| 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:33 +0300 |
| Subject: crypto: omap-sham - fix closing of hash with separate finalize call |
| |
| From: Tero Kristo <t-kristo@ti.com> |
| |
| |
| [ Upstream commit 898d86a565925f09de3d0b30cf3b47ec2e409680 ] |
| |
| Currently there is an interesting corner case failure with omap-sham |
| driver, if the finalize call is done separately with no data, but |
| all previous data has already been processed. In this case, it is not |
| possible to close the hash with the hardware without providing any data, |
| so we get incorrect results. Fix this by adjusting the size of data |
| sent to the hardware crypto engine in case the non-final data size falls |
| on the block size boundary, by reducing the amount of data sent by one |
| full block. This makes it sure that we always have some data available |
| for the finalize call and we can close the hash properly. |
| |
| Signed-off-by: Tero Kristo <t-kristo@ti.com> |
| Reported-by: Aparna Balasubramanian <aparnab@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 | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/crypto/omap-sham.c |
| +++ b/drivers/crypto/omap-sham.c |
| @@ -750,7 +750,10 @@ static int omap_sham_align_sgs(struct sc |
| if (final) |
| new_len = DIV_ROUND_UP(new_len, bs) * bs; |
| else |
| - new_len = new_len / bs * bs; |
| + new_len = (new_len - 1) / bs * bs; |
| + |
| + if (nbytes != new_len) |
| + list_ok = false; |
| |
| while (nbytes > 0 && sg_tmp) { |
| n++; |
| @@ -846,6 +849,8 @@ static int omap_sham_prepare_request(str |
| xmit_len = DIV_ROUND_UP(xmit_len, bs) * bs; |
| else |
| xmit_len = xmit_len / bs * bs; |
| + } else if (!final) { |
| + xmit_len -= bs; |
| } |
| |
| hash_later = rctx->total - xmit_len; |
| @@ -1137,7 +1142,7 @@ retry: |
| ctx = ahash_request_ctx(req); |
| |
| err = omap_sham_prepare_request(req, ctx->op == OP_UPDATE); |
| - if (err) |
| + if (err || !ctx->total) |
| goto err1; |
| |
| dev_dbg(dd->dev, "handling new req, op: %lu, nbytes: %d\n", |