Commit 0c3cf4cc9abd854dcc6488719348a75b8f328c54
Committed by
Herbert Xu
1 parent
0d258efb6a
Exists in
master
and in
4 other branches
crypto: omap-sham - uses digest buffer in request context
Currently driver storred digest results in req->results provided by the client. But some clients do not set it until final() call. It leads to crash. Changed to use internal buffer to store temporary digest results. Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@nokia.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Showing 1 changed file with 8 additions and 3 deletions Side-by-side Diff
drivers/crypto/omap-sham.c
... | ... | @@ -97,6 +97,7 @@ |
97 | 97 | unsigned long flags; |
98 | 98 | unsigned long op; |
99 | 99 | |
100 | + u8 digest[SHA1_DIGEST_SIZE]; | |
100 | 101 | size_t digcnt; |
101 | 102 | u8 *buffer; |
102 | 103 | size_t bufcnt; |
... | ... | @@ -194,7 +195,7 @@ |
194 | 195 | static void omap_sham_copy_hash(struct ahash_request *req, int out) |
195 | 196 | { |
196 | 197 | struct omap_sham_reqctx *ctx = ahash_request_ctx(req); |
197 | - u32 *hash = (u32 *)req->result; | |
198 | + u32 *hash = (u32 *)ctx->digest; | |
198 | 199 | int i; |
199 | 200 | |
200 | 201 | if (likely(ctx->flags & FLAGS_SHA1)) { |
201 | 202 | |
... | ... | @@ -453,8 +454,11 @@ |
453 | 454 | ctx->flags |= FLAGS_CLEAN; |
454 | 455 | spin_unlock_irqrestore(&dd->lock, flags); |
455 | 456 | |
456 | - if (ctx->digcnt) | |
457 | + if (ctx->digcnt) { | |
457 | 458 | clk_disable(dd->iclk); |
459 | + memcpy(req->result, ctx->digest, (ctx->flags & FLAGS_SHA1) ? | |
460 | + SHA1_DIGEST_SIZE : MD5_DIGEST_SIZE); | |
461 | + } | |
458 | 462 | |
459 | 463 | if (ctx->dma_addr) |
460 | 464 | dma_unmap_single(dd->dev, ctx->dma_addr, ctx->buflen, |
... | ... | @@ -576,6 +580,7 @@ |
576 | 580 | |
577 | 581 | static int omap_sham_finish_req_hmac(struct ahash_request *req) |
578 | 582 | { |
583 | + struct omap_sham_reqctx *ctx = ahash_request_ctx(req); | |
579 | 584 | struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm); |
580 | 585 | struct omap_sham_hmac_ctx *bctx = tctx->base; |
581 | 586 | int bs = crypto_shash_blocksize(bctx->shash); |
... | ... | @@ -590,7 +595,7 @@ |
590 | 595 | |
591 | 596 | return crypto_shash_init(&desc.shash) ?: |
592 | 597 | crypto_shash_update(&desc.shash, bctx->opad, bs) ?: |
593 | - crypto_shash_finup(&desc.shash, req->result, ds, req->result); | |
598 | + crypto_shash_finup(&desc.shash, ctx->digest, ds, ctx->digest); | |
594 | 599 | } |
595 | 600 | |
596 | 601 | static void omap_sham_finish_req(struct ahash_request *req, int err) |