xref: /linux/include/crypto/krb5.h (revision 0392b110ccaf543b31842b04c8142f4f8ce7bdec)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Kerberos 5 crypto
3  *
4  * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 
8 #ifndef _CRYPTO_KRB5_H
9 #define _CRYPTO_KRB5_H
10 
11 #include <linux/crypto.h>
12 #include <crypto/aead.h>
13 #include <crypto/hash.h>
14 
15 struct crypto_shash;
16 struct scatterlist;
17 
18 /*
19  * Per Kerberos v5 protocol spec crypto types from the wire.  These get mapped
20  * to linux kernel crypto routines.
21  */
22 #define KRB5_ENCTYPE_NULL			0x0000
23 #define KRB5_ENCTYPE_DES_CBC_CRC		0x0001	/* DES cbc mode with CRC-32 */
24 #define KRB5_ENCTYPE_DES_CBC_MD4		0x0002	/* DES cbc mode with RSA-MD4 */
25 #define KRB5_ENCTYPE_DES_CBC_MD5		0x0003	/* DES cbc mode with RSA-MD5 */
26 #define KRB5_ENCTYPE_DES_CBC_RAW		0x0004	/* DES cbc mode raw */
27 /* XXX deprecated? */
28 #define KRB5_ENCTYPE_DES3_CBC_SHA		0x0005	/* DES-3 cbc mode with NIST-SHA */
29 #define KRB5_ENCTYPE_DES3_CBC_RAW		0x0006	/* DES-3 cbc mode raw */
30 #define KRB5_ENCTYPE_DES_HMAC_SHA1		0x0008
31 #define KRB5_ENCTYPE_DES3_CBC_SHA1		0x0010
32 #define KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96	0x0011
33 #define KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96	0x0012
34 #define KRB5_ENCTYPE_ARCFOUR_HMAC		0x0017
35 #define KRB5_ENCTYPE_ARCFOUR_HMAC_EXP		0x0018
36 #define KRB5_ENCTYPE_UNKNOWN			0x01ff
37 
38 #define KRB5_CKSUMTYPE_CRC32			0x0001
39 #define KRB5_CKSUMTYPE_RSA_MD4			0x0002
40 #define KRB5_CKSUMTYPE_RSA_MD4_DES		0x0003
41 #define KRB5_CKSUMTYPE_DESCBC			0x0004
42 #define KRB5_CKSUMTYPE_RSA_MD5			0x0007
43 #define KRB5_CKSUMTYPE_RSA_MD5_DES		0x0008
44 #define KRB5_CKSUMTYPE_NIST_SHA			0x0009
45 #define KRB5_CKSUMTYPE_HMAC_SHA1_DES3		0x000c
46 #define KRB5_CKSUMTYPE_HMAC_SHA1_96_AES128	0x000f
47 #define KRB5_CKSUMTYPE_HMAC_SHA1_96_AES256	0x0010
48 #define KRB5_CKSUMTYPE_HMAC_MD5_ARCFOUR		-138 /* Microsoft md5 hmac cksumtype */
49 
50 /*
51  * Constants used for key derivation
52  */
53 /* from rfc3961 */
54 #define KEY_USAGE_SEED_CHECKSUM         (0x99)
55 #define KEY_USAGE_SEED_ENCRYPTION       (0xAA)
56 #define KEY_USAGE_SEED_INTEGRITY        (0x55)
57 
58 /*
59  * Mode of operation.
60  */
61 enum krb5_crypto_mode {
62 	KRB5_CHECKSUM_MODE,	/* Checksum only */
63 	KRB5_ENCRYPT_MODE,	/* Fully encrypted, possibly with integrity checksum */
64 };
65 
66 struct krb5_buffer {
67 	unsigned int	len;
68 	void		*data;
69 };
70 
71 /*
72  * Kerberos encoding type definition.
73  */
74 struct krb5_enctype {
75 	int		etype;		/* Encryption (key) type */
76 	int		ctype;		/* Checksum type */
77 	const char	*name;		/* "Friendly" name */
78 	const char	*encrypt_name;	/* Crypto encrypt+checksum name */
79 	const char	*cksum_name;	/* Crypto checksum name */
80 	const char	*hash_name;	/* Crypto hash name */
81 	const char	*derivation_enc; /* Cipher used in key derivation */
82 	u16		block_len;	/* Length of encryption block */
83 	u16		conf_len;	/* Length of confounder (normally == block_len) */
84 	u16		cksum_len;	/* Length of checksum */
85 	u16		key_bytes;	/* Length of raw key, in bytes */
86 	u16		key_len;	/* Length of final key, in bytes */
87 	u16		hash_len;	/* Length of hash in bytes */
88 	u16		prf_len;	/* Length of PRF() result in bytes */
89 	u16		Kc_len;		/* Length of Kc in bytes */
90 	u16		Ke_len;		/* Length of Ke in bytes */
91 	u16		Ki_len;		/* Length of Ki in bytes */
92 	bool		keyed_cksum;	/* T if a keyed cksum */
93 
94 	const struct krb5_crypto_profile *profile;
95 
96 	int (*random_to_key)(const struct krb5_enctype *krb5,
97 			     const struct krb5_buffer *in,
98 			     struct krb5_buffer *out);	/* complete key generation */
99 };
100 
101 /*
102  * krb5_api.c
103  */
104 const struct krb5_enctype *crypto_krb5_find_enctype(u32 enctype);
105 size_t crypto_krb5_how_much_buffer(const struct krb5_enctype *krb5,
106 				   enum krb5_crypto_mode mode,
107 				   size_t data_size, size_t *_offset);
108 size_t crypto_krb5_how_much_data(const struct krb5_enctype *krb5,
109 				 enum krb5_crypto_mode mode,
110 				 size_t *_buffer_size, size_t *_offset);
111 void crypto_krb5_where_is_the_data(const struct krb5_enctype *krb5,
112 				   enum krb5_crypto_mode mode,
113 				   size_t *_offset, size_t *_len);
114 struct crypto_aead *crypto_krb5_prepare_encryption(const struct krb5_enctype *krb5,
115 						   const struct krb5_buffer *TK,
116 						   u32 usage, gfp_t gfp);
117 struct crypto_shash *crypto_krb5_prepare_checksum(const struct krb5_enctype *krb5,
118 						  const struct krb5_buffer *TK,
119 						  u32 usage, gfp_t gfp);
120 ssize_t crypto_krb5_encrypt(const struct krb5_enctype *krb5,
121 			    struct crypto_aead *aead,
122 			    struct scatterlist *sg, unsigned int nr_sg,
123 			    size_t sg_len,
124 			    size_t data_offset, size_t data_len,
125 			    bool preconfounded);
126 int crypto_krb5_decrypt(const struct krb5_enctype *krb5,
127 			struct crypto_aead *aead,
128 			struct scatterlist *sg, unsigned int nr_sg,
129 			size_t *_offset, size_t *_len);
130 ssize_t crypto_krb5_get_mic(const struct krb5_enctype *krb5,
131 			    struct crypto_shash *shash,
132 			    const struct krb5_buffer *metadata,
133 			    struct scatterlist *sg, unsigned int nr_sg,
134 			    size_t sg_len,
135 			    size_t data_offset, size_t data_len);
136 int crypto_krb5_verify_mic(const struct krb5_enctype *krb5,
137 			   struct crypto_shash *shash,
138 			   const struct krb5_buffer *metadata,
139 			   struct scatterlist *sg, unsigned int nr_sg,
140 			   size_t *_offset, size_t *_len);
141 
142 #endif /* _CRYPTO_KRB5_H */
143