Crypto engine does not support key1 = key2 for AES XTS algorithm; the
operation hangs the engines.  Return -EINVAL in case key1 and key2 are the
same.

Signed-off-by: Thara Gopinath <thara.gopin...@linaro.org>
---
 drivers/crypto/qce/skcipher.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/qce/skcipher.c b/drivers/crypto/qce/skcipher.c
index a2d3da0ad95f..12955dcd53dd 100644
--- a/drivers/crypto/qce/skcipher.c
+++ b/drivers/crypto/qce/skcipher.c
@@ -167,16 +167,33 @@ static int qce_skcipher_setkey(struct crypto_skcipher 
*ablk, const u8 *key,
        struct crypto_tfm *tfm = crypto_skcipher_tfm(ablk);
        struct qce_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
        unsigned long flags = to_cipher_tmpl(ablk)->alg_flags;
+       unsigned int __keylen;
        int ret;
 
        if (!key || !keylen)
                return -EINVAL;
 
-       switch (IS_XTS(flags) ? keylen >> 1 : keylen) {
+       /*
+        * AES XTS key1 = key2 not supported by crypto engine.
+        * Revisit to request a fallback cipher in this case.
+        */
+       if (IS_XTS(flags)) {
+               __keylen = keylen >> 1;
+               if (!memcmp(key, key + __keylen, __keylen))
+                       return -ENOKEY;
+       } else {
+               __keylen = keylen;
+       }
+
+       switch (__keylen) {
        case AES_KEYSIZE_128:
        case AES_KEYSIZE_256:
                memcpy(ctx->enc_key, key, keylen);
                break;
+       case AES_KEYSIZE_192:
+               break;
+       default:
+               return -EINVAL;
        }
 
        ret = crypto_skcipher_setkey(ctx->fallback, key, keylen);
-- 
2.25.1

Reply via email to