@@ -1060,6 +1060,50 @@ typedef struct {
1060
1060
uint64_t hi , lo ;
1061
1061
} uint128_t ;
1062
1062
1063
+ static void
1064
+ dump_bin (char * out , size_t out_len , const void * in , size_t in_len )
1065
+ {
1066
+ const unsigned char * in_c = in ;
1067
+ const unsigned char * end = in_c + in_len ;
1068
+ for ( ; in_c != end ; in_c ++ ) {
1069
+ int count = snprintf (out , out_len , "%02x " , (unsigned )* in_c );
1070
+ if (out_len < count ) {
1071
+ break ;
1072
+ }
1073
+
1074
+ out_len -= count ;
1075
+ out += count ;
1076
+ }
1077
+ }
1078
+
1079
+ static void
1080
+ assert_buf_eq (const void * l , const void * r , size_t len , const char * msg )
1081
+ {
1082
+ if (!memcmp (l , r , len )) {
1083
+ return ;
1084
+ }
1085
+
1086
+ size_t compare_str_size = len * 3 + 1 ;
1087
+ char * compare_hex = vmem_alloc (compare_str_size , KM_SLEEP );
1088
+ if (!compare_hex ) {
1089
+ ASSERT0F (memcmp (l , r , len ), "%s" , msg );
1090
+ return ;
1091
+ }
1092
+ char * actual_hex = vmem_alloc (compare_str_size , KM_SLEEP );
1093
+ if (!actual_hex ) {
1094
+ ASSERT0F (memcmp (l , r , len ), "%s" , msg );
1095
+ goto free_compare ;
1096
+ }
1097
+
1098
+ dump_bin (compare_hex , compare_str_size , l , len );
1099
+ dump_bin (actual_hex , compare_str_size , r , len );
1100
+ ASSERT0F (memcmp (l , r , len ), "%s\nexpected: %s\nactual: %s" , msg , compare_hex , actual_hex );
1101
+
1102
+ vmem_free (actual_hex , compare_str_size );
1103
+ free_compare :
1104
+ vmem_free (compare_hex , compare_str_size );
1105
+ }
1106
+
1063
1107
extern void ASMABI clear_fpu_regs_avx (void );
1064
1108
extern void ASMABI gcm_xor_avx (const uint8_t * src , uint8_t * dst );
1065
1109
extern void ASMABI aes_encrypt_intel (const uint32_t rk [], int nr ,
@@ -1075,8 +1119,13 @@ extern void ASMABI gcm_ghash_vpclmulqdq_avx2(uint64_t ghash[2],
1075
1119
static inline void GHASH_AVX (gcm_ctx_t * ctx , const uint8_t * in , size_t len )
1076
1120
{
1077
1121
if (ctx -> gcm_use_avx2 ) {
1122
+ uint64_t compare [2 ];
1123
+ memcpy (compare , ctx -> gcm_ghash , sizeof (compare ));
1124
+ gcm_ghash_avx (compare ,
1125
+ (const uint64_t * )ctx -> gcm_Htable , in , len );
1078
1126
gcm_ghash_vpclmulqdq_avx2 (ctx -> gcm_ghash ,
1079
1127
(const uint64_t * )ctx -> gcm_Htable , in , len );
1128
+ assert_buf_eq (compare , ctx -> gcm_ghash , sizeof (compare ), "ghash mismatch" );
1080
1129
} else {
1081
1130
gcm_ghash_avx (ctx -> gcm_ghash ,
1082
1131
(const uint64_t * )ctx -> gcm_Htable , in , len );
@@ -1233,7 +1282,7 @@ gcm_mode_encrypt_contiguous_blocks_avx(gcm_ctx_t *ctx, char *data,
1233
1282
size_t done = 0 ;
1234
1283
uint8_t * datap = (uint8_t * )data ;
1235
1284
size_t chunk_size = (size_t )GCM_CHUNK_SIZE_READ ;
1236
- aesni_gcm_encrypt_impl * encrypt_blocks = ctx -> gcm_use_avx2 ?
1285
+ aesni_gcm_encrypt_impl * encrypt_blocks = B_FALSE ?
1237
1286
aesni_gcm_encrypt_avx2 : aesni_gcm_encrypt_avx ;
1238
1287
const aes_key_t * key = ((aes_key_t * )ctx -> gcm_keysched );
1239
1288
uint64_t * ghash = ctx -> gcm_ghash ;
@@ -1473,7 +1522,7 @@ gcm_decrypt_final_avx(gcm_ctx_t *ctx, crypto_data_t *out, size_t block_size)
1473
1522
B_FALSE );
1474
1523
1475
1524
size_t chunk_size = (size_t )GCM_CHUNK_SIZE_READ ;
1476
- aesni_gcm_decrypt_impl * decrypt_blocks = ctx -> gcm_use_avx2 ?
1525
+ aesni_gcm_decrypt_impl * decrypt_blocks = B_FALSE ?
1477
1526
aesni_gcm_decrypt_avx2 : aesni_gcm_decrypt_avx ;
1478
1527
size_t pt_len = ctx -> gcm_processed_data_len - ctx -> gcm_tag_len ;
1479
1528
uint8_t * datap = ctx -> gcm_pt_buf ;
@@ -1602,7 +1651,10 @@ gcm_init_avx(gcm_ctx_t *ctx, const uint8_t *iv, size_t iv_len,
1602
1651
(const uint32_t * )H , (uint32_t * )H );
1603
1652
1604
1653
if (ctx -> gcm_use_avx2 ) {
1654
+ uint64_t compare [(2 * 6 * 2 )];
1605
1655
gcm_init_vpclmulqdq_avx2 ((uint128_t * )ctx -> gcm_Htable , H );
1656
+ gcm_init_htab_avx (compare , H );
1657
+ assert_buf_eq (compare , ctx -> gcm_Htable , ctx -> gcm_htab_len , "htab differs" );
1606
1658
} else {
1607
1659
gcm_init_htab_avx (ctx -> gcm_Htable , H );
1608
1660
}
0 commit comments