From 029bf5a02bcb0cc7a46b3c2f1ce2798da6dcfaf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horia=20Geant=C4=83?= Date: Mon, 23 Mar 2020 11:37:11 +0200 Subject: [PATCH] MLK-21644 crypto: tcrypt - workaround for overlapping src, dst AAD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a temporary workround for the case when: -SWIOTLB is used for DMA bounce buffering AND -data to be DMA-ed is mapped DMA_FROM_DEVICE and device only partially overwrites the "original" data AND -it's expected that the "original" data that was not overwritten by the device to be untouched As discussed in upstream, the proper fix should be: -either an extension of the DMA API OR -a workaround in the device driver (considering these cases are rarely met in practice) Since both alternatives are not trivial (to say the least), add a workaround for the few cases matching the error conditions listed above. Link: https://lore.kernel.org/lkml/VI1PR0402MB348537CB86926B3E6D1DBE0A98070@VI1PR0402MB3485.eurprd04.prod.outlook.com/ Link: https://lore.kernel.org/lkml/20190522072018.10660-1-horia.geanta@nxp.com/ Signed-off-by: Horia Geantă Reviewed-by: Valentin Ciocoi Radulescu Reviewed-by: Iuliana Prodan --- crypto/tcrypt.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 7ffe9dcba42e..633e8075d22c 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c @@ -256,7 +256,7 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs, unsigned int i, j, iv_len; const char *key; const char *e; - void *assoc; + void *assoc, *assoc_out; u32 *b_size; char *iv; int ret; @@ -376,6 +376,8 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs, assoc = cur->axbuf[0]; memset(assoc, 0xff, aad_size); + assoc_out = cur->axbuf[1]; + memset(assoc_out, 0xff, aad_size); sg_init_aead(cur->sg, cur->xbuf, *b_size + (enc ? 0 : authsize), @@ -383,7 +385,7 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs, sg_init_aead(cur->sgout, cur->xoutbuf, *b_size + (enc ? authsize : 0), - assoc, aad_size); + assoc_out, aad_size); aead_request_set_ad(cur->req, aad_size); @@ -401,6 +403,9 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs, ret); break; } + + memset(assoc, 0xff, aad_size); + memset(assoc_out, 0xff, aad_size); } aead_request_set_crypt(cur->req, cur->sg, @@ -527,7 +532,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, struct scatterlist *sg; struct scatterlist *sgout; const char *e; - void *assoc; + void *assoc, *assoc_out; char *iv; char *xbuf[XBUFSIZE]; char *xoutbuf[XBUFSIZE]; @@ -590,6 +595,8 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, do { assoc = axbuf[0]; memset(assoc, 0xff, aad_size); + assoc_out = axbuf[1]; + memset(assoc_out, 0xff, aad_size); if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) { pr_err("template (%u) too big for tvmem (%lu)\n", @@ -629,7 +636,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, assoc, aad_size); sg_init_aead(sgout, xoutbuf, - *b_size + (enc ? authsize : 0), assoc, + *b_size + (enc ? authsize : 0), assoc_out, aad_size); aead_request_set_ad(req, aad_size); @@ -651,6 +658,9 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, ret); break; } + + memset(assoc, 0xff, aad_size); + memset(assoc_out, 0xff, aad_size); } aead_request_set_crypt(req, sg, sgout,