@@ -38,7 +38,8 @@ struct netio {
38
38
};
39
39
40
40
struct crypto_ctx {
41
- crypto_aead_aes256gcm_state state ;
41
+ crypto_aead_aes256gcm_state state_r ;
42
+ crypto_aead_aes256gcm_state state_w ;
42
43
uint8_t nonce_r [crypto_aead_aes256gcm_NPUBBYTES ];
43
44
uint8_t nonce_w [crypto_aead_aes256gcm_NPUBBYTES ];
44
45
uint8_t skey [crypto_generichash_KEYBYTES ];
@@ -466,7 +467,7 @@ static int encrypt_packet (struct crypto_ctx *ctx, uint8_t *packet, size_t size,
466
467
packet + hs , size - hs ,
467
468
packet , hs ,
468
469
NULL , ctx -> nonce_w ,
469
- (const crypto_aead_aes256gcm_state * )& ctx -> state );
470
+ (const crypto_aead_aes256gcm_state * )& ctx -> state_w );
470
471
471
472
sodium_increment (ctx -> nonce_w , crypto_aead_aes256gcm_NPUBBYTES );
472
473
buffer -> write += ws ;
@@ -491,7 +492,7 @@ static int decrypt_packet (struct crypto_ctx *ctx, uint8_t *packet, size_t size,
491
492
buffer -> read + hs , rs - hs ,
492
493
packet , hs ,
493
494
ctx -> nonce_r ,
494
- (const crypto_aead_aes256gcm_state * )& ctx -> state ))
495
+ (const crypto_aead_aes256gcm_state * )& ctx -> state_r ))
495
496
return -1 ;
496
497
497
498
sodium_increment (ctx -> nonce_r , crypto_aead_aes256gcm_NPUBBYTES );
@@ -575,7 +576,7 @@ static int gt_setup_crypto (struct crypto_ctx *ctx, int fd, int listener)
575
576
uint8_t shared [crypto_scalarmult_BYTES ];
576
577
uint8_t key [crypto_aead_aes256gcm_KEYBYTES ];
577
578
578
- uint8_t data_r [size ], data_w [size ], data_x [ size ] ;
579
+ uint8_t data_r [size ], data_w [size ];
579
580
uint8_t hkey_c [hkey_size ];
580
581
581
582
randombytes_buf (data_w , nonce_size );
@@ -600,18 +601,22 @@ static int gt_setup_crypto (struct crypto_ctx *ctx, int fd, int listener)
600
601
if (listener && fd_write_all (fd , data_w , size )!= size )
601
602
return -1 ;
602
603
603
- for (size_t i = 0 ; i < size ; i ++ )
604
- data_x [i ] = data_r [i ]^data_w [i ];
605
-
606
604
crypto_scalarmult (shared , secret , & data_r [nonce_size ]);
607
605
608
606
crypto_generichash_state state ;
609
607
crypto_generichash_init (& state , ctx -> skey , sizeof (ctx -> skey ), sizeof (key ));
610
608
crypto_generichash_update (& state , shared , sizeof (shared ));
611
- crypto_generichash_update (& state , data_x , size );
609
+ crypto_generichash_update (& state , data_r , size );
610
+ crypto_generichash_update (& state , data_w , size );
612
611
crypto_generichash_final (& state , key , sizeof (key ));
612
+ crypto_aead_aes256gcm_beforenm (& ctx -> state_r , key );
613
613
614
- crypto_aead_aes256gcm_beforenm (& ctx -> state , key );
614
+ crypto_generichash_init (& state , ctx -> skey , sizeof (ctx -> skey ), sizeof (key ));
615
+ crypto_generichash_update (& state , shared , sizeof (shared ));
616
+ crypto_generichash_update (& state , data_w , size );
617
+ crypto_generichash_update (& state , data_r , size );
618
+ crypto_generichash_final (& state , key , sizeof (key ));
619
+ crypto_aead_aes256gcm_beforenm (& ctx -> state_w , key );
615
620
616
621
sodium_memzero (secret , sizeof (secret ));
617
622
sodium_memzero (shared , sizeof (shared ));
0 commit comments