| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Tero Kristo <t-kristo@ti.com> |
| Date: Wed, 24 May 2017 10:35:32 +0300 |
| Subject: crypto: omap-sham - buffer handling fixes for hashing later |
| |
| From: Tero Kristo <t-kristo@ti.com> |
| |
| |
| [ Upstream commit 5d78d57ede8f9e7f656c610ed25be7be337e0529 ] |
| |
| Currently, the hash later code only handles the cases when we have |
| either new data coming in with the request or old data in the buffer, |
| but not the combination when we have both. Fix this by changing the |
| ordering of the code a bit and handling both cases properly |
| simultaneously if needed. Also, fix an issue with omap_sham_update |
| that surfaces with this fix, so that the code checks the bufcnt |
| instead of total data amount against buffer length to avoid any |
| buffer overflows. |
| |
| Signed-off-by: Tero Kristo <t-kristo@ti.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/crypto/omap-sham.c | 22 ++++++++++++++-------- |
| 1 file changed, 14 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/crypto/omap-sham.c |
| +++ b/drivers/crypto/omap-sham.c |
| @@ -873,14 +873,21 @@ static int omap_sham_prepare_request(str |
| } |
| |
| if (hash_later) { |
| - if (req->nbytes) { |
| - scatterwalk_map_and_copy(rctx->buffer, req->src, |
| - req->nbytes - hash_later, |
| - hash_later, 0); |
| - } else { |
| + int offset = 0; |
| + |
| + if (hash_later > req->nbytes) { |
| memcpy(rctx->buffer, rctx->buffer + xmit_len, |
| - hash_later); |
| + hash_later - req->nbytes); |
| + offset = hash_later - req->nbytes; |
| + } |
| + |
| + if (req->nbytes) { |
| + scatterwalk_map_and_copy(rctx->buffer + offset, |
| + req->src, |
| + offset + req->nbytes - |
| + hash_later, hash_later, 0); |
| } |
| + |
| rctx->bufcnt = hash_later; |
| } else { |
| rctx->bufcnt = 0; |
| @@ -1189,11 +1196,10 @@ static int omap_sham_update(struct ahash |
| if (!req->nbytes) |
| return 0; |
| |
| - if (ctx->total + req->nbytes < ctx->buflen) { |
| + if (ctx->bufcnt + req->nbytes <= ctx->buflen) { |
| scatterwalk_map_and_copy(ctx->buffer + ctx->bufcnt, req->src, |
| 0, req->nbytes, 0); |
| ctx->bufcnt += req->nbytes; |
| - ctx->total += req->nbytes; |
| return 0; |
| } |
| |