Commit 0c3cf4cc9abd854dcc6488719348a75b8f328c54

Authored by Dmitry Kasatkin
Committed by Herbert Xu
1 parent 0d258efb6a

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)