summaryrefslogtreecommitdiffstats
path: root/module/icp/io
diff options
context:
space:
mode:
authorAttila Fülöp <[email protected]>2020-10-30 23:24:21 +0100
committerGitHub <[email protected]>2020-10-30 15:24:21 -0700
commite8beeaa1116cc771360a24c9c1f9e6f47ced0e28 (patch)
tree2abe313d9fa753ef2ade6a19781641841d3b0c86 /module/icp/io
parentd9655c5b3723abc21dc2915e8d6aecf22d842527 (diff)
ICP: gcm: Allocate hash subkey table separately
While evaluating other assembler implementations it turns out that the precomputed hash subkey tables vary in size, from 8*16 bytes (avx2/avx512) up to 48*16 bytes (avx512-vaes), depending on the implementation. To be able to handle the size differences later, allocate `gcm_Htable` dynamically rather then having a fixed size array, and adapt consumers. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Attila Fülöp <[email protected]> Closes #11102
Diffstat (limited to 'module/icp/io')
-rw-r--r--module/icp/io/aes.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/module/icp/io/aes.c b/module/icp/io/aes.c
index 96fb6bb1a..e540af447 100644
--- a/module/icp/io/aes.c
+++ b/module/icp/io/aes.c
@@ -1051,6 +1051,16 @@ out:
bzero(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
kmem_free(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
}
+#ifdef CAN_USE_GCM_ASM
+ if (aes_ctx.ac_flags & (GCM_MODE|GMAC_MODE) &&
+ ((gcm_ctx_t *)&aes_ctx)->gcm_Htable != NULL) {
+
+ gcm_ctx_t *ctx = (gcm_ctx_t *)&aes_ctx;
+
+ bzero(ctx->gcm_Htable, ctx->gcm_htab_len);
+ kmem_free(ctx->gcm_Htable, ctx->gcm_htab_len);
+ }
+#endif
return (ret);
}
@@ -1209,6 +1219,14 @@ out:
vmem_free(((gcm_ctx_t *)&aes_ctx)->gcm_pt_buf,
((gcm_ctx_t *)&aes_ctx)->gcm_pt_buf_len);
}
+#ifdef CAN_USE_GCM_ASM
+ if (((gcm_ctx_t *)&aes_ctx)->gcm_Htable != NULL) {
+ gcm_ctx_t *ctx = (gcm_ctx_t *)&aes_ctx;
+
+ bzero(ctx->gcm_Htable, ctx->gcm_htab_len);
+ kmem_free(ctx->gcm_Htable, ctx->gcm_htab_len);
+ }
+#endif
}
return (ret);