crypto: arm64/cbcmac - handle empty messages in same way as template
authorEric Biggers <ebiggers@google.com>
Sun, 31 Mar 2019 20:04:21 +0000 (13:04 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 8 Apr 2019 06:42:55 +0000 (14:42 +0800)
My patches to make testmgr fuzz algorithms against their generic
implementation detected that the arm64 implementations of "cbcmac(aes)"
handle empty messages differently from the cbcmac template.  Namely, the
arm64 implementations return the encrypted initial value, but the cbcmac
template returns the initial value directly.

This isn't actually a meaningful case because any user of cbcmac needs
to prepend the message length, as CCM does; otherwise it's insecure.
However, we should keep the behavior consistent; at the very least this
makes testing easier.

Do it the easy way, which is to change the arm64 implementations to have
the same behavior as the cbcmac template.

For what it's worth, ghash does things essentially the same way: it
returns its initial value when given an empty message, even though in
practice ghash is never passed an empty message.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm64/crypto/aes-glue.c

index 692cb75f2ca2ffe1cb2b6ae5bf7f4bf4fb13036f..f0ceb545bd1ee29dcb36daf6ebcb2043459da0a3 100644 (file)
@@ -707,7 +707,7 @@ static int cbcmac_final(struct shash_desc *desc, u8 *out)
        struct mac_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
        struct mac_desc_ctx *ctx = shash_desc_ctx(desc);
 
-       mac_do_update(&tctx->key, NULL, 0, ctx->dg, 1, 0);
+       mac_do_update(&tctx->key, NULL, 0, ctx->dg, (ctx->len != 0), 0);
 
        memcpy(out, ctx->dg, AES_BLOCK_SIZE);