]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00215875-2: caam: fix descriptor buffer overrun in hash_digest_key()
authorSteve Cornelius <steve.cornelius@freescale.com>
Thu, 30 Aug 2012 21:15:39 +0000 (14:15 -0700)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:22 +0000 (08:35 +0200)
HMAC keys often need to be reduced to under the size of a digest to
be used. The driver does this psuedo-synchronously through the use of
hash_digest_key(), which builds a sequence pointered job descriptor to
perform this function.

When this function built the job descriptor, it correctly accounted for the
number of instructions and number of pointers that would go into its
construction. However, it failed to account for the fact that both the
sequence in and out pointers used extended lengths, adding 8 more bytes to
the required job descriptor. This caused the descriptor to overrun the
allocated buffer by that amount, resulting in memory corruptions.

Signed-off-by: Steve Cornelius <steve.cornelius@freescale.com>
Signed-off-by: Terry Lv <r65388@freescale.com>
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/desc_constr.h

index b8cf42b0795cdc8882dc6342ba7de9d8474a6be0..ee065151f0fc55c6228fdfed9db9c902994a2f65 100644 (file)
@@ -441,7 +441,13 @@ static u32 hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in,
        dma_addr_t src_dma, dst_dma;
        int ret = 0;
 
-       desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
+       /*
+        * Hashing descriptor is 6 commands (including header), 2 pointers,
+        * and 2 extended lengths
+        */
+       desc = kmalloc((CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2 +
+                       CAAM_EXTLEN_SZ * 2),
+                       GFP_KERNEL | GFP_DMA);
 
        init_job_desc(desc, 0);
 
index c85c1f0584012cfc35c3ba7784e056e6d64ef855..0393c98f5b9c60d4e70f57ddf5be16a1ef5ee047 100644 (file)
@@ -9,6 +9,7 @@
 #define IMMEDIATE (1 << 23)
 #define CAAM_CMD_SZ sizeof(u32)
 #define CAAM_PTR_SZ sizeof(dma_addr_t)
+#define CAAM_EXTLEN_SZ sizeof(u32)
 #define CAAM_DESC_BYTES_MAX (CAAM_CMD_SZ * MAX_CAAM_DESCSIZE)
 
 #ifdef DEBUG