@@ -55,13 +55,13 @@ func (i *ServerInstance) Init(nfsDKeySeed, xorSKeyBytes []byte, xorMode, minutes
5555 if i .nfsDKey , err = mlkem .NewDecapsulationKey768 (nfsDKeySeed ); err != nil {
5656 return
5757 }
58- hash32 := sha3 .Sum256 (i .nfsDKey .EncapsulationKey ().Bytes ())
59- copy (i .hash11 [:], hash32 [:])
6058 if xorMode > 0 {
6159 i .xorMode = xorMode
6260 if i .xorSKey , err = ecdh .X25519 ().NewPrivateKey (xorSKeyBytes ); err != nil {
6361 return
6462 }
63+ hash32 := sha3 .Sum256 (i .nfsDKey .EncapsulationKey ().Bytes ())
64+ copy (i .hash11 [:], hash32 [:])
6565 }
6666 if minutes > 0 {
6767 i .minutes = time .Duration (minutes ) * time .Minute
@@ -106,7 +106,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) {
106106 }
107107 c := & ServerConn {Conn : conn }
108108
109- _ , t , l , err := ReadAndDiscardPaddings (c .Conn ) // allow paddings before client/ticket hello
109+ _ , t , l , err := ReadAndDiscardPaddings (c .Conn , nil , nil ) // allow paddings before client/ticket hello
110110 if err != nil {
111111 return nil , err
112112 }
@@ -170,11 +170,14 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) {
170170 if err != nil {
171171 return nil , err
172172 }
173+ nfsAEAD := NewAEAD (c .cipher , nfsKey , pfsEKeyBytes , encapsulatedNfsKey )
174+ nfsNonce := append ([]byte {}, peerClientHello [:11 + 1 ]... )
173175 pfsKey , encapsulatedPfsKey := pfsEKey .Encapsulate ()
174176 c .baseKey = append (pfsKey , nfsKey ... )
175177 pfsAEAD := NewAEAD (c .cipher , c .baseKey , encapsulatedPfsKey , encapsulatedNfsKey )
176- c .ticket = append (i .hash11 [:], pfsAEAD .Seal (nil , peerClientHello [:11 + 1 ], []byte ("VLESS" ), pfsEKeyBytes )... )
177- IncreaseNonce (peerClientHello [:11 + 1 ])
178+ pfsNonce := append ([]byte {}, peerClientHello [:11 + 1 ]... )
179+ c .ticket = append (i .hash11 [:], pfsAEAD .Seal (nil , pfsNonce , []byte ("VLESS" ), pfsEKeyBytes )... )
180+ IncreaseNonce (pfsNonce )
178181
179182 serverHello := make ([]byte , 5 + 1088 + 21 + randBetween (100 , 1000 ))
180183 EncodeHeader (serverHello , 1 , 1088 + 21 )
@@ -183,20 +186,41 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) {
183186 padding := serverHello [5 + 1088 + 21 :]
184187 rand .Read (padding ) // important
185188 EncodeHeader (padding , 23 , len (padding )- 5 )
186- pfsAEAD .Seal (padding [:5 ], peerClientHello [: 11 + 1 ] , padding [5 :len (padding )- 16 ], padding [:5 ])
189+ pfsAEAD .Seal (padding [:5 ], pfsNonce , padding [5 :len (padding )- 16 ], padding [:5 ])
187190
188191 if _ , err := c .Conn .Write (serverHello ); err != nil {
189192 return nil , err
190193 }
191194 // server can send more PFS AEAD paddings / messages if needed
192195
196+ _ , t , l , err = ReadAndDiscardPaddings (c .Conn , nfsAEAD , nfsNonce ) // allow paddings before ticket hello
197+ if err != nil {
198+ return nil , err
199+ }
200+ if t != 0 {
201+ return nil , fmt .Errorf ("unexpected type %v, expect ticket hello" , t )
202+ }
203+ peerTicketHello := make ([]byte , 32 + 32 )
204+ if l != len (peerTicketHello ) {
205+ return nil , fmt .Errorf ("unexpected length %v for ticket hello" , l )
206+ }
207+ if _ , err := io .ReadFull (c .Conn , peerTicketHello ); err != nil {
208+ return nil , err
209+ }
210+ if ! bytes .Equal (peerTicketHello [:32 ], c .ticket ) {
211+ return nil , errors .New ("naughty boy" )
212+ }
213+ c .peerRandom = peerTicketHello [32 :]
214+
193215 if i .minutes > 0 {
194216 i .Lock ()
195- i . sessions [[ 32 ] byte ( c . ticket )] = & ServerSession {
217+ s : = & ServerSession {
196218 expire : time .Now ().Add (i .minutes ),
197219 cipher : c .cipher ,
198220 baseKey : c .baseKey ,
199221 }
222+ s .randoms .Store ([32 ]byte (c .peerRandom ), true )
223+ i .sessions [[32 ]byte (c .ticket )] = s
200224 i .Unlock ()
201225 }
202226
@@ -208,26 +232,6 @@ func (c *ServerConn) Read(b []byte) (int, error) {
208232 return 0 , nil
209233 }
210234 if c .peerAEAD == nil {
211- if c .peerRandom == nil { // 1-RTT's 0-RTT
212- _ , t , l , err := ReadAndDiscardPaddings (c .Conn ) // allow paddings before ticket hello
213- if err != nil {
214- return 0 , err
215- }
216- if t != 0 {
217- return 0 , fmt .Errorf ("unexpected type %v, expect ticket hello" , t )
218- }
219- peerTicketHello := make ([]byte , 32 + 32 )
220- if l != len (peerTicketHello ) {
221- return 0 , fmt .Errorf ("unexpected length %v for ticket hello" , l )
222- }
223- if _ , err := io .ReadFull (c .Conn , peerTicketHello ); err != nil {
224- return 0 , err
225- }
226- if ! bytes .Equal (peerTicketHello [:32 ], c .ticket ) {
227- return 0 , errors .New ("naughty boy" )
228- }
229- c .peerRandom = peerTicketHello [32 :]
230- }
231235 c .peerAEAD = NewAEAD (c .cipher , c .baseKey , c .peerRandom , c .ticket )
232236 c .peerNonce = make ([]byte , 12 )
233237 }
@@ -280,9 +284,6 @@ func (c *ServerConn) Write(b []byte) (int, error) {
280284 }
281285 n += len (b )
282286 if c .aead == nil {
283- if c .peerRandom == nil {
284- return 0 , errors .New ("empty c.peerRandom" )
285- }
286287 data = make ([]byte , 5 + 32 + 5 + len (b )+ 16 )
287288 EncodeHeader (data , 0 , 32 )
288289 rand .Read (data [5 : 5 + 32 ])
0 commit comments