]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: hash - Remove support for cloning hash tfms
authorEric Biggers <ebiggers@kernel.org>
Fri, 22 May 2026 05:30:23 +0000 (00:30 -0500)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 May 2026 00:45:45 +0000 (17:45 -0700)
Hash transformation cloning no longer has a user, and there's a good
chance no new one will appear because the library API solves the problem
in a much simpler and more efficient way.  Remove support for it.

Note that no tests need to be removed, as this feature had no tests.

Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Link: https://patch.msgid.link/20260522053028.91165-2-ebiggers@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
crypto/ahash.c
crypto/cmac.c
crypto/cryptd.c
crypto/hmac.c
crypto/shash.c
include/crypto/hash.h

index 7a730324c50e2858a44f99affa03100936dca862..85dcd120de3ee0c962ce1a6c5fbf9fb0e3f76486 100644 (file)
@@ -862,76 +862,6 @@ bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg)
 }
 EXPORT_SYMBOL_GPL(crypto_hash_alg_has_setkey);
 
-struct crypto_ahash *crypto_clone_ahash(struct crypto_ahash *hash)
-{
-       struct hash_alg_common *halg = crypto_hash_alg_common(hash);
-       struct crypto_tfm *tfm = crypto_ahash_tfm(hash);
-       struct crypto_ahash *fb = NULL;
-       struct crypto_ahash *nhash;
-       struct ahash_alg *alg;
-       int err;
-
-       if (!crypto_hash_alg_has_setkey(halg)) {
-               tfm = crypto_tfm_get(tfm);
-               if (IS_ERR(tfm))
-                       return ERR_CAST(tfm);
-
-               return hash;
-       }
-
-       nhash = crypto_clone_tfm(&crypto_ahash_type, tfm);
-
-       if (IS_ERR(nhash))
-               return nhash;
-
-       nhash->reqsize = hash->reqsize;
-       nhash->statesize = hash->statesize;
-
-       if (likely(hash->using_shash)) {
-               struct crypto_shash **nctx = crypto_ahash_ctx(nhash);
-               struct crypto_shash *shash;
-
-               shash = crypto_clone_shash(ahash_to_shash(hash));
-               if (IS_ERR(shash)) {
-                       err = PTR_ERR(shash);
-                       goto out_free_nhash;
-               }
-               crypto_ahash_tfm(nhash)->exit = crypto_exit_ahash_using_shash;
-               nhash->using_shash = true;
-               *nctx = shash;
-               return nhash;
-       }
-
-       if (crypto_ahash_need_fallback(hash)) {
-               fb = crypto_clone_ahash(crypto_ahash_fb(hash));
-               err = PTR_ERR(fb);
-               if (IS_ERR(fb))
-                       goto out_free_nhash;
-
-               crypto_ahash_tfm(nhash)->fb = crypto_ahash_tfm(fb);
-       }
-
-       err = -ENOSYS;
-       alg = crypto_ahash_alg(hash);
-       if (!alg->clone_tfm)
-               goto out_free_fb;
-
-       err = alg->clone_tfm(nhash, hash);
-       if (err)
-               goto out_free_fb;
-
-       crypto_ahash_tfm(nhash)->exit = crypto_ahash_exit_tfm;
-
-       return nhash;
-
-out_free_fb:
-       crypto_free_ahash(fb);
-out_free_nhash:
-       crypto_free_ahash(nhash);
-       return ERR_PTR(err);
-}
-EXPORT_SYMBOL_GPL(crypto_clone_ahash);
-
 static int ahash_default_export_core(struct ahash_request *req, void *out)
 {
        return -ENOSYS;
index 1b03964abe0079a0f67632a47e83d4dbb733f654..83e58937f0136680ab19f7b4aca392bb6e0af092 100644 (file)
@@ -151,21 +151,6 @@ static int cmac_init_tfm(struct crypto_shash *tfm)
        return 0;
 }
 
