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
parent
c4b5c4cf6c
commit
029bf5a02b
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue