OSDN Git Service

crypto: inside-secure - refrain from unneeded invalidations
authorOfer Heifetz <oferh@marvell.com>
Thu, 14 Dec 2017 14:26:47 +0000 (15:26 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 22 Dec 2017 09:03:30 +0000 (20:03 +1100)
The check to know if an invalidation is needed (i.e. when the context
changes) is done even if the context does not exist yet. This happens
when first setting a key for ciphers and/or hmac operations.

This commits adds a check in the _setkey functions to only check if an
invalidation is needed when a context exists, as there is no need to
perform this check otherwise.

Signed-off-by: Ofer Heifetz <oferh@marvell.com>
[Antoine: commit message and added a comment and reworked one of the
checks]
Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/inside-secure/safexcel_cipher.c
drivers/crypto/inside-secure/safexcel_hash.c

index fcc0a60..794849b 100644 (file)
@@ -78,10 +78,12 @@ static int safexcel_aes_setkey(struct crypto_skcipher *ctfm, const u8 *key,
                return ret;
        }
 
-       for (i = 0; i < len / sizeof(u32); i++) {
-               if (ctx->key[i] != cpu_to_le32(aes.key_enc[i])) {
-                       ctx->base.needs_inv = true;
-                       break;
+       if (ctx->base.ctxr_dma) {
+               for (i = 0; i < len / sizeof(u32); i++) {
+                       if (ctx->key[i] != cpu_to_le32(aes.key_enc[i])) {
+                               ctx->base.needs_inv = true;
+                               break;
+                       }
                }
        }
 
index e53e6b2..d156637 100644 (file)
@@ -527,10 +527,16 @@ static int safexcel_ahash_enqueue(struct ahash_request *areq)
 
        req->needs_inv = false;
 
-       if (req->processed && ctx->digest == CONTEXT_CONTROL_DIGEST_PRECOMPUTED)
-               ctx->base.needs_inv = safexcel_ahash_needs_inv_get(areq);
-
        if (ctx->base.ctxr) {
+               if (!ctx->base.needs_inv && req->processed &&
+                   ctx->digest == CONTEXT_CONTROL_DIGEST_PRECOMPUTED)
+                       /* We're still setting needs_inv here, even though it is
+                        * cleared right away, because the needs_inv flag can be
+                        * set in other functions and we want to keep the same
+                        * logic.
+                        */
+                       ctx->base.needs_inv = safexcel_ahash_needs_inv_get(areq);
+
                if (ctx->base.needs_inv) {
                        ctx->base.needs_inv = false;
                        req->needs_inv = true;
@@ -928,11 +934,13 @@ static int safexcel_hmac_sha1_setkey(struct crypto_ahash *tfm, const u8 *key,
        if (ret)
                return ret;
 
-       for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) {
-               if (ctx->ipad[i] != le32_to_cpu(istate.state[i]) ||
-                   ctx->opad[i] != le32_to_cpu(ostate.state[i])) {
-                       ctx->base.needs_inv = true;
-                       break;
+       if (ctx->base.ctxr) {
+               for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) {
+                       if (ctx->ipad[i] != le32_to_cpu(istate.state[i]) ||
+                           ctx->opad[i] != le32_to_cpu(ostate.state[i])) {
+                               ctx->base.needs_inv = true;
+                               break;
+                       }
                }
        }