]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - crypto/ccm.c
Merge tag 'iommu-updates-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[mirror_ubuntu-jammy-kernel.git] / crypto / ccm.c
index a9fb46f22eaaff10a1c95ea4b636daef2b089843..241ecdc5c4e0e6f111b41eb5576368bb6d753b60 100644 (file)
@@ -866,7 +866,7 @@ static int cbcmac_init_tfm(struct crypto_tfm *tfm)
 {
        struct crypto_cipher *cipher;
        struct crypto_instance *inst = (void *)tfm->__crt_alg;
-       struct crypto_spawn *spawn = crypto_instance_ctx(inst);
+       struct crypto_cipher_spawn *spawn = crypto_instance_ctx(inst);
        struct cbcmac_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
 
        cipher = crypto_spawn_cipher(spawn);
@@ -887,6 +887,7 @@ static void cbcmac_exit_tfm(struct crypto_tfm *tfm)
 static int cbcmac_create(struct crypto_template *tmpl, struct rtattr **tb)
 {
        struct shash_instance *inst;
+       struct crypto_cipher_spawn *spawn;
        struct crypto_alg *alg;
        int err;
 
@@ -894,21 +895,20 @@ static int cbcmac_create(struct crypto_template *tmpl, struct rtattr **tb)
        if (err)
                return err;
 
-       alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER,
-                                 CRYPTO_ALG_TYPE_MASK);
-       if (IS_ERR(alg))
-               return PTR_ERR(alg);
+       inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
+       if (!inst)
+               return -ENOMEM;
+       spawn = shash_instance_ctx(inst);
 
-       inst = shash_alloc_instance("cbcmac", alg);
-       err = PTR_ERR(inst);
-       if (IS_ERR(inst))
-               goto out_put_alg;
+       err = crypto_grab_cipher(spawn, shash_crypto_instance(inst),
+                                crypto_attr_alg_name(tb[1]), 0, 0);
+       if (err)
+               goto err_free_inst;
+       alg = crypto_spawn_cipher_alg(spawn);
 
-       err = crypto_init_spawn(shash_instance_ctx(inst), alg,
-                               shash_crypto_instance(inst),
-                               CRYPTO_ALG_TYPE_MASK);
+       err = crypto_inst_setname(shash_crypto_instance(inst), tmpl->name, alg);
        if (err)
-               goto out_free_inst;
+               goto err_free_inst;
 
        inst->alg.base.cra_priority = alg->cra_priority;
        inst->alg.base.cra_blocksize = 1;
@@ -927,14 +927,13 @@ static int cbcmac_create(struct crypto_template *tmpl, struct rtattr **tb)
        inst->alg.final = crypto_cbcmac_digest_final;
        inst->alg.setkey = crypto_cbcmac_digest_setkey;
 
-       err = shash_register_instance(tmpl, inst);
+       inst->free = shash_free_singlespawn_instance;
 
-out_free_inst:
-       if (err)
-               shash_free_instance(shash_crypto_instance(inst));
-
-out_put_alg:
-       crypto_mod_put(alg);
+       err = shash_register_instance(tmpl, inst);
+       if (err) {
+err_free_inst:
+               shash_free_singlespawn_instance(inst);
+       }
        return err;
 }
 
@@ -942,7 +941,6 @@ static struct crypto_template crypto_ccm_tmpls[] = {
        {
                .name = "cbcmac",
                .create = cbcmac_create,
-               .free = shash_free_instance,
                .module = THIS_MODULE,
        }, {
                .name = "ccm_base",