Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _CRYPTO_XTS_H 3 : : #define _CRYPTO_XTS_H 4 : : 5 : : #include <crypto/b128ops.h> 6 : : #include <crypto/internal/skcipher.h> 7 : : #include <linux/fips.h> 8 : : 9 : : #define XTS_BLOCK_SIZE 16 10 : : 11 : : #define XTS_TWEAK_CAST(x) ((void (*)(void *, u8*, const u8*))(x)) 12 : : 13 : : static inline int xts_check_key(struct crypto_tfm *tfm, 14 : : const u8 *key, unsigned int keylen) 15 : : { 16 : : u32 *flags = &tfm->crt_flags; 17 : : 18 : : /* 19 : : * key consists of keys of equal size concatenated, therefore 20 : : * the length must be even. 21 : : */ 22 : : if (keylen % 2) { 23 : : *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 24 : : return -EINVAL; 25 : : } 26 : : 27 : : /* ensure that the AES and tweak key are not identical */ 28 : : if (fips_enabled && 29 : : !crypto_memneq(key, key + (keylen / 2), keylen / 2)) { 30 : : *flags |= CRYPTO_TFM_RES_WEAK_KEY; 31 : : return -EINVAL; 32 : : } 33 : : 34 : : return 0; 35 : : } 36 : : 37 : 0 : static inline int xts_verify_key(struct crypto_skcipher *tfm, 38 : : const u8 *key, unsigned int keylen) 39 : : { 40 : : /* 41 : : * key consists of keys of equal size concatenated, therefore 42 : : * the length must be even. 43 : : */ 44 [ # # ]: 0 : if (keylen % 2) { 45 : : crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); 46 : 0 : return -EINVAL; 47 : : } 48 : : 49 : : /* ensure that the AES and tweak key are not identical */ 50 [ # # ]: 0 : if ((fips_enabled || (crypto_skcipher_get_flags(tfm) & 51 [ # # ]: 0 : CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)) && 52 : 0 : !crypto_memneq(key, key + (keylen / 2), keylen / 2)) { 53 : : crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_WEAK_KEY); 54 : 0 : return -EINVAL; 55 : : } 56 : : 57 : : return 0; 58 : : } 59 : : 60 : : #endif /* _CRYPTO_XTS_H */