| From 274252862f386b7868f35bf5ceaa5391a8ccfdf3 Mon Sep 17 00:00:00 2001 |
| From: Phil Sutter <phil.sutter@viprinet.com> |
| Date: Wed, 16 Nov 2011 18:28:01 +0100 |
| Subject: crypto: mv_cesa - fix hashing of chunks > 1920 bytes |
| |
| From: Phil Sutter <phil.sutter@viprinet.com> |
| |
| commit 274252862f386b7868f35bf5ceaa5391a8ccfdf3 upstream. |
| |
| This was broken by commit 7759995c75ae0cbd4c861582908449f6b6208e7a (yes, |
| myself). The basic problem here is since the digest state is only saved |
| after the last chunk, the state array is only valid when handling the |
| first chunk of the next buffer. Broken since linux-3.0. |
| |
| Signed-off-by: Phil Sutter <phil.sutter@viprinet.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/crypto/mv_cesa.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/crypto/mv_cesa.c |
| +++ b/drivers/crypto/mv_cesa.c |
| @@ -342,11 +342,13 @@ static void mv_process_hash_current(int |
| else |
| op.config |= CFG_MID_FRAG; |
| |
| - writel(req_ctx->state[0], cpg->reg + DIGEST_INITIAL_VAL_A); |
| - writel(req_ctx->state[1], cpg->reg + DIGEST_INITIAL_VAL_B); |
| - writel(req_ctx->state[2], cpg->reg + DIGEST_INITIAL_VAL_C); |
| - writel(req_ctx->state[3], cpg->reg + DIGEST_INITIAL_VAL_D); |
| - writel(req_ctx->state[4], cpg->reg + DIGEST_INITIAL_VAL_E); |
| + if (first_block) { |
| + writel(req_ctx->state[0], cpg->reg + DIGEST_INITIAL_VAL_A); |
| + writel(req_ctx->state[1], cpg->reg + DIGEST_INITIAL_VAL_B); |
| + writel(req_ctx->state[2], cpg->reg + DIGEST_INITIAL_VAL_C); |
| + writel(req_ctx->state[3], cpg->reg + DIGEST_INITIAL_VAL_D); |
| + writel(req_ctx->state[4], cpg->reg + DIGEST_INITIAL_VAL_E); |
| + } |
| } |
| |
| memcpy(cpg->sram + SRAM_CONFIG, &op, sizeof(struct sec_accel_config)); |