aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/seqiv.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-06-21 07:11:49 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-06-22 03:49:28 -0400
commiteeee12aa34d840c6c99051f0ff85a9ffa1badd07 (patch)
treeecb6931eb545524be8bdfacbaed8a8bf8d7908db /crypto/seqiv.c
parent055906d1e7f94f459a0e80228f15656bf5871311 (diff)
crypto: seqiv - Add compatibility support without RNG
When seqiv is used in compatibility mode, this patch allows it to function even when an RNG Is not available. It also changes the RNG allocation for the new explicit seqiv interface so that we only hold a reference to the RNG during initialisation. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/seqiv.c')
-rw-r--r--crypto/seqiv.c50
1 files changed, 25 insertions, 25 deletions
diff --git a/crypto/seqiv.c b/crypto/seqiv.c
index 42e4ee532d35..122c56e3491b 100644
--- a/crypto/seqiv.c
+++ b/crypto/seqiv.c
@@ -478,29 +478,42 @@ static int seqiv_init(struct crypto_tfm *tfm)
478{ 478{
479 struct crypto_ablkcipher *geniv = __crypto_ablkcipher_cast(tfm); 479 struct crypto_ablkcipher *geniv = __crypto_ablkcipher_cast(tfm);
480 struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); 480 struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
481 int err;
481 482
482 spin_lock_init(&ctx->lock); 483 spin_lock_init(&ctx->lock);
483 484
484 tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request); 485 tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request);
485 486
486 return crypto_rng_get_bytes(crypto_default_rng, ctx->salt, 487 err = 0;
487 crypto_ablkcipher_ivsize(geniv)) ?: 488 if (!crypto_get_default_rng()) {
488 skcipher_geniv_init(tfm); 489 crypto_ablkcipher_crt(geniv)->givencrypt = seqiv_givencrypt;
490 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
491 crypto_ablkcipher_ivsize(geniv));
492 crypto_put_default_rng();
493 }
494
495 return err ?: skcipher_geniv_init(tfm);
489} 496}
490 497
491static int seqiv_old_aead_init(struct crypto_tfm *tfm) 498static int seqiv_old_aead_init(struct crypto_tfm *tfm)
492{ 499{
493 struct crypto_aead *geniv = __crypto_aead_cast(tfm); 500 struct crypto_aead *geniv = __crypto_aead_cast(tfm);
494 struct seqiv_ctx *ctx = crypto_aead_ctx(geniv); 501 struct seqiv_ctx *ctx = crypto_aead_ctx(geniv);
502 int err;
495 503
496 spin_lock_init(&ctx->lock); 504 spin_lock_init(&ctx->lock);
497 505
498 crypto_aead_set_reqsize(__crypto_aead_cast(tfm), 506 crypto_aead_set_reqsize(__crypto_aead_cast(tfm),
499 sizeof(struct aead_request)); 507 sizeof(struct aead_request));
508 err = 0;
509 if (!crypto_get_default_rng()) {
510 geniv->givencrypt = seqiv_aead_givencrypt;
511 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
512 crypto_aead_ivsize(geniv));
513 crypto_put_default_rng();
514 }
500 515
501 return crypto_rng_get_bytes(crypto_default_rng, ctx->salt, 516 return err ?: aead_geniv_init(tfm);
502 crypto_aead_ivsize(geniv)) ?:
503 aead_geniv_init(tfm);
504} 517}
505 518
506static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize) 519static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize)
@@ -513,8 +526,13 @@ static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize)
513 526
514 crypto_aead_set_reqsize(geniv, sizeof(struct aead_request)); 527 crypto_aead_set_reqsize(geniv, sizeof(struct aead_request));
515 528
529 err = crypto_get_default_rng();
530 if (err)
531 goto out;
532
516 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt, 533 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
517 crypto_aead_ivsize(geniv)); 534 crypto_aead_ivsize(geniv));
535 crypto_put_default_rng();
518 if (err) 536 if (err)
519 goto out; 537 goto out;
520 538
@@ -571,8 +589,6 @@ static int seqiv_ablkcipher_create(struct crypto_template *tmpl,
571 if (inst->alg.cra_ablkcipher.ivsize < sizeof(u64)) 589 if (inst->alg.cra_ablkcipher.ivsize < sizeof(u64))
572 goto free_inst; 590 goto free_inst;
573 591
574 inst->alg.cra_ablkcipher.givencrypt = seqiv_givencrypt;
575
576 inst->alg.cra_init = seqiv_init; 592 inst->alg.cra_init = seqiv_init;
577 inst->alg.cra_exit = skcipher_geniv_exit; 593 inst->alg.cra_exit = skcipher_geniv_exit;
578 594
@@ -602,8 +618,6 @@ static int seqiv_old_aead_create(struct crypto_template *tmpl,
602 if (inst->alg.cra_aead.ivsize < sizeof(u64)) 618 if (inst->alg.cra_aead.ivsize < sizeof(u64))
603 goto free_inst; 619 goto free_inst;
604 620
605 inst->alg.cra_aead.givencrypt = seqiv_aead_givencrypt;
606
607 inst->alg.cra_init = seqiv_old_aead_init; 621 inst->alg.cra_init = seqiv_old_aead_init;
608 inst->alg.cra_exit = aead_geniv_exit; 622 inst->alg.cra_exit = aead_geniv_exit;
609 623
@@ -680,18 +694,11 @@ static int seqiv_create(struct crypto_template *tmpl, struct rtattr **tb)
680 if (IS_ERR(algt)) 694 if (IS_ERR(algt))
681 return PTR_ERR(algt); 695 return PTR_ERR(algt);
682 696
683 err = crypto_get_default_rng();
684 if (err)
685 return err;
686
687 if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) 697 if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK)
688 err = seqiv_ablkcipher_create(tmpl, tb); 698 err = seqiv_ablkcipher_create(tmpl, tb);
689 else 699 else
690 err = seqiv_aead_create(tmpl, tb); 700 err = seqiv_aead_create(tmpl, tb);
691 701
692 if (err)
693 crypto_put_default_rng();
694
695 return err; 702 return err;
696} 703}
697 704
@@ -702,14 +709,10 @@ static int seqniv_create(struct crypto_template *tmpl, struct rtattr **tb)
702 struct aead_alg *alg; 709 struct aead_alg *alg;
703 int err; 710 int err;
704 711
705 err = crypto_get_default_rng();
706 if (err)
707 return err;
708
709 inst = aead_geniv_alloc(tmpl, tb, 0, 0); 712 inst = aead_geniv_alloc(tmpl, tb, 0, 0);
710 err = PTR_ERR(inst); 713 err = PTR_ERR(inst);
711 if (IS_ERR(inst)) 714 if (IS_ERR(inst))
712 goto put_rng; 715 goto out;
713 716
714 spawn = aead_instance_ctx(inst); 717 spawn = aead_instance_ctx(inst);
715 alg = crypto_spawn_aead_alg(spawn); 718 alg = crypto_spawn_aead_alg(spawn);
@@ -741,8 +744,6 @@ out:
741 744
742free_inst: 745free_inst:
743 aead_geniv_free(inst); 746 aead_geniv_free(inst);
744put_rng:
745 crypto_put_default_rng();
746 goto out; 747 goto out;
747} 748}
748 749
@@ -752,7 +753,6 @@ static void seqiv_free(struct crypto_instance *inst)
752 skcipher_geniv_free(inst); 753 skcipher_geniv_free(inst);
753 else 754 else
754 aead_geniv_free(aead_instance(inst)); 755 aead_geniv_free(aead_instance(inst));
755 crypto_put_default_rng();
756} 756}
757 757
758static struct crypto_template seqiv_tmpl = { 758static struct crypto_template seqiv_tmpl = {