Skip to content

Commit ae64131

Browse files
committed
Debug: use AVX2 for init and ghash
Also add assertions to check.
1 parent c0a1e8e commit ae64131

File tree

1 file changed

+54
-2
lines changed
  • module/icp/algs/modes

1 file changed

+54
-2
lines changed

module/icp/algs/modes/gcm.c

+54-2
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,50 @@ typedef struct {
10601060
uint64_t hi, lo;
10611061
} uint128_t;
10621062

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+
10631107
extern void ASMABI clear_fpu_regs_avx(void);
10641108
extern void ASMABI gcm_xor_avx(const uint8_t *src, uint8_t *dst);
10651109
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],
10751119
static inline void GHASH_AVX(gcm_ctx_t *ctx, const uint8_t *in, size_t len)
10761120
{
10771121
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);
10781126
gcm_ghash_vpclmulqdq_avx2(ctx->gcm_ghash,
10791127
(const uint64_t *)ctx->gcm_Htable, in, len);
1128+
assert_buf_eq(compare, ctx->gcm_ghash, sizeof(compare), "ghash mismatch");
10801129
} else {
10811130
gcm_ghash_avx(ctx->gcm_ghash,
10821131
(const uint64_t *)ctx->gcm_Htable, in, len);
@@ -1233,7 +1282,7 @@ gcm_mode_encrypt_contiguous_blocks_avx(gcm_ctx_t *ctx, char *data,
12331282
size_t done = 0;
12341283
uint8_t *datap = (uint8_t *)data;
12351284
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 ?
12371286
aesni_gcm_encrypt_avx2 : aesni_gcm_encrypt_avx;
12381287
const aes_key_t *key = ((aes_key_t *)ctx->gcm_keysched);
12391288
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)
14731522
B_FALSE);
14741523

14751524
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 ?
14771526
aesni_gcm_decrypt_avx2 : aesni_gcm_decrypt_avx;
14781527
size_t pt_len = ctx->gcm_processed_data_len - ctx->gcm_tag_len;
14791528
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,
16021651
(const uint32_t *)H, (uint32_t *)H);
16031652

16041653
if (ctx->gcm_use_avx2) {
1654+
uint64_t compare[(2 * 6 * 2)];
16051655
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");
16061658
} else {
16071659
gcm_init_htab_avx(ctx->gcm_Htable, H);
16081660
}

0 commit comments

Comments
 (0)