tls.go 1.4 KB

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