diff options
| -rw-r--r-- | crypto/authencesn.c | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/crypto/authencesn.c b/crypto/authencesn.c index a3da6770bc9e..b8efe36ce114 100644 --- a/crypto/authencesn.c +++ b/crypto/authencesn.c | |||
| @@ -393,8 +393,6 @@ static int crypto_authenc_esn_genicv(struct aead_request *req, u8 *iv, | |||
| 393 | struct scatterlist *cipher = areq_ctx->cipher; | 393 | struct scatterlist *cipher = areq_ctx->cipher; |
| 394 | struct scatterlist *hsg = areq_ctx->hsg; | 394 | struct scatterlist *hsg = areq_ctx->hsg; |
| 395 | struct scatterlist *tsg = areq_ctx->tsg; | 395 | struct scatterlist *tsg = areq_ctx->tsg; |
| 396 | struct scatterlist *assoc1; | ||
| 397 | struct scatterlist *assoc2; | ||
| 398 | unsigned int ivsize = crypto_aead_ivsize(authenc_esn); | 396 | unsigned int ivsize = crypto_aead_ivsize(authenc_esn); |
| 399 | unsigned int cryptlen = req->cryptlen; | 397 | unsigned int cryptlen = req->cryptlen; |
| 400 | struct page *dstp; | 398 | struct page *dstp; |
| @@ -412,27 +410,19 @@ static int crypto_authenc_esn_genicv(struct aead_request *req, u8 *iv, | |||
| 412 | cryptlen += ivsize; | 410 | cryptlen += ivsize; |
| 413 | } | 411 | } |
| 414 | 412 | ||
| 415 | if (sg_is_last(assoc)) | 413 | if (assoc->length < 12) |
| 416 | return -EINVAL; | ||
| 417 | |||
| 418 | assoc1 = assoc + 1; | ||
| 419 | if (sg_is_last(assoc1)) | ||
| 420 | return -EINVAL; | ||
| 421 | |||
| 422 | assoc2 = assoc + 2; | ||
| 423 | if (!sg_is_last(assoc2)) | ||
| 424 | return -EINVAL; | 414 | return -EINVAL; |
| 425 | 415 | ||
| 426 | sg_init_table(hsg, 2); | 416 | sg_init_table(hsg, 2); |
| 427 | sg_set_page(hsg, sg_page(assoc), assoc->length, assoc->offset); | 417 | sg_set_page(hsg, sg_page(assoc), 4, assoc->offset); |
| 428 | sg_set_page(hsg + 1, sg_page(assoc2), assoc2->length, assoc2->offset); | 418 | sg_set_page(hsg + 1, sg_page(assoc), 4, assoc->offset + 8); |
| 429 | 419 | ||
| 430 | sg_init_table(tsg, 1); | 420 | sg_init_table(tsg, 1); |
| 431 | sg_set_page(tsg, sg_page(assoc1), assoc1->length, assoc1->offset); | 421 | sg_set_page(tsg, sg_page(assoc), 4, assoc->offset + 4); |
| 432 | 422 | ||
| 433 | areq_ctx->cryptlen = cryptlen; | 423 | areq_ctx->cryptlen = cryptlen; |
| 434 | areq_ctx->headlen = assoc->length + assoc2->length; | 424 | areq_ctx->headlen = 8; |
| 435 | areq_ctx->trailen = assoc1->length; | 425 | areq_ctx->trailen = 4; |
| 436 | areq_ctx->sg = dst; | 426 | areq_ctx->sg = dst; |
| 437 | 427 | ||
| 438 | areq_ctx->complete = authenc_esn_geniv_ahash_done; | 428 | areq_ctx->complete = authenc_esn_geniv_ahash_done; |
| @@ -563,8 +553,6 @@ static int crypto_authenc_esn_iverify(struct aead_request *req, u8 *iv, | |||
| 563 | struct scatterlist *cipher = areq_ctx->cipher; | 553 | struct scatterlist *cipher = areq_ctx->cipher; |
| 564 | struct scatterlist *hsg = areq_ctx->hsg; | 554 | struct scatterlist *hsg = areq_ctx->hsg; |
| 565 | struct scatterlist *tsg = areq_ctx->tsg; | 555 | struct scatterlist *tsg = areq_ctx->tsg; |
| 566 | struct scatterlist *assoc1; | ||
| 567 | struct scatterlist *assoc2; | ||
| 568 | unsigned int ivsize = crypto_aead_ivsize(authenc_esn); | 556 | unsigned int ivsize = crypto_aead_ivsize(authenc_esn); |
| 569 | struct page *srcp; | 557 | struct page *srcp; |
| 570 | u8 *vsrc; | 558 | u8 *vsrc; |
| @@ -580,27 +568,19 @@ static int crypto_authenc_esn_iverify(struct aead_request *req, u8 *iv, | |||
| 580 | cryptlen += ivsize; | 568 | cryptlen += ivsize; |
| 581 | } | 569 | } |
| 582 | 570 | ||
| 583 | if (sg_is_last(assoc)) | 571 | if (assoc->length < 12) |
| 584 | return -EINVAL; | ||
| 585 | |||
| 586 | assoc1 = assoc + 1; | ||
| 587 | if (sg_is_last(assoc1)) | ||
| 588 | return -EINVAL; | ||
| 589 | |||
| 590 | assoc2 = assoc + 2; | ||
| 591 | if (!sg_is_last(assoc2)) | ||
| 592 | return -EINVAL; | 572 | return -EINVAL; |
| 593 | 573 | ||
| 594 | sg_init_table(hsg, 2); | 574 | sg_init_table(hsg, 2); |
| 595 | sg_set_page(hsg, sg_page(assoc), assoc->length, assoc->offset); | 575 | sg_set_page(hsg, sg_page(assoc), 4, assoc->offset); |
| 596 | sg_set_page(hsg + 1, sg_page(assoc2), assoc2->length, assoc2->offset); | 576 | sg_set_page(hsg + 1, sg_page(assoc), 4, assoc->offset + 8); |
| 597 | 577 | ||
| 598 | sg_init_table(tsg, 1); | 578 | sg_init_table(tsg, 1); |
| 599 | sg_set_page(tsg, sg_page(assoc1), assoc1->length, assoc1->offset); | 579 | sg_set_page(tsg, sg_page(assoc), 4, assoc->offset + 4); |
| 600 | 580 | ||
| 601 | areq_ctx->cryptlen = cryptlen; | 581 | areq_ctx->cryptlen = cryptlen; |
| 602 | areq_ctx->headlen = assoc->length + assoc2->length; | 582 | areq_ctx->headlen = 8; |
| 603 | areq_ctx->trailen = assoc1->length; | 583 | areq_ctx->trailen = 4; |
| 604 | areq_ctx->sg = src; | 584 | areq_ctx->sg = src; |
| 605 | 585 | ||
| 606 | areq_ctx->complete = authenc_esn_verify_ahash_done; | 586 | areq_ctx->complete = authenc_esn_verify_ahash_done; |
