Commit c3bf02a2 authored by Russell King's avatar Russell King Committed by Herbert Xu

crypto: marvell/cesa - fix wrong hash results

Attempting to use the sha1 digest for openssh via openssl reveals that
the result from the hash is wrong: this happens when we export the
state from one socket and import it into another via calling accept().

The reason for this is because the operation is reset to "initial block"
state, whereas we may be past the first fragment of data to be hashed.

Arrange for the operation code to avoid the initialisation of the state,
thereby preserving the imported state.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent e72f407e
...@@ -837,6 +837,11 @@ static int mv_cesa_md5_import(struct ahash_request *req, const void *in) ...@@ -837,6 +837,11 @@ static int mv_cesa_md5_import(struct ahash_request *req, const void *in)
if (ret) if (ret)
return ret; return ret;
if (in_state->byte_count >= sizeof(in_state->block))
mv_cesa_update_op_cfg(&creq->op_tmpl,
CESA_SA_DESC_CFG_MID_FRAG,
CESA_SA_DESC_CFG_FRAG_MSK);
creq->len = in_state->byte_count; creq->len = in_state->byte_count;
memcpy(creq->state, in_state->hash, digsize); memcpy(creq->state, in_state->hash, digsize);
creq->cache_ptr = 0; creq->cache_ptr = 0;
...@@ -931,6 +936,11 @@ static int mv_cesa_sha1_import(struct ahash_request *req, const void *in) ...@@ -931,6 +936,11 @@ static int mv_cesa_sha1_import(struct ahash_request *req, const void *in)
if (ret) if (ret)
return ret; return ret;
if (in_state->count >= SHA1_BLOCK_SIZE)
mv_cesa_update_op_cfg(&creq->op_tmpl,
CESA_SA_DESC_CFG_MID_FRAG,
CESA_SA_DESC_CFG_FRAG_MSK);
creq->len = in_state->count; creq->len = in_state->count;
memcpy(creq->state, in_state->state, digsize); memcpy(creq->state, in_state->state, digsize);
creq->cache_ptr = 0; creq->cache_ptr = 0;
...@@ -1036,6 +1046,11 @@ static int mv_cesa_sha256_import(struct ahash_request *req, const void *in) ...@@ -1036,6 +1046,11 @@ static int mv_cesa_sha256_import(struct ahash_request *req, const void *in)
if (ret) if (ret)
return ret; return ret;
if (in_state->count >= SHA256_BLOCK_SIZE)
mv_cesa_update_op_cfg(&creq->op_tmpl,
CESA_SA_DESC_CFG_MID_FRAG,
CESA_SA_DESC_CFG_FRAG_MSK);
creq->len = in_state->count; creq->len = in_state->count;
memcpy(creq->state, in_state->state, digsize); memcpy(creq->state, in_state->state, digsize);
creq->cache_ptr = 0; creq->cache_ptr = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment