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 13:39:32 +0300
commit02e96760b8fbeffcab1769f9a9a45da661409cc2 (patch)
tree8d4beb3816bb6254b830293f09d9d190c5e28b4f /crypto
parent651364b5fe44c83cb8f89c4d9f8f89359fb787c5 (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.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index 54952bd885c4..8bbc5de37ca4 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -224,7 +224,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];
@@ -287,6 +287,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",
@@ -326,7 +328,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);
@@ -348,6 +350,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,