diff --git a/component/tls/reality.go b/component/tls/reality.go index 06e4ed68..5beffb43 100644 --- a/component/tls/reality.go +++ b/component/tls/reality.go @@ -26,6 +26,7 @@ import ( utls "github.com/metacubex/utls" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" + "golang.org/x/exp/slices" "golang.org/x/net/http2" ) @@ -60,6 +61,27 @@ func GetRealityConn(ctx context.Context, conn net.Conn, ClientFingerprint string return nil, err } + // ------for X25519MLKEM768 does not work properly with reality------- + // Iterate over extensions and check + for _, extension := range uConn.Extensions { + if ce, ok := extension.(*utls.SupportedCurvesExtension); ok { + ce.Curves = slices.DeleteFunc(ce.Curves, func(curveID utls.CurveID) bool { + return curveID == utls.X25519MLKEM768 + }) + } + if ks, ok := extension.(*utls.KeyShareExtension); ok { + ks.KeyShares = slices.DeleteFunc(ks.KeyShares, func(share utls.KeyShare) bool { + return share.Group == utls.X25519MLKEM768 + }) + } + } + // Rebuild the client hello + err = uConn.BuildHandshakeState() + if err != nil { + return nil, err + } + // -------------------------------------------------------------------- + hello := uConn.HandshakeState.Hello rawSessionID := hello.Raw[39 : 39+32] // the location of session ID for i := range rawSessionID { // https://github.com/golang/go/issues/5373