aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/mv_cesa.c
diff options
context:
space:
mode:
authorPhil Sutter <phil.sutter@viprinet.com>2012-05-25 09:54:49 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2012-06-12 04:46:05 -0400
commit4d03c5047a07a62563e1a8fa798ea258f048bfde (patch)
treea4f90fbc4c7dfb4dd3dc7f8e820b2e19c501a451 /drivers/crypto/mv_cesa.c
parent5741d2eeaee28b37a4711a1776f716b274f3d2e4 (diff)
crypto: mv_cesa - fix for hash finalisation with data
Since mv_hash_final_fallback() uses ctx->state, read out the digest state register before calling it. Signed-off-by: Phil Sutter <phil.sutter@viprinet.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/mv_cesa.c')
-rw-r--r--drivers/crypto/mv_cesa.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/crypto/mv_cesa.c b/drivers/crypto/mv_cesa.c
index 904623d45c62..0d4071754352 100644
--- a/drivers/crypto/mv_cesa.c
+++ b/drivers/crypto/mv_cesa.c
@@ -423,6 +423,15 @@ out:
423 return rc; 423 return rc;
424} 424}
425 425
426static void mv_save_digest_state(struct mv_req_hash_ctx *ctx)
427{
428 ctx->state[0] = readl(cpg->reg + DIGEST_INITIAL_VAL_A);
429 ctx->state[1] = readl(cpg->reg + DIGEST_INITIAL_VAL_B);
430 ctx->state[2] = readl(cpg->reg + DIGEST_INITIAL_VAL_C);
431 ctx->state[3] = readl(cpg->reg + DIGEST_INITIAL_VAL_D);
432 ctx->state[4] = readl(cpg->reg + DIGEST_INITIAL_VAL_E);
433}
434
426static void mv_hash_algo_completion(void) 435static void mv_hash_algo_completion(void)
427{ 436{
428 struct ahash_request *req = ahash_request_cast(cpg->cur_req); 437 struct ahash_request *req = ahash_request_cast(cpg->cur_req);
@@ -437,14 +446,12 @@ static void mv_hash_algo_completion(void)
437 memcpy(req->result, cpg->sram + SRAM_DIGEST_BUF, 446 memcpy(req->result, cpg->sram + SRAM_DIGEST_BUF,
438 crypto_ahash_digestsize(crypto_ahash_reqtfm 447 crypto_ahash_digestsize(crypto_ahash_reqtfm
439 (req))); 448 (req)));
440 } else 449 } else {
450 mv_save_digest_state(ctx);
441 mv_hash_final_fallback(req); 451 mv_hash_final_fallback(req);
452 }
442 } else { 453 } else {
443 ctx->state[0] = readl(cpg->reg + DIGEST_INITIAL_VAL_A); 454 mv_save_digest_state(ctx);
444 ctx->state[1] = readl(cpg->reg + DIGEST_INITIAL_VAL_B);
445 ctx->state[2] = readl(cpg->reg + DIGEST_INITIAL_VAL_C);
446 ctx->state[3] = readl(cpg->reg + DIGEST_INITIAL_VAL_D);
447 ctx->state[4] = readl(cpg->reg + DIGEST_INITIAL_VAL_E);
448 } 455 }
449} 456}
450 457