@@ -4,15 +4,13 @@ import (
4
4
"bytes"
5
5
"crypto/cipher"
6
6
"crypto/rand"
7
- "crypto/sha256"
8
7
"errors"
9
8
"io"
10
9
"net"
11
10
"sync"
12
11
"time"
13
12
14
13
"github.com/metacubex/utls/mlkem"
15
- "golang.org/x/crypto/hkdf"
16
14
)
17
15
18
16
type ServerSession struct {
@@ -113,7 +111,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) {
113
111
if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
114
112
return nil , err
115
113
}
116
- if l , _ := decodeHeader (peerHeader ); l != 0 {
114
+ if l , _ := DecodeHeader (peerHeader ); l != 0 {
117
115
noise := make ([]byte , randBetween (100 , 1000 ))
118
116
rand .Read (noise )
119
117
c .Conn .Write (noise ) // make client do new handshake
@@ -141,17 +139,15 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) {
141
139
pfsKey , encapsulatedPfsKey := pfsEKey .Encapsulate ()
142
140
c .baseKey = append (pfsKey , nfsKey ... )
143
141
144
- authKey := make ([]byte , 32 )
145
- hkdf .New (sha256 .New , c .baseKey , encapsulatedPfsKey , encapsulatedNfsKey ).Read (authKey )
146
142
nonce := [12 ]byte {c .cipher }
147
- c .ticket = newAead (c .cipher , authKey ).Seal (nil , nonce [:], []byte ("VLESS" ), pfsEKeyBytes )
143
+ c .ticket = NewAead (c .cipher , c . baseKey , encapsulatedPfsKey , encapsulatedNfsKey ).Seal (nil , nonce [:], []byte ("VLESS" ), pfsEKeyBytes )
148
144
149
145
paddingLen := randBetween (100 , 1000 )
150
146
151
147
serverHello := make ([]byte , 1088 + 21 + 5 + paddingLen )
152
148
copy (serverHello , encapsulatedPfsKey )
153
149
copy (serverHello [1088 :], c .ticket )
154
- encodeHeader (serverHello [1109 :], int (paddingLen ))
150
+ EncodeHeader (serverHello [1109 :], int (paddingLen ))
155
151
rand .Read (serverHello [1114 :])
156
152
157
153
if _ , err := c .Conn .Write (serverHello ); err != nil {
@@ -183,7 +179,7 @@ func (c *ServerConn) Read(b []byte) (int, error) {
183
179
if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
184
180
return 0 , err
185
181
}
186
- peerPaddingLen , _ := decodeHeader (peerHeader )
182
+ peerPaddingLen , _ := DecodeHeader (peerHeader )
187
183
if peerPaddingLen == 0 {
188
184
break
189
185
}
@@ -204,9 +200,7 @@ func (c *ServerConn) Read(b []byte) (int, error) {
204
200
return 0 , err
205
201
}
206
202
}
207
- peerKey := make ([]byte , 32 )
208
- hkdf .New (sha256 .New , c .baseKey , c .peerRandom , c .ticket ).Read (peerKey )
209
- c .peerAead = newAead (c .cipher , peerKey )
203
+ c .peerAead = NewAead (c .cipher , c .baseKey , c .peerRandom , c .ticket )
210
204
c .peerNonce = make ([]byte , 12 )
211
205
}
212
206
if len (c .peerCache ) != 0 {
@@ -217,7 +211,7 @@ func (c *ServerConn) Read(b []byte) (int, error) {
217
211
if _ , err := io .ReadFull (c .Conn , peerHeader ); err != nil {
218
212
return 0 , err
219
213
}
220
- peerLength , err := decodeHeader (peerHeader ) // 17~17000
214
+ peerLength , err := DecodeHeader (peerHeader ) // 17~17000
221
215
if err != nil {
222
216
return 0 , err
223
217
}
@@ -229,8 +223,15 @@ func (c *ServerConn) Read(b []byte) (int, error) {
229
223
if len (dst ) <= len (b ) {
230
224
dst = b [:len (dst )] // avoids another copy()
231
225
}
226
+ var peerAead cipher.AEAD
227
+ if bytes .Equal (c .peerNonce , MaxNonce ) {
228
+ peerAead = NewAead (ClientCipher , c .baseKey , peerData , peerHeader )
229
+ }
232
230
_ , err = c .peerAead .Open (dst [:0 ], c .peerNonce , peerData , peerHeader )
233
- increaseNonce (c .peerNonce )
231
+ if peerAead != nil {
232
+ c .peerAead = peerAead
233
+ }
234
+ IncreaseNonce (c .peerNonce )
234
235
if err != nil {
235
236
return 0 , errors .New ("error" )
236
237
}
@@ -245,31 +246,32 @@ func (c *ServerConn) Write(b []byte) (int, error) {
245
246
if len (b ) == 0 {
246
247
return 0 , nil
247
248
}
249
+ var data []byte
248
250
for n := 0 ; n < len (b ); {
249
251
b := b [n :]
250
252
if len (b ) > 8192 {
251
253
b = b [:8192 ] // for avoiding another copy() in client's Read()
252
254
}
253
255
n += len (b )
254
- var data []byte
255
256
if c .aead == nil {
256
257
if c .peerRandom == nil {
257
258
return 0 , errors .New ("empty c.peerRandom" )
258
259
}
259
260
data = make ([]byte , 32 + 5 + len (b )+ 16 )
260
261
rand .Read (data [:32 ])
261
- key := make ([]byte , 32 )
262
- hkdf .New (sha256 .New , c .baseKey , data [:32 ], c .peerRandom ).Read (key )
263
- c .aead = newAead (c .cipher , key )
262
+ c .aead = NewAead (c .cipher , c .baseKey , data [:32 ], c .peerRandom )
264
263
c .nonce = make ([]byte , 12 )
265
- encodeHeader (data [32 :], len (b )+ 16 )
264
+ EncodeHeader (data [32 :], len (b )+ 16 )
266
265
c .aead .Seal (data [:37 ], c .nonce , b , data [32 :37 ])
267
266
} else {
268
267
data = make ([]byte , 5 + len (b )+ 16 )
269
- encodeHeader (data , len (b )+ 16 )
268
+ EncodeHeader (data , len (b )+ 16 )
270
269
c .aead .Seal (data [:5 ], c .nonce , b , data [:5 ])
270
+ if bytes .Equal (c .nonce , MaxNonce ) {
271
+ c .aead = NewAead (ClientCipher , c .baseKey , data [5 :], data [:5 ])
272
+ }
271
273
}
272
- increaseNonce (c .nonce )
274
+ IncreaseNonce (c .nonce )
273
275
if _ , err := c .Conn .Write (data ); err != nil {
274
276
return 0 , err
275
277
}
0 commit comments