Skip to content

Commit b643388

Browse files
committed
chore: sync vless encryption code
1 parent 0836ec6 commit b643388

File tree

5 files changed

+60
-66
lines changed

5 files changed

+60
-66
lines changed

transport/vless/encryption/client.go

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"io"
1111
"net"
1212
"runtime"
13+
"strings"
1314
"sync"
1415
"time"
1516

@@ -37,13 +38,12 @@ func init() {
3738

3839
type ClientInstance struct {
3940
sync.RWMutex
40-
nfsEKey *mlkem.EncapsulationKey768
41-
nfsEKeySha256 [32]byte
42-
xor uint32
43-
minutes time.Duration
44-
expire time.Time
45-
baseKey []byte
46-
ticket []byte
41+
nfsEKey *mlkem.EncapsulationKey768
42+
xorKey []byte
43+
minutes time.Duration
44+
expire time.Time
45+
baseKey []byte
46+
ticket []byte
4747
}
4848

4949
type ClientConn struct {
@@ -60,10 +60,17 @@ type ClientConn struct {
6060
}
6161

6262
func (i *ClientInstance) Init(nfsEKeyBytes []byte, xor uint32, minutes time.Duration) (err error) {
63+
if i.nfsEKey != nil {
64+
err = errors.New("already initialized")
65+
return
66+
}
6367
i.nfsEKey, err = mlkem.NewEncapsulationKey768(nfsEKeyBytes)
68+
if err != nil {
69+
return
70+
}
6471
if xor > 0 {
65-
i.nfsEKeySha256 = sha256.Sum256(nfsEKeyBytes)
66-
i.xor = xor
72+
xorKey := sha256.Sum256(nfsEKeyBytes)
73+
i.xorKey = xorKey[:]
6774
}
6875
i.minutes = minutes
6976
return
@@ -73,8 +80,8 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) {
7380
if i.nfsEKey == nil {
7481
return nil, errors.New("uninitialized")
7582
}
76-
if i.xor > 0 {
77-
conn = NewXorConn(conn, i.nfsEKeySha256[:])
83+
if i.xorKey != nil {
84+
conn = NewXorConn(conn, i.xorKey)
7885
}
7986
c := &ClientConn{Conn: conn}
8087

@@ -110,14 +117,14 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) {
110117
}
111118
// client can send more padding / NFS AEAD messages if needed
112119

113-
_, t, l, err := ReadAndDecodeHeader(c.Conn)
120+
_, t, l, err := ReadAndDiscardPaddings(c.Conn)
114121
if err != nil {
115122
return nil, err
116123
}
124+
117125
if t != 1 {
118126
return nil, fmt.Errorf("unexpected type %v, expect random hello", t)
119127
}
120-
121128
peerRandomHello := make([]byte, 1088+21)
122129
if l != len(peerRandomHello) {
123130
return nil, fmt.Errorf("unexpected length %v for random hello", l)
@@ -194,34 +201,17 @@ func (c *ClientConn) Read(b []byte) (int, error) {
194201
return 0, nil
195202
}
196203
if c.peerAead == nil {
197-
var t byte
198-
var l int
199-
var err error
200-
if c.instance == nil { // from 1-RTT
201-
for {
202-
if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil {
203-
return 0, err
204-
}
205-
if t != 23 {
206-
break
207-
}
208-
if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil {
209-
return 0, err
210-
}
211-
}
212-
} else {
213-
h := make([]byte, 5)
214-
if _, err := io.ReadFull(c.Conn, h); err != nil {
215-
return 0, err
216-
}
217-
if t, l, err = DecodeHeader(h); err != nil {
204+
_, t, l, err := ReadAndDiscardPaddings(c.Conn)
205+
if err != nil {
206+
if c.instance != nil && strings.HasPrefix(err.Error(), "invalid header: ") { // from 0-RTT
218207
c.instance.Lock()
219208
if bytes.Equal(c.ticket, c.instance.ticket) {
220209
c.instance.expire = time.Now() // expired
221210
}
222211
c.instance.Unlock()
223212
return 0, errors.New("new handshake needed")
224213
}
214+
return 0, err
225215
}
226216
if t != 0 {
227217
return 0, fmt.Errorf("unexpected type %v, expect server random", t)

transport/vless/encryption/common.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ func DecodeHeader(h []byte) (t byte, l int, err error) {
4545
} else if h[0] == 1 && h[1] == 1 && h[2] == 1 {
4646
t = 1
4747
} else {
48-
h = nil
48+
l = 0
4949
}
50-
if h == nil || l < 17 || l > 17000 { // TODO: TLSv1.3 max length
51-
err = fmt.Errorf("invalid header: %v", h[:5])
50+
if l < 17 || l > 17000 { // TODO: TLSv1.3 max length
51+
err = fmt.Errorf("invalid header: %v", h[:5]) // relied by client's Read()
5252
}
5353
return
5454
}
@@ -62,6 +62,17 @@ func ReadAndDecodeHeader(conn net.Conn) (h []byte, t byte, l int, err error) {
6262
return
6363
}
6464

65+
func ReadAndDiscardPaddings(conn net.Conn) (h []byte, t byte, l int, err error) {
66+
for {
67+
if h, t, l, err = ReadAndDecodeHeader(conn); err != nil || t != 23 {
68+
return
69+
}
70+
if _, err = io.ReadFull(conn, make([]byte, l)); err != nil {
71+
return
72+
}
73+
}
74+
}
75+
6576
func NewAead(c byte, secret, salt, info []byte) (aead cipher.AEAD) {
6677
key := make([]byte, 32)
6778
hkdf.New(sha256.New, secret, salt, info).Read(key)

transport/vless/encryption/doc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
// https://github.com/XTLS/Xray-core/commit/1720be168fa069332c418503d30341fc6e01df7f
1010
// https://github.com/XTLS/Xray-core/commit/0fd7691d6b28e05922d7a5a9313d97745a51ea63
1111
// https://github.com/XTLS/Xray-core/commit/09cc92c61d9067e0d65c1cae9124664ecfc78f43
12-
// https://github.com/XTLS/Xray-core/commit/7f778a4e2f123dc03fe57fbf24da59dcaf270f8a
12+
// https://github.com/XTLS/Xray-core/commit/2807ee432a1fbeb301815647189eacd650b12a8b
1313
package encryption

transport/vless/encryption/server.go

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@ type ServerSession struct {
2424

2525
type ServerInstance struct {
2626
sync.RWMutex
27-
nfsDKey *mlkem.DecapsulationKey768
28-
nfsEKeySha256 [32]byte
29-
xor uint32
30-
minutes time.Duration
31-
sessions map[[21]byte]*ServerSession
32-
closed bool
27+
nfsDKey *mlkem.DecapsulationKey768
28+
xorKey []byte
29+
minutes time.Duration
30+
sessions map[[21]byte]*ServerSession
31+
closed bool
3332
}
3433

3534
type ServerConn struct {
@@ -46,10 +45,17 @@ type ServerConn struct {
4645
}
4746

4847
func (i *ServerInstance) Init(nfsDKeySeed []byte, xor uint32, minutes time.Duration) (err error) {
48+
if i.nfsDKey != nil {
49+
err = errors.New("already initialized")
50+
return
51+
}
4952
i.nfsDKey, err = mlkem.NewDecapsulationKey768(nfsDKeySeed)
53+
if err != nil {
54+
return
55+
}
5056
if xor > 0 {
51-
i.nfsEKeySha256 = sha256.Sum256(i.nfsDKey.EncapsulationKey().Bytes())
52-
i.xor = xor
57+
xorKey := sha256.Sum256(i.nfsDKey.EncapsulationKey().Bytes())
58+
i.xorKey = xorKey[:]
5359
}
5460
if minutes > 0 {
5561
i.minutes = minutes
@@ -86,18 +92,15 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) {
8692
if i.nfsDKey == nil {
8793
return nil, errors.New("uninitialized")
8894
}
89-
if i.xor > 0 {
90-
conn = NewXorConn(conn, i.nfsEKeySha256[:])
95+
if i.xorKey != nil {
96+
conn = NewXorConn(conn, i.xorKey)
9197
}
9298
c := &ServerConn{Conn: conn}
9399

94-
_, t, l, err := ReadAndDecodeHeader(c.Conn)
100+
_, t, l, err := ReadAndDiscardPaddings(c.Conn)
95101
if err != nil {
96102
return nil, err
97103
}
98-
if t == 23 {
99-
return nil, errors.New("unexpected data")
100-
}
101104

102105
if t == 0 {
103106
if i.minutes == 0 {
@@ -187,19 +190,9 @@ func (c *ServerConn) Read(b []byte) (int, error) {
187190
}
188191
if c.peerAead == nil {
189192
if c.peerRandom == nil { // from 1-RTT
190-
var t byte
191-
var l int
192-
var err error
193-
for {
194-
if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil {
195-
return 0, err
196-
}
197-
if t != 23 {
198-
break
199-
}
200-
if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil {
201-
return 0, err
202-
}
193+
_, t, l, err := ReadAndDiscardPaddings(c.Conn)
194+
if err != nil {
195+
return 0, err
203196
}
204197
if t != 0 {
205198
return 0, fmt.Errorf("unexpected type %v, expect ticket hello", t)

transport/vless/encryption/xor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type XorConn struct {
1818
}
1919

2020
func NewXorConn(conn net.Conn, key []byte) *XorConn {
21-
return &XorConn{Conn: conn, key: key[:16]}
21+
return &XorConn{Conn: conn, key: key}
2222
//chacha20.NewUnauthenticatedCipher()
2323
}
2424

0 commit comments

Comments
 (0)