Merge tag 'tomoyo-pr-20200128' of git://git.osdn.net/gitroot/tomoyo/tomoyo-test1
[linux-2.6-microblaze.git] / crypto / adiantum.c
index 9dc53cf..cf2b9f4 100644 (file)
@@ -39,8 +39,6 @@
 #include <crypto/scatterwalk.h>
 #include <linux/module.h>
 
-#include "internal.h"
-
 /*
  * Size of right-hand part of input data, in bytes; also the size of the block
  * cipher's block size and the hash function's output.
@@ -64,7 +62,7 @@
 
 struct adiantum_instance_ctx {
        struct crypto_skcipher_spawn streamcipher_spawn;
-       struct crypto_spawn blockcipher_spawn;
+       struct crypto_cipher_spawn blockcipher_spawn;
        struct crypto_shash_spawn hash_spawn;
 };
 
@@ -72,7 +70,7 @@ struct adiantum_tfm_ctx {
        struct crypto_skcipher *streamcipher;
        struct crypto_cipher *blockcipher;
        struct crypto_shash *hash;
-       struct poly1305_key header_hash_key;
+       struct poly1305_core_key header_hash_key;
 };
 
 struct adiantum_request_ctx {
@@ -135,9 +133,6 @@ static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key,
                                  crypto_skcipher_get_flags(tfm) &
                                  CRYPTO_TFM_REQ_MASK);
        err = crypto_skcipher_setkey(tctx->streamcipher, key, keylen);
-       crypto_skcipher_set_flags(tfm,
-                               crypto_skcipher_get_flags(tctx->streamcipher) &
-                               CRYPTO_TFM_RES_MASK);
        if (err)
                return err;
 
@@ -167,9 +162,6 @@ static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key,
                                CRYPTO_TFM_REQ_MASK);
        err = crypto_cipher_setkey(tctx->blockcipher, keyp,
                                   BLOCKCIPHER_KEY_SIZE);
-       crypto_skcipher_set_flags(tfm,
-                                 crypto_cipher_get_flags(tctx->blockcipher) &
-                                 CRYPTO_TFM_RES_MASK);
        if (err)
                goto out;
        keyp += BLOCKCIPHER_KEY_SIZE;
@@ -182,8 +174,6 @@ static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key,
        crypto_shash_set_flags(tctx->hash, crypto_skcipher_get_flags(tfm) &
                                           CRYPTO_TFM_REQ_MASK);
        err = crypto_shash_setkey(tctx->hash, keyp, NHPOLY1305_KEY_SIZE);
-       crypto_skcipher_set_flags(tfm, crypto_shash_get_flags(tctx->hash) &
-                                      CRYPTO_TFM_RES_MASK);
        keyp += NHPOLY1305_KEY_SIZE;
        WARN_ON(keyp != &data->derived_keys[ARRAY_SIZE(data->derived_keys)]);
 out:
@@ -249,7 +239,7 @@ static void adiantum_hash_header(struct skcipher_request *req)
        poly1305_core_blocks(&state, &tctx->header_hash_key, req->iv,
                             TWEAK_SIZE / POLY1305_BLOCK_SIZE, 1);
 
-       poly1305_core_emit(&state, &rctx->header_hash);
+       poly1305_core_emit(&state, NULL, &rctx->header_hash);
 }
 
 /* Hash the left-hand part (the "bulk") of the message using NHPoly1305 */
@@ -469,7 +459,7 @@ static void adiantum_free_instance(struct skcipher_instance *inst)
        struct adiantum_instance_ctx *ictx = skcipher_instance_ctx(inst);
 
        crypto_drop_skcipher(&ictx->streamcipher_spawn);
-       crypto_drop_spawn(&ictx->blockcipher_spawn);
+       crypto_drop_cipher(&ictx->blockcipher_spawn);
        crypto_drop_shash(&ictx->hash_spawn);
        kfree(inst);
 }
