We were copying the last ciphertext block into the IV field
for CBC before removing the DMA mapping of the output buffer
with the result of the buffer sometime being out-of-sync cache
wise and were getting intermittent cases of bad output IV.

Fix it by moving the DMA buffer unmapping before the copy.

Signed-off-by: Gilad Ben-Yossef <gi...@benyossef.com>
Fixes: 00904aa0cd59 ("crypto: ccree - fix iv handling")
Cc: <sta...@vger.kernel.org>
---
 drivers/crypto/ccree/cc_cipher.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/ccree/cc_cipher.c b/drivers/crypto/ccree/cc_cipher.c
index cc92b031fad1..98ea53524250 100644
--- a/drivers/crypto/ccree/cc_cipher.c
+++ b/drivers/crypto/ccree/cc_cipher.c
@@ -652,6 +652,8 @@ static void cc_cipher_complete(struct device *dev, void 
*cc_req, int err)
        unsigned int ivsize = crypto_skcipher_ivsize(sk_tfm);
        unsigned int len;
 
+       cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst);
+
        switch (ctx_p->cipher_mode) {
        case DRV_CIPHER_CBC:
                /*
@@ -681,7 +683,6 @@ static void cc_cipher_complete(struct device *dev, void 
*cc_req, int err)
                break;
        }
 
-       cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst);
        kzfree(req_ctx->iv);
 
        skcipher_request_complete(req, err);
-- 
2.20.1

Reply via email to