]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
crypto: chelsio - fix writing tfm flags to wrong place
authorEric Biggers <ebiggers@google.com>
Tue, 31 Dec 2019 03:19:31 +0000 (21:19 -0600)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 6 Mar 2020 07:13:20 +0000 (02:13 -0500)
BugLink: https://bugs.launchpad.net/bugs/1864904
commit bd56cea012fc2d6381e8cd3209510ce09f9de8c9 upstream.

The chelsio crypto driver is casting 'struct crypto_aead' directly to
'struct crypto_tfm', which is incorrect because the crypto_tfm isn't the
first field of 'struct crypto_aead'.  Consequently, the calls to
crypto_tfm_set_flags() are modifying some other field in the struct.

Also, the driver is setting CRYPTO_TFM_RES_BAD_KEY_LEN in
->setauthsize(), not just in ->setkey().  This is incorrect since this
flag is for bad key lengths, not for bad authentication tag lengths.

Fix these bugs by removing the broken crypto_tfm_set_flags() calls from
->setauthsize() and by fixing them in ->setkey().

Fixes: 324429d74127 ("chcr: Support for Chelsio's Crypto Hardware")
Cc: <stable@vger.kernel.org> # v4.9+
Cc: Atul Gupta <atul.gupta@chelsio.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/crypto/chelsio/chcr_algo.c

index 31415d657ffb6626a3504173ccca763ff462e17c..3e8e5b24001c630cbdb6b0f7dd029a9ee18357fc 100644 (file)
@@ -2991,9 +2991,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
                aeadctx->mayverify = VERIFY_SW;
                break;
        default:
-
-                 crypto_tfm_set_flags((struct crypto_tfm *) tfm,
-                       CRYPTO_TFM_RES_BAD_KEY_LEN);
                return -EINVAL;
        }
        return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
@@ -3018,8 +3015,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm,
                aeadctx->mayverify = VERIFY_HW;
                break;
        default:
-               crypto_tfm_set_flags((struct crypto_tfm *)tfm,
-                                    CRYPTO_TFM_RES_BAD_KEY_LEN);
                return -EINVAL;
        }
        return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
@@ -3060,8 +3055,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm,
                aeadctx->mayverify = VERIFY_HW;
                break;
        default:
-               crypto_tfm_set_flags((struct crypto_tfm *)tfm,
-                                    CRYPTO_TFM_RES_BAD_KEY_LEN);
                return -EINVAL;
        }
        return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
@@ -3087,8 +3080,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead *aead,
                ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
                mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
        } else {
-               crypto_tfm_set_flags((struct crypto_tfm *)aead,
-                                    CRYPTO_TFM_RES_BAD_KEY_LEN);
+               crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
                aeadctx->enckey_len = 0;
                return  -EINVAL;
        }
@@ -3126,8 +3118,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key,
        int error;
 
        if (keylen < 3) {
-               crypto_tfm_set_flags((struct crypto_tfm *)aead,
-                                    CRYPTO_TFM_RES_BAD_KEY_LEN);
+               crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
                aeadctx->enckey_len = 0;
                return  -EINVAL;
        }
@@ -3177,8 +3168,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,
        } else if (keylen == AES_KEYSIZE_256) {
                ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
        } else {
-               crypto_tfm_set_flags((struct crypto_tfm *)aead,
-                                    CRYPTO_TFM_RES_BAD_KEY_LEN);
+               crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
                pr_err("GCM: Invalid key length %d\n", keylen);
                ret = -EINVAL;
                goto out;