crypto: caam - use len instead of nents for bulding HW S/G table
Currently, conversion of SW S/G table into HW S/G layout relies on nents returned by sg_nents_for_len(sg, len). However this leaves the possibility of HW S/G referencing more data then needed: since buffer length in HW S/G entries is filled using sg_dma_len(sg), the last entry in HW S/G table might have a length that is bigger than needed for the crypto request. This way of S/G table conversion is fine, unless after converting a table more entries have to be appended to the HW S/G table. In this case, crypto engine would access data from the S/G entry having the incorrect length, instead of advancing in the S/G table. This situation doesn't exist, but the upcoming implementation of IV update for skcipher algorithms needs to add a S/G entry after req->dst S/G (corresponding to output IV). Signed-off-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Este commit está contenido en:
@@ -729,7 +729,7 @@ static int ahash_edesc_add_src(struct caam_hash_ctx *ctx,
|
||||
unsigned int sgsize = sizeof(*sg) *
|
||||
pad_sg_nents(first_sg + nents);
|
||||
|
||||
sg_to_sec4_sg_last(req->src, nents, sg + first_sg, 0);
|
||||
sg_to_sec4_sg_last(req->src, to_hash, sg + first_sg, 0);
|
||||
|
||||
src_dma = dma_map_single(ctx->jrdev, sg, sgsize, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(ctx->jrdev, src_dma)) {
|
||||
@@ -788,9 +788,9 @@ static int ahash_update_ctx(struct ahash_request *req)
|
||||
|
||||
if (to_hash) {
|
||||
int pad_nents;
|
||||
int src_len = req->nbytes - *next_buflen;
|
||||
|
||||
src_nents = sg_nents_for_len(req->src,
|
||||
req->nbytes - (*next_buflen));
|
||||
src_nents = sg_nents_for_len(req->src, src_len);
|
||||
if (src_nents < 0) {
|
||||
dev_err(jrdev, "Invalid number of src SG.\n");
|
||||
return src_nents;
|
||||
@@ -835,7 +835,7 @@ static int ahash_update_ctx(struct ahash_request *req)
|
||||
goto unmap_ctx;
|
||||
|
||||
if (mapped_nents)
|
||||
sg_to_sec4_sg_last(req->src, mapped_nents,
|
||||
sg_to_sec4_sg_last(req->src, src_len,
|
||||
edesc->sec4_sg + sec4_sg_src_index,
|
||||
0);
|
||||
else
|
||||
@@ -1208,9 +1208,9 @@ static int ahash_update_no_ctx(struct ahash_request *req)
|
||||
|
||||
if (to_hash) {
|
||||
int pad_nents;
|
||||
int src_len = req->nbytes - *next_buflen;
|
||||
|
||||
src_nents = sg_nents_for_len(req->src,
|
||||
req->nbytes - *next_buflen);
|
||||
src_nents = sg_nents_for_len(req->src, src_len);
|
||||
if (src_nents < 0) {
|
||||
dev_err(jrdev, "Invalid number of src SG.\n");
|
||||
return src_nents;
|
||||
@@ -1250,8 +1250,7 @@ static int ahash_update_no_ctx(struct ahash_request *req)
|
||||
if (ret)
|
||||
goto unmap_ctx;
|
||||
|
||||
sg_to_sec4_sg_last(req->src, mapped_nents,
|
||||
edesc->sec4_sg + 1, 0);
|
||||
sg_to_sec4_sg_last(req->src, src_len, edesc->sec4_sg + 1, 0);
|
||||
|
||||
if (*next_buflen) {
|
||||
scatterwalk_map_and_copy(next_buf, req->src,
|
||||
|
Referencia en una nueva incidencia
Block a user