-static int cmac_clone_tfm(struct crypto_shash *tfm, struct crypto_shash *otfm)
-{
-       struct cmac_tfm_ctx *octx = crypto_shash_ctx(otfm);
-       struct cmac_tfm_ctx *ctx = crypto_shash_ctx(tfm);
-       struct crypto_cipher *cipher;
-
-       cipher = crypto_clone_cipher(octx->child);
-       if (IS_ERR(cipher))
-               return PTR_ERR(cipher);
-
-       ctx->child = cipher;
-
-       return 0;
-}
-
 static void cmac_exit_tfm(struct crypto_shash *tfm)
 {
        struct cmac_tfm_ctx *ctx = crypto_shash_ctx(tfm);
@@ -222,7 +207,6 @@ static int cmac_create(struct crypto_template *tmpl, struct rtattr **tb)
        inst->alg.finup = crypto_cmac_digest_finup;
        inst->alg.setkey = crypto_cmac_digest_setkey;
        inst->alg.init_tfm = cmac_init_tfm;
-       inst->alg.clone_tfm = cmac_clone_tfm;
        inst->alg.exit_tfm = cmac_exit_tfm;
 
        inst->free = shash_free_singlespawn_instance;
index aba9fe0f23b4ad8389ad81ff50f1ad55c000cf69..d8dbf07ab4269f6c9de7b9364c11aa28005ca4c0 100644 (file)
@@ -452,21 +452,6 @@ static int cryptd_hash_init_tfm(struct crypto_ahash *tfm)
        return 0;
 }
 
-static int cryptd_hash_clone_tfm(struct crypto_ahash *ntfm,
-                                struct crypto_ahash *tfm)
-{
-       struct cryptd_hash_ctx *nctx = crypto_ahash_ctx(ntfm);
-       struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm);
-       struct crypto_shash *hash;
-
-       hash = crypto_clone_shash(ctx->child);
-       if (IS_ERR(hash))
-               return PTR_ERR(hash);
-
-       nctx->child = hash;
-       return 0;
-}
-
 static void cryptd_hash_exit_tfm(struct crypto_ahash *tfm)
 {
        struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm);
@@ -700,7 +685,6 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
        inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
 
        inst->alg.init_tfm = cryptd_hash_init_tfm;
-       inst->alg.clone_tfm = cryptd_hash_clone_tfm;
        inst->alg.exit_tfm = cryptd_hash_exit_tfm;
 
        inst->alg.init   = cryptd_hash_init_enqueue;
index 148af460ae974351ce3d58c8f0ca9c44d9273fe7..807e08b252c55551105c31838545dc559226db2f 100644 (file)
@@ -158,20 +158,6 @@ static int hmac_init_tfm(struct crypto_shash *parent)
        return 0;
 }
 
