]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: ahash - Add support for drivers with no fallback
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 4 Jun 2025 09:54:41 +0000 (17:54 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Aug 2025 14:39:00 +0000 (16:39 +0200)
[ Upstream commit 4ccd065a69df163cd9fe0dd8e0f609f1eeb4723d ]

Some drivers cannot have a fallback, e.g., because the key is held
in hardware.  Allow these to be used with ahash by adding the bit
CRYPTO_ALG_NO_FALLBACK.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Tested-by: Harald Freudenberger <freude@linux.ibm.com>
Stable-dep-of: 1e2b7fcd3f07 ("crypto: ahash - Stop legacy tfms from using the set_virt fallback path")
Signed-off-by: Sasha Levin <sashal@kernel.org>
crypto/ahash.c
include/linux/crypto.h

index bc84a07c924c3bea4999f199f628668146c35ddf..3878b4da3cfdfe6f2658422cf331fc3d97f62d1c 100644 (file)
@@ -347,6 +347,9 @@ static int ahash_do_req_chain(struct ahash_request *req,
        if (crypto_ahash_statesize(tfm) > HASH_MAX_STATESIZE)
                return -ENOSYS;
 
+       if (!crypto_ahash_need_fallback(tfm))
+               return -ENOSYS;
+
        {
                u8 state[HASH_MAX_STATESIZE];
 
@@ -954,6 +957,10 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
            base->cra_reqsize > MAX_SYNC_HASH_REQSIZE)
                return -EINVAL;
 
+       if (base->cra_flags & CRYPTO_ALG_NEED_FALLBACK &&
+           base->cra_flags & CRYPTO_ALG_NO_FALLBACK)
+               return -EINVAL;
+
        err = hash_prepare_alg(&alg->halg);
        if (err)
                return err;
@@ -962,7 +969,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
        base->cra_flags |= CRYPTO_ALG_TYPE_AHASH;
 
        if ((base->cra_flags ^ CRYPTO_ALG_REQ_VIRT) &
-           (CRYPTO_ALG_ASYNC | CRYPTO_ALG_REQ_VIRT))
+           (CRYPTO_ALG_ASYNC | CRYPTO_ALG_REQ_VIRT) &&
+           !(base->cra_flags & CRYPTO_ALG_NO_FALLBACK))
                base->cra_flags |= CRYPTO_ALG_NEED_FALLBACK;
 
        if (!alg->setkey)
index b50f1954d1bbad1e6481d9ea8725757af630feeb..a2137e19be7d86846633e6d7acca6dec59e98c77 100644 (file)
 /* Set if the algorithm supports virtual addresses. */
 #define CRYPTO_ALG_REQ_VIRT            0x00040000
 
+/* Set if the algorithm cannot have a fallback (e.g., phmac). */
+#define CRYPTO_ALG_NO_FALLBACK         0x00080000
+
 /* The high bits 0xff000000 are reserved for type-specific flags. */
 
 /*