@@ -102,7 +102,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
102102 if i .NfsSKeys == nil {
103103 return nil , errors .New ("uninitialized" )
104104 }
105- c := NewCommonConn (conn )
105+ c := NewCommonConn (conn , true )
106106
107107 ivAndRelays := make ([]byte , 16 + i .RelaysLength )
108108 if _ , err := io .ReadFull (conn , ivAndRelays ); err != nil {
@@ -151,16 +151,21 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
151151 }
152152 relays = relays [32 :]
153153 }
154- nfsGCM := NewGCM (iv , nfsKey )
154+ nfsAEAD := NewAEAD (iv , nfsKey , c . UseAES )
155155
156156 encryptedLength := make ([]byte , 18 )
157157 if _ , err := io .ReadFull (conn , encryptedLength ); err != nil {
158158 return nil , err
159159 }
160- if _ , err := nfsGCM .Open (encryptedLength [:0 ], nil , encryptedLength , nil ); err != nil {
161- return nil , err
160+ decryptedLength := make ([]byte , 2 )
161+ if _ , err := nfsAEAD .Open (decryptedLength [:0 ], nil , encryptedLength , nil ); err != nil {
162+ c .UseAES = ! c .UseAES
163+ nfsAEAD = NewAEAD (iv , nfsKey , c .UseAES )
164+ if _ , err := nfsAEAD .Open (decryptedLength [:0 ], nil , encryptedLength , nil ); err != nil {
165+ return nil , err
166+ }
162167 }
163- length := DecodeLength (encryptedLength [: 2 ] )
168+ length := DecodeLength (decryptedLength )
164169
165170 if length == 32 {
166171 if i .Seconds == 0 {
@@ -170,7 +175,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
170175 if _ , err := io .ReadFull (conn , encryptedTicket ); err != nil {
171176 return nil , err
172177 }
173- ticket , err := nfsGCM .Open (nil , nil , encryptedTicket , nil )
178+ ticket , err := nfsAEAD .Open (nil , nil , encryptedTicket , nil )
174179 if err != nil {
175180 return nil , err
176181 }
@@ -193,8 +198,8 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
193198 c .UnitedKey = append (s .PfsKey , nfsKey ... ) // the same nfsKey links the upload & download (prevents server -> client's another request)
194199 c .PreWrite = make ([]byte , 16 )
195200 rand .Read (c .PreWrite ) // always trust yourself, not the client (also prevents being parsed as TLS thus causing false interruption for "native" and "xorpub")
196- c .GCM = NewGCM (c .PreWrite , c .UnitedKey )
197- c .PeerGCM = NewGCM (encryptedTicket , c .UnitedKey ) // unchangeable ctx (prevents server -> server), and different ctx length for upload / download (prevents client -> client)
201+ c .AEAD = NewAEAD (c .PreWrite , c .UnitedKey , c . UseAES )
202+ c .PeerAEAD = NewAEAD (encryptedTicket , c .UnitedKey , c . UseAES ) // unchangeable ctx (prevents server -> server), and different ctx length for upload / download (prevents client -> client)
198203 if i .XorMode == 2 {
199204 c .Conn = NewXorConn (conn , NewCTR (c .UnitedKey , c .PreWrite ), NewCTR (c .UnitedKey , iv ), 16 , 0 ) // it doesn't matter if the attacker sends client's iv back to the client
200205 }
@@ -208,7 +213,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
208213 if _ , err := io .ReadFull (conn , encryptedPfsPublicKey ); err != nil {
209214 return nil , err
210215 }
211- if _ , err := nfsGCM .Open (encryptedPfsPublicKey [:0 ], nil , encryptedPfsPublicKey , nil ); err != nil {
216+ if _ , err := nfsAEAD .Open (encryptedPfsPublicKey [:0 ], nil , encryptedPfsPublicKey , nil ); err != nil {
212217 return nil , err
213218 }
214219 mlkem768EKey , err := mlkem .NewEncapsulationKey768 (encryptedPfsPublicKey [:1184 ])
@@ -230,8 +235,8 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
230235 copy (pfsKey [32 :], x25519Key )
231236 pfsPublicKey := append (encapsulatedPfsKey , x25519SKey .PublicKey ().Bytes ()... )
232237 c .UnitedKey = append (pfsKey , nfsKey ... )
233- c .GCM = NewGCM (pfsPublicKey , c .UnitedKey )
234- c .PeerGCM = NewGCM (encryptedPfsPublicKey [:1184 + 32 ], c .UnitedKey )
238+ c .AEAD = NewAEAD (pfsPublicKey , c .UnitedKey , c . UseAES )
239+ c .PeerAEAD = NewAEAD (encryptedPfsPublicKey [:1184 + 32 ], c .UnitedKey , c . UseAES )
235240 ticket := make ([]byte , 16 )
236241 rand .Read (ticket )
237242 copy (ticket , EncodeLength (int (i .Seconds * 4 / 5 )))
@@ -240,11 +245,11 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
240245 encryptedTicketLength := 32
241246 paddingLength := int (crypto .RandBetween (100 , 1000 ))
242247 serverHello := make ([]byte , pfsKeyExchangeLength + encryptedTicketLength + paddingLength )
243- nfsGCM .Seal (serverHello [:0 ], MaxNonce , pfsPublicKey , nil )
244- c .GCM .Seal (serverHello [:pfsKeyExchangeLength ], nil , ticket , nil )
248+ nfsAEAD .Seal (serverHello [:0 ], MaxNonce , pfsPublicKey , nil )
249+ c .AEAD .Seal (serverHello [:pfsKeyExchangeLength ], nil , ticket , nil )
245250 padding := serverHello [pfsKeyExchangeLength + encryptedTicketLength :]
246- c .GCM .Seal (padding [:0 ], nil , EncodeLength (paddingLength - 18 ), nil )
247- c .GCM .Seal (padding [:18 ], nil , padding [18 :paddingLength - 16 ], nil )
251+ c .AEAD .Seal (padding [:0 ], nil , EncodeLength (paddingLength - 18 ), nil )
252+ c .AEAD .Seal (padding [:18 ], nil , padding [18 :paddingLength - 16 ], nil )
248253
249254 if _ , err := conn .Write (serverHello ); err != nil {
250255 return nil , err
@@ -264,14 +269,14 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*CommonConn, error) {
264269 if _ , err := io .ReadFull (conn , encryptedLength ); err != nil {
265270 return nil , err
266271 }
267- if _ , err := nfsGCM .Open (encryptedLength [:0 ], nil , encryptedLength , nil ); err != nil {
272+ if _ , err := nfsAEAD .Open (encryptedLength [:0 ], nil , encryptedLength , nil ); err != nil {
268273 return nil , err
269274 }
270275 encryptedPadding := make ([]byte , DecodeLength (encryptedLength [:2 ]))
271276 if _ , err := io .ReadFull (conn , encryptedPadding ); err != nil {
272277 return nil , err
273278 }
274- if _ , err := nfsGCM .Open (encryptedPadding [:0 ], nil , encryptedPadding , nil ); err != nil {
279+ if _ , err := nfsAEAD .Open (encryptedPadding [:0 ], nil , encryptedPadding , nil ); err != nil {
275280 return nil , err
276281 }
277282
0 commit comments