|
@@ -181,6 +181,7 @@ static void authenc_verify_ahash_update_done(struct crypto_async_request *areq,
|
|
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
|
|
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
|
|
struct authenc_request_ctx *areq_ctx = aead_request_ctx(req);
|
|
struct authenc_request_ctx *areq_ctx = aead_request_ctx(req);
|
|
struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
|
|
struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
|
|
|
|
+ unsigned int cryptlen = req->cryptlen;
|
|
|
|
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
@@ -196,6 +197,7 @@ static void authenc_verify_ahash_update_done(struct crypto_async_request *areq,
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
authsize = crypto_aead_authsize(authenc);
|
|
authsize = crypto_aead_authsize(authenc);
|
|
|
|
+ cryptlen -= authsize;
|
|
ihash = ahreq->result + authsize;
|
|
ihash = ahreq->result + authsize;
|
|
scatterwalk_map_and_copy(ihash, areq_ctx->sg, areq_ctx->cryptlen,
|
|
scatterwalk_map_and_copy(ihash, areq_ctx->sg, areq_ctx->cryptlen,
|
|
authsize, 0);
|
|
authsize, 0);
|
|
@@ -209,7 +211,7 @@ static void authenc_verify_ahash_update_done(struct crypto_async_request *areq,
|
|
ablkcipher_request_set_callback(abreq, aead_request_flags(req),
|
|
ablkcipher_request_set_callback(abreq, aead_request_flags(req),
|
|
req->base.complete, req->base.data);
|
|
req->base.complete, req->base.data);
|
|
ablkcipher_request_set_crypt(abreq, req->src, req->dst,
|
|
ablkcipher_request_set_crypt(abreq, req->src, req->dst,
|
|
- req->cryptlen, req->iv);
|
|
|
|
|
|
+ cryptlen, req->iv);
|
|
|
|
|
|
err = crypto_ablkcipher_decrypt(abreq);
|
|
err = crypto_ablkcipher_decrypt(abreq);
|
|
|
|
|
|
@@ -228,11 +230,13 @@ static void authenc_verify_ahash_done(struct crypto_async_request *areq,
|
|
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
|
|
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
|
|
struct authenc_request_ctx *areq_ctx = aead_request_ctx(req);
|
|
struct authenc_request_ctx *areq_ctx = aead_request_ctx(req);
|
|
struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
|
|
struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
|
|
|
|
+ unsigned int cryptlen = req->cryptlen;
|
|
|
|
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
authsize = crypto_aead_authsize(authenc);
|
|
authsize = crypto_aead_authsize(authenc);
|
|
|
|
+ cryptlen -= authsize;
|
|
ihash = ahreq->result + authsize;
|
|
ihash = ahreq->result + authsize;
|
|
scatterwalk_map_and_copy(ihash, areq_ctx->sg, areq_ctx->cryptlen,
|
|
scatterwalk_map_and_copy(ihash, areq_ctx->sg, areq_ctx->cryptlen,
|
|
authsize, 0);
|
|
authsize, 0);
|
|
@@ -246,7 +250,7 @@ static void authenc_verify_ahash_done(struct crypto_async_request *areq,
|
|
ablkcipher_request_set_callback(abreq, aead_request_flags(req),
|
|
ablkcipher_request_set_callback(abreq, aead_request_flags(req),
|
|
req->base.complete, req->base.data);
|
|
req->base.complete, req->base.data);
|
|
ablkcipher_request_set_crypt(abreq, req->src, req->dst,
|
|
ablkcipher_request_set_crypt(abreq, req->src, req->dst,
|
|
- req->cryptlen, req->iv);
|
|
|
|
|
|
+ cryptlen, req->iv);
|
|
|
|
|
|
err = crypto_ablkcipher_decrypt(abreq);
|
|
err = crypto_ablkcipher_decrypt(abreq);
|
|
|
|
|