On Thu, May 30, 2019 at 6:51 PM Eric Biggers <ebiggers@xxxxxxxxxx> wrote: > > From: Eric Biggers <ebiggers@xxxxxxxxxx> > > Changing ghash_mod_init() to be subsys_initcall made it start running > before the alignment fault handler has been installed on ARM. In kernel > builds where the keys in the ghash test vectors happened to be > misaligned in the kernel image, this exposed the longstanding bug that > ghash_setkey() is incorrectly casting the key buffer (which can have any > alignment) to be128 for passing to gf128mul_init_4k_lle(). > > Fix this by memcpy()ing the key to a temporary buffer. > > Don't fix it by setting an alignmask on the algorithm instead because > that would unnecessarily force alignment of the data too. > > Fixes: 2cdc6899a88e ("crypto: ghash - Add GHASH digest algorithm for GCM") > Reported-by: Peter Robinson <pbrobinson@xxxxxxxxx> Tested-by: Peter Robinson <pbrobinson@xxxxxxxxx> That fixes the problems I was seeing, thanks for the quick response/fix. Peter > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx> > --- > crypto/ghash-generic.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c > index e6307935413c1..c8a347798eae6 100644 > --- a/crypto/ghash-generic.c > +++ b/crypto/ghash-generic.c > @@ -34,6 +34,7 @@ static int ghash_setkey(struct crypto_shash *tfm, > const u8 *key, unsigned int keylen) > { > struct ghash_ctx *ctx = crypto_shash_ctx(tfm); > + be128 k; > > if (keylen != GHASH_BLOCK_SIZE) { > crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); > @@ -42,7 +43,12 @@ static int ghash_setkey(struct crypto_shash *tfm, > > if (ctx->gf128) > gf128mul_free_4k(ctx->gf128); > - ctx->gf128 = gf128mul_init_4k_lle((be128 *)key); > + > + BUILD_BUG_ON(sizeof(k) != GHASH_BLOCK_SIZE); > + memcpy(&k, key, GHASH_BLOCK_SIZE); /* avoid violating alignment rules */ > + ctx->gf128 = gf128mul_init_4k_lle(&k); > + memzero_explicit(&k, GHASH_BLOCK_SIZE); > + > if (!ctx->gf128) > return -ENOMEM; > > -- > 2.22.0.rc1.257.g3120a18244-goog >