chore: sync vless encryption code

This commit is contained in:
wwqgtxx
2025-08-25 01:10:35 +08:00
parent 2605bf78f9
commit aca0d97beb
4 changed files with 54 additions and 60 deletions

View File

@@ -18,12 +18,13 @@ import (
type CommonConn struct {
net.Conn
Client *ClientInstance
UnitedKey []byte
PreWrite []byte
GCM *GCM
PeerGCM *GCM
input bytes.Reader // PeerCache
Client *ClientInstance
UnitedKey []byte
PreWrite []byte
GCM *GCM
PeerPadding []byte
PeerGCM *GCM
input bytes.Reader // PeerCache
}
func (c *CommonConn) Write(b []byte) (int, error) {
@@ -39,12 +40,12 @@ func (c *CommonConn) Write(b []byte) (int, error) {
n += len(b)
data = make([]byte, 5+len(b)+16)
EncodeHeader(data, len(b)+16)
aead := c.GCM
max := false
if bytes.Equal(c.GCM.Nonce[:], MaxNonce) {
aead = nil
max = true
}
c.GCM.Seal(data[:5], nil, b, data[:5])
if aead == nil {
if max {
c.GCM = NewGCM(data[5:], c.UnitedKey)
}
if c.PreWrite != nil {
@@ -63,15 +64,24 @@ func (c *CommonConn) Read(b []byte) (int, error) {
return 0, nil
}
if c.PeerGCM == nil { // client's 0-RTT
serverRandom := make([]byte, 32)
serverRandom := make([]byte, 16)
if _, err := io.ReadFull(c.Conn, serverRandom); err != nil {
return 0, err
}
c.PeerGCM = NewGCM(serverRandom, c.UnitedKey)
if xorConn, ok := c.Conn.(*XorConn); ok {
xorConn.PeerCTR = NewCTR(c.UnitedKey, serverRandom[16:])
xorConn.PeerCTR = NewCTR(c.UnitedKey, serverRandom)
}
}
if c.PeerPadding != nil { // client's 1-RTT
if _, err := io.ReadFull(c.Conn, c.PeerPadding); err != nil {
return 0, err
}
if _, err := c.PeerGCM.Open(c.PeerPadding[:0], nil, c.PeerPadding, nil); err != nil {
return 0, err
}
c.PeerPadding = nil
}
if c.input.Len() > 0 {
return c.input.Read(b)
}
@@ -96,13 +106,13 @@ func (c *CommonConn) Read(b []byte) (int, error) {
if len(dst) <= len(b) {
dst = b[:len(dst)] // avoids another copy()
}
var peerAEAD *GCM
var newGCM *GCM
if bytes.Equal(c.PeerGCM.Nonce[:], MaxNonce) {
peerAEAD = NewGCM(peerData, c.UnitedKey)
newGCM = NewGCM(peerData, c.UnitedKey)
}
_, err = c.PeerGCM.Open(dst[:0], nil, peerData, h)
if peerAEAD != nil {
c.PeerGCM = peerAEAD
if newGCM != nil {
c.PeerGCM = newGCM
}
if err != nil {
return 0, err