diff mbox series

[v6,04/11] crypto: qce: skcipher: Return unsupported if any three keys are same for DES3 algorithms

Message ID 20210207143946.2099859-5-thara.gopinath@linaro.org
State Superseded
Headers show
Series Regression fixes/clean ups in the Qualcomm crypto engine driver | expand

Commit Message

Thara Gopinath Feb. 7, 2021, 2:39 p.m. UTC
Return unsupported if any three keys are same for DES3 algorithms
since CE does not support this and the operation causes the engine to
hang.

Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org>

---
 drivers/crypto/qce/skcipher.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

-- 
2.25.1

Comments

Herbert Xu Feb. 10, 2021, 7:18 a.m. UTC | #1
On Sun, Feb 07, 2021 at 09:39:39AM -0500, Thara Gopinath wrote:
>

> +	/*

> +	 * The crypto engine does not support any two keys

> +	 * being the same for triple des algorithms. The

> +	 * verify_skcipher_des3_key does not check for all the

> +	 * below conditions. Return -ENOKEY in case any two keys

> +	 * are the same. Revisit to see if a fallback cipher

> +	 * is needed to handle this condition.

> +	 */

> +	memcpy(_key, key, DES3_EDE_KEY_SIZE);

> +	if (!((_key[0] ^ _key[2]) | (_key[1] ^ _key[3])) |

> +	    !((_key[2] ^ _key[4]) | (_key[3] ^ _key[5])) |

> +	    !((_key[0] ^ _key[4]) | (_key[1] ^ _key[5])))

> +		return -ENOKEY;


This introduces a sparse warning:

  CHECK   ../drivers/crypto/qce/skcipher.c
../drivers/crypto/qce/skcipher.c:241:58: warning: dubious: !x | !y
../drivers/crypto/qce/skcipher.c:242:58: warning: dubious: x | !y

Please make sure that you test your patches with C=1 so that
you don't introduce new sparse warnings.

Thanks,
-- 
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
diff mbox series

Patch

diff --git a/drivers/crypto/qce/skcipher.c b/drivers/crypto/qce/skcipher.c
index 12955dcd53dd..de1f37ed4ee6 100644
--- a/drivers/crypto/qce/skcipher.c
+++ b/drivers/crypto/qce/skcipher.c
@@ -221,12 +221,27 @@  static int qce_des3_setkey(struct crypto_skcipher *ablk, const u8 *key,
 			   unsigned int keylen)
 {
 	struct qce_cipher_ctx *ctx = crypto_skcipher_ctx(ablk);
+	u32 _key[6];
 	int err;
 
 	err = verify_skcipher_des3_key(ablk, key);
 	if (err)
 		return err;
 
+	/*
+	 * The crypto engine does not support any two keys
+	 * being the same for triple des algorithms. The
+	 * verify_skcipher_des3_key does not check for all the
+	 * below conditions. Return -ENOKEY in case any two keys
+	 * are the same. Revisit to see if a fallback cipher
+	 * is needed to handle this condition.
+	 */
+	memcpy(_key, key, DES3_EDE_KEY_SIZE);
+	if (!((_key[0] ^ _key[2]) | (_key[1] ^ _key[3])) |
+	    !((_key[2] ^ _key[4]) | (_key[3] ^ _key[5])) |
+	    !((_key[0] ^ _key[4]) | (_key[1] ^ _key[5])))
+		return -ENOKEY;
+
 	ctx->enc_keylen = keylen;
 	memcpy(ctx->enc_key, key, keylen);
 	return 0;