crypto: omap-aes-gcm - check length of assocdata in RFC4106 mode
authorArd Biesheuvel <ardb@kernel.org>
Tue, 5 Nov 2019 14:01:04 +0000 (16:01 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 11 Dec 2019 08:36:59 +0000 (16:36 +0800)
RFC4106 requires the associated data to be a certain size, so reject
inputs that are wrong. This also prevents crashes or other problems due
to assoclen becoming negative after subtracting 8 bytes.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Tero Kristo <t-kristo@ti.com>
Tested-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-aes-gcm.c

index 70398fb..1aabf9a 100644 (file)
@@ -365,7 +365,8 @@ int omap_aes_4106gcm_encrypt(struct aead_request *req)
 
        memcpy(rctx->iv, ctx->nonce, 4);
        memcpy(rctx->iv + 4, req->iv, 8);
-       return omap_aes_gcm_crypt(req, FLAGS_ENCRYPT | FLAGS_GCM |
+       return crypto_ipsec_check_assoclen(req->assoclen) ?:
+              omap_aes_gcm_crypt(req, FLAGS_ENCRYPT | FLAGS_GCM |
                                  FLAGS_RFC4106_GCM);
 }
 
@@ -376,7 +377,8 @@ int omap_aes_4106gcm_decrypt(struct aead_request *req)
 
        memcpy(rctx->iv, ctx->nonce, 4);
        memcpy(rctx->iv + 4, req->iv, 8);
-       return omap_aes_gcm_crypt(req, FLAGS_GCM | FLAGS_RFC4106_GCM);
+       return crypto_ipsec_check_assoclen(req->assoclen) ?:
+              omap_aes_gcm_crypt(req, FLAGS_GCM | FLAGS_RFC4106_GCM);
 }
 
 int omap_aes_gcm_setkey(struct crypto_aead *tfm, const u8 *key,