-static int hmac_clone_tfm(struct crypto_shash *dst, struct crypto_shash *src)
-{
-       struct hmac_ctx *sctx = crypto_shash_ctx(src);
-       struct hmac_ctx *dctx = crypto_shash_ctx(dst);
-       struct crypto_shash *hash;
-
-       hash = crypto_clone_shash(sctx->hash);
-       if (IS_ERR(hash))
-               return PTR_ERR(hash);
-
-       dctx->hash = hash;
-       return 0;
-}
-
 static void hmac_exit_tfm(struct crypto_shash *parent)
 {
        struct hmac_ctx *tctx = crypto_shash_ctx(parent);
@@ -235,7 +221,6 @@ static int __hmac_create_shash(struct crypto_template *tmpl,
        inst->alg.import_core = hmac_import_core;
        inst->alg.setkey = hmac_setkey;
        inst->alg.init_tfm = hmac_init_tfm;
-       inst->alg.clone_tfm = hmac_clone_tfm;
        inst->alg.exit_tfm = hmac_exit_tfm;
 
        inst->free = shash_free_singlespawn_instance;
@@ -423,21 +408,6 @@ static int hmac_init_ahash_tfm(struct crypto_ahash *parent)
        return 0;
 }
 
-static int hmac_clone_ahash_tfm(struct crypto_ahash *dst,
-                               struct crypto_ahash *src)
-{
-       struct ahash_hmac_ctx *sctx = crypto_ahash_ctx(src);
-       struct ahash_hmac_ctx *dctx = crypto_ahash_ctx(dst);
-       struct crypto_ahash *hash;
-
-       hash = crypto_clone_ahash(sctx->hash);
-       if (IS_ERR(hash))
-               return PTR_ERR(hash);
-
-       dctx->hash = hash;
-       return 0;
-}
-
 static void hmac_exit_ahash_tfm(struct crypto_ahash *parent)
 {
        struct ahash_hmac_ctx *tctx = crypto_ahash_ctx(parent);
@@ -503,7 +473,6 @@ static int hmac_create_ahash(struct crypto_template *tmpl, struct rtattr **tb,
        inst->alg.import_core = hmac_import_core_ahash;
        inst->alg.setkey = hmac_setkey_ahash;
        inst->alg.init_tfm = hmac_init_ahash_tfm;
-       inst->alg.clone_tfm = hmac_clone_ahash_tfm;
        inst->alg.exit_tfm = hmac_exit_ahash_tfm;
 
        inst->free = ahash_free_singlespawn_instance;
index 2f07d0bd1f61b62e14941316061b4bae866c9322..351cba3c11070f9ef7b2170b870784101328cb25 100644 (file)
@@ -395,43 +395,6 @@ int crypto_has_shash(const char *alg_name, u32 type, u32 mask)
 }
 EXPORT_SYMBOL_GPL(crypto_has_shash);
 
-struct crypto_shash *crypto_clone_shash(struct crypto_shash *hash)
-{
-       struct crypto_tfm *tfm = crypto_shash_tfm(hash);
-       struct shash_alg *alg = crypto_shash_alg(hash);
-       struct crypto_shash *nhash;
-       int err;
-
-       if (!crypto_shash_alg_has_setkey(alg)) {
-               tfm = crypto_tfm_get(tfm);
-               if (IS_ERR(tfm))
-                       return ERR_CAST(tfm);
-
-               return hash;
-       }
-
-       if (!alg->clone_tfm && (alg->init_tfm || alg->base.cra_init))
-               return ERR_PTR(-ENOSYS);
-
-       nhash = crypto_clone_tfm(&crypto_shash_type, tfm);
-       if (IS_ERR(nhash))
-               return nhash;
-
-       if (alg->clone_tfm) {
-               err = alg->clone_tfm(nhash, hash);
-               if (err) {
-                       crypto_free_shash(nhash);
-                       return ERR_PTR(err);
-               }
-       }
-
-       if (alg->exit_tfm)
-               crypto_shash_tfm(nhash)->exit = crypto_shash_exit_tfm;
-
-       return nhash;
-}
-EXPORT_SYMBOL_GPL(crypto_clone_shash);
-
 int hash_prepare_alg(struct hash_alg_common *alg)
 {
        struct crypto_alg *base = &alg->base;
index 586700332c731b0ae443a258380348ddf203bf35..e474f8461ea1990ee2f5357b33c4d67bd6551a7a 100644 (file)
@@ -148,7 +148,6 @@ struct ahash_request {
  * @exit_tfm: Deinitialize the cryptographic transformation object.
  *           This is a counterpart to @init_tfm, used to remove
  *           various changes set in @init_tfm.
- * @clone_tfm: Copy transform into new object, may allocate memory.
  * @halg: see struct hash_alg_common
  */
 struct ahash_alg {
@@ -165,7 +164,6 @@ struct ahash_alg {
                      unsigned int keylen);
        int (*init_tfm)(struct crypto_ahash *tfm);
        void (*exit_tfm)(struct crypto_ahash *tfm);
-       int (*clone_tfm)(struct crypto_ahash *dst, struct crypto_ahash *src);
 
        struct hash_alg_common halg;
 };
@@ -239,7 +237,6 @@ struct shash_desc {
  * @exit_tfm: Deinitialize the cryptographic transformation object.
  *           This is a counterpart to @init_tfm, used to remove
  *           various changes set in @init_tfm.
- * @clone_tfm: Copy transform into new object, may allocate memory.
  * @descsize: Size of the operational state for the message digest. This state
  *           size is the memory size that needs to be allocated for
  *           shash_desc.__ctx
@@ -263,7 +260,6 @@ struct shash_alg {
                      unsigned int keylen);
        int (*init_tfm)(struct crypto_shash *tfm);
        void (*exit_tfm)(struct crypto_shash *tfm);
-       int (*clone_tfm)(struct crypto_shash *dst, struct crypto_shash *src);
 
        unsigned int descsize;
 
@@ -322,8 +318,6 @@ static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm)
 struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type,
                                        u32 mask);
 
-struct crypto_ahash *crypto_clone_ahash(struct crypto_ahash *tfm);
-
 static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm)
 {
        return &tfm->base;
@@ -759,8 +753,6 @@ static inline void ahash_request_set_virt(struct ahash_request *req,
 struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type,
                                        u32 mask);
 
-struct crypto_shash *crypto_clone_shash(struct crypto_shash *tfm);
-
 int crypto_has_shash(const char *alg_name, u32 type, u32 mask);
 
 static inline struct crypto_tfm *crypto_shash_tfm(struct crypto_shash *tfm)