REALITY protocol: Reject outdated/strange Client Hello that doesn't have X25519MLKEM768 before optional X25519

https://github.com/XTLS/Xray-core/issues/6714#issuecomment-5575338614
This commit is contained in:
RPRX
2026-09-08 06:21:03 +00:00
committed by GitHub
parent e1986a4d31
commit 8cdf7bf9c7
+18 -8
View File
@@ -211,20 +211,30 @@ func Server(ctx context.Context, conn net.Conn, config *Config) (*Conn, error) {
if copying || err != nil || hs.c.vers != VersionTLS13 || !config.ServerNames[hs.clientHello.serverName] {
break
}
var peerPub []byte
var peerPub, peerPub2 []byte
for _, keyShare := range hs.clientHello.keyShares {
if keyShare.group == X25519MLKEM768 && len(keyShare.data) == mlkem.EncapsulationKeySize768+32 {
if peerPub2 != nil {
peerPub2 = nil // ensure fail
break // ensure once
}
peerPub2 = keyShare.data[mlkem.EncapsulationKeySize768:]
continue // fast continue
}
if keyShare.group == X25519 && len(keyShare.data) == 32 {
if peerPub != nil {
peerPub2 = nil // ensure fail
break // ensure once
}
peerPub = keyShare.data
break
break // ensure order
}
}
if peerPub2 == nil {
break // reject outdated/strange Client Hello that doesn't have X25519MLKEM768 before optional X25519
}
if peerPub == nil {
for _, keyShare := range hs.clientHello.keyShares {
if keyShare.group == X25519MLKEM768 && len(keyShare.data) == mlkem.EncapsulationKeySize768+32 {
peerPub = keyShare.data[mlkem.EncapsulationKeySize768:]
break
}
}
peerPub = peerPub2 // secondary choice: X25519 in X25519MLKEM768
}
for peerPub != nil {
if hs.c.AuthKey, err = curve25519.X25519(config.PrivateKey, peerPub); err != nil {