1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2ce004556SJussi Kivilinna #ifndef _CRYPTO_XTS_H 3ce004556SJussi Kivilinna #define _CRYPTO_XTS_H 4ce004556SJussi Kivilinna 5ce004556SJussi Kivilinna #include <crypto/b128ops.h> 6f1c131b4SHerbert Xu #include <crypto/internal/skcipher.h> 728856a9eSStephan Mueller #include <linux/fips.h> 8ce004556SJussi Kivilinna 9ce004556SJussi Kivilinna #define XTS_BLOCK_SIZE 16 10ce004556SJussi Kivilinna 1128856a9eSStephan Mueller static inline int xts_check_key(struct crypto_tfm *tfm, 1228856a9eSStephan Mueller const u8 *key, unsigned int keylen) 1328856a9eSStephan Mueller { 1428856a9eSStephan Mueller u32 *flags = &tfm->crt_flags; 1528856a9eSStephan Mueller 1628856a9eSStephan Mueller /* 1728856a9eSStephan Mueller * key consists of keys of equal size concatenated, therefore 1828856a9eSStephan Mueller * the length must be even. 1928856a9eSStephan Mueller */ 20*674f368aSEric Biggers if (keylen % 2) 2128856a9eSStephan Mueller return -EINVAL; 2228856a9eSStephan Mueller 2328856a9eSStephan Mueller /* ensure that the AES and tweak key are not identical */ 2428856a9eSStephan Mueller if (fips_enabled && 2528856a9eSStephan Mueller !crypto_memneq(key, key + (keylen / 2), keylen / 2)) { 2628856a9eSStephan Mueller *flags |= CRYPTO_TFM_RES_WEAK_KEY; 2728856a9eSStephan Mueller return -EINVAL; 2828856a9eSStephan Mueller } 2928856a9eSStephan Mueller 3028856a9eSStephan Mueller return 0; 3128856a9eSStephan Mueller } 3228856a9eSStephan Mueller 33f1c131b4SHerbert Xu static inline int xts_verify_key(struct crypto_skcipher *tfm, 34f1c131b4SHerbert Xu const u8 *key, unsigned int keylen) 35f1c131b4SHerbert Xu { 36f1c131b4SHerbert Xu /* 37f1c131b4SHerbert Xu * key consists of keys of equal size concatenated, therefore 38f1c131b4SHerbert Xu * the length must be even. 39f1c131b4SHerbert Xu */ 40*674f368aSEric Biggers if (keylen % 2) 41f1c131b4SHerbert Xu return -EINVAL; 42f1c131b4SHerbert Xu 43f1c131b4SHerbert Xu /* ensure that the AES and tweak key are not identical */ 44231baecdSEric Biggers if ((fips_enabled || (crypto_skcipher_get_flags(tfm) & 45231baecdSEric Biggers CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)) && 46f1c131b4SHerbert Xu !crypto_memneq(key, key + (keylen / 2), keylen / 2)) { 47f1c131b4SHerbert Xu crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_WEAK_KEY); 48f1c131b4SHerbert Xu return -EINVAL; 49f1c131b4SHerbert Xu } 50f1c131b4SHerbert Xu 51f1c131b4SHerbert Xu return 0; 52f1c131b4SHerbert Xu } 53f1c131b4SHerbert Xu 54ce004556SJussi Kivilinna #endif /* _CRYPTO_XTS_H */ 55