From d900c7121452015eecf311ac57781ceca36bd2a2 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 18 May 2025 00:50:00 +0800 Subject: [PATCH] fix: shadowtls v2 not work with X25519MLKEM768 --- transport/sing-shadowtls/shadowtls.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/transport/sing-shadowtls/shadowtls.go b/transport/sing-shadowtls/shadowtls.go index 904bcd63..4f9c3b51 100644 --- a/transport/sing-shadowtls/shadowtls.go +++ b/transport/sing-shadowtls/shadowtls.go @@ -49,7 +49,7 @@ func NewShadowTLS(ctx context.Context, conn net.Conn, option *ShadowTLSOption) ( return nil, err } - tlsHandshake := uTLSHandshakeFunc(tlsConfig, option.ClientFingerprint) + tlsHandshake := uTLSHandshakeFunc(tlsConfig, option.ClientFingerprint, option.Version) client, err := shadowtls.NewClient(shadowtls.ClientConfig{ Version: option.Version, Password: option.Password, @@ -62,15 +62,19 @@ func NewShadowTLS(ctx context.Context, conn net.Conn, option *ShadowTLSOption) ( return client.DialContextConn(ctx, conn) } -func uTLSHandshakeFunc(config *tls.Config, clientFingerprint string) shadowtls.TLSHandshakeFunc { +func uTLSHandshakeFunc(config *tls.Config, clientFingerprint string, version int) shadowtls.TLSHandshakeFunc { return func(ctx context.Context, conn net.Conn, sessionIDGenerator shadowtls.TLSSessionIDGeneratorFunc) error { tlsConfig := tlsC.UConfig(config) tlsConfig.SessionIDGenerator = sessionIDGenerator - if config.MaxVersion == tls.VersionTLS12 { // for ShadowTLS v1 + if version == 1 { + tlsConfig.MaxVersion = tlsC.VersionTLS12 // ShadowTLS v1 only support TLS 1.2 tlsConn := tlsC.Client(conn, tlsConfig) return tlsConn.HandshakeContext(ctx) } if clientFingerprint, ok := tlsC.GetFingerprint(clientFingerprint); ok { + if version == 2 && clientFingerprint == tlsC.HelloChrome_Auto { + clientFingerprint = tlsC.HelloChrome_120 // ShadowTLS v2 not work with X25519MLKEM768 + } tlsConn := tlsC.UClient(conn, tlsConfig, clientFingerprint) if slices.Equal(tlsConfig.NextProtos, WsALPN) { err := tlsC.BuildWebsocketHandshakeState(tlsConn)