mirror of
https://github.com/XTLS/REALITY.git
synced 2025-08-22 06:28:35 +00:00
REALITY protocol: Use X25519MLKEM768's data if X25519 doesn't exist in Client Hello
This commit is contained in:
parent
05a351a645
commit
ebbbf46ec3
20
tls.go
20
tls.go
@ -211,11 +211,23 @@ 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] {
|
if copying || err != nil || hs.c.vers != VersionTLS13 || !config.ServerNames[hs.clientHello.serverName] {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
var peerPub []byte
|
||||||
for _, keyShare := range hs.clientHello.keyShares {
|
for _, keyShare := range hs.clientHello.keyShares {
|
||||||
if keyShare.group != X25519 || len(keyShare.data) != 32 {
|
if keyShare.group == X25519 && len(keyShare.data) == 32 {
|
||||||
continue
|
peerPub = keyShare.data
|
||||||
|
break
|
||||||
}
|
}
|
||||||
if hs.c.AuthKey, err = curve25519.X25519(config.PrivateKey, keyShare.data); err != nil {
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for peerPub != nil {
|
||||||
|
if hs.c.AuthKey, err = curve25519.X25519(config.PrivateKey, peerPub); err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if _, err = hkdf.New(sha256.New, hs.c.AuthKey, hs.clientHello.random[:20], []byte("REALITY")).Read(hs.c.AuthKey); err != nil {
|
if _, err = hkdf.New(sha256.New, hs.c.AuthKey, hs.clientHello.random[:20], []byte("REALITY")).Read(hs.c.AuthKey); err != nil {
|
||||||
@ -426,7 +438,7 @@ func Server(ctx context.Context, conn net.Conn, config *Config) (*Conn, error) {
|
|||||||
waitGroup.Wait()
|
waitGroup.Wait()
|
||||||
target.Close()
|
target.Close()
|
||||||
if config.Show {
|
if config.Show {
|
||||||
fmt.Printf("REALITY remoteAddr: %v\ths.c.handshakeStatus: %v\n", remoteAddr, hs.c.isHandshakeComplete.Load())
|
fmt.Printf("REALITY remoteAddr: %v\ths.c.isHandshakeComplete.Load(): %v\n", remoteAddr, hs.c.isHandshakeComplete.Load())
|
||||||
}
|
}
|
||||||
if hs.c.isHandshakeComplete.Load() {
|
if hs.c.isHandshakeComplete.Load() {
|
||||||
return hs.c, nil
|
return hs.c, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user