@@ -894,6 +894,7 @@ typedef struct {
894
894
chacha20poly1305_ctx * chacha ;
895
895
unsigned char poly1305_key [POLY1305_KEYLEN ];
896
896
size_t aad_size ;
897
+ REBU64 sequence = 0 ;
897
898
898
899
if (ref_init ) {
899
900
ctx_ser = Make_Series (sizeof (chacha20poly1305_ctx ), (REBCNT )1 , FALSE);
@@ -911,19 +912,16 @@ typedef struct {
911
912
Trap1 (RE_INVALID_DATA , val_remote_key );
912
913
chacha20_keysetup (& chacha -> remote_chacha , VAL_BIN_AT (val_remote_key ), len );
913
914
914
- chacha -> local_sequence = 0 ;
915
- chacha -> remote_sequence = 0 ;
916
-
917
915
len = VAL_LEN (val_local_iv );
918
916
if (!(len == 12 || len == 8 ))
919
917
Trap1 (RE_INVALID_DATA , val_local_iv );
920
- chacha20_ivsetup (& chacha -> local_chacha , VAL_BIN_AT (val_local_iv ), len , 1 , (u8 * )& chacha -> local_sequence );
918
+ chacha20_ivsetup (& chacha -> local_chacha , VAL_BIN_AT (val_local_iv ), len , 1 , (u8 * )& sequence );
921
919
memcpy (chacha -> local_iv , VAL_BIN_AT (val_local_iv ), len );
922
920
923
921
len = VAL_LEN (val_remote_iv );
924
922
if (!(len == 12 || len == 8 ))
925
923
Trap1 (RE_INVALID_DATA , val_remote_iv );
926
- chacha20_ivsetup (& chacha -> remote_chacha , VAL_BIN_AT (val_remote_iv ), len , 1 , (u8 * )& chacha -> remote_sequence );
924
+ chacha20_ivsetup (& chacha -> remote_chacha , VAL_BIN_AT (val_remote_iv ), len , 1 , (u8 * )& sequence );
927
925
memcpy (chacha -> remote_iv , VAL_BIN_AT (val_remote_iv ), len );
928
926
return R_ARG1 ;
929
927
}
@@ -936,7 +934,7 @@ typedef struct {
936
934
chacha = (chacha20poly1305_ctx * )ctx_ser -> data ;
937
935
938
936
if (ref_encrypt ) {
939
- chacha20_ivsetup (& chacha -> local_chacha , chacha -> local_iv , 12 , 1 , ( u8 * ) & chacha -> local_sequence );
937
+ chacha20_ivsetup (& chacha -> local_chacha , chacha -> local_iv , 12 , 1 , VAL_BIN_AT ( val_local_aad ) );
940
938
chacha20_poly1305_key (& chacha -> local_chacha , poly1305_key );
941
939
//puts("poly1305_key:"); Dump_Bytes(poly1305_key, POLY1305_KEYLEN);
942
940
@@ -1006,18 +1004,12 @@ typedef struct {
1006
1004
poly1305_finish (& aead_ctx , mac_tag );
1007
1005
1008
1006
if (!poly1305_verify (mac_tag , VAL_BIN_TAIL (val_cipher ) - POLY1305_TAGLEN )) {
1009
- puts ("MAC verification failed!" );
1010
- }
1011
- else {
1012
- puts ("MAC OK!" );
1007
+ //puts("MAC verification failed!");
1008
+ return R_NONE ;
1013
1009
}
1014
1010
1015
1011
//puts("mac result:"); Dump_Bytes(mac_tag, POLY1305_TAGLEN);
1016
1012
1017
- chacha -> remote_sequence ++ ;
1018
-
1019
-
1020
-
1021
1013
SERIES_TAIL (ctx_ser ) = len ;
1022
1014
SET_BINARY (val_ctx , ctx_ser );
1023
1015
}
0 commit comments