]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: caam - fix overflow on long hmac keys
authorHoria Geantă <horia.geanta@nxp.com>
Tue, 17 Mar 2026 10:25:14 +0000 (12:25 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 26 Mar 2026 09:10:58 +0000 (18:10 +0900)
When a key longer than block size is supplied, it is copied and then
hashed into the real key.  The memory allocated for the copy needs to
be rounded to DMA cache alignment, as otherwise the hashed key may
corrupt neighbouring memory.

The copying is performed using kmemdup, however this leads to an overflow:
reading more bytes (aligned_len - keylen) from the keylen source buffer.
Fix this by replacing kmemdup with kmalloc, followed by memcpy.

Fixes: 199354d7fb6e ("crypto: caam - Remove GFP_DMA and add DMA alignment padding")
Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamalg_qi2.c

index 167372936ca7003dd6d38139a3ca7d80824a00bc..78964e1712e581e1ffd451ebcf109fd6232397db 100644 (file)
@@ -3326,9 +3326,10 @@ static int ahash_setkey(struct crypto_ahash *ahash, const u8 *key,
                if (aligned_len < keylen)
                        return -EOVERFLOW;
 
-               hashed_key = kmemdup(key, aligned_len, GFP_KERNEL);
+               hashed_key = kmalloc(aligned_len, GFP_KERNEL);
                if (!hashed_key)
                        return -ENOMEM;
+               memcpy(hashed_key, key, keylen);
                ret = hash_digest_key(ctx, &keylen, hashed_key, digestsize);
                if (ret)
                        goto bad_free_key;