[PATCH 4.8 055/125] crypto: marvell - Dont overwrite default creq->state during initialization

From: Greg Kroah-Hartman
Date: Sat Oct 29 2016 - 10:14:00 EST


4.8-stable review patch. If anyone has any objections, please let me know.

------------------

From: Romain Perier <romain.perier@xxxxxxxxxxxxxxxxxx>

commit 57cfda1ac74e58767f6305bd1ea3449177425460 upstream.

Currently, in mv_cesa_{md5,sha1,sha256}_init creq->state is initialized
before the call to mv_cesa_ahash_init. This is wrong because this
function fills creq with zero by using memset, so its 'state' that
contains the default DIGEST is overwritten. This commit fixes the issue
by initializing creq->state just after the call to mv_cesa_ahash_init.

Fixes: commit b0ef51067cb4 ("crypto: marvell/cesa - initialize hash...")
Signed-off-by: Romain Perier <romain.perier@xxxxxxxxxxxxxxxxxx>
Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>

---
drivers/crypto/marvell/hash.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)

--- a/drivers/crypto/marvell/hash.c
+++ b/drivers/crypto/marvell/hash.c
@@ -805,13 +805,14 @@ static int mv_cesa_md5_init(struct ahash
struct mv_cesa_op_ctx tmpl = { };

mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_MD5);
+
+ mv_cesa_ahash_init(req, &tmpl, true);
+
creq->state[0] = MD5_H0;
creq->state[1] = MD5_H1;
creq->state[2] = MD5_H2;
creq->state[3] = MD5_H3;

- mv_cesa_ahash_init(req, &tmpl, true);
-
return 0;
}

@@ -873,14 +874,15 @@ static int mv_cesa_sha1_init(struct ahas
struct mv_cesa_op_ctx tmpl = { };

mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_SHA1);
+
+ mv_cesa_ahash_init(req, &tmpl, false);
+
creq->state[0] = SHA1_H0;
creq->state[1] = SHA1_H1;
creq->state[2] = SHA1_H2;
creq->state[3] = SHA1_H3;
creq->state[4] = SHA1_H4;

- mv_cesa_ahash_init(req, &tmpl, false);
-
return 0;
}

@@ -942,6 +944,9 @@ static int mv_cesa_sha256_init(struct ah
struct mv_cesa_op_ctx tmpl = { };

mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_SHA256);
+
+ mv_cesa_ahash_init(req, &tmpl, false);
+
creq->state[0] = SHA256_H0;
creq->state[1] = SHA256_H1;
creq->state[2] = SHA256_H2;
@@ -951,8 +956,6 @@ static int mv_cesa_sha256_init(struct ah
creq->state[6] = SHA256_H6;
creq->state[7] = SHA256_H7;

- mv_cesa_ahash_init(req, &tmpl, false);
-
return 0;
}