crypto: cryptd - Add support for cloning hashes
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 13 Apr 2023 06:24:25 +0000 (14:24 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 20 Apr 2023 10:20:04 +0000 (18:20 +0800)
Allow cryptd hashes to be cloned.  The underlying hash will be cloned.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/cryptd.c

index 43ce347..bbcc368 100644 (file)
@@ -446,6 +446,21 @@ 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);
@@ -678,6 +693,7 @@ 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;