Skip to content

Commit f3a83e0

Browse files
robnlundman
authored andcommitted
gcm_avx_init: zero the ghash state after hashing the IV
IVs != 96 bits get hashed with GHASH to bring them to 96 bits. Any call to GHASH will mix the ghash state in gcm_ghash. This is expected to be zero at first use in an encrypt or decrypt operation, so it needs to be zeroed after using GHASH in setup. gcm_init() does this, but gcm_avx_init() zeroed it before setup, not after, resulting in incorrect encrypt/decrypt results when using AVX GCM with an IV != 96 bits. OpenZFS _always_ uses a 96 bit IV (ZIO_DATA_IV_LEN) so this will never have been hit in any real-world use, which is extremely fortunate, as we would have incorrectly-encrypted data on-disk. Still, as long as we have this code here we should make sure it's correct. Thanks-to: Joel Low <joel@joelsplace.sg> Sponsored-by: https://despairlabs.com/sponsor/ Signed-off-by: Rob Norris <robn@despairlabs.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: Attila Fülöp <attila@fueloep.org>
1 parent 671ca05 commit f3a83e0

File tree

1 file changed

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

1 file changed

+2
-1
lines changed

module/icp/algs/modes/gcm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1467,7 +1467,6 @@ gcm_init_avx(gcm_ctx_t *ctx, const uint8_t *iv, size_t iv_len,
14671467
B_FALSE);
14681468

14691469
/* Init H (encrypt zero block) and create the initial counter block. */
1470-
memset(ctx->gcm_ghash, 0, sizeof (ctx->gcm_ghash));
14711470
memset(H, 0, sizeof (ctx->gcm_H));
14721471
kfpu_begin();
14731472
aes_encrypt_intel(keysched, aes_rounds,
@@ -1496,6 +1495,8 @@ gcm_init_avx(gcm_ctx_t *ctx, const uint8_t *iv, size_t iv_len,
14961495
kfpu_begin();
14971496
}
14981497

1498+
memset(ctx->gcm_ghash, 0, sizeof (ctx->gcm_ghash));
1499+
14991500
/* Openssl post increments the counter, adjust for that. */
15001501
gcm_incr_counter_block(ctx);
15011502

0 commit comments

Comments
 (0)