blob: 0f8dba69feb462052500934e5bc1e75403dfced4 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Jussi Kivilinnace004552011-11-09 11:56:06 +08002#ifndef _CRYPTO_XTS_H
3#define _CRYPTO_XTS_H
4
5#include <crypto/b128ops.h>
Herbert Xuf1c131b2016-11-22 20:08:19 +08006#include <crypto/internal/skcipher.h>
Stephan Mueller28856a92016-02-09 15:37:47 +01007#include <linux/fips.h>
Jussi Kivilinnace004552011-11-09 11:56:06 +08008
Jussi Kivilinnace004552011-11-09 11:56:06 +08009#define XTS_BLOCK_SIZE 16
10
Stephan Mueller28856a92016-02-09 15:37:47 +010011static inline int xts_check_key(struct crypto_tfm *tfm,
12 const u8 *key, unsigned int keylen)
13{
Stephan Mueller28856a92016-02-09 15:37:47 +010014 /*
15 * key consists of keys of equal size concatenated, therefore
16 * the length must be even.
17 */
Eric Biggers674f3682019-12-30 21:19:36 -060018 if (keylen % 2)
Stephan Mueller28856a92016-02-09 15:37:47 +010019 return -EINVAL;
Stephan Mueller28856a92016-02-09 15:37:47 +010020
21 /* ensure that the AES and tweak key are not identical */
Eric Biggersc4c4db02019-12-30 21:19:37 -060022 if (fips_enabled && !crypto_memneq(key, key + (keylen / 2), keylen / 2))
Stephan Mueller28856a92016-02-09 15:37:47 +010023 return -EINVAL;
Stephan Mueller28856a92016-02-09 15:37:47 +010024
25 return 0;
26}
27
Herbert Xuf1c131b2016-11-22 20:08:19 +080028static inline int xts_verify_key(struct crypto_skcipher *tfm,
29 const u8 *key, unsigned int keylen)
30{
31 /*
32 * key consists of keys of equal size concatenated, therefore
33 * the length must be even.
34 */
Eric Biggers674f3682019-12-30 21:19:36 -060035 if (keylen % 2)
Herbert Xuf1c131b2016-11-22 20:08:19 +080036 return -EINVAL;
Herbert Xuf1c131b2016-11-22 20:08:19 +080037
38 /* ensure that the AES and tweak key are not identical */
Eric Biggers231baec2019-01-18 22:48:00 -080039 if ((fips_enabled || (crypto_skcipher_get_flags(tfm) &
40 CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)) &&
Eric Biggersc4c4db02019-12-30 21:19:37 -060041 !crypto_memneq(key, key + (keylen / 2), keylen / 2))
Herbert Xuf1c131b2016-11-22 20:08:19 +080042 return -EINVAL;
Herbert Xuf1c131b2016-11-22 20:08:19 +080043
44 return 0;
45}
46
Jussi Kivilinnace004552011-11-09 11:56:06 +080047#endif /* _CRYPTO_XTS_H */