xref: /linux/crypto/krb5/internal.h (revision c8d8f6af66c3cd7896460da4a0ddd006f391f6d2)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Kerberos5 crypto internals
3  *
4  * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 
8 #include <linux/scatterlist.h>
9 #include <crypto/krb5.h>
10 
11 /*
12  * Profile used for key derivation and encryption.
13  */
14 struct krb5_crypto_profile {
15 	 /* Pseudo-random function */
16 	int (*calc_PRF)(const struct krb5_enctype *krb5,
17 			const struct krb5_buffer *protocol_key,
18 			const struct krb5_buffer *octet_string,
19 			struct krb5_buffer *result,
20 			gfp_t gfp);
21 
22 	/* Checksum key derivation */
23 	int (*calc_Kc)(const struct krb5_enctype *krb5,
24 		       const struct krb5_buffer *TK,
25 		       const struct krb5_buffer *usage_constant,
26 		       struct krb5_buffer *Kc,
27 		       gfp_t gfp);
28 
29 	/* Encryption key derivation */
30 	int (*calc_Ke)(const struct krb5_enctype *krb5,
31 		       const struct krb5_buffer *TK,
32 		       const struct krb5_buffer *usage_constant,
33 		       struct krb5_buffer *Ke,
34 		       gfp_t gfp);
35 
36 	 /* Integrity key derivation */
37 	int (*calc_Ki)(const struct krb5_enctype *krb5,
38 		       const struct krb5_buffer *TK,
39 		       const struct krb5_buffer *usage_constant,
40 		       struct krb5_buffer *Ki,
41 		       gfp_t gfp);
42 
43 	/* Derive the keys needed for an encryption AEAD object. */
44 	int (*derive_encrypt_keys)(const struct krb5_enctype *krb5,
45 				   const struct krb5_buffer *TK,
46 				   unsigned int usage,
47 				   struct krb5_buffer *setkey,
48 				   gfp_t gfp);
49 
50 	/* Directly load the keys needed for an encryption AEAD object. */
51 	int (*load_encrypt_keys)(const struct krb5_enctype *krb5,
52 				 const struct krb5_buffer *Ke,
53 				 const struct krb5_buffer *Ki,
54 				 struct krb5_buffer *setkey,
55 				 gfp_t gfp);
56 
57 	/* Derive the key needed for a checksum hash object. */
58 	int (*derive_checksum_key)(const struct krb5_enctype *krb5,
59 				   const struct krb5_buffer *TK,
60 				   unsigned int usage,
61 				   struct krb5_buffer *setkey,
62 				   gfp_t gfp);
63 
64 	/* Directly load the keys needed for a checksum hash object. */
65 	int (*load_checksum_key)(const struct krb5_enctype *krb5,
66 				 const struct krb5_buffer *Kc,
67 				 struct krb5_buffer *setkey,
68 				 gfp_t gfp);
69 
70 	/* Encrypt data in-place, inserting confounder and checksum. */
71 	ssize_t (*encrypt)(const struct krb5_enctype *krb5,
72 			   struct crypto_aead *aead,
73 			   struct scatterlist *sg, unsigned int nr_sg,
74 			   size_t sg_len,
75 			   size_t data_offset, size_t data_len,
76 			   bool preconfounded);
77 
78 	/* Decrypt data in-place, removing confounder and checksum */
79 	int (*decrypt)(const struct krb5_enctype *krb5,
80 		       struct crypto_aead *aead,
81 		       struct scatterlist *sg, unsigned int nr_sg,
82 		       size_t *_offset, size_t *_len);
83 
84 	/* Generate a MIC on part of a packet, inserting the checksum */
85 	ssize_t (*get_mic)(const struct krb5_enctype *krb5,
86 			   struct crypto_shash *shash,
87 			   const struct krb5_buffer *metadata,
88 			   struct scatterlist *sg, unsigned int nr_sg,
89 			   size_t sg_len,
90 			   size_t data_offset, size_t data_len);
91 
92 	/* Verify the MIC on a piece of data, removing the checksum */
93 	int (*verify_mic)(const struct krb5_enctype *krb5,
94 			  struct crypto_shash *shash,
95 			  const struct krb5_buffer *metadata,
96 			  struct scatterlist *sg, unsigned int nr_sg,
97 			  size_t *_offset, size_t *_len);
98 };
99 
100 /*
101  * Crypto size/alignment rounding convenience macros.
102  */
103 #define crypto_roundup(X) ((unsigned int)round_up((X), CRYPTO_MINALIGN))
104 
105 #define krb5_aead_size(TFM) \
106 	crypto_roundup(sizeof(struct aead_request) + crypto_aead_reqsize(TFM))
107 #define krb5_aead_ivsize(TFM) \
108 	crypto_roundup(crypto_aead_ivsize(TFM))
109 #define krb5_shash_size(TFM) \
110 	crypto_roundup(sizeof(struct shash_desc) + crypto_shash_descsize(TFM))
111 #define krb5_digest_size(TFM) \
112 	crypto_roundup(crypto_shash_digestsize(TFM))
113 #define round16(x) (((x) + 15) & ~15)
114 
115 /*
116  * krb5_api.c
117  */
118 struct crypto_aead *krb5_prepare_encryption(const struct krb5_enctype *krb5,
119 					    const struct krb5_buffer *keys,
120 					    gfp_t gfp);
121 struct crypto_shash *krb5_prepare_checksum(const struct krb5_enctype *krb5,
122 					   const struct krb5_buffer *Kc,
123 					   gfp_t gfp);
124 
125 /*
126  * krb5_kdf.c
127  */
128 int krb5_derive_Kc(const struct krb5_enctype *krb5, const struct krb5_buffer *TK,
129 		   u32 usage, struct krb5_buffer *key, gfp_t gfp);
130 int krb5_derive_Ke(const struct krb5_enctype *krb5, const struct krb5_buffer *TK,
131 		   u32 usage, struct krb5_buffer *key, gfp_t gfp);
132 int krb5_derive_Ki(const struct krb5_enctype *krb5, const struct krb5_buffer *TK,
133 		   u32 usage, struct krb5_buffer *key, gfp_t gfp);
134 
135 /*
136  * rfc3961_simplified.c
137  */
138 extern const struct krb5_crypto_profile rfc3961_simplified_profile;
139