aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2009-07-14 07:11:32 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2009-07-14 07:11:32 -0400
commit0b535adfb102bac1edb046444172b6b77d99bc92 (patch)
treef113cae3f022b6d39ddcf63a71c7b3dc65b120fe
parent9cd899a32f611eb6328014f1d9e0ba31977812d9 (diff)
crypto: cryptd - Switch to new style ahash
This patch changes cryptd to use the new style ahash type. In particular, the instance is enlarged to encapsulate the new ahash_alg structure. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/cryptd.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
index ad58f513ba8b..5dabb7dbad84 100644
--- a/crypto/cryptd.c
+++ b/crypto/cryptd.c
@@ -255,17 +255,18 @@ static void cryptd_blkcipher_exit_tfm(struct crypto_tfm *tfm)
255 crypto_free_blkcipher(ctx->child); 255 crypto_free_blkcipher(ctx->child);
256} 256}
257 257
258static struct crypto_instance *cryptd_alloc_instance(struct crypto_alg *alg, 258static void *cryptd_alloc_instance(struct crypto_alg *alg, unsigned int head,
259 unsigned int tail) 259 unsigned int tail)
260{ 260{
261 char *p;
261 struct crypto_instance *inst; 262 struct crypto_instance *inst;
262 int err; 263 int err;
263 264
264 inst = kzalloc(sizeof(*inst) + tail, GFP_KERNEL); 265 p = kzalloc(head + sizeof(*inst) + tail, GFP_KERNEL);
265 if (!inst) { 266 if (!p)
266 inst = ERR_PTR(-ENOMEM); 267 return ERR_PTR(-ENOMEM);
267 goto out; 268
268 } 269 inst = (void *)(p + head);
269 270
270 err = -ENAMETOOLONG; 271 err = -ENAMETOOLONG;
271 if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, 272 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,
279 inst->alg.cra_alignmask = alg->cra_alignmask; 280 inst->alg.cra_alignmask = alg->cra_alignmask;
280 281
281out: 282out:
282 return inst; 283 return p;
283 284
284out_free_inst: 285out_free_inst:
285 kfree(inst); 286 kfree(p);
286 inst = ERR_PTR(err); 287 p = ERR_PTR(err);
287 goto out; 288 goto out;
288} 289}
289 290
@@ -301,7 +302,7 @@ static int cryptd_create_blkcipher(struct crypto_template *tmpl,
301 if (IS_ERR(alg)) 302 if (IS_ERR(alg))
302 return PTR_ERR(alg); 303 return PTR_ERR(alg);
303 304
304 inst = cryptd_alloc_instance(alg, sizeof(*ctx)); 305 inst = cryptd_alloc_instance(alg, 0, sizeof(*ctx));
305 if (IS_ERR(inst)) 306 if (IS_ERR(inst))
306 goto out_put_alg; 307 goto out_put_alg;
307 308
@@ -509,7 +510,7 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
509 struct cryptd_queue *queue) 510 struct cryptd_queue *queue)
510{ 511{
511 struct hashd_instance_ctx *ctx; 512 struct hashd_instance_ctx *ctx;
512 struct crypto_instance *inst; 513 struct ahash_instance *inst;
513 struct shash_alg *salg; 514 struct shash_alg *salg;
514 struct crypto_alg *alg; 515 struct crypto_alg *alg;
515 int err; 516 int err;
@@ -519,33 +520,34 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
519 return PTR_ERR(salg); 520 return PTR_ERR(salg);
520 521
521 alg = &salg->base; 522 alg = &salg->base;
522 inst = cryptd_alloc_instance(alg, sizeof(*ctx)); 523 inst = cryptd_alloc_instance(alg, ahash_instance_headroom(),
524 sizeof(*ctx));
523 if (IS_ERR(inst)) 525 if (IS_ERR(inst))
524 goto out_put_alg; 526 goto out_put_alg;
525 527
526 ctx = crypto_instance_ctx(inst); 528 ctx = ahash_instance_ctx(inst);
527 ctx->queue = queue; 529 ctx->queue = queue;
528 530
529 err = crypto_init_shash_spawn(&ctx->spawn, salg, inst); 531 err = crypto_init_shash_spawn(&ctx->spawn, salg,
532 ahash_crypto_instance(inst));
530 if (err) 533 if (err)
531 goto out_free_inst; 534 goto out_free_inst;
532 535
533 inst->alg.cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_ASYNC; 536 inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC;
534 inst->alg.cra_type = &crypto_ahash_type;
535 537
536 inst->alg.cra_ahash.digestsize = salg->digestsize; 538 inst->alg.halg.digestsize = salg->digestsize;
537 inst->alg.cra_ctxsize = sizeof(struct cryptd_hash_ctx); 539 inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
538 540
539 inst->alg.cra_init = cryptd_hash_init_tfm; 541 inst->alg.halg.base.cra_init = cryptd_hash_init_tfm;
540 inst->alg.cra_exit = cryptd_hash_exit_tfm; 542 inst->alg.halg.base.cra_exit = cryptd_hash_exit_tfm;
541 543
542 inst->alg.cra_ahash.init = cryptd_hash_init_enqueue; 544 inst->alg.init = cryptd_hash_init_enqueue;
543 inst->alg.cra_ahash.update = cryptd_hash_update_enqueue; 545 inst->alg.update = cryptd_hash_update_enqueue;
544 inst->alg.cra_ahash.final = cryptd_hash_final_enqueue; 546 inst->alg.final = cryptd_hash_final_enqueue;
545 inst->alg.cra_ahash.setkey = cryptd_hash_setkey; 547 inst->alg.setkey = cryptd_hash_setkey;
546 inst->alg.cra_ahash.digest = cryptd_hash_digest_enqueue; 548 inst->alg.digest = cryptd_hash_digest_enqueue;
547 549
548 err = crypto_register_instance(tmpl, inst); 550 err = ahash_register_instance(tmpl, inst);
549 if (err) { 551 if (err) {
550 crypto_drop_shash(&ctx->spawn); 552 crypto_drop_shash(&ctx->spawn);
551out_free_inst: 553out_free_inst:
@@ -580,6 +582,14 @@ static int cryptd_create(struct crypto_template *tmpl, struct rtattr **tb)
580static void cryptd_free(struct crypto_instance *inst) 582static void cryptd_free(struct crypto_instance *inst)
581{ 583{
582 struct cryptd_instance_ctx *ctx = crypto_instance_ctx(inst); 584 struct cryptd_instance_ctx *ctx = crypto_instance_ctx(inst);
585 struct hashd_instance_ctx *hctx = crypto_instance_ctx(inst);
586
587 switch (inst->alg.cra_flags & CRYPTO_ALG_TYPE_MASK) {
588 case CRYPTO_ALG_TYPE_AHASH:
589 crypto_drop_shash(&hctx->spawn);
590 kfree(ahash_instance(inst));
591 return;
592 }
583 593
584 crypto_drop_spawn(&ctx->spawn); 594 crypto_drop_spawn(&ctx->spawn);
585 kfree(inst); 595 kfree(inst);