summaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
authorHoria Geantă <horia.geanta@nxp.com>2020-03-23 11:37:11 +0200
committerHoria Geantă <horia.geanta@nxp.com>2020-03-31 12:50:38 +0300
commit029bf5a02bcb0cc7a46b3c2f1ce2798da6dcfaf5 (patch)
tree236db60c7157bf38280a80fbd8cc5f9573c290d9 /crypto
parentc4b5c4cf6cedeca72c0a627df19ada59ec664a80 (diff)
MLK-21644 crypto: tcrypt - workaround for overlapping src, dst AAD
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ă <horia.geanta@nxp.com> Reviewed-by: Valentin Ciocoi Radulescu <valentin.ciocoi@nxp.com> Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/tcrypt.c18
1 files 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,