linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation
@ 2016-02-08 15:26 Cyrille Pitchen
  2016-02-08 15:26 ` [PATCH 1/2] " Cyrille Pitchen
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Cyrille Pitchen @ 2016-02-08 15:26 UTC (permalink / raw)
  To: linux-arm-kernel

This series of patches includes two fixes for the atmel-sha.c driver.

The first one fixes the implementation of the import/export hooks, which
did not pass the recent updates in testmgr.c (partial update exercise).
The new implementation now passes the tcrypt tests: tested with
next-20160208.

The second patch fixes a race condition if acquiring the hardware when it
is already busy.

Cyrille Pitchen (2):
  crypto: atmel-sha - fix .import()/.export() implementation
  crypto: atmel-sha - fix race in atmel_sha_final()

 drivers/crypto/atmel-sha.c | 68 ++++++++--------------------------------------
 1 file changed, 12 insertions(+), 56 deletions(-)

-- 
1.8.2.2

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] crypto: atmel-sha - fix .import()/.export() implementation
  2016-02-08 15:26 [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Cyrille Pitchen
@ 2016-02-08 15:26 ` Cyrille Pitchen
  2016-02-08 15:26 ` [PATCH 2/2] crypto: atmel-sha - fix race in atmel_sha_final() Cyrille Pitchen
  2016-02-16 20:21 ` [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Herbert Xu
  2 siblings, 0 replies; 4+ messages in thread
From: Cyrille Pitchen @ 2016-02-08 15:26 UTC (permalink / raw)
  To: linux-arm-kernel

Using only the digest, digcnt[], bufcnt and buffer[] fields of the
struct atmel_sha_reqctx was not enough to import/export the request state,
so now we use the whole structure.

Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
---
 drivers/crypto/atmel-sha.c | 44 ++++++++++----------------------------------
 1 file changed, 10 insertions(+), 34 deletions(-)

diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c
index f8407dc7dd38..7d27f96cdf02 100644
--- a/drivers/crypto/atmel-sha.c
+++ b/drivers/crypto/atmel-sha.c
@@ -81,16 +81,9 @@ struct atmel_sha_caps {
 struct atmel_sha_dev;
 
 /*
- * .statesize = sizeof(struct atmel_sha_state) must be <= PAGE_SIZE / 8 as
+ * .statesize = sizeof(struct atmel_sha_reqctx) must be <= PAGE_SIZE / 8 as
  * tested by the ahash_prepare_alg() function.
  */
-struct atmel_sha_state {
-	u8	digest[SHA512_DIGEST_SIZE];
-	u8	buffer[SHA_BUFFER_LEN];
-	u64	digcnt[2];
-	size_t	bufcnt;
-};
-
 struct atmel_sha_reqctx {
 	struct atmel_sha_dev	*dd;
 	unsigned long	flags;
@@ -109,7 +102,7 @@ struct atmel_sha_reqctx {
 
 	size_t block_size;
 
-	u8	buffer[0] __aligned(sizeof(u32));
+	u8 buffer[SHA_BUFFER_LEN + SHA512_BLOCK_SIZE] __aligned(sizeof(u32));
 };
 
 struct atmel_sha_ctx {
@@ -1048,40 +1041,23 @@ static int atmel_sha_digest(struct ahash_request *req)
 static int atmel_sha_export(struct ahash_request *req, void *out)
 {
 	const struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
-	struct atmel_sha_state state;
-
-	memcpy(state.digest, ctx->digest, SHA512_DIGEST_SIZE);
-	memcpy(state.buffer, ctx->buffer, ctx->bufcnt);
-	state.bufcnt = ctx->bufcnt;
-	state.digcnt[0] = ctx->digcnt[0];
-	state.digcnt[1] = ctx->digcnt[1];
 
-	/* out might be unaligned. */
-	memcpy(out, &state, sizeof(state));
+	memcpy(out, ctx, sizeof(*ctx));
 	return 0;
 }
 
 static int atmel_sha_import(struct ahash_request *req, const void *in)
 {
 	struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
-	struct atmel_sha_state state;
-
-	/* in might be unaligned. */
-	memcpy(&state, in, sizeof(state));
 
-	memcpy(ctx->digest, state.digest, SHA512_DIGEST_SIZE);
-	memcpy(ctx->buffer, state.buffer, state.bufcnt);
-	ctx->bufcnt = state.bufcnt;
-	ctx->digcnt[0] = state.digcnt[0];
-	ctx->digcnt[1] = state.digcnt[1];
+	memcpy(ctx, in, sizeof(*ctx));
 	return 0;
 }
 
 static int atmel_sha_cra_init(struct crypto_tfm *tfm)
 {
 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
-				 sizeof(struct atmel_sha_reqctx) +
-				 SHA_BUFFER_LEN + SHA512_BLOCK_SIZE);
+				 sizeof(struct atmel_sha_reqctx));
 
 	return 0;
 }
@@ -1097,7 +1073,7 @@ static struct ahash_alg sha_1_256_algs[] = {
 	.import		= atmel_sha_import,
 	.halg = {
 		.digestsize	= SHA1_DIGEST_SIZE,
-		.statesize	= sizeof(struct atmel_sha_state),
+		.statesize	= sizeof(struct atmel_sha_reqctx),
 		.base	= {
 			.cra_name		= "sha1",
 			.cra_driver_name	= "atmel-sha1",
@@ -1121,7 +1097,7 @@ static struct ahash_alg sha_1_256_algs[] = {
 	.import		= atmel_sha_import,
 	.halg = {
 		.digestsize	= SHA256_DIGEST_SIZE,
-		.statesize	= sizeof(struct atmel_sha_state),
+		.statesize	= sizeof(struct atmel_sha_reqctx),
 		.base	= {
 			.cra_name		= "sha256",
 			.cra_driver_name	= "atmel-sha256",
@@ -1147,7 +1123,7 @@ static struct ahash_alg sha_224_alg = {
 	.import		= atmel_sha_import,
 	.halg = {
 		.digestsize	= SHA224_DIGEST_SIZE,
-		.statesize	= sizeof(struct atmel_sha_state),
+		.statesize	= sizeof(struct atmel_sha_reqctx),
 		.base	= {
 			.cra_name		= "sha224",
 			.cra_driver_name	= "atmel-sha224",
@@ -1173,7 +1149,7 @@ static struct ahash_alg sha_384_512_algs[] = {
 	.import		= atmel_sha_import,
 	.halg = {
 		.digestsize	= SHA384_DIGEST_SIZE,
-		.statesize	= sizeof(struct atmel_sha_state),
+		.statesize	= sizeof(struct atmel_sha_reqctx),
 		.base	= {
 			.cra_name		= "sha384",
 			.cra_driver_name	= "atmel-sha384",
@@ -1197,7 +1173,7 @@ static struct ahash_alg sha_384_512_algs[] = {
 	.import		= atmel_sha_import,
 	.halg = {
 		.digestsize	= SHA512_DIGEST_SIZE,
-		.statesize	= sizeof(struct atmel_sha_state),
+		.statesize	= sizeof(struct atmel_sha_reqctx),
 		.base	= {
 			.cra_name		= "sha512",
 			.cra_driver_name	= "atmel-sha512",
-- 
1.8.2.2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] crypto: atmel-sha - fix race in atmel_sha_final()
  2016-02-08 15:26 [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Cyrille Pitchen
  2016-02-08 15:26 ` [PATCH 1/2] " Cyrille Pitchen
@ 2016-02-08 15:26 ` Cyrille Pitchen
  2016-02-16 20:21 ` [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Herbert Xu
  2 siblings, 0 replies; 4+ messages in thread
From: Cyrille Pitchen @ 2016-02-08 15:26 UTC (permalink / raw)
  To: linux-arm-kernel

When (!ctx->bufcnt && !(ctx->flags & SHA_FLAGS_PAD)), the former source
code used to set the SHA_FLAGS_BUSY without checking whether this flag was
already set. If so, the hardware is already processing another hash
request so the processing of the req argument of atmel_sha_final() should
be delayed by queueing this request, the same way as done for the
(ctx->bufcnt != 0) case.

Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
---
 drivers/crypto/atmel-sha.c | 24 ++----------------------
 1 file changed, 2 insertions(+), 22 deletions(-)

diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c
index 7d27f96cdf02..596e489a4ca9 100644
--- a/drivers/crypto/atmel-sha.c
+++ b/drivers/crypto/atmel-sha.c
@@ -979,37 +979,17 @@ static int atmel_sha_update(struct ahash_request *req)
 static int atmel_sha_final(struct ahash_request *req)
 {
 	struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
-	struct atmel_sha_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
-	struct atmel_sha_dev *dd = tctx->dd;
-
-	int err = 0;
 
 	ctx->flags |= SHA_FLAGS_FINUP;
 
 	if (ctx->flags & SHA_FLAGS_ERROR)
 		return 0; /* uncompleted hash is not needed */
 
-	if (ctx->bufcnt) {
-		return atmel_sha_enqueue(req, SHA_OP_FINAL);
-	} else if (!(ctx->flags & SHA_FLAGS_PAD)) { /* add padding */
-		err = atmel_sha_hw_init(dd);
-		if (err)
-			goto err1;
-
-		dd->req = req;
-		dd->flags |= SHA_FLAGS_BUSY;
-		err = atmel_sha_final_req(dd);
-	} else {
+	if (ctx->flags & SHA_FLAGS_PAD)
 		/* copy ready hash (+ finalize hmac) */
 		return atmel_sha_finish(req);
-	}
-
-err1:
-	if (err != -EINPROGRESS)
-		/* done_task will not finish it, so do it here */
-		atmel_sha_finish_req(req, err);
 
-	return err;
+	return atmel_sha_enqueue(req, SHA_OP_FINAL);
 }
 
 static int atmel_sha_finup(struct ahash_request *req)
-- 
1.8.2.2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation
  2016-02-08 15:26 [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Cyrille Pitchen
  2016-02-08 15:26 ` [PATCH 1/2] " Cyrille Pitchen
  2016-02-08 15:26 ` [PATCH 2/2] crypto: atmel-sha - fix race in atmel_sha_final() Cyrille Pitchen
@ 2016-02-16 20:21 ` Herbert Xu
  2 siblings, 0 replies; 4+ messages in thread
From: Herbert Xu @ 2016-02-16 20:21 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Feb 08, 2016 at 04:26:47PM +0100, Cyrille Pitchen wrote:
> This series of patches includes two fixes for the atmel-sha.c driver.
> 
> The first one fixes the implementation of the import/export hooks, which
> did not pass the recent updates in testmgr.c (partial update exercise).
> The new implementation now passes the tcrypt tests: tested with
> next-20160208.
> 
> The second patch fixes a race condition if acquiring the hardware when it
> is already busy.

All applied.
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-02-16 20:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-08 15:26 [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Cyrille Pitchen
2016-02-08 15:26 ` [PATCH 1/2] " Cyrille Pitchen
2016-02-08 15:26 ` [PATCH 2/2] crypto: atmel-sha - fix race in atmel_sha_final() Cyrille Pitchen
2016-02-16 20:21 ` [PATCH 0/2] crypto: atmel-sha - fix .import()/.export() implementation Herbert Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).