tls.go 962 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package tls
  2. import (
  3. "crypto/tls"
  4. "v2ray.com/core/common/buf"
  5. "v2ray.com/core/common/net"
  6. )
  7. //go:generate errorgen
  8. var (
  9. _ buf.Writer = (*conn)(nil)
  10. )
  11. type conn struct {
  12. *tls.Conn
  13. }
  14. func (c *conn) WriteMultiBuffer(mb buf.MultiBuffer) error {
  15. mb = buf.Compact(mb)
  16. mb, err := buf.WriteMultiBuffer(c, mb)
  17. buf.ReleaseMulti(mb)
  18. return err
  19. }
  20. func (c *conn) HandshakeAddress() net.Address {
  21. if err := c.Handshake(); err != nil {
  22. return nil
  23. }
  24. state := c.Conn.ConnectionState()
  25. if len(state.ServerName) == 0 {
  26. return nil
  27. }
  28. return net.ParseAddress(state.ServerName)
  29. }
  30. // Client initiates a TLS client handshake on the given connection.
  31. func Client(c net.Conn, config *tls.Config) net.Conn {
  32. tlsConn := tls.Client(c, config)
  33. return &conn{Conn: tlsConn}
  34. }
  35. // Server initiates a TLS server handshake on the given connection.
  36. func Server(c net.Conn, config *tls.Config) net.Conn {
  37. tlsConn := tls.Server(c, config)
  38. return &conn{Conn: tlsConn}
  39. }