Skip to content

Commit 441f99c

Browse files
romain-izard-proherbertx
authored andcommitted
crypto: ccm - preserve the IV buffer
The IV buffer used during CCM operations is used twice, during both the hashing step and the ciphering step. When using a hardware accelerator that updates the contents of the IV buffer at the end of ciphering operations, the value will be modified. In the decryption case, the subsequent setup of the hashing algorithm will interpret the updated IV instead of the original value, which can lead to out-of-bounds writes. Reuse the idata buffer, only used in the hashing step, to preserve the IV's value during the ciphering step in the decryption case. Signed-off-by: Romain Izard <romain.izard.pro@gmail.com> Reviewed-by: Tudor Ambarus <tudor.ambarus@microchip.com> Cc: <stable@vger.kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent d041b55 commit 441f99c

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

crypto/ccm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ static int crypto_ccm_decrypt(struct aead_request *req)
363363
unsigned int cryptlen = req->cryptlen;
364364
u8 *authtag = pctx->auth_tag;
365365
u8 *odata = pctx->odata;
366-
u8 *iv = req->iv;
366+
u8 *iv = pctx->idata;
367367
int err;
368368

369369
cryptlen -= authsize;
@@ -379,6 +379,8 @@ static int crypto_ccm_decrypt(struct aead_request *req)
379379
if (req->src != req->dst)
380380
dst = pctx->dst;
381381

382+
memcpy(iv, req->iv, 16);
383+
382384
skcipher_request_set_tfm(skreq, ctx->ctr);
383385
skcipher_request_set_callback(skreq, pctx->flags,
384386
crypto_ccm_decrypt_done, req);

0 commit comments

Comments
 (0)