aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 = {