tls.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package tls
  2. import (
  3. "crypto/tls"
  4. "github.com/v2fly/v2ray-core/v4/common/buf"
  5. "github.com/v2fly/v2ray-core/v4/common/net"
  6. )
  7. //go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
  8. var _ buf.Writer = (*Conn)(nil)
  9. type Conn struct {
  10. *tls.Conn
  11. }
  12. func (c *Conn) WriteMultiBuffer(mb buf.MultiBuffer) error {
  13. mb = buf.Compact(mb)
  14. mb, err := buf.WriteMultiBuffer(c, mb)
  15. buf.ReleaseMulti(mb)
  16. return err
  17. }
  18. func (c *Conn) HandshakeAddress() net.Address {
  19. if err := c.Handshake(); err != nil {
  20. return nil
  21. }
  22. state := c.ConnectionState()
  23. if state.ServerName == "" {
  24. return nil
  25. }
  26. return net.ParseAddress(state.ServerName)
  27. }
  28. // Client initiates a TLS client handshake on the given connection.
  29. func Client(c net.Conn, config *tls.Config) net.Conn {
  30. tlsConn := tls.Client(c, config)
  31. return &Conn{Conn: tlsConn}
  32. }
  33. /*
  34. func copyConfig(c *tls.Config) *utls.Config {
  35. return &utls.Config{
  36. NextProtos: c.NextProtos,
  37. ServerName: c.ServerName,
  38. InsecureSkipVerify: c.InsecureSkipVerify,
  39. MinVersion: utls.VersionTLS12,
  40. MaxVersion: utls.VersionTLS12,
  41. }
  42. }
  43. func UClient(c net.Conn, config *tls.Config) net.Conn {
  44. uConfig := copyConfig(config)
  45. return utls.Client(c, uConfig)
  46. }
  47. */
  48. // Server initiates a TLS server handshake on the given connection.
  49. func Server(c net.Conn, config *tls.Config) net.Conn {
  50. tlsConn := tls.Server(c, config)
  51. return &Conn{Conn: tlsConn}
  52. }