]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: ahash - Fix crypto_ahash_import with partial block data
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Nov 2025 05:36:03 +0000 (13:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 24 Nov 2025 09:52:30 +0000 (17:52 +0800)
Restore the partial block buffer in crypto_ahash_import by copying
it.  Check whether the partial block buffer exceeds the maximum
size and return -EOVERFLOW if it does.

Zero the partial block buffer in crypto_ahash_import_core.

Reported-by: T Pratham <t-pratham@ti.com>
Tested-by: T Pratham <t-pratham@ti.com>
Fixes: 9d7a0ab1c753 ("crypto: ahash - Handle partial blocks in API")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/ahash.c

index dfb4f5476428fcd0ab94fe08da924df9f105aed3..819b484a1a003ce400929c66a7018d39863672fb 100644 (file)
@@ -661,6 +661,12 @@ int crypto_ahash_import_core(struct ahash_request *req, const void *in)
                                                in);
        if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
                return -ENOKEY;
+       if (crypto_ahash_block_only(tfm)) {
+               unsigned int reqsize = crypto_ahash_reqsize(tfm);
+               u8 *buf = ahash_request_ctx(req);
+
+               buf[reqsize - 1] = 0;
+       }
        return crypto_ahash_alg(tfm)->import_core(req, in);
 }
 EXPORT_SYMBOL_GPL(crypto_ahash_import_core);
@@ -674,10 +680,14 @@ int crypto_ahash_import(struct ahash_request *req, const void *in)
        if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
                return -ENOKEY;
        if (crypto_ahash_block_only(tfm)) {
+               unsigned int plen = crypto_ahash_blocksize(tfm) + 1;
                unsigned int reqsize = crypto_ahash_reqsize(tfm);
+               unsigned int ss = crypto_ahash_statesize(tfm);
                u8 *buf = ahash_request_ctx(req);
 
-               buf[reqsize - 1] = 0;
+               memcpy(buf + reqsize - plen, in + ss - plen, plen);
+               if (buf[reqsize - 1] >= plen)
+                       return -EOVERFLOW;
        }
        return crypto_ahash_alg(tfm)->import(req, in);
 }