diff options
-rw-r--r-- | crypto/seqiv.c | 50 |
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 | ||
491 | static int seqiv_old_aead_init(struct crypto_tfm *tfm) | 498 | static 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 | ||
506 | static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize) | 519 | static 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 | ||
742 | free_inst: | 745 | free_inst: |
743 | aead_geniv_free(inst); | 746 | aead_geniv_free(inst); |
744 | put_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 | ||
758 | static struct crypto_template seqiv_tmpl = { | 758 | static struct crypto_template seqiv_tmpl = { |