@@ -501,14 +491,12 @@ static bool adiantum_supported_algorithms(struct skcipher_alg *streamcipher_alg,
 static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
 {
        struct crypto_attr_type *algt;
-       const char *streamcipher_name;
-       const char *blockcipher_name;
+       u32 mask;
        const char *nhpoly1305_name;
        struct skcipher_instance *inst;
        struct adiantum_instance_ctx *ictx;
        struct skcipher_alg *streamcipher_alg;
        struct crypto_alg *blockcipher_alg;
-       struct crypto_alg *_hash_alg;
        struct shash_alg *hash_alg;
        int err;
 
@@ -519,19 +507,7 @@ static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
        if ((algt->type ^ CRYPTO_ALG_TYPE_SKCIPHER) & algt->mask)
                return -EINVAL;
 
-       streamcipher_name = crypto_attr_alg_name(tb[1]);
-       if (IS_ERR(streamcipher_name))
-               return PTR_ERR(streamcipher_name);
-
-       blockcipher_name = crypto_attr_alg_name(tb[2]);
-       if (IS_ERR(blockcipher_name))
-               return PTR_ERR(blockcipher_name);
-
-       nhpoly1305_name = crypto_attr_alg_name(tb[3]);
-       if (nhpoly1305_name == ERR_PTR(-ENOENT))
-               nhpoly1305_name = "nhpoly1305";
-       if (IS_ERR(nhpoly1305_name))
-               return PTR_ERR(nhpoly1305_name);
+       mask = crypto_requires_sync(algt->type, algt->mask);
 
        inst = kzalloc(sizeof(*inst) + sizeof(*ictx), GFP_KERNEL);
        if (!inst)
@@ -539,37 +515,31 @@ static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
        ictx = skcipher_instance_ctx(inst);
 
        /* Stream cipher, e.g. "xchacha12" */
-       crypto_set_skcipher_spawn(&ictx->streamcipher_spawn,
-                                 skcipher_crypto_instance(inst));
-       err = crypto_grab_skcipher(&ictx->streamcipher_spawn, streamcipher_name,
-                                  0, crypto_requires_sync(algt->type,
-                                                          algt->mask));
+       err = crypto_grab_skcipher(&ictx->streamcipher_spawn,
+                                  skcipher_crypto_instance(inst),
+                                  crypto_attr_alg_name(tb[1]), 0, mask);
        if (err)
-               goto out_free_inst;
+               goto err_free_inst;
        streamcipher_alg = crypto_spawn_skcipher_alg(&ictx->streamcipher_spawn);
 
        /* Block cipher, e.g. "aes" */
-       crypto_set_spawn(&ictx->blockcipher_spawn,
-                        skcipher_crypto_instance(inst));
-       err = crypto_grab_spawn(&ictx->blockcipher_spawn, blockcipher_name,
-                               CRYPTO_ALG_TYPE_CIPHER, CRYPTO_ALG_TYPE_MASK);
+       err = crypto_grab_cipher(&ictx->blockcipher_spawn,
+                                skcipher_crypto_instance(inst),
+                                crypto_attr_alg_name(tb[2]), 0, mask);
        if (err)
-               goto out_drop_streamcipher;
-       blockcipher_alg = ictx->blockcipher_spawn.alg;
+               goto err_free_inst;
+       blockcipher_alg = crypto_spawn_cipher_alg(&ictx->blockcipher_spawn);
 
        /* NHPoly1305 ε-∆U hash function */
-       _hash_alg = crypto_alg_mod_lookup(nhpoly1305_name,
-                                         CRYPTO_ALG_TYPE_SHASH,
-                                         CRYPTO_ALG_TYPE_MASK);
-       if (IS_ERR(_hash_alg)) {
-               err = PTR_ERR(_hash_alg);
-               goto out_drop_blockcipher;
-       }
-       hash_alg = __crypto_shash_alg(_hash_alg);
-       err = crypto_init_shash_spawn(&ictx->hash_spawn, hash_alg,
-                                     skcipher_crypto_instance(inst));
+       nhpoly1305_name = crypto_attr_alg_name(tb[3]);
+       if (nhpoly1305_name == ERR_PTR(-ENOENT))
+               nhpoly1305_name = "nhpoly1305";
+       err = crypto_grab_shash(&ictx->hash_spawn,
+                               skcipher_crypto_instance(inst),
+                               nhpoly1305_name, 0, mask);
        if (err)
-               goto out_put_hash;
+               goto err_free_inst;
+       hash_alg = crypto_spawn_shash_alg(&ictx->hash_spawn);
 
        /* Check the set of algorithms */
        if (!adiantum_supported_algorithms(streamcipher_alg, blockcipher_alg,
@@ -578,7 +548,7 @@ static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
                        streamcipher_alg->base.cra_name,
                        blockcipher_alg->cra_name, hash_alg->base.cra_name);
                err = -EINVAL;
-               goto out_drop_hash;
+               goto err_free_inst;
        }
 
        /* Instance fields */
@@ -587,13 +557,13 @@ static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
        if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME,
                     "adiantum(%s,%s)", streamcipher_alg->base.cra_name,
                     blockcipher_alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
-               goto out_drop_hash;
+               goto err_free_inst;
        if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME,
                     "adiantum(%s,%s,%s)",
                     streamcipher_alg->base.cra_driver_name,
                     blockcipher_alg->cra_driver_name,
                     hash_alg->base.cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
-               goto out_drop_hash;
+               goto err_free_inst;
 
        inst->alg.base.cra_flags = streamcipher_alg->base.cra_flags &
                                   CRYPTO_ALG_ASYNC;
@@ -623,22 +593,10 @@ static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
        inst->free = adiantum_free_instance;
 
        err = skcipher_register_instance(tmpl, inst);
-       if (err)
-               goto out_drop_hash;
-
-       crypto_mod_put(_hash_alg);
-       return 0;
-
-out_drop_hash:
-       crypto_drop_shash(&ictx->hash_spawn);
-out_put_hash:
-       crypto_mod_put(_hash_alg);
-out_drop_blockcipher:
-       crypto_drop_spawn(&ictx->blockcipher_spawn);
-out_drop_streamcipher:
-       crypto_drop_skcipher(&ictx->streamcipher_spawn);
-out_free_inst:
-       kfree(inst);
+       if (err) {
+err_free_inst:
+               adiantum_free_instance(inst);
+       }
        return err;
 }