aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/seqiv.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-05-21 03:11:14 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-05-21 23:25:56 -0400
commit3c08fee7b5ce471a7114478ac8c6e546787bd8c2 (patch)
treeaf572616f55362927208154e6b786d144b853a1e /crypto/seqiv.c
parent856e3f4092cfd9ea6d6564e73f5bce5a0ac3cae3 (diff)
crypto: seqiv - Add seqniv
This patch adds a new IV generator seqniv which is identical to seqiv except that it skips the IV when authenticating. This is intended to be used by algorithms such as rfc4106 that does the IV authentication implicitly. Note that the code used for seqniv is in fact identical to the compatibility case for seqiv. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/seqiv.c')
-rw-r--r--crypto/seqiv.c71
1 files changed, 70 insertions, 1 deletions
diff --git a/crypto/seqiv.c b/crypto/seqiv.c
index 27dbab8a80a9..a9bfbda4f36a 100644
--- a/crypto/seqiv.c
+++ b/crypto/seqiv.c
@@ -584,6 +584,7 @@ static void seqiv_aead_exit(struct crypto_tfm *tfm)
584} 584}
585 585
586static struct crypto_template seqiv_tmpl; 586static struct crypto_template seqiv_tmpl;
587static struct crypto_template seqniv_tmpl;
587 588
588static struct crypto_instance *seqiv_ablkcipher_alloc(struct rtattr **tb) 589static struct crypto_instance *seqiv_ablkcipher_alloc(struct rtattr **tb)
589{ 590{
@@ -710,6 +711,51 @@ put_rng:
710 goto out; 711 goto out;
711} 712}
712 713
714static struct crypto_instance *seqniv_alloc(struct rtattr **tb)
715{
716 struct aead_instance *inst;
717 struct crypto_aead_spawn *spawn;
718 struct aead_alg *alg;
719 int err;
720
721 err = crypto_get_default_rng();
722 if (err)
723 return ERR_PTR(err);
724
725 inst = aead_geniv_alloc(&seqniv_tmpl, tb, 0, 0);
726
727 if (IS_ERR(inst))
728 goto put_rng;
729
730 if (inst->alg.ivsize < sizeof(u64)) {
731 aead_geniv_free(inst);
732 inst = ERR_PTR(-EINVAL);
733 goto put_rng;
734 }
735
736 spawn = aead_instance_ctx(inst);
737 alg = crypto_spawn_aead_alg(spawn);
738
739 inst->alg.setkey = seqiv_aead_setkey;
740 inst->alg.setauthsize = seqiv_aead_setauthsize;
741 inst->alg.encrypt = seqiv_aead_encrypt_compat_first;
742 inst->alg.decrypt = seqiv_aead_decrypt_compat;
743
744 inst->alg.base.cra_init = seqiv_aead_compat_init;
745 inst->alg.base.cra_exit = seqiv_aead_compat_exit;
746
747 inst->alg.base.cra_alignmask |= __alignof__(u32) - 1;
748 inst->alg.base.cra_ctxsize = sizeof(struct seqiv_aead_ctx);
749 inst->alg.base.cra_ctxsize += inst->alg.base.cra_aead.ivsize;
750
751out:
752 return aead_crypto_instance(inst);
753
754put_rng:
755 crypto_put_default_rng();
756 goto out;
757}
758
713static void seqiv_free(struct crypto_instance *inst) 759static void seqiv_free(struct crypto_instance *inst)
714{ 760{
715 if ((inst->alg.cra_flags ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) 761 if ((inst->alg.cra_flags ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK)
@@ -726,9 +772,31 @@ static struct crypto_template seqiv_tmpl = {
726 .module = THIS_MODULE, 772 .module = THIS_MODULE,
727}; 773};
728 774
775static struct crypto_template seqniv_tmpl = {
776 .name = "seqniv",
777 .alloc = seqniv_alloc,
778 .free = seqiv_free,
779 .module = THIS_MODULE,
780};
781
729static int __init seqiv_module_init(void) 782static int __init seqiv_module_init(void)
730{ 783{
731 return crypto_register_template(&seqiv_tmpl); 784 int err;
785
786 err = crypto_register_template(&seqiv_tmpl);
787 if (err)
788 goto out;
789
790 err = crypto_register_template(&seqniv_tmpl);
791 if (err)
792 goto out_undo_niv;
793
794out:
795 return err;
796
797out_undo_niv:
798 crypto_unregister_template(&seqiv_tmpl);
799 goto out;
732} 800}
733 801
734static void __exit seqiv_module_exit(void) 802static void __exit seqiv_module_exit(void)
@@ -742,3 +810,4 @@ module_exit(seqiv_module_exit);
742MODULE_LICENSE("GPL"); 810MODULE_LICENSE("GPL");
743MODULE_DESCRIPTION("Sequence Number IV Generator"); 811MODULE_DESCRIPTION("Sequence Number IV Generator");
744MODULE_ALIAS_CRYPTO("seqiv"); 812MODULE_ALIAS_CRYPTO("seqiv");
813MODULE_ALIAS_CRYPTO("seqniv");