Skip to content

Commit

Permalink
[CRYPTO] authenc: Fix hash verification
Browse files Browse the repository at this point in the history
The previous code incorrectly included the hash in the verification which
also meant that we'd crash and burn when it comes to actually verifying
the hash since we'd go past the end of the SG list.

This patch fixes that by subtracting authsize from cryptlen at the start.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
herbertx committed Jan 10, 2008
1 parent e236d4a commit 481f34a
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions crypto/authenc.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,8 @@ static int crypto_authenc_encrypt(struct aead_request *req)
return crypto_authenc_hash(req);
}

static int crypto_authenc_verify(struct aead_request *req)
static int crypto_authenc_verify(struct aead_request *req,
unsigned int cryptlen)
{
struct crypto_aead *authenc = crypto_aead_reqtfm(req);
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
Expand All @@ -170,7 +171,6 @@ static int crypto_authenc_verify(struct aead_request *req)
u8 *ohash = aead_request_ctx(req);
u8 *ihash;
struct scatterlist *src = req->src;
unsigned int cryptlen = req->cryptlen;
unsigned int authsize;
int err;

Expand Down Expand Up @@ -214,16 +214,22 @@ static int crypto_authenc_decrypt(struct aead_request *req)
struct crypto_aead *authenc = crypto_aead_reqtfm(req);
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
struct ablkcipher_request *abreq = aead_request_ctx(req);
unsigned int cryptlen = req->cryptlen;
unsigned int authsize = crypto_aead_authsize(authenc);
int err;

err = crypto_authenc_verify(req);
if (cryptlen < authsize)
return -EINVAL;
cryptlen -= authsize;

err = crypto_authenc_verify(req, cryptlen);
if (err)
return err;

ablkcipher_request_set_tfm(abreq, ctx->enc);
ablkcipher_request_set_callback(abreq, aead_request_flags(req),
crypto_authenc_decrypt_done, req);
ablkcipher_request_set_crypt(abreq, req->src, req->dst, req->cryptlen,
ablkcipher_request_set_crypt(abreq, req->src, req->dst, cryptlen,
req->iv);

return crypto_ablkcipher_decrypt(abreq);
Expand Down

0 comments on commit 481f34a

Please sign in to comment.