|
@@ -255,17 +255,18 @@ static void cryptd_blkcipher_exit_tfm(struct crypto_tfm *tfm)
|
|
crypto_free_blkcipher(ctx->child);
|
|
crypto_free_blkcipher(ctx->child);
|
|
}
|
|
}
|
|
|
|
|
|
-static struct crypto_instance *cryptd_alloc_instance(struct crypto_alg *alg,
|
|
|
|
- unsigned int tail)
|
|
|
|
|
|
+static void *cryptd_alloc_instance(struct crypto_alg *alg, unsigned int head,
|
|
|
|
+ unsigned int tail)
|
|
{
|
|
{
|
|
|
|
+ char *p;
|
|
struct crypto_instance *inst;
|
|
struct crypto_instance *inst;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- inst = kzalloc(sizeof(*inst) + tail, GFP_KERNEL);
|
|
|
|
- if (!inst) {
|
|
|
|
- inst = ERR_PTR(-ENOMEM);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ p = kzalloc(head + sizeof(*inst) + tail, GFP_KERNEL);
|
|
|
|
+ if (!p)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+
|
|
|
|
+ inst = (void *)(p + head);
|
|
|
|
|
|
err = -ENAMETOOLONG;
|
|
err = -ENAMETOOLONG;
|
|
if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
|
|
if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
|
|
@@ -279,11 +280,11 @@ static struct crypto_instance *cryptd_alloc_instance(struct crypto_alg *alg,
|
|
inst->alg.cra_alignmask = alg->cra_alignmask;
|
|
inst->alg.cra_alignmask = alg->cra_alignmask;
|
|
|
|
|
|
out:
|
|
out:
|
|
- return inst;
|
|
|
|
|
|
+ return p;
|
|
|
|
|
|
out_free_inst:
|
|
out_free_inst:
|
|
- kfree(inst);
|
|
|
|
- inst = ERR_PTR(err);
|
|
|
|
|
|
+ kfree(p);
|
|
|
|
+ p = ERR_PTR(err);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -301,7 +302,7 @@ static int cryptd_create_blkcipher(struct crypto_template *tmpl,
|
|
if (IS_ERR(alg))
|
|
if (IS_ERR(alg))
|
|
return PTR_ERR(alg);
|
|
return PTR_ERR(alg);
|
|
|
|
|
|
- inst = cryptd_alloc_instance(alg, sizeof(*ctx));
|
|
|
|
|
|
+ inst = cryptd_alloc_instance(alg, 0, sizeof(*ctx));
|
|
if (IS_ERR(inst))
|
|
if (IS_ERR(inst))
|
|
goto out_put_alg;
|
|
goto out_put_alg;
|
|
|
|
|
|
@@ -509,7 +510,7 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|
struct cryptd_queue *queue)
|
|
struct cryptd_queue *queue)
|
|
{
|
|
{
|
|
struct hashd_instance_ctx *ctx;
|
|
struct hashd_instance_ctx *ctx;
|
|
- struct crypto_instance *inst;
|
|
|
|
|
|
+ struct ahash_instance *inst;
|
|
struct shash_alg *salg;
|
|
struct shash_alg *salg;
|
|
struct crypto_alg *alg;
|
|
struct crypto_alg *alg;
|
|
int err;
|
|
int err;
|
|
@@ -519,33 +520,34 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|
return PTR_ERR(salg);
|
|
return PTR_ERR(salg);
|
|
|
|
|
|
alg = &salg->base;
|
|
alg = &salg->base;
|
|
- inst = cryptd_alloc_instance(alg, sizeof(*ctx));
|
|
|
|
|
|
+ inst = cryptd_alloc_instance(alg, ahash_instance_headroom(),
|
|
|
|
+ sizeof(*ctx));
|
|
if (IS_ERR(inst))
|
|
if (IS_ERR(inst))
|
|
goto out_put_alg;
|
|
goto out_put_alg;
|
|
|
|
|
|
- ctx = crypto_instance_ctx(inst);
|
|
|
|
|
|
+ ctx = ahash_instance_ctx(inst);
|
|
ctx->queue = queue;
|
|
ctx->queue = queue;
|
|
|
|
|
|
- err = crypto_init_shash_spawn(&ctx->spawn, salg, inst);
|
|
|
|
|
|
+ err = crypto_init_shash_spawn(&ctx->spawn, salg,
|
|
|
|
+ ahash_crypto_instance(inst));
|
|
if (err)
|
|
if (err)
|
|
goto out_free_inst;
|
|
goto out_free_inst;
|
|
|
|
|
|
- inst->alg.cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_ASYNC;
|
|
|
|
- inst->alg.cra_type = &crypto_ahash_type;
|
|
|
|
|
|
+ inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC;
|
|
|
|
|
|
- inst->alg.cra_ahash.digestsize = salg->digestsize;
|
|
|
|
- inst->alg.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
|
|
|
|
|
|
+ inst->alg.halg.digestsize = salg->digestsize;
|
|
|
|
+ inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
|
|
|
|
|
|
- inst->alg.cra_init = cryptd_hash_init_tfm;
|
|
|
|
- inst->alg.cra_exit = cryptd_hash_exit_tfm;
|
|
|
|
|
|
+ inst->alg.halg.base.cra_init = cryptd_hash_init_tfm;
|
|
|
|
+ inst->alg.halg.base.cra_exit = cryptd_hash_exit_tfm;
|
|
|
|
|
|
- inst->alg.cra_ahash.init = cryptd_hash_init_enqueue;
|
|
|
|
- inst->alg.cra_ahash.update = cryptd_hash_update_enqueue;
|
|
|
|
- inst->alg.cra_ahash.final = cryptd_hash_final_enqueue;
|
|
|
|
- inst->alg.cra_ahash.setkey = cryptd_hash_setkey;
|
|
|
|
- inst->alg.cra_ahash.digest = cryptd_hash_digest_enqueue;
|
|
|
|
|
|
+ inst->alg.init = cryptd_hash_init_enqueue;
|
|
|
|
+ inst->alg.update = cryptd_hash_update_enqueue;
|
|
|
|
+ inst->alg.final = cryptd_hash_final_enqueue;
|
|
|
|
+ inst->alg.setkey = cryptd_hash_setkey;
|
|
|
|
+ inst->alg.digest = cryptd_hash_digest_enqueue;
|
|
|
|
|
|
- err = crypto_register_instance(tmpl, inst);
|
|
|
|
|
|
+ err = ahash_register_instance(tmpl, inst);
|
|
if (err) {
|
|
if (err) {
|
|
crypto_drop_shash(&ctx->spawn);
|
|
crypto_drop_shash(&ctx->spawn);
|
|
out_free_inst:
|
|
out_free_inst:
|
|
@@ -580,6 +582,14 @@ static int cryptd_create(struct crypto_template *tmpl, struct rtattr **tb)
|
|
static void cryptd_free(struct crypto_instance *inst)
|
|
static void cryptd_free(struct crypto_instance *inst)
|
|
{
|
|
{
|
|
struct cryptd_instance_ctx *ctx = crypto_instance_ctx(inst);
|
|
struct cryptd_instance_ctx *ctx = crypto_instance_ctx(inst);
|
|
|
|
+ struct hashd_instance_ctx *hctx = crypto_instance_ctx(inst);
|
|
|
|
+
|
|
|
|
+ switch (inst->alg.cra_flags & CRYPTO_ALG_TYPE_MASK) {
|
|
|
|
+ case CRYPTO_ALG_TYPE_AHASH:
|
|
|
|
+ crypto_drop_shash(&hctx->spawn);
|
|
|
|
+ kfree(ahash_instance(inst));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
crypto_drop_spawn(&ctx->spawn);
|
|
crypto_drop_spawn(&ctx->spawn);
|
|
kfree(inst);
|
|
kfree(inst);
|