LF-286 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>
This commit is contained in:
Horia Geantă 2020-03-23 11:37:11 +02:00 committed by Dong Aisheng
parent 1e82a01a16
commit 1b09322268

View File

@ -251,7 +251,7 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs,
const int *b_size;
const char *key;
const char *e;
void *assoc;
void *assoc, *assoc_out;
char *iv;
int ret;
@ -377,6 +377,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,
bs + (enc ? 0 : authsize),
@ -384,7 +386,7 @@ static void test_mb_aead_speed(const char *algo, int enc, int secs,
sg_init_aead(cur->sgout, cur->xoutbuf,
bs + (enc ? authsize : 0),
assoc, aad_size);
assoc_out, aad_size);
aead_request_set_ad(cur->req, aad_size);
@ -402,6 +404,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,
@ -528,7 +533,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];
@ -599,6 +604,8 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs,
assoc = axbuf[0];
memset(assoc, 0xff, aad_size);
assoc_out = axbuf[1];
memset(assoc_out, 0xff, aad_size);
if ((*keysize + bs) > TVMEMSIZE * PAGE_SIZE) {
pr_err("template (%u) too big for tvmem (%lu)\n",
@ -636,7 +643,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs,
assoc, aad_size);
sg_init_aead(sgout, xoutbuf,
bs + (enc ? authsize : 0), assoc,
bs + (enc ? authsize : 0), assoc_out,
aad_size);
aead_request_set_ad(req, aad_size);
@ -658,6 +665,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,