tls.go 830 B

123456789101112131415161718192021222324252627282930313233
  1. package sniff
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "errors"
  6. "io"
  7. "github.com/sagernet/sing-box/adapter"
  8. C "github.com/sagernet/sing-box/constant"
  9. "github.com/sagernet/sing/common/bufio"
  10. E "github.com/sagernet/sing/common/exceptions"
  11. )
  12. func TLSClientHello(ctx context.Context, metadata *adapter.InboundContext, reader io.Reader) error {
  13. var clientHello *tls.ClientHelloInfo
  14. err := tls.Server(bufio.NewReadOnlyConn(reader), &tls.Config{
  15. GetConfigForClient: func(argHello *tls.ClientHelloInfo) (*tls.Config, error) {
  16. clientHello = argHello
  17. return nil, nil
  18. },
  19. }).HandshakeContext(ctx)
  20. if clientHello != nil {
  21. metadata.Protocol = C.ProtocolTLS
  22. metadata.Domain = clientHello.ServerName
  23. return nil
  24. }
  25. if errors.Is(err, io.ErrUnexpectedEOF) {
  26. return E.Cause1(ErrNeedMoreData, err)
  27. } else {
  28. return err
  29. }
  30. }