]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
crypto: inside-secure - Fix hang case on EIP97 with basic DES/3DES ops
authorPascal van Leeuwen <pascalvanl@gmail.com>
Wed, 11 Dec 2019 16:32:37 +0000 (17:32 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 20 Dec 2019 06:58:34 +0000 (14:58 +0800)
This patch fixes another hang case on the EIP97 caused by sending
invalidation tokens to the hardware when doing basic (3)DES ECB/CBC
operations. Invalidation tokens are an EIP197 feature and needed nor
supported by the EIP97. So they should not be sent for that device.

Signed-off-by: Pascal van Leeuwen <pvanleeuwen@rambus.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 bc5605e89d11fd8e1b703e85713c2b31c3816619..f4ece0d8bd6cf7de21940445b53fac5c1793d904 100644 (file)
@@ -1509,6 +1509,7 @@ static int safexcel_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,
                               unsigned int len)
 {
        struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
+       struct safexcel_crypto_priv *priv = ctx->priv;
        int ret;
 
        ret = verify_skcipher_des_key(ctfm, key);
@@ -1516,7 +1517,7 @@ static int safexcel_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,
                return ret;
 
        /* if context exits and key changed, need to invalidate it */
-       if (ctx->base.ctxr_dma)
+       if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
                if (memcmp(ctx->key, key, len))
                        ctx->base.needs_inv = true;
 
@@ -1605,6 +1606,7 @@ static int safexcel_des3_ede_setkey(struct crypto_skcipher *ctfm,
                                   const u8 *key, unsigned int len)
 {
        struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
+       struct safexcel_crypto_priv *priv = ctx->priv;
        int err;
 
        err = verify_skcipher_des3_key(ctfm, key);
@@ -1612,7 +1614,7 @@ static int safexcel_des3_ede_setkey(struct crypto_skcipher *ctfm,
                return err;
 
        /* if context exits and key changed, need to invalidate it */
-       if (ctx->base.ctxr_dma)
+       if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
                if (memcmp(ctx->key, key, len))
                        ctx->base.needs_inv = true;
 
index ef3a489dbf4e41342bb9239027e06ec5f3fb2d90..25e49d1c96e8428bdd06f0079faa2ca3e6a2acbb 100644 (file)
@@ -282,7 +282,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv,
                        sreq->processed = sreq->block_sz;
                        sreq->hmac = 0;
 
-                       ctx->base.needs_inv = true;
+                       if (priv->flags & EIP197_TRC_CACHE)
+                               ctx->base.needs_inv = true;
                        areq->nbytes = 0;
                        safexcel_ahash_enqueue(areq);