diff options
author | Antoine Ténart <antoine.tenart@free-electrons.com> | 2017-12-11 06:10:58 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-12-22 03:48:01 -0500 |
commit | 2973633e9f09311e849f975d969737af81a521ff (patch) | |
tree | 655b362b754a0299cbaf3e8bcc8f84b30d4ab5a1 | |
parent | 7cad2fabd5691dbb17762877d4e7f236fe4bc181 (diff) |
crypto: inside-secure - do not use areq->result for partial results
This patches update the SafeXcel driver to stop using the crypto
ahash_request result field for partial results (i.e. on updates).
Instead the driver local safexcel_ahash_req state field is used, and
only on final operations the ahash_request result buffer is updated.
Fixes: 1b44c5a60c13 ("crypto: inside-secure - add SafeXcel EIP197 crypto engine driver")
Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/inside-secure/safexcel_hash.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/crypto/inside-secure/safexcel_hash.c b/drivers/crypto/inside-secure/safexcel_hash.c index 55ff8a340b11..0c5a5820b06e 100644 --- a/drivers/crypto/inside-secure/safexcel_hash.c +++ b/drivers/crypto/inside-secure/safexcel_hash.c | |||
@@ -35,7 +35,7 @@ struct safexcel_ahash_req { | |||
35 | bool needs_inv; | 35 | bool needs_inv; |
36 | 36 | ||
37 | u8 state_sz; /* expected sate size, only set once */ | 37 | u8 state_sz; /* expected sate size, only set once */ |
38 | u32 state[SHA256_DIGEST_SIZE / sizeof(u32)]; | 38 | u32 state[SHA256_DIGEST_SIZE / sizeof(u32)] __aligned(sizeof(u32)); |
39 | 39 | ||
40 | u64 len; | 40 | u64 len; |
41 | u64 processed; | 41 | u64 processed; |
@@ -128,7 +128,7 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin | |||
128 | struct ahash_request *areq = ahash_request_cast(async); | 128 | struct ahash_request *areq = ahash_request_cast(async); |
129 | struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq); | 129 | struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq); |
130 | struct safexcel_ahash_req *sreq = ahash_request_ctx(areq); | 130 | struct safexcel_ahash_req *sreq = ahash_request_ctx(areq); |
131 | int cache_len, result_sz = sreq->state_sz; | 131 | int cache_len; |
132 | 132 | ||
133 | *ret = 0; | 133 | *ret = 0; |
134 | 134 | ||
@@ -149,8 +149,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin | |||
149 | spin_unlock_bh(&priv->ring[ring].egress_lock); | 149 | spin_unlock_bh(&priv->ring[ring].egress_lock); |
150 | 150 | ||
151 | if (sreq->finish) | 151 | if (sreq->finish) |
152 | result_sz = crypto_ahash_digestsize(ahash); | 152 | memcpy(areq->result, sreq->state, |
153 | memcpy(sreq->state, areq->result, result_sz); | 153 | crypto_ahash_digestsize(ahash)); |
154 | 154 | ||
155 | dma_unmap_sg(priv->dev, areq->src, | 155 | dma_unmap_sg(priv->dev, areq->src, |
156 | sg_nents_for_len(areq->src, areq->nbytes), DMA_TO_DEVICE); | 156 | sg_nents_for_len(areq->src, areq->nbytes), DMA_TO_DEVICE); |
@@ -274,7 +274,7 @@ send_command: | |||
274 | /* Add the token */ | 274 | /* Add the token */ |
275 | safexcel_hash_token(first_cdesc, len, req->state_sz); | 275 | safexcel_hash_token(first_cdesc, len, req->state_sz); |
276 | 276 | ||
277 | ctx->base.result_dma = dma_map_single(priv->dev, areq->result, | 277 | ctx->base.result_dma = dma_map_single(priv->dev, req->state, |
278 | req->state_sz, DMA_FROM_DEVICE); | 278 | req->state_sz, DMA_FROM_DEVICE); |
279 | if (dma_mapping_error(priv->dev, ctx->base.result_dma)) { | 279 | if (dma_mapping_error(priv->dev, ctx->base.result_dma)) { |
280 | ret = -EINVAL; | 280 | ret = -EINVAL; |