qlight_transport.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package p2p
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/tls"
  5. "net"
  6. "github.com/ethereum/go-ethereum/log"
  7. "github.com/ethereum/go-ethereum/p2p/rlpx"
  8. )
  9. var qlightTLSConfig *tls.Config
  10. func SetQLightTLSConfig(config *tls.Config) {
  11. qlightTLSConfig = config
  12. }
  13. type tlsErrorTransport struct {
  14. err error
  15. }
  16. func (tr *tlsErrorTransport) doEncHandshake(prv *ecdsa.PrivateKey) (*ecdsa.PublicKey, error) {
  17. return nil, tr.err
  18. }
  19. func (tr *tlsErrorTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  20. return nil, tr.err
  21. }
  22. func (tr *tlsErrorTransport) ReadMsg() (Msg, error) { return Msg{}, tr.err }
  23. func (tr *tlsErrorTransport) WriteMsg(Msg) error { return tr.err }
  24. func (tr *tlsErrorTransport) close(err error) {}
  25. func NewQlightClientTransport(conn net.Conn, dialDest *ecdsa.PublicKey) transport {
  26. log.Info("Setting up qlight client transport")
  27. if qlightTLSConfig != nil {
  28. tlsConn := tls.Client(conn, qlightTLSConfig)
  29. err := tlsConn.Handshake()
  30. if err != nil {
  31. log.Error("Failure setting up qlight client transport", "err", err)
  32. return &tlsErrorTransport{err}
  33. }
  34. log.Info("Qlight client tls transport established successfully")
  35. return &rlpxTransport{conn: rlpx.NewConn(tlsConn, dialDest)}
  36. }
  37. return &rlpxTransport{conn: rlpx.NewConn(conn, dialDest)}
  38. }
  39. func NewQlightServerTransport(conn net.Conn, dialDest *ecdsa.PublicKey) transport {
  40. log.Info("Setting up qlight server transport")
  41. if qlightTLSConfig != nil {
  42. tlsConn := tls.Server(conn, qlightTLSConfig)
  43. err := tlsConn.Handshake()
  44. if err != nil {
  45. log.Error("Failure setting up qlight server transport", "err", err)
  46. return &tlsErrorTransport{err}
  47. }
  48. log.Info("Qlight server tls transport established successfully")
  49. return &rlpxTransport{conn: rlpx.NewConn(tlsConn, dialDest)}
  50. }
  51. return &rlpxTransport{conn: rlpx.NewConn(conn, dialDest)}
  52. }