aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/seqiv.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-07-08 19:17:22 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-07-14 02:56:46 -0400
commit5964f26c9f6003e9badedb768a0735eaf034ac56 (patch)
tree306cb5e1d0be7cce24026c80a4ae9cc9030e5be7 /crypto/seqiv.c
parent5499b1a7311f5ec301ac2baa04a3482ee89ac0ab (diff)
crypto: seqiv - Replace seqniv with seqiv
This patch replaces the seqniv generator with seqiv when the underlying algorithm understands the new calling convention. This not only makes more sense as now seqiv is solely responsible for IV generation rather than also determining how the IV is going to be used, it also allows for optimisations in the underlying implementation. For example, the space for the IV could be used to add padding for authentication. This patch also removes the unnecessary copying of IV to dst during seqiv decryption as the IV is part of the AD and not cipher text. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/seqiv.c')
-rw-r--r--crypto/seqiv.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/crypto/seqiv.c b/crypto/seqiv.c
index 122c56e3491b..45d0563f681a 100644
--- a/crypto/seqiv.c
+++ b/crypto/seqiv.c
@@ -467,9 +467,6 @@ static int seqiv_aead_decrypt(struct aead_request *req)
467 aead_request_set_ad(subreq, req->assoclen + ivsize); 467 aead_request_set_ad(subreq, req->assoclen + ivsize);
468 468
469 scatterwalk_map_and_copy(req->iv, req->src, req->assoclen, ivsize, 0); 469 scatterwalk_map_and_copy(req->iv, req->src, req->assoclen, ivsize, 0);
470 if (req->src != req->dst)
471 scatterwalk_map_and_copy(req->iv, req->dst,
472 req->assoclen, ivsize, 1);
473 470
474 return crypto_aead_decrypt(subreq); 471 return crypto_aead_decrypt(subreq);
475} 472}
@@ -516,9 +513,9 @@ static int seqiv_old_aead_init(struct crypto_tfm *tfm)
516 return err ?: aead_geniv_init(tfm); 513 return err ?: aead_geniv_init(tfm);
517} 514}
518 515
519static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize) 516static int seqiv_aead_init_common(struct crypto_aead *geniv,
517 unsigned int reqsize)
520{ 518{
521 struct crypto_aead *geniv = __crypto_aead_cast(tfm);
522 struct seqiv_aead_ctx *ctx = crypto_aead_ctx(geniv); 519 struct seqiv_aead_ctx *ctx = crypto_aead_ctx(geniv);
523 int err; 520 int err;
524 521
@@ -541,7 +538,7 @@ static int seqiv_aead_init_common(struct crypto_tfm *tfm, unsigned int reqsize)
541 if (IS_ERR(ctx->null)) 538 if (IS_ERR(ctx->null))
542 goto out; 539 goto out;
543 540
544 err = aead_geniv_init(tfm); 541 err = aead_geniv_init(crypto_aead_tfm(geniv));
545 if (err) 542 if (err)
546 goto drop_null; 543 goto drop_null;
547 544
@@ -556,19 +553,19 @@ drop_null:
556 goto out; 553 goto out;
557} 554}
558 555
559static int seqiv_aead_init(struct crypto_tfm *tfm) 556static int seqiv_aead_init(struct crypto_aead *tfm)
560{ 557{
561 return seqiv_aead_init_common(tfm, sizeof(struct aead_request)); 558 return seqiv_aead_init_common(tfm, sizeof(struct aead_request));
562} 559}
563 560
564static int seqniv_aead_init(struct crypto_tfm *tfm) 561static int seqniv_aead_init(struct crypto_aead *tfm)
565{ 562{
566 return seqiv_aead_init_common(tfm, sizeof(struct seqniv_request_ctx)); 563 return seqiv_aead_init_common(tfm, sizeof(struct seqniv_request_ctx));
567} 564}
568 565
569static void seqiv_aead_exit(struct crypto_tfm *tfm) 566static void seqiv_aead_exit(struct crypto_aead *tfm)
570{ 567{
571 struct seqiv_aead_ctx *ctx = crypto_tfm_ctx(tfm); 568 struct seqiv_aead_ctx *ctx = crypto_aead_ctx(tfm);
572 569
573 crypto_free_aead(ctx->geniv.child); 570 crypto_free_aead(ctx->geniv.child);
574 crypto_put_default_null_skcipher(); 571 crypto_put_default_null_skcipher();
@@ -666,11 +663,11 @@ static int seqiv_aead_create(struct crypto_template *tmpl, struct rtattr **tb)
666 inst->alg.encrypt = seqiv_aead_encrypt; 663 inst->alg.encrypt = seqiv_aead_encrypt;
667 inst->alg.decrypt = seqiv_aead_decrypt; 664 inst->alg.decrypt = seqiv_aead_decrypt;
668 665
669 inst->alg.base.cra_init = seqiv_aead_init; 666 inst->alg.init = seqiv_aead_init;
670 inst->alg.base.cra_exit = seqiv_aead_exit; 667 inst->alg.exit = seqiv_aead_exit;
671 668
672 inst->alg.base.cra_ctxsize = sizeof(struct seqiv_aead_ctx); 669 inst->alg.base.cra_ctxsize = sizeof(struct seqiv_aead_ctx);
673 inst->alg.base.cra_ctxsize += inst->alg.base.cra_aead.ivsize; 670 inst->alg.base.cra_ctxsize += inst->alg.ivsize;
674 671
675done: 672done:
676 err = aead_register_instance(tmpl, inst); 673 err = aead_register_instance(tmpl, inst);
@@ -727,8 +724,15 @@ static int seqniv_create(struct crypto_template *tmpl, struct rtattr **tb)
727 inst->alg.encrypt = seqniv_aead_encrypt; 724 inst->alg.encrypt = seqniv_aead_encrypt;
728 inst->alg.decrypt = seqniv_aead_decrypt; 725 inst->alg.decrypt = seqniv_aead_decrypt;
729 726
730 inst->alg.base.cra_init = seqniv_aead_init; 727 inst->alg.init = seqniv_aead_init;
731 inst->alg.base.cra_exit = seqiv_aead_exit; 728 inst->alg.exit = seqiv_aead_exit;
729
730 if ((alg->base.cra_flags & CRYPTO_ALG_AEAD_NEW)) {
731 inst->alg.encrypt = seqiv_aead_encrypt;
732 inst->alg.decrypt = seqiv_aead_decrypt;
733
734 inst->alg.init = seqiv_aead_init;
735 }
732 736
733 inst->alg.base.cra_alignmask |= __alignof__(u32) - 1; 737 inst->alg.base.cra_alignmask |= __alignof__(u32) - 1;
734 inst->alg.base.cra_ctxsize = sizeof(struct seqiv_aead_ctx); 738 inst->alg.base.cra_ctxsize = sizeof(struct seqiv_aead_ctx);