1
0
Fork 0

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>
5.4-rM2-2.2.x-imx-squashed
Horia Geantă 2020-03-23 11:37:11 +02:00
parent c4b5c4cf6c
commit 029bf5a02b
1 changed files with 14 additions and 4 deletions

View File

@ -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,