xref: /openbmc/linux/include/crypto/des.h (revision d7198ce4)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
216d004a2SEvgeniy Polyakov /*
316d004a2SEvgeniy Polyakov  * DES & Triple DES EDE Cipher Algorithms.
416d004a2SEvgeniy Polyakov  */
516d004a2SEvgeniy Polyakov 
616d004a2SEvgeniy Polyakov #ifndef __CRYPTO_DES_H
716d004a2SEvgeniy Polyakov #define __CRYPTO_DES_H
816d004a2SEvgeniy Polyakov 
9d7198ce4SHerbert Xu #include <crypto/skcipher.h>
10d7198ce4SHerbert Xu #include <linux/compiler.h>
11d7198ce4SHerbert Xu #include <linux/fips.h>
12d7198ce4SHerbert Xu #include <linux/string.h>
13d7198ce4SHerbert Xu 
1416d004a2SEvgeniy Polyakov #define DES_KEY_SIZE		8
1516d004a2SEvgeniy Polyakov #define DES_EXPKEY_WORDS	32
1616d004a2SEvgeniy Polyakov #define DES_BLOCK_SIZE		8
1716d004a2SEvgeniy Polyakov 
1816d004a2SEvgeniy Polyakov #define DES3_EDE_KEY_SIZE	(3 * DES_KEY_SIZE)
1916d004a2SEvgeniy Polyakov #define DES3_EDE_EXPKEY_WORDS	(3 * DES_EXPKEY_WORDS)
2016d004a2SEvgeniy Polyakov #define DES3_EDE_BLOCK_SIZE	DES_BLOCK_SIZE
2116d004a2SEvgeniy Polyakov 
22d7198ce4SHerbert Xu static inline int __des3_verify_key(u32 *flags, const u8 *key)
23d7198ce4SHerbert Xu {
24d7198ce4SHerbert Xu 	int err = -EINVAL;
25d7198ce4SHerbert Xu 	u32 K[6];
26d7198ce4SHerbert Xu 
27d7198ce4SHerbert Xu 	memcpy(K, key, DES3_EDE_KEY_SIZE);
28d7198ce4SHerbert Xu 
29d7198ce4SHerbert Xu 	if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
30d7198ce4SHerbert Xu 		     !((K[2] ^ K[4]) | (K[3] ^ K[5]))) &&
31d7198ce4SHerbert Xu 		     (fips_enabled ||
32d7198ce4SHerbert Xu 		      (*flags & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)))
33d7198ce4SHerbert Xu 		goto bad;
34d7198ce4SHerbert Xu 
35d7198ce4SHerbert Xu 	if (unlikely(!((K[0] ^ K[4]) | (K[1] ^ K[5]))) && fips_enabled)
36d7198ce4SHerbert Xu 		goto bad;
37d7198ce4SHerbert Xu 
38d7198ce4SHerbert Xu 	err = 0;
39d7198ce4SHerbert Xu 
40d7198ce4SHerbert Xu out:
41d7198ce4SHerbert Xu 	memzero_explicit(K, DES3_EDE_KEY_SIZE);
42d7198ce4SHerbert Xu 
43d7198ce4SHerbert Xu 	return err;
44d7198ce4SHerbert Xu 
45d7198ce4SHerbert Xu bad:
46d7198ce4SHerbert Xu 	*flags |= CRYPTO_TFM_RES_WEAK_KEY;
47d7198ce4SHerbert Xu 	goto out;
48d7198ce4SHerbert Xu }
49d7198ce4SHerbert Xu 
50d7198ce4SHerbert Xu static inline int des3_verify_key(struct crypto_skcipher *tfm, const u8 *key)
51d7198ce4SHerbert Xu {
52d7198ce4SHerbert Xu 	u32 flags;
53d7198ce4SHerbert Xu 	int err;
54d7198ce4SHerbert Xu 
55d7198ce4SHerbert Xu 	flags = crypto_skcipher_get_flags(tfm);
56d7198ce4SHerbert Xu 	err = __des3_verify_key(&flags, key);
57d7198ce4SHerbert Xu 	crypto_skcipher_set_flags(tfm, flags);
58d7198ce4SHerbert Xu 	return err;
59d7198ce4SHerbert Xu }
6016d004a2SEvgeniy Polyakov 
6116d004a2SEvgeniy Polyakov extern unsigned long des_ekey(u32 *pe, const u8 *k);
6216d004a2SEvgeniy Polyakov 
636574e6c6SJussi Kivilinna extern int __des3_ede_setkey(u32 *expkey, u32 *flags, const u8 *key,
646574e6c6SJussi Kivilinna 			     unsigned int keylen);
656574e6c6SJussi Kivilinna 
6616d004a2SEvgeniy Polyakov #endif /* __CRYPTO_DES_H */
67