Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=481f34ae752ac74c4cbd88a9954dd4ed10e84f81
Commit:     481f34ae752ac74c4cbd88a9954dd4ed10e84f81
Parent:     e236d4a89a2ffbc8aa18064161f4f159c4d89b4a
Author:     Herbert Xu <[EMAIL PROTECTED]>
AuthorDate: Tue Dec 4 20:04:21 2007 +1100
Committer:  Herbert Xu <[EMAIL PROTECTED]>
CommitDate: Fri Jan 11 08:16:30 2008 +1100

    [CRYPTO] authenc: Fix hash verification
    
    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 <[EMAIL PROTECTED]>
---
 crypto/authenc.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/crypto/authenc.c b/crypto/authenc.c
index a61dea1..82e03ff 100644
--- a/crypto/authenc.c
+++ b/crypto/authenc.c
@@ -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);
@@ -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;
 
@@ -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);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to