| From 2c6144a7914e1fee9a922a1f947bba163c1cedcf Mon Sep 17 00:00:00 2001 |
| From: Herbert Xu <herbert@gondor.apana.org.au> |
| Date: Thu, 4 Nov 2010 14:38:39 -0400 |
| Subject: [PATCH] crypto: padlock - Fix AES-CBC handling on odd-block-sized |
| input |
| |
| commit c054a076a1bd4731820a9c4d638b13d5c9bf5935 upstream. |
| |
| On certain VIA chipsets AES-CBC requires the input/output to be |
| a multiple of 64 bytes. We had a workaround for this but it was |
| buggy as it sent the whole input for processing when it is meant |
| to only send the initial number of blocks which makes the rest |
| a multiple of 64 bytes. |
| |
| As expected this causes memory corruption whenever the workaround |
| kicks in. |
| |
| Reported-by: Phil Sutter <phil@nwl.cc> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c |
| index 2e992bc..8a515ba 100644 |
| --- a/drivers/crypto/padlock-aes.c |
| +++ b/drivers/crypto/padlock-aes.c |
| @@ -286,7 +286,7 @@ static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, |
| if (initial) |
| asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" /* rep xcryptcbc */ |
| : "+S" (input), "+D" (output), "+a" (iv) |
| - : "d" (control_word), "b" (key), "c" (count)); |
| + : "d" (control_word), "b" (key), "c" (initial)); |
| |
| asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" /* rep xcryptcbc */ |
| : "+S" (input), "+D" (output), "+a" (iv) |
| -- |
| 1.7.4.4 |
| |