summaryrefslogtreecommitdiff
path: root/crypto/ahash.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2025-04-23 17:22:28 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2025-04-28 19:40:54 +0800
commit19da081a28c95fe9b03ce952a2bf4a6f6bf5112c (patch)
tree224f4fc987087caa04437c1c10b26256cb7b245d /crypto/ahash.c
parentaf9ce62783dd6acd595491badec08f1235c84739 (diff)
crypto: api - Add crypto_request_clone and fb
Add a helper to clone crypto requests and eliminate code duplication. Use kmemdup in the helper. Also add an fb field to crypto_tfm. This also happens to fix the existing implementations which were buggy. Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202504230118.1CxUaUoX-lkp@intel.com/ Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202504230004.c7mrY0C6-lkp@intel.com/ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/ahash.c')
-rw-r--r--crypto/ahash.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/crypto/ahash.c b/crypto/ahash.c
index 7a74092323b9..9b813f7b9177 100644
--- a/crypto/ahash.c
+++ b/crypto/ahash.c
@@ -12,13 +12,11 @@
* Copyright (c) 2008 Loc Ho <lho@amcc.com>
*/
-#include <crypto/scatterwalk.h>
#include <linux/cryptouser.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/module.h>
-#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/seq_file.h>
#include <linux/string.h>
@@ -301,7 +299,8 @@ int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
err = alg->setkey(tfm, key, keylen);
if (!err && ahash_is_async(tfm))
- err = crypto_ahash_setkey(tfm->fb, key, keylen);
+ err = crypto_ahash_setkey(crypto_ahash_fb(tfm),
+ key, keylen);
if (unlikely(err)) {
ahash_set_needkey(tfm, alg);
return err;
@@ -732,7 +731,7 @@ static void crypto_ahash_exit_tfm(struct crypto_tfm *tfm)
tfm->__crt_alg->cra_exit(tfm);
if (ahash_is_async(hash))
- crypto_free_ahash(hash->fb);
+ crypto_free_ahash(crypto_ahash_fb(hash));
}
static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
@@ -745,8 +744,6 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
crypto_ahash_set_statesize(hash, alg->halg.statesize);
crypto_ahash_set_reqsize(hash, crypto_tfm_alg_reqsize(tfm));
- hash->fb = hash;
-
if (tfm->__crt_alg->cra_type == &crypto_shash_type)
return crypto_init_ahash_using_shash(tfm);
@@ -756,7 +753,7 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
if (IS_ERR(fb))
return PTR_ERR(fb);
- hash->fb = fb;
+ tfm->fb = crypto_ahash_tfm(fb);
}
ahash_set_needkey(hash, alg);
@@ -1036,7 +1033,7 @@ EXPORT_SYMBOL_GPL(ahash_request_free);
int crypto_hash_digest(struct crypto_ahash *tfm, const u8 *data,
unsigned int len, u8 *out)
{
- HASH_REQUEST_ON_STACK(req, tfm->fb);
+ HASH_REQUEST_ON_STACK(req, crypto_ahash_fb(tfm));
int err;
ahash_request_set_callback(req, 0, NULL, NULL);
@@ -1049,24 +1046,5 @@ int crypto_hash_digest(struct crypto_ahash *tfm, const u8 *data,
}
EXPORT_SYMBOL_GPL(crypto_hash_digest);
-struct ahash_request *ahash_request_clone(struct ahash_request *req,
- size_t total, gfp_t gfp)
-{
- struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
- struct ahash_request *nreq;
-
- nreq = kmalloc(total, gfp);
- if (!nreq) {
- ahash_request_set_tfm(req, tfm->fb);
- req->base.flags = CRYPTO_TFM_REQ_ON_STACK;
- return req;
- }
-
- memcpy(nreq, req, total);
- ahash_request_set_tfm(req, tfm);
- return req;
-}
-EXPORT_SYMBOL_GPL(ahash_request_clone);
-
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Asynchronous cryptographic hash type");