1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2022 Oracle and/or its affiliates.
4  *
5  * KUnit test of SunRPC's GSS Kerberos mechanism. Subsystem
6  * name is "rpcsec_gss_krb5".
7  */
8 
9 #include <kunit/test.h>
10 #include <kunit/visibility.h>
11 
12 #include <linux/kernel.h>
13 #include <crypto/hash.h>
14 
15 #include <linux/sunrpc/xdr.h>
16 #include <linux/sunrpc/gss_krb5.h>
17 
18 #include "gss_krb5_internal.h"
19 
20 MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
21 
22 struct gss_krb5_test_param {
23 	const char			*desc;
24 	u32				enctype;
25 	u32				nfold;
26 	u32				constant;
27 	const struct xdr_netobj		*base_key;
28 	const struct xdr_netobj		*Ke;
29 	const struct xdr_netobj		*usage;
30 	const struct xdr_netobj		*plaintext;
31 	const struct xdr_netobj		*confounder;
32 	const struct xdr_netobj		*expected_result;
33 	const struct xdr_netobj		*expected_hmac;
34 	const struct xdr_netobj		*next_iv;
35 };
36 
37 static inline void gss_krb5_get_desc(const struct gss_krb5_test_param *param,
38 				     char *desc)
39 {
40 	strscpy(desc, param->desc, KUNIT_PARAM_DESC_SIZE);
41 }
42 
43 static void kdf_case(struct kunit *test)
44 {
45 	const struct gss_krb5_test_param *param = test->param_value;
46 	const struct gss_krb5_enctype *gk5e;
47 	struct xdr_netobj derivedkey;
48 	int err;
49 
50 	/* Arrange */
51 	gk5e = gss_krb5_lookup_enctype(param->enctype);
52 	if (!gk5e)
53 		kunit_skip(test, "Encryption type is not available");
54 
55 	derivedkey.data = kunit_kzalloc(test, param->expected_result->len,
56 					GFP_KERNEL);
57 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, derivedkey.data);
58 	derivedkey.len = param->expected_result->len;
59 
60 	/* Act */
61 	err = gk5e->derive_key(gk5e, param->base_key, &derivedkey,
62 			       param->usage, GFP_KERNEL);
63 	KUNIT_ASSERT_EQ(test, err, 0);
64 
65 	/* Assert */
66 	KUNIT_EXPECT_EQ_MSG(test,
67 			    memcmp(param->expected_result->data,
68 				   derivedkey.data, derivedkey.len), 0,
69 			    "key mismatch");
70 }
71 
72 static void checksum_case(struct kunit *test)
73 {
74 	const struct gss_krb5_test_param *param = test->param_value;
75 	struct xdr_buf buf = {
76 		.head[0].iov_len	= param->plaintext->len,
77 		.len			= param->plaintext->len,
78 	};
79 	const struct gss_krb5_enctype *gk5e;
80 	struct xdr_netobj Kc, checksum;
81 	struct crypto_ahash *tfm;
82 	int err;
83 
84 	/* Arrange */
85 	gk5e = gss_krb5_lookup_enctype(param->enctype);
86 	if (!gk5e)
87 		kunit_skip(test, "Encryption type is not available");
88 
89 	Kc.len = gk5e->Kc_length;
90 	Kc.data = kunit_kzalloc(test, Kc.len, GFP_KERNEL);
91 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Kc.data);
92 	err = gk5e->derive_key(gk5e, param->base_key, &Kc,
93 			       param->usage, GFP_KERNEL);
94 	KUNIT_ASSERT_EQ(test, err, 0);
95 
96 	tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
97 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tfm);
98 	err = crypto_ahash_setkey(tfm, Kc.data, Kc.len);
99 	KUNIT_ASSERT_EQ(test, err, 0);
100 
101 	buf.head[0].iov_base = kunit_kzalloc(test, buf.head[0].iov_len, GFP_KERNEL);
102 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf.head[0].iov_base);
103 	memcpy(buf.head[0].iov_base, param->plaintext->data, buf.head[0].iov_len);
104 
105 	checksum.len = gk5e->cksumlength;
106 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
107 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
108 
109 	/* Act */
110 	err = gss_krb5_checksum(tfm, NULL, 0, &buf, 0, &checksum);
111 	KUNIT_ASSERT_EQ(test, err, 0);
112 
113 	/* Assert */
114 	KUNIT_EXPECT_EQ_MSG(test,
115 			    memcmp(param->expected_result->data,
116 				   checksum.data, checksum.len), 0,
117 			    "checksum mismatch");
118 
119 	crypto_free_ahash(tfm);
120 }
121 
122 #define DEFINE_HEX_XDR_NETOBJ(name, hex_array...)		\
123 	static const u8 name ## _data[] = { hex_array };	\
124 	static const struct xdr_netobj name = {			\
125 		.data	= (u8 *)name##_data,			\
126 		.len	= sizeof(name##_data),			\
127 	}
128 
129 #define DEFINE_STR_XDR_NETOBJ(name, string)			\
130 	static const u8 name ## _str[] = string;		\
131 	static const struct xdr_netobj name = {			\
132 		.data	= (u8 *)name##_str,			\
133 		.len	= sizeof(name##_str) - 1,		\
134 	}
135 
136 /*
137  * RFC 3961 Appendix A.1.  n-fold
138  *
139  * The n-fold function is defined in section 5.1 of RFC 3961.
140  *
141  * This test material is copyright (C) The Internet Society (2005).
142  */
143 
144 DEFINE_HEX_XDR_NETOBJ(nfold_test1_plaintext,
145 		      0x30, 0x31, 0x32, 0x33, 0x34, 0x35
146 );
147 DEFINE_HEX_XDR_NETOBJ(nfold_test1_expected_result,
148 		      0xbe, 0x07, 0x26, 0x31, 0x27, 0x6b, 0x19, 0x55
149 );
150 
151 DEFINE_HEX_XDR_NETOBJ(nfold_test2_plaintext,
152 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
153 );
154 DEFINE_HEX_XDR_NETOBJ(nfold_test2_expected_result,
155 		      0x78, 0xa0, 0x7b, 0x6c, 0xaf, 0x85, 0xfa
156 );
157 
158 DEFINE_HEX_XDR_NETOBJ(nfold_test3_plaintext,
159 		      0x52, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x43, 0x6f,
160 		      0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2c,
161 		      0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x75, 0x6e,
162 		      0x6e, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x64,
163 		      0x65
164 );
165 DEFINE_HEX_XDR_NETOBJ(nfold_test3_expected_result,
166 		      0xbb, 0x6e, 0xd3, 0x08, 0x70, 0xb7, 0xf0, 0xe0
167 );
168 
169 DEFINE_HEX_XDR_NETOBJ(nfold_test4_plaintext,
170 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
171 );
172 DEFINE_HEX_XDR_NETOBJ(nfold_test4_expected_result,
173 		      0x59, 0xe4, 0xa8, 0xca, 0x7c, 0x03, 0x85, 0xc3,
174 		      0xc3, 0x7b, 0x3f, 0x6d, 0x20, 0x00, 0x24, 0x7c,
175 		      0xb6, 0xe6, 0xbd, 0x5b, 0x3e
176 );
177 
178 DEFINE_HEX_XDR_NETOBJ(nfold_test5_plaintext,
179 		      0x4d, 0x41, 0x53, 0x53, 0x41, 0x43, 0x48, 0x56,
180 		      0x53, 0x45, 0x54, 0x54, 0x53, 0x20, 0x49, 0x4e,
181 		      0x53, 0x54, 0x49, 0x54, 0x56, 0x54, 0x45, 0x20,
182 		      0x4f, 0x46, 0x20, 0x54, 0x45, 0x43, 0x48, 0x4e,
183 		      0x4f, 0x4c, 0x4f, 0x47, 0x59
184 );
185 DEFINE_HEX_XDR_NETOBJ(nfold_test5_expected_result,
186 		      0xdb, 0x3b, 0x0d, 0x8f, 0x0b, 0x06, 0x1e, 0x60,
187 		      0x32, 0x82, 0xb3, 0x08, 0xa5, 0x08, 0x41, 0x22,
188 		      0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b
189 );
190 
191 DEFINE_HEX_XDR_NETOBJ(nfold_test6_plaintext,
192 		      0x51
193 );
194 DEFINE_HEX_XDR_NETOBJ(nfold_test6_expected_result,
195 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
196 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
197 		      0x51, 0x8a, 0x54, 0xa2, 0x15
198 );
199 
200 DEFINE_HEX_XDR_NETOBJ(nfold_test7_plaintext,
201 		      0x62, 0x61
202 );
203 DEFINE_HEX_XDR_NETOBJ(nfold_test7_expected_result,
204 		      0xfb, 0x25, 0xd5, 0x31, 0xae, 0x89, 0x74, 0x49,
205 		      0x9f, 0x52, 0xfd, 0x92, 0xea, 0x98, 0x57, 0xc4,
206 		      0xba, 0x24, 0xcf, 0x29, 0x7e
207 );
208 
209 DEFINE_HEX_XDR_NETOBJ(nfold_test_kerberos,
210 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
211 );
212 DEFINE_HEX_XDR_NETOBJ(nfold_test8_expected_result,
213 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
214 );
215 DEFINE_HEX_XDR_NETOBJ(nfold_test9_expected_result,
216 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
217 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93
218 );
219 DEFINE_HEX_XDR_NETOBJ(nfold_test10_expected_result,
220 		      0x83, 0x72, 0xc2, 0x36, 0x34, 0x4e, 0x5f, 0x15,
221 		      0x50, 0xcd, 0x07, 0x47, 0xe1, 0x5d, 0x62, 0xca,
222 		      0x7a, 0x5a, 0x3b, 0xce, 0xa4
223 );
224 DEFINE_HEX_XDR_NETOBJ(nfold_test11_expected_result,
225 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
226 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93,
227 		      0x5c, 0x9b, 0xdc, 0xda, 0xd9, 0x5c, 0x98, 0x99,
228 		      0xc4, 0xca, 0xe4, 0xde, 0xe6, 0xd6, 0xca, 0xe4
229 );
230 
231 static const struct gss_krb5_test_param rfc3961_nfold_test_params[] = {
232 	{
233 		.desc			= "64-fold(\"012345\")",
234 		.nfold			= 64,
235 		.plaintext		= &nfold_test1_plaintext,
236 		.expected_result	= &nfold_test1_expected_result,
237 	},
238 	{
239 		.desc			= "56-fold(\"password\")",
240 		.nfold			= 56,
241 		.plaintext		= &nfold_test2_plaintext,
242 		.expected_result	= &nfold_test2_expected_result,
243 	},
244 	{
245 		.desc			= "64-fold(\"Rough Consensus, and Running Code\")",
246 		.nfold			= 64,
247 		.plaintext		= &nfold_test3_plaintext,
248 		.expected_result	= &nfold_test3_expected_result,
249 	},
250 	{
251 		.desc			= "168-fold(\"password\")",
252 		.nfold			= 168,
253 		.plaintext		= &nfold_test4_plaintext,
254 		.expected_result	= &nfold_test4_expected_result,
255 	},
256 	{
257 		.desc			= "192-fold(\"MASSACHVSETTS INSTITVTE OF TECHNOLOGY\")",
258 		.nfold			= 192,
259 		.plaintext		= &nfold_test5_plaintext,
260 		.expected_result	= &nfold_test5_expected_result,
261 	},
262 	{
263 		.desc			= "168-fold(\"Q\")",
264 		.nfold			= 168,
265 		.plaintext		= &nfold_test6_plaintext,
266 		.expected_result	= &nfold_test6_expected_result,
267 	},
268 	{
269 		.desc			= "168-fold(\"ba\")",
270 		.nfold			= 168,
271 		.plaintext		= &nfold_test7_plaintext,
272 		.expected_result	= &nfold_test7_expected_result,
273 	},
274 	{
275 		.desc			= "64-fold(\"kerberos\")",
276 		.nfold			= 64,
277 		.plaintext		= &nfold_test_kerberos,
278 		.expected_result	= &nfold_test8_expected_result,
279 	},
280 	{
281 		.desc			= "128-fold(\"kerberos\")",
282 		.nfold			= 128,
283 		.plaintext		= &nfold_test_kerberos,
284 		.expected_result	= &nfold_test9_expected_result,
285 	},
286 	{
287 		.desc			= "168-fold(\"kerberos\")",
288 		.nfold			= 168,
289 		.plaintext		= &nfold_test_kerberos,
290 		.expected_result	= &nfold_test10_expected_result,
291 	},
292 	{
293 		.desc			= "256-fold(\"kerberos\")",
294 		.nfold			= 256,
295 		.plaintext		= &nfold_test_kerberos,
296 		.expected_result	= &nfold_test11_expected_result,
297 	},
298 };
299 
300 /* Creates the function rfc3961_nfold_gen_params */
301 KUNIT_ARRAY_PARAM(rfc3961_nfold, rfc3961_nfold_test_params, gss_krb5_get_desc);
302 
303 static void rfc3961_nfold_case(struct kunit *test)
304 {
305 	const struct gss_krb5_test_param *param = test->param_value;
306 	u8 *result;
307 
308 	/* Arrange */
309 	result = kunit_kzalloc(test, 4096, GFP_KERNEL);
310 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, result);
311 
312 	/* Act */
313 	krb5_nfold(param->plaintext->len * 8, param->plaintext->data,
314 		   param->expected_result->len * 8, result);
315 
316 	/* Assert */
317 	KUNIT_EXPECT_EQ_MSG(test,
318 			    memcmp(param->expected_result->data,
319 				   result, param->expected_result->len), 0,
320 			    "result mismatch");
321 }
322 
323 static struct kunit_case rfc3961_test_cases[] = {
324 	{
325 		.name			= "RFC 3961 n-fold",
326 		.run_case		= rfc3961_nfold_case,
327 		.generate_params	= rfc3961_nfold_gen_params,
328 	},
329 	{}
330 };
331 
332 static struct kunit_suite rfc3961_suite = {
333 	.name			= "RFC 3961 tests",
334 	.test_cases		= rfc3961_test_cases,
335 };
336 
337 /*
338  * From RFC 3962 Appendix B:   Sample Test Vectors
339  *
340  * Some test vectors for CBC with ciphertext stealing, using an
341  * initial vector of all-zero.
342  *
343  * This test material is copyright (C) The Internet Society (2005).
344  */
345 
346 DEFINE_HEX_XDR_NETOBJ(rfc3962_encryption_key,
347 		      0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
348 		      0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
349 );
350 
351 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_plaintext,
352 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
353 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
354 		      0x20
355 );
356 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_expected_result,
357 		      0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
358 		      0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
359 		      0x97
360 );
361 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_next_iv,
362 		      0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
363 		      0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f
364 );
365 
366 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_plaintext,
367 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
368 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
369 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
370 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
371 );
372 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_expected_result,
373 		      0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
374 		      0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
375 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
376 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
377 );
378 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_next_iv,
379 		      0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
380 		      0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22
381 );
382 
383 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_plaintext,
384 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
385 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
386 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
387 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43
388 );
389 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_expected_result,
390 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
391 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
392 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
393 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84
394 );
395 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_next_iv,
396 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
397 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8
398 );
399 
400 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_plaintext,
401 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
402 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
403 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
404 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
405 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
406 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c
407 );
408 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_expected_result,
409 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
410 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
411 		      0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
412 		      0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
413 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
414 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5
415 );
416 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_next_iv,
417 		      0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
418 		      0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e
419 );
420 
421 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_plaintext,
422 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
423 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
424 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
425 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
426 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
427 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20
428 );
429 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_expected_result,
430 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
431 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
432 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
433 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
434 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
435 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8
436 );
437 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_next_iv,
438 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
439 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8
440 );
441 
442 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_plaintext,
443 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
444 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
445 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
446 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
447 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
448 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
449 		      0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
450 		      0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e
451 );
452 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_expected_result,
453 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
454 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
455 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
456 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
457 		      0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
458 		      0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
459 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
460 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8
461 );
462 DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_next_iv,
463 		      0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
464 		      0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40
465 );
466 
467 static const struct gss_krb5_test_param rfc3962_encrypt_test_params[] = {
468 	{
469 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 1",
470 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
471 		.Ke			= &rfc3962_encryption_key,
472 		.plaintext		= &rfc3962_enc_test1_plaintext,
473 		.expected_result	= &rfc3962_enc_test1_expected_result,
474 		.next_iv		= &rfc3962_enc_test1_next_iv,
475 	},
476 	{
477 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 2",
478 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
479 		.Ke			= &rfc3962_encryption_key,
480 		.plaintext		= &rfc3962_enc_test2_plaintext,
481 		.expected_result	= &rfc3962_enc_test2_expected_result,
482 		.next_iv		= &rfc3962_enc_test2_next_iv,
483 	},
484 	{
485 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 3",
486 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
487 		.Ke			= &rfc3962_encryption_key,
488 		.plaintext		= &rfc3962_enc_test3_plaintext,
489 		.expected_result	= &rfc3962_enc_test3_expected_result,
490 		.next_iv		= &rfc3962_enc_test3_next_iv,
491 	},
492 	{
493 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 4",
494 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
495 		.Ke			= &rfc3962_encryption_key,
496 		.plaintext		= &rfc3962_enc_test4_plaintext,
497 		.expected_result	= &rfc3962_enc_test4_expected_result,
498 		.next_iv		= &rfc3962_enc_test4_next_iv,
499 	},
500 	{
501 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 5",
502 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
503 		.Ke			= &rfc3962_encryption_key,
504 		.plaintext		= &rfc3962_enc_test5_plaintext,
505 		.expected_result	= &rfc3962_enc_test5_expected_result,
506 		.next_iv		= &rfc3962_enc_test5_next_iv,
507 	},
508 	{
509 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 6",
510 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
511 		.Ke			= &rfc3962_encryption_key,
512 		.plaintext		= &rfc3962_enc_test6_plaintext,
513 		.expected_result	= &rfc3962_enc_test6_expected_result,
514 		.next_iv		= &rfc3962_enc_test6_next_iv,
515 	},
516 };
517 
518 /* Creates the function rfc3962_encrypt_gen_params */
519 KUNIT_ARRAY_PARAM(rfc3962_encrypt, rfc3962_encrypt_test_params,
520 		  gss_krb5_get_desc);
521 
522 /*
523  * This tests the implementation of the encryption part of the mechanism.
524  * It does not apply a confounder or test the result of HMAC over the
525  * plaintext.
526  */
527 static void rfc3962_encrypt_case(struct kunit *test)
528 {
529 	const struct gss_krb5_test_param *param = test->param_value;
530 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
531 	const struct gss_krb5_enctype *gk5e;
532 	struct xdr_buf buf;
533 	void *iv, *text;
534 	u32 err;
535 
536 	/* Arrange */
537 	gk5e = gss_krb5_lookup_enctype(param->enctype);
538 	if (!gk5e)
539 		kunit_skip(test, "Encryption type is not available");
540 
541 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
542 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
543 	err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len);
544 	KUNIT_ASSERT_EQ(test, err, 0);
545 
546 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
547 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
548 	err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len);
549 	KUNIT_ASSERT_EQ(test, err, 0);
550 
551 	iv = kunit_kzalloc(test, crypto_sync_skcipher_ivsize(cts_tfm), GFP_KERNEL);
552 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, iv);
553 
554 	text = kunit_kzalloc(test, param->plaintext->len, GFP_KERNEL);
555 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
556 
557 	memcpy(text, param->plaintext->data, param->plaintext->len);
558 	memset(&buf, 0, sizeof(buf));
559 	buf.head[0].iov_base = text;
560 	buf.head[0].iov_len = param->plaintext->len;
561 	buf.len = buf.head[0].iov_len;
562 
563 	/* Act */
564 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL,
565 				   iv, crypto_sync_skcipher_ivsize(cts_tfm));
566 	KUNIT_ASSERT_EQ(test, err, 0);
567 
568 	/* Assert */
569 	KUNIT_EXPECT_EQ_MSG(test,
570 			    param->expected_result->len, buf.len,
571 			    "ciphertext length mismatch");
572 	KUNIT_EXPECT_EQ_MSG(test,
573 			    memcmp(param->expected_result->data,
574 				   text, param->expected_result->len), 0,
575 			    "ciphertext mismatch");
576 	KUNIT_EXPECT_EQ_MSG(test,
577 			    memcmp(param->next_iv->data, iv,
578 				   param->next_iv->len), 0,
579 			    "IV mismatch");
580 
581 	crypto_free_sync_skcipher(cts_tfm);
582 	crypto_free_sync_skcipher(cbc_tfm);
583 }
584 
585 static struct kunit_case rfc3962_test_cases[] = {
586 	{
587 		.name			= "RFC 3962 encryption",
588 		.run_case		= rfc3962_encrypt_case,
589 		.generate_params	= rfc3962_encrypt_gen_params,
590 	},
591 	{}
592 };
593 
594 static struct kunit_suite rfc3962_suite = {
595 	.name			= "RFC 3962 suite",
596 	.test_cases		= rfc3962_test_cases,
597 };
598 
599 /*
600  * From RFC 6803 Section 10.  Test vectors
601  *
602  * Sample results for key derivation
603  *
604  * Copyright (c) 2012 IETF Trust and the persons identified as the
605  * document authors.  All rights reserved.
606  */
607 
608 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_basekey,
609 		      0x57, 0xd0, 0x29, 0x72, 0x98, 0xff, 0xd9, 0xd3,
610 		      0x5d, 0xe5, 0xa4, 0x7f, 0xb4, 0xbd, 0xe2, 0x4b
611 );
612 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Kc,
613 		      0xd1, 0x55, 0x77, 0x5a, 0x20, 0x9d, 0x05, 0xf0,
614 		      0x2b, 0x38, 0xd4, 0x2a, 0x38, 0x9e, 0x5a, 0x56
615 );
616 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ke,
617 		      0x64, 0xdf, 0x83, 0xf8, 0x5a, 0x53, 0x2f, 0x17,
618 		      0x57, 0x7d, 0x8c, 0x37, 0x03, 0x57, 0x96, 0xab
619 );
620 DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ki,
621 		      0x3e, 0x4f, 0xbd, 0xf3, 0x0f, 0xb8, 0x25, 0x9c,
622 		      0x42, 0x5c, 0xb6, 0xc9, 0x6f, 0x1f, 0x46, 0x35
623 );
624 
625 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_basekey,
626 		      0xb9, 0xd6, 0x82, 0x8b, 0x20, 0x56, 0xb7, 0xbe,
627 		      0x65, 0x6d, 0x88, 0xa1, 0x23, 0xb1, 0xfa, 0xc6,
628 		      0x82, 0x14, 0xac, 0x2b, 0x72, 0x7e, 0xcf, 0x5f,
629 		      0x69, 0xaf, 0xe0, 0xc4, 0xdf, 0x2a, 0x6d, 0x2c
630 );
631 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Kc,
632 		      0xe4, 0x67, 0xf9, 0xa9, 0x55, 0x2b, 0xc7, 0xd3,
633 		      0x15, 0x5a, 0x62, 0x20, 0xaf, 0x9c, 0x19, 0x22,
634 		      0x0e, 0xee, 0xd4, 0xff, 0x78, 0xb0, 0xd1, 0xe6,
635 		      0xa1, 0x54, 0x49, 0x91, 0x46, 0x1a, 0x9e, 0x50
636 );
637 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ke,
638 		      0x41, 0x2a, 0xef, 0xc3, 0x62, 0xa7, 0x28, 0x5f,
639 		      0xc3, 0x96, 0x6c, 0x6a, 0x51, 0x81, 0xe7, 0x60,
640 		      0x5a, 0xe6, 0x75, 0x23, 0x5b, 0x6d, 0x54, 0x9f,
641 		      0xbf, 0xc9, 0xab, 0x66, 0x30, 0xa4, 0xc6, 0x04
642 );
643 DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ki,
644 		      0xfa, 0x62, 0x4f, 0xa0, 0xe5, 0x23, 0x99, 0x3f,
645 		      0xa3, 0x88, 0xae, 0xfd, 0xc6, 0x7e, 0x67, 0xeb,
646 		      0xcd, 0x8c, 0x08, 0xe8, 0xa0, 0x24, 0x6b, 0x1d,
647 		      0x73, 0xb0, 0xd1, 0xdd, 0x9f, 0xc5, 0x82, 0xb0
648 );
649 
650 DEFINE_HEX_XDR_NETOBJ(usage_checksum,
651 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_CHECKSUM
652 );
653 DEFINE_HEX_XDR_NETOBJ(usage_encryption,
654 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_ENCRYPTION
655 );
656 DEFINE_HEX_XDR_NETOBJ(usage_integrity,
657 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_INTEGRITY
658 );
659 
660 static const struct gss_krb5_test_param rfc6803_kdf_test_params[] = {
661 	{
662 		.desc			= "Derive Kc subkey for camellia128-cts-cmac",
663 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
664 		.base_key		= &camellia128_cts_cmac_basekey,
665 		.usage			= &usage_checksum,
666 		.expected_result	= &camellia128_cts_cmac_Kc,
667 	},
668 	{
669 		.desc			= "Derive Ke subkey for camellia128-cts-cmac",
670 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
671 		.base_key		= &camellia128_cts_cmac_basekey,
672 		.usage			= &usage_encryption,
673 		.expected_result	= &camellia128_cts_cmac_Ke,
674 	},
675 	{
676 		.desc			= "Derive Ki subkey for camellia128-cts-cmac",
677 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
678 		.base_key		= &camellia128_cts_cmac_basekey,
679 		.usage			= &usage_integrity,
680 		.expected_result	= &camellia128_cts_cmac_Ki,
681 	},
682 	{
683 		.desc			= "Derive Kc subkey for camellia256-cts-cmac",
684 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
685 		.base_key		= &camellia256_cts_cmac_basekey,
686 		.usage			= &usage_checksum,
687 		.expected_result	= &camellia256_cts_cmac_Kc,
688 	},
689 	{
690 		.desc			= "Derive Ke subkey for camellia256-cts-cmac",
691 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
692 		.base_key		= &camellia256_cts_cmac_basekey,
693 		.usage			= &usage_encryption,
694 		.expected_result	= &camellia256_cts_cmac_Ke,
695 	},
696 	{
697 		.desc			= "Derive Ki subkey for camellia256-cts-cmac",
698 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
699 		.base_key		= &camellia256_cts_cmac_basekey,
700 		.usage			= &usage_integrity,
701 		.expected_result	= &camellia256_cts_cmac_Ki,
702 	},
703 };
704 
705 /* Creates the function rfc6803_kdf_gen_params */
706 KUNIT_ARRAY_PARAM(rfc6803_kdf, rfc6803_kdf_test_params, gss_krb5_get_desc);
707 
708 /*
709  * From RFC 6803 Section 10.  Test vectors
710  *
711  * Sample checksums.
712  *
713  * Copyright (c) 2012 IETF Trust and the persons identified as the
714  * document authors.  All rights reserved.
715  *
716  * XXX: These tests are likely to fail on EBCDIC or Unicode platforms.
717  */
718 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test1_plaintext,
719 		      "abcdefghijk");
720 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_basekey,
721 		      0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93,
722 		      0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3
723 );
724 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_usage,
725 		      0x00, 0x00, 0x00, 0x07, KEY_USAGE_SEED_CHECKSUM
726 );
727 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_expected_result,
728 		      0x11, 0x78, 0xe6, 0xc5, 0xc4, 0x7a, 0x8c, 0x1a,
729 		      0xe0, 0xc4, 0xb9, 0xc7, 0xd4, 0xeb, 0x7b, 0x6b
730 );
731 
732 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test2_plaintext,
733 		      "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
734 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_basekey,
735 		      0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d,
736 		      0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c
737 );
738 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_usage,
739 		      0x00, 0x00, 0x00, 0x08, KEY_USAGE_SEED_CHECKSUM
740 );
741 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_expected_result,
742 		      0xd1, 0xb3, 0x4f, 0x70, 0x04, 0xa7, 0x31, 0xf2,
743 		      0x3a, 0x0c, 0x00, 0xbf, 0x6c, 0x3f, 0x75, 0x3a
744 );
745 
746 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test3_plaintext,
747 		      "123456789");
748 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_basekey,
749 		      0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57,
750 		      0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03,
751 		      0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd,
752 		      0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b
753 );
754 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_usage,
755 		      0x00, 0x00, 0x00, 0x09, KEY_USAGE_SEED_CHECKSUM
756 );
757 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_expected_result,
758 		      0x87, 0xa1, 0x2c, 0xfd, 0x2b, 0x96, 0x21, 0x48,
759 		      0x10, 0xf0, 0x1c, 0x82, 0x6e, 0x77, 0x44, 0xb1
760 );
761 
762 DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test4_plaintext,
763 		      "!@#$%^&*()!@#$%^&*()!@#$%^&*()");
764 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_basekey,
765 		      0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15,
766 		      0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe,
767 		      0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33,
768 		      0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05
769 );
770 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_usage,
771 		      0x00, 0x00, 0x00, 0x0a, KEY_USAGE_SEED_CHECKSUM
772 );
773 DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_expected_result,
774 		      0x3f, 0xa0, 0xb4, 0x23, 0x55, 0xe5, 0x2b, 0x18,
775 		      0x91, 0x87, 0x29, 0x4a, 0xa2, 0x52, 0xab, 0x64
776 );
777 
778 static const struct gss_krb5_test_param rfc6803_checksum_test_params[] = {
779 	{
780 		.desc			= "camellia128-cts-cmac checksum test 1",
781 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
782 		.base_key		= &rfc6803_checksum_test1_basekey,
783 		.usage			= &rfc6803_checksum_test1_usage,
784 		.plaintext		= &rfc6803_checksum_test1_plaintext,
785 		.expected_result	= &rfc6803_checksum_test1_expected_result,
786 	},
787 	{
788 		.desc			= "camellia128-cts-cmac checksum test 2",
789 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
790 		.base_key		= &rfc6803_checksum_test2_basekey,
791 		.usage			= &rfc6803_checksum_test2_usage,
792 		.plaintext		= &rfc6803_checksum_test2_plaintext,
793 		.expected_result	= &rfc6803_checksum_test2_expected_result,
794 	},
795 	{
796 		.desc			= "camellia256-cts-cmac checksum test 3",
797 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
798 		.base_key		= &rfc6803_checksum_test3_basekey,
799 		.usage			= &rfc6803_checksum_test3_usage,
800 		.plaintext		= &rfc6803_checksum_test3_plaintext,
801 		.expected_result	= &rfc6803_checksum_test3_expected_result,
802 	},
803 	{
804 		.desc			= "camellia256-cts-cmac checksum test 4",
805 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
806 		.base_key		= &rfc6803_checksum_test4_basekey,
807 		.usage			= &rfc6803_checksum_test4_usage,
808 		.plaintext		= &rfc6803_checksum_test4_plaintext,
809 		.expected_result	= &rfc6803_checksum_test4_expected_result,
810 	},
811 };
812 
813 /* Creates the function rfc6803_checksum_gen_params */
814 KUNIT_ARRAY_PARAM(rfc6803_checksum, rfc6803_checksum_test_params,
815 		  gss_krb5_get_desc);
816 
817 /*
818  * From RFC 6803 Section 10.  Test vectors
819  *
820  * Sample encryptions (all using the default cipher state)
821  *
822  * Copyright (c) 2012 IETF Trust and the persons identified as the
823  * document authors.  All rights reserved.
824  *
825  * Key usage values are from errata 4326 against RFC 6803.
826  */
827 
828 static const struct xdr_netobj rfc6803_enc_empty_plaintext = {
829 	.len	= 0,
830 };
831 
832 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_1byte_plaintext, "1");
833 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_9byte_plaintext, "9 bytesss");
834 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_13byte_plaintext, "13 bytes byte");
835 DEFINE_STR_XDR_NETOBJ(rfc6803_enc_30byte_plaintext,
836 		      "30 bytes bytes bytes bytes byt"
837 );
838 
839 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_confounder,
840 		      0xb6, 0x98, 0x22, 0xa1, 0x9a, 0x6b, 0x09, 0xc0,
841 		      0xeb, 0xc8, 0x55, 0x7d, 0x1f, 0x1b, 0x6c, 0x0a
842 );
843 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_basekey,
844 		      0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93,
845 		      0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3
846 );
847 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_expected_result,
848 		      0xc4, 0x66, 0xf1, 0x87, 0x10, 0x69, 0x92, 0x1e,
849 		      0xdb, 0x7c, 0x6f, 0xde, 0x24, 0x4a, 0x52, 0xdb,
850 		      0x0b, 0xa1, 0x0e, 0xdc, 0x19, 0x7b, 0xdb, 0x80,
851 		      0x06, 0x65, 0x8c, 0xa3, 0xcc, 0xce, 0x6e, 0xb8
852 );
853 
854 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_confounder,
855 		      0x6f, 0x2f, 0xc3, 0xc2, 0xa1, 0x66, 0xfd, 0x88,
856 		      0x98, 0x96, 0x7a, 0x83, 0xde, 0x95, 0x96, 0xd9
857 );
858 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_basekey,
859 		      0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d,
860 		      0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c
861 );
862 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_expected_result,
863 		      0x84, 0x2d, 0x21, 0xfd, 0x95, 0x03, 0x11, 0xc0,
864 		      0xdd, 0x46, 0x4a, 0x3f, 0x4b, 0xe8, 0xd6, 0xda,
865 		      0x88, 0xa5, 0x6d, 0x55, 0x9c, 0x9b, 0x47, 0xd3,
866 		      0xf9, 0xa8, 0x50, 0x67, 0xaf, 0x66, 0x15, 0x59,
867 		      0xb8
868 );
869 
870 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_confounder,
871 		      0xa5, 0xb4, 0xa7, 0x1e, 0x07, 0x7a, 0xee, 0xf9,
872 		      0x3c, 0x87, 0x63, 0xc1, 0x8f, 0xdb, 0x1f, 0x10
873 );
874 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_basekey,
875 		      0xa1, 0xbb, 0x61, 0xe8, 0x05, 0xf9, 0xba, 0x6d,
876 		      0xde, 0x8f, 0xdb, 0xdd, 0xc0, 0x5c, 0xde, 0xa0
877 );
878 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_expected_result,
879 		      0x61, 0x9f, 0xf0, 0x72, 0xe3, 0x62, 0x86, 0xff,
880 		      0x0a, 0x28, 0xde, 0xb3, 0xa3, 0x52, 0xec, 0x0d,
881 		      0x0e, 0xdf, 0x5c, 0x51, 0x60, 0xd6, 0x63, 0xc9,
882 		      0x01, 0x75, 0x8c, 0xcf, 0x9d, 0x1e, 0xd3, 0x3d,
883 		      0x71, 0xdb, 0x8f, 0x23, 0xaa, 0xbf, 0x83, 0x48,
884 		      0xa0
885 );
886 
887 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_confounder,
888 		      0x19, 0xfe, 0xe4, 0x0d, 0x81, 0x0c, 0x52, 0x4b,
889 		      0x5b, 0x22, 0xf0, 0x18, 0x74, 0xc6, 0x93, 0xda
890 );
891 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_basekey,
892 		      0x2c, 0xa2, 0x7a, 0x5f, 0xaf, 0x55, 0x32, 0x24,
893 		      0x45, 0x06, 0x43, 0x4e, 0x1c, 0xef, 0x66, 0x76
894 );
895 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_expected_result,
896 		      0xb8, 0xec, 0xa3, 0x16, 0x7a, 0xe6, 0x31, 0x55,
897 		      0x12, 0xe5, 0x9f, 0x98, 0xa7, 0xc5, 0x00, 0x20,
898 		      0x5e, 0x5f, 0x63, 0xff, 0x3b, 0xb3, 0x89, 0xaf,
899 		      0x1c, 0x41, 0xa2, 0x1d, 0x64, 0x0d, 0x86, 0x15,
900 		      0xc9, 0xed, 0x3f, 0xbe, 0xb0, 0x5a, 0xb6, 0xac,
901 		      0xb6, 0x76, 0x89, 0xb5, 0xea
902 );
903 
904 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_confounder,
905 		      0xca, 0x7a, 0x7a, 0xb4, 0xbe, 0x19, 0x2d, 0xab,
906 		      0xd6, 0x03, 0x50, 0x6d, 0xb1, 0x9c, 0x39, 0xe2
907 );
908 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_basekey,
909 		      0x78, 0x24, 0xf8, 0xc1, 0x6f, 0x83, 0xff, 0x35,
910 		      0x4c, 0x6b, 0xf7, 0x51, 0x5b, 0x97, 0x3f, 0x43
911 );
912 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_expected_result,
913 		      0xa2, 0x6a, 0x39, 0x05, 0xa4, 0xff, 0xd5, 0x81,
914 		      0x6b, 0x7b, 0x1e, 0x27, 0x38, 0x0d, 0x08, 0x09,
915 		      0x0c, 0x8e, 0xc1, 0xf3, 0x04, 0x49, 0x6e, 0x1a,
916 		      0xbd, 0xcd, 0x2b, 0xdc, 0xd1, 0xdf, 0xfc, 0x66,
917 		      0x09, 0x89, 0xe1, 0x17, 0xa7, 0x13, 0xdd, 0xbb,
918 		      0x57, 0xa4, 0x14, 0x6c, 0x15, 0x87, 0xcb, 0xa4,
919 		      0x35, 0x66, 0x65, 0x59, 0x1d, 0x22, 0x40, 0x28,
920 		      0x2f, 0x58, 0x42, 0xb1, 0x05, 0xa5
921 );
922 
923 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_confounder,
924 		      0x3c, 0xbb, 0xd2, 0xb4, 0x59, 0x17, 0x94, 0x10,
925 		      0x67, 0xf9, 0x65, 0x99, 0xbb, 0x98, 0x92, 0x6c
926 );
927 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_basekey,
928 		      0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57,
929 		      0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03,
930 		      0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd,
931 		      0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b
932 );
933 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_expected_result,
934 		      0x03, 0x88, 0x6d, 0x03, 0x31, 0x0b, 0x47, 0xa6,
935 		      0xd8, 0xf0, 0x6d, 0x7b, 0x94, 0xd1, 0xdd, 0x83,
936 		      0x7e, 0xcc, 0xe3, 0x15, 0xef, 0x65, 0x2a, 0xff,
937 		      0x62, 0x08, 0x59, 0xd9, 0x4a, 0x25, 0x92, 0x66
938 );
939 
940 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_confounder,
941 		      0xde, 0xf4, 0x87, 0xfc, 0xeb, 0xe6, 0xde, 0x63,
942 		      0x46, 0xd4, 0xda, 0x45, 0x21, 0xbb, 0xa2, 0xd2
943 );
944 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_basekey,
945 		      0x1b, 0x97, 0xfe, 0x0a, 0x19, 0x0e, 0x20, 0x21,
946 		      0xeb, 0x30, 0x75, 0x3e, 0x1b, 0x6e, 0x1e, 0x77,
947 		      0xb0, 0x75, 0x4b, 0x1d, 0x68, 0x46, 0x10, 0x35,
948 		      0x58, 0x64, 0x10, 0x49, 0x63, 0x46, 0x38, 0x33
949 );
950 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_expected_result,
951 		      0x2c, 0x9c, 0x15, 0x70, 0x13, 0x3c, 0x99, 0xbf,
952 		      0x6a, 0x34, 0xbc, 0x1b, 0x02, 0x12, 0x00, 0x2f,
953 		      0xd1, 0x94, 0x33, 0x87, 0x49, 0xdb, 0x41, 0x35,
954 		      0x49, 0x7a, 0x34, 0x7c, 0xfc, 0xd9, 0xd1, 0x8a,
955 		      0x12
956 );
957 
958 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_confounder,
959 		      0xad, 0x4f, 0xf9, 0x04, 0xd3, 0x4e, 0x55, 0x53,
960 		      0x84, 0xb1, 0x41, 0x00, 0xfc, 0x46, 0x5f, 0x88
961 );
962 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_basekey,
963 		      0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15,
964 		      0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe,
965 		      0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33,
966 		      0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05
967 );
968 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_expected_result,
969 		      0x9c, 0x6d, 0xe7, 0x5f, 0x81, 0x2d, 0xe7, 0xed,
970 		      0x0d, 0x28, 0xb2, 0x96, 0x35, 0x57, 0xa1, 0x15,
971 		      0x64, 0x09, 0x98, 0x27, 0x5b, 0x0a, 0xf5, 0x15,
972 		      0x27, 0x09, 0x91, 0x3f, 0xf5, 0x2a, 0x2a, 0x9c,
973 		      0x8e, 0x63, 0xb8, 0x72, 0xf9, 0x2e, 0x64, 0xc8,
974 		      0x39
975 );
976 
977 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_confounder,
978 		      0xcf, 0x9b, 0xca, 0x6d, 0xf1, 0x14, 0x4e, 0x0c,
979 		      0x0a, 0xf9, 0xb8, 0xf3, 0x4c, 0x90, 0xd5, 0x14
980 );
981 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_basekey,
982 		      0xb0, 0x38, 0xb1, 0x32, 0xcd, 0x8e, 0x06, 0x61,
983 		      0x22, 0x67, 0xfa, 0xb7, 0x17, 0x00, 0x66, 0xd8,
984 		      0x8a, 0xec, 0xcb, 0xa0, 0xb7, 0x44, 0xbf, 0xc6,
985 		      0x0d, 0xc8, 0x9b, 0xca, 0x18, 0x2d, 0x07, 0x15
986 );
987 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_expected_result,
988 		      0xee, 0xec, 0x85, 0xa9, 0x81, 0x3c, 0xdc, 0x53,
989 		      0x67, 0x72, 0xab, 0x9b, 0x42, 0xde, 0xfc, 0x57,
990 		      0x06, 0xf7, 0x26, 0xe9, 0x75, 0xdd, 0xe0, 0x5a,
991 		      0x87, 0xeb, 0x54, 0x06, 0xea, 0x32, 0x4c, 0xa1,
992 		      0x85, 0xc9, 0x98, 0x6b, 0x42, 0xaa, 0xbe, 0x79,
993 		      0x4b, 0x84, 0x82, 0x1b, 0xee
994 );
995 
996 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_confounder,
997 		      0x64, 0x4d, 0xef, 0x38, 0xda, 0x35, 0x00, 0x72,
998 		      0x75, 0x87, 0x8d, 0x21, 0x68, 0x55, 0xe2, 0x28
999 );
1000 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_basekey,
1001 		      0xcc, 0xfc, 0xd3, 0x49, 0xbf, 0x4c, 0x66, 0x77,
1002 		      0xe8, 0x6e, 0x4b, 0x02, 0xb8, 0xea, 0xb9, 0x24,
1003 		      0xa5, 0x46, 0xac, 0x73, 0x1c, 0xf9, 0xbf, 0x69,
1004 		      0x89, 0xb9, 0x96, 0xe7, 0xd6, 0xbf, 0xbb, 0xa7
1005 );
1006 DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_expected_result,
1007 		      0x0e, 0x44, 0x68, 0x09, 0x85, 0x85, 0x5f, 0x2d,
1008 		      0x1f, 0x18, 0x12, 0x52, 0x9c, 0xa8, 0x3b, 0xfd,
1009 		      0x8e, 0x34, 0x9d, 0xe6, 0xfd, 0x9a, 0xda, 0x0b,
1010 		      0xaa, 0xa0, 0x48, 0xd6, 0x8e, 0x26, 0x5f, 0xeb,
1011 		      0xf3, 0x4a, 0xd1, 0x25, 0x5a, 0x34, 0x49, 0x99,
1012 		      0xad, 0x37, 0x14, 0x68, 0x87, 0xa6, 0xc6, 0x84,
1013 		      0x57, 0x31, 0xac, 0x7f, 0x46, 0x37, 0x6a, 0x05,
1014 		      0x04, 0xcd, 0x06, 0x57, 0x14, 0x74
1015 );
1016 
1017 static const struct gss_krb5_test_param rfc6803_encrypt_test_params[] = {
1018 	{
1019 		.desc			= "Encrypt empty plaintext with camellia128-cts-cmac",
1020 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1021 		.constant		= 0,
1022 		.base_key		= &rfc6803_enc_test1_basekey,
1023 		.plaintext		= &rfc6803_enc_empty_plaintext,
1024 		.confounder		= &rfc6803_enc_test1_confounder,
1025 		.expected_result	= &rfc6803_enc_test1_expected_result,
1026 	},
1027 	{
1028 		.desc			= "Encrypt 1 byte with camellia128-cts-cmac",
1029 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1030 		.constant		= 1,
1031 		.base_key		= &rfc6803_enc_test2_basekey,
1032 		.plaintext		= &rfc6803_enc_1byte_plaintext,
1033 		.confounder		= &rfc6803_enc_test2_confounder,
1034 		.expected_result	= &rfc6803_enc_test2_expected_result,
1035 	},
1036 	{
1037 		.desc			= "Encrypt 9 bytes with camellia128-cts-cmac",
1038 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1039 		.constant		= 2,
1040 		.base_key		= &rfc6803_enc_test3_basekey,
1041 		.plaintext		= &rfc6803_enc_9byte_plaintext,
1042 		.confounder		= &rfc6803_enc_test3_confounder,
1043 		.expected_result	= &rfc6803_enc_test3_expected_result,
1044 	},
1045 	{
1046 		.desc			= "Encrypt 13 bytes with camellia128-cts-cmac",
1047 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1048 		.constant		= 3,
1049 		.base_key		= &rfc6803_enc_test4_basekey,
1050 		.plaintext		= &rfc6803_enc_13byte_plaintext,
1051 		.confounder		= &rfc6803_enc_test4_confounder,
1052 		.expected_result	= &rfc6803_enc_test4_expected_result,
1053 	},
1054 	{
1055 		.desc			= "Encrypt 30 bytes with camellia128-cts-cmac",
1056 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1057 		.constant		= 4,
1058 		.base_key		= &rfc6803_enc_test5_basekey,
1059 		.plaintext		= &rfc6803_enc_30byte_plaintext,
1060 		.confounder		= &rfc6803_enc_test5_confounder,
1061 		.expected_result	= &rfc6803_enc_test5_expected_result,
1062 	},
1063 	{
1064 		.desc			= "Encrypt empty plaintext with camellia256-cts-cmac",
1065 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1066 		.constant		= 0,
1067 		.base_key		= &rfc6803_enc_test6_basekey,
1068 		.plaintext		= &rfc6803_enc_empty_plaintext,
1069 		.confounder		= &rfc6803_enc_test6_confounder,
1070 		.expected_result	= &rfc6803_enc_test6_expected_result,
1071 	},
1072 	{
1073 		.desc			= "Encrypt 1 byte with camellia256-cts-cmac",
1074 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1075 		.constant		= 1,
1076 		.base_key		= &rfc6803_enc_test7_basekey,
1077 		.plaintext		= &rfc6803_enc_1byte_plaintext,
1078 		.confounder		= &rfc6803_enc_test7_confounder,
1079 		.expected_result	= &rfc6803_enc_test7_expected_result,
1080 	},
1081 	{
1082 		.desc			= "Encrypt 9 bytes with camellia256-cts-cmac",
1083 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1084 		.constant		= 2,
1085 		.base_key		= &rfc6803_enc_test8_basekey,
1086 		.plaintext		= &rfc6803_enc_9byte_plaintext,
1087 		.confounder		= &rfc6803_enc_test8_confounder,
1088 		.expected_result	= &rfc6803_enc_test8_expected_result,
1089 	},
1090 	{
1091 		.desc			= "Encrypt 13 bytes with camellia256-cts-cmac",
1092 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1093 		.constant		= 3,
1094 		.base_key		= &rfc6803_enc_test9_basekey,
1095 		.plaintext		= &rfc6803_enc_13byte_plaintext,
1096 		.confounder		= &rfc6803_enc_test9_confounder,
1097 		.expected_result	= &rfc6803_enc_test9_expected_result,
1098 	},
1099 	{
1100 		.desc			= "Encrypt 30 bytes with camellia256-cts-cmac",
1101 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1102 		.constant		= 4,
1103 		.base_key		= &rfc6803_enc_test10_basekey,
1104 		.plaintext		= &rfc6803_enc_30byte_plaintext,
1105 		.confounder		= &rfc6803_enc_test10_confounder,
1106 		.expected_result	= &rfc6803_enc_test10_expected_result,
1107 	},
1108 };
1109 
1110 /* Creates the function rfc6803_encrypt_gen_params */
1111 KUNIT_ARRAY_PARAM(rfc6803_encrypt, rfc6803_encrypt_test_params,
1112 		  gss_krb5_get_desc);
1113 
1114 static void rfc6803_encrypt_case(struct kunit *test)
1115 {
1116 	const struct gss_krb5_test_param *param = test->param_value;
1117 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
1118 	const struct gss_krb5_enctype *gk5e;
1119 	struct xdr_netobj Ke, Ki, checksum;
1120 	u8 usage_data[GSS_KRB5_K5CLENGTH];
1121 	struct xdr_netobj usage = {
1122 		.data = usage_data,
1123 		.len = sizeof(usage_data),
1124 	};
1125 	struct crypto_ahash *ahash_tfm;
1126 	unsigned int blocksize;
1127 	struct xdr_buf buf;
1128 	void *text;
1129 	size_t len;
1130 	u32 err;
1131 
1132 	/* Arrange */
1133 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1134 	if (!gk5e)
1135 		kunit_skip(test, "Encryption type is not available");
1136 
1137 	memset(usage_data, 0, sizeof(usage_data));
1138 	usage.data[3] = param->constant;
1139 
1140 	Ke.len = gk5e->Ke_length;
1141 	Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL);
1142 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data);
1143 	usage.data[4] = KEY_USAGE_SEED_ENCRYPTION;
1144 	err = gk5e->derive_key(gk5e, param->base_key, &Ke, &usage, GFP_KERNEL);
1145 	KUNIT_ASSERT_EQ(test, err, 0);
1146 
1147 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
1148 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
1149 	err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len);
1150 	KUNIT_ASSERT_EQ(test, err, 0);
1151 
1152 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
1153 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
1154 	err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len);
1155 	KUNIT_ASSERT_EQ(test, err, 0);
1156 	blocksize = crypto_sync_skcipher_blocksize(cts_tfm);
1157 
1158 	len = param->confounder->len + param->plaintext->len + blocksize;
1159 	text = kunit_kzalloc(test, len, GFP_KERNEL);
1160 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
1161 	memcpy(text, param->confounder->data, param->confounder->len);
1162 	memcpy(text + param->confounder->len, param->plaintext->data,
1163 	       param->plaintext->len);
1164 
1165 	memset(&buf, 0, sizeof(buf));
1166 	buf.head[0].iov_base = text;
1167 	buf.head[0].iov_len = param->confounder->len + param->plaintext->len;
1168 	buf.len = buf.head[0].iov_len;
1169 
1170 	checksum.len = gk5e->cksumlength;
1171 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
1172 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
1173 
1174 	Ki.len = gk5e->Ki_length;
1175 	Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL);
1176 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data);
1177 	usage.data[4] = KEY_USAGE_SEED_INTEGRITY;
1178 	err = gk5e->derive_key(gk5e, param->base_key, &Ki,
1179 			       &usage, GFP_KERNEL);
1180 	KUNIT_ASSERT_EQ(test, err, 0);
1181 	ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
1182 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm);
1183 	err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len);
1184 	KUNIT_ASSERT_EQ(test, err, 0);
1185 
1186 	/* Act */
1187 	err = gss_krb5_checksum(ahash_tfm, NULL, 0, &buf, 0, &checksum);
1188 	KUNIT_ASSERT_EQ(test, err, 0);
1189 
1190 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
1191 	KUNIT_ASSERT_EQ(test, err, 0);
1192 
1193 	/* Assert */
1194 	KUNIT_EXPECT_EQ_MSG(test, param->expected_result->len,
1195 			    buf.len + checksum.len,
1196 			    "ciphertext length mismatch");
1197 	KUNIT_EXPECT_EQ_MSG(test,
1198 			    memcmp(param->expected_result->data,
1199 				   buf.head[0].iov_base, buf.len), 0,
1200 			    "encrypted result mismatch");
1201 	KUNIT_EXPECT_EQ_MSG(test,
1202 			    memcmp(param->expected_result->data +
1203 				   (param->expected_result->len - checksum.len),
1204 				   checksum.data, checksum.len), 0,
1205 			    "HMAC mismatch");
1206 
1207 	crypto_free_ahash(ahash_tfm);
1208 	crypto_free_sync_skcipher(cts_tfm);
1209 	crypto_free_sync_skcipher(cbc_tfm);
1210 }
1211 
1212 static struct kunit_case rfc6803_test_cases[] = {
1213 	{
1214 		.name			= "RFC 6803 key derivation",
1215 		.run_case		= kdf_case,
1216 		.generate_params	= rfc6803_kdf_gen_params,
1217 	},
1218 	{
1219 		.name			= "RFC 6803 checksum",
1220 		.run_case		= checksum_case,
1221 		.generate_params	= rfc6803_checksum_gen_params,
1222 	},
1223 	{
1224 		.name			= "RFC 6803 encryption",
1225 		.run_case		= rfc6803_encrypt_case,
1226 		.generate_params	= rfc6803_encrypt_gen_params,
1227 	},
1228 	{}
1229 };
1230 
1231 static struct kunit_suite rfc6803_suite = {
1232 	.name			= "RFC 6803 suite",
1233 	.test_cases		= rfc6803_test_cases,
1234 };
1235 
1236 /*
1237  * From RFC 8009 Appendix A.  Test Vectors
1238  *
1239  * Sample results for SHA-2 enctype key derivation
1240  *
1241  * This test material is copyright (c) 2016 IETF Trust and the
1242  * persons identified as the document authors.  All rights reserved.
1243  */
1244 
1245 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_basekey,
1246 		      0x37, 0x05, 0xd9, 0x60, 0x80, 0xc1, 0x77, 0x28,
1247 		      0xa0, 0xe8, 0x00, 0xea, 0xb6, 0xe0, 0xd2, 0x3c
1248 );
1249 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Kc,
1250 		      0xb3, 0x1a, 0x01, 0x8a, 0x48, 0xf5, 0x47, 0x76,
1251 		      0xf4, 0x03, 0xe9, 0xa3, 0x96, 0x32, 0x5d, 0xc3
1252 );
1253 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ke,
1254 		      0x9b, 0x19, 0x7d, 0xd1, 0xe8, 0xc5, 0x60, 0x9d,
1255 		      0x6e, 0x67, 0xc3, 0xe3, 0x7c, 0x62, 0xc7, 0x2e
1256 );
1257 DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ki,
1258 		      0x9f, 0xda, 0x0e, 0x56, 0xab, 0x2d, 0x85, 0xe1,
1259 		      0x56, 0x9a, 0x68, 0x86, 0x96, 0xc2, 0x6a, 0x6c
1260 );
1261 
1262 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_basekey,
1263 		      0x6d, 0x40, 0x4d, 0x37, 0xfa, 0xf7, 0x9f, 0x9d,
1264 		      0xf0, 0xd3, 0x35, 0x68, 0xd3, 0x20, 0x66, 0x98,
1265 		      0x00, 0xeb, 0x48, 0x36, 0x47, 0x2e, 0xa8, 0xa0,
1266 		      0x26, 0xd1, 0x6b, 0x71, 0x82, 0x46, 0x0c, 0x52
1267 );
1268 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Kc,
1269 		      0xef, 0x57, 0x18, 0xbe, 0x86, 0xcc, 0x84, 0x96,
1270 		      0x3d, 0x8b, 0xbb, 0x50, 0x31, 0xe9, 0xf5, 0xc4,
1271 		      0xba, 0x41, 0xf2, 0x8f, 0xaf, 0x69, 0xe7, 0x3d
1272 );
1273 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ke,
1274 		      0x56, 0xab, 0x22, 0xbe, 0xe6, 0x3d, 0x82, 0xd7,
1275 		      0xbc, 0x52, 0x27, 0xf6, 0x77, 0x3f, 0x8e, 0xa7,
1276 		      0xa5, 0xeb, 0x1c, 0x82, 0x51, 0x60, 0xc3, 0x83,
1277 		      0x12, 0x98, 0x0c, 0x44, 0x2e, 0x5c, 0x7e, 0x49
1278 );
1279 DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ki,
1280 		      0x69, 0xb1, 0x65, 0x14, 0xe3, 0xcd, 0x8e, 0x56,
1281 		      0xb8, 0x20, 0x10, 0xd5, 0xc7, 0x30, 0x12, 0xb6,
1282 		      0x22, 0xc4, 0xd0, 0x0f, 0xfc, 0x23, 0xed, 0x1f
1283 );
1284 
1285 static const struct gss_krb5_test_param rfc8009_kdf_test_params[] = {
1286 	{
1287 		.desc			= "Derive Kc subkey for aes128-cts-hmac-sha256-128",
1288 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1289 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1290 		.usage			= &usage_checksum,
1291 		.expected_result	= &aes128_cts_hmac_sha256_128_Kc,
1292 	},
1293 	{
1294 		.desc			= "Derive Ke subkey for aes128-cts-hmac-sha256-128",
1295 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1296 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1297 		.usage			= &usage_encryption,
1298 		.expected_result	= &aes128_cts_hmac_sha256_128_Ke,
1299 	},
1300 	{
1301 		.desc			= "Derive Ki subkey for aes128-cts-hmac-sha256-128",
1302 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1303 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1304 		.usage			= &usage_integrity,
1305 		.expected_result	= &aes128_cts_hmac_sha256_128_Ki,
1306 	},
1307 	{
1308 		.desc			= "Derive Kc subkey for aes256-cts-hmac-sha384-192",
1309 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1310 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1311 		.usage			= &usage_checksum,
1312 		.expected_result	= &aes256_cts_hmac_sha384_192_Kc,
1313 	},
1314 	{
1315 		.desc			= "Derive Ke subkey for aes256-cts-hmac-sha384-192",
1316 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1317 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1318 		.usage			= &usage_encryption,
1319 		.expected_result	= &aes256_cts_hmac_sha384_192_Ke,
1320 	},
1321 	{
1322 		.desc			= "Derive Ki subkey for aes256-cts-hmac-sha384-192",
1323 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1324 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1325 		.usage			= &usage_integrity,
1326 		.expected_result	= &aes256_cts_hmac_sha384_192_Ki,
1327 	},
1328 };
1329 
1330 /* Creates the function rfc8009_kdf_gen_params */
1331 KUNIT_ARRAY_PARAM(rfc8009_kdf, rfc8009_kdf_test_params, gss_krb5_get_desc);
1332 
1333 /*
1334  * From RFC 8009 Appendix A.  Test Vectors
1335  *
1336  * These sample checksums use the above sample key derivation results,
1337  * including use of the same base-key and key usage values.
1338  *
1339  * This test material is copyright (c) 2016 IETF Trust and the
1340  * persons identified as the document authors.  All rights reserved.
1341  */
1342 
1343 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_plaintext,
1344 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1345 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1346 		      0x10, 0x11, 0x12, 0x13, 0x14
1347 );
1348 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test1_expected_result,
1349 		      0xd7, 0x83, 0x67, 0x18, 0x66, 0x43, 0xd6, 0x7b,
1350 		      0x41, 0x1c, 0xba, 0x91, 0x39, 0xfc, 0x1d, 0xee
1351 );
1352 DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test2_expected_result,
1353 		      0x45, 0xee, 0x79, 0x15, 0x67, 0xee, 0xfc, 0xa3,
1354 		      0x7f, 0x4a, 0xc1, 0xe0, 0x22, 0x2d, 0xe8, 0x0d,
1355 		      0x43, 0xc3, 0xbf, 0xa0, 0x66, 0x99, 0x67, 0x2a
1356 );
1357 
1358 static const struct gss_krb5_test_param rfc8009_checksum_test_params[] = {
1359 	{
1360 		.desc			= "Checksum with aes128-cts-hmac-sha256-128",
1361 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1362 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1363 		.usage			= &usage_checksum,
1364 		.plaintext		= &rfc8009_checksum_plaintext,
1365 		.expected_result	= &rfc8009_checksum_test1_expected_result,
1366 	},
1367 	{
1368 		.desc			= "Checksum with aes256-cts-hmac-sha384-192",
1369 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1370 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1371 		.usage			= &usage_checksum,
1372 		.plaintext		= &rfc8009_checksum_plaintext,
1373 		.expected_result	= &rfc8009_checksum_test2_expected_result,
1374 	},
1375 };
1376 
1377 /* Creates the function rfc8009_checksum_gen_params */
1378 KUNIT_ARRAY_PARAM(rfc8009_checksum, rfc8009_checksum_test_params,
1379 		  gss_krb5_get_desc);
1380 
1381 /*
1382  * From RFC 8009 Appendix A.  Test Vectors
1383  *
1384  * Sample encryptions (all using the default cipher state):
1385  * --------------------------------------------------------
1386  *
1387  * These sample encryptions use the above sample key derivation results,
1388  * including use of the same base-key and key usage values.
1389  *
1390  * This test material is copyright (c) 2016 IETF Trust and the
1391  * persons identified as the document authors.  All rights reserved.
1392  */
1393 
1394 static const struct xdr_netobj rfc8009_enc_empty_plaintext = {
1395 	.len	= 0,
1396 };
1397 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_short_plaintext,
1398 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05
1399 );
1400 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_block_plaintext,
1401 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1402 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
1403 );
1404 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_long_plaintext,
1405 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1406 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1407 		      0x10, 0x11, 0x12, 0x13, 0x14
1408 );
1409 
1410 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_confounder,
1411 		      0x7e, 0x58, 0x95, 0xea, 0xf2, 0x67, 0x24, 0x35,
1412 		      0xba, 0xd8, 0x17, 0xf5, 0x45, 0xa3, 0x71, 0x48
1413 );
1414 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_result,
1415 		      0xef, 0x85, 0xfb, 0x89, 0x0b, 0xb8, 0x47, 0x2f,
1416 		      0x4d, 0xab, 0x20, 0x39, 0x4d, 0xca, 0x78, 0x1d
1417 );
1418 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_hmac,
1419 		      0xad, 0x87, 0x7e, 0xda, 0x39, 0xd5, 0x0c, 0x87,
1420 		      0x0c, 0x0d, 0x5a, 0x0a, 0x8e, 0x48, 0xc7, 0x18
1421 );
1422 
1423 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_confounder,
1424 		      0x7b, 0xca, 0x28, 0x5e, 0x2f, 0xd4, 0x13, 0x0f,
1425 		      0xb5, 0x5b, 0x1a, 0x5c, 0x83, 0xbc, 0x5b, 0x24
1426 );
1427 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_result,
1428 		      0x84, 0xd7, 0xf3, 0x07, 0x54, 0xed, 0x98, 0x7b,
1429 		      0xab, 0x0b, 0xf3, 0x50, 0x6b, 0xeb, 0x09, 0xcf,
1430 		      0xb5, 0x54, 0x02, 0xce, 0xf7, 0xe6
1431 );
1432 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_hmac,
1433 		      0x87, 0x7c, 0xe9, 0x9e, 0x24, 0x7e, 0x52, 0xd1,
1434 		      0x6e, 0xd4, 0x42, 0x1d, 0xfd, 0xf8, 0x97, 0x6c
1435 );
1436 
1437 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_confounder,
1438 		      0x56, 0xab, 0x21, 0x71, 0x3f, 0xf6, 0x2c, 0x0a,
1439 		      0x14, 0x57, 0x20, 0x0f, 0x6f, 0xa9, 0x94, 0x8f
1440 );
1441 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_result,
1442 		      0x35, 0x17, 0xd6, 0x40, 0xf5, 0x0d, 0xdc, 0x8a,
1443 		      0xd3, 0x62, 0x87, 0x22, 0xb3, 0x56, 0x9d, 0x2a,
1444 		      0xe0, 0x74, 0x93, 0xfa, 0x82, 0x63, 0x25, 0x40,
1445 		      0x80, 0xea, 0x65, 0xc1, 0x00, 0x8e, 0x8f, 0xc2
1446 );
1447 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_hmac,
1448 		      0x95, 0xfb, 0x48, 0x52, 0xe7, 0xd8, 0x3e, 0x1e,
1449 		      0x7c, 0x48, 0xc3, 0x7e, 0xeb, 0xe6, 0xb0, 0xd3
1450 );
1451 
1452 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_confounder,
1453 		      0xa7, 0xa4, 0xe2, 0x9a, 0x47, 0x28, 0xce, 0x10,
1454 		      0x66, 0x4f, 0xb6, 0x4e, 0x49, 0xad, 0x3f, 0xac
1455 );
1456 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_result,
1457 		      0x72, 0x0f, 0x73, 0xb1, 0x8d, 0x98, 0x59, 0xcd,
1458 		      0x6c, 0xcb, 0x43, 0x46, 0x11, 0x5c, 0xd3, 0x36,
1459 		      0xc7, 0x0f, 0x58, 0xed, 0xc0, 0xc4, 0x43, 0x7c,
1460 		      0x55, 0x73, 0x54, 0x4c, 0x31, 0xc8, 0x13, 0xbc,
1461 		      0xe1, 0xe6, 0xd0, 0x72, 0xc1
1462 );
1463 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_hmac,
1464 		      0x86, 0xb3, 0x9a, 0x41, 0x3c, 0x2f, 0x92, 0xca,
1465 		      0x9b, 0x83, 0x34, 0xa2, 0x87, 0xff, 0xcb, 0xfc
1466 );
1467 
1468 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_confounder,
1469 		      0xf7, 0x64, 0xe9, 0xfa, 0x15, 0xc2, 0x76, 0x47,
1470 		      0x8b, 0x2c, 0x7d, 0x0c, 0x4e, 0x5f, 0x58, 0xe4
1471 );
1472 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_result,
1473 		      0x41, 0xf5, 0x3f, 0xa5, 0xbf, 0xe7, 0x02, 0x6d,
1474 		      0x91, 0xfa, 0xf9, 0xbe, 0x95, 0x91, 0x95, 0xa0
1475 );
1476 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_hmac,
1477 		      0x58, 0x70, 0x72, 0x73, 0xa9, 0x6a, 0x40, 0xf0,
1478 		      0xa0, 0x19, 0x60, 0x62, 0x1a, 0xc6, 0x12, 0x74,
1479 		      0x8b, 0x9b, 0xbf, 0xbe, 0x7e, 0xb4, 0xce, 0x3c
1480 );
1481 
1482 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_confounder,
1483 		      0xb8, 0x0d, 0x32, 0x51, 0xc1, 0xf6, 0x47, 0x14,
1484 		      0x94, 0x25, 0x6f, 0xfe, 0x71, 0x2d, 0x0b, 0x9a
1485 );
1486 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_result,
1487 		      0x4e, 0xd7, 0xb3, 0x7c, 0x2b, 0xca, 0xc8, 0xf7,
1488 		      0x4f, 0x23, 0xc1, 0xcf, 0x07, 0xe6, 0x2b, 0xc7,
1489 		      0xb7, 0x5f, 0xb3, 0xf6, 0x37, 0xb9
1490 );
1491 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_hmac,
1492 		      0xf5, 0x59, 0xc7, 0xf6, 0x64, 0xf6, 0x9e, 0xab,
1493 		      0x7b, 0x60, 0x92, 0x23, 0x75, 0x26, 0xea, 0x0d,
1494 		      0x1f, 0x61, 0xcb, 0x20, 0xd6, 0x9d, 0x10, 0xf2
1495 );
1496 
1497 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_confounder,
1498 		      0x53, 0xbf, 0x8a, 0x0d, 0x10, 0x52, 0x65, 0xd4,
1499 		      0xe2, 0x76, 0x42, 0x86, 0x24, 0xce, 0x5e, 0x63
1500 );
1501 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_result,
1502 		      0xbc, 0x47, 0xff, 0xec, 0x79, 0x98, 0xeb, 0x91,
1503 		      0xe8, 0x11, 0x5c, 0xf8, 0xd1, 0x9d, 0xac, 0x4b,
1504 		      0xbb, 0xe2, 0xe1, 0x63, 0xe8, 0x7d, 0xd3, 0x7f,
1505 		      0x49, 0xbe, 0xca, 0x92, 0x02, 0x77, 0x64, 0xf6
1506 );
1507 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_hmac,
1508 		      0x8c, 0xf5, 0x1f, 0x14, 0xd7, 0x98, 0xc2, 0x27,
1509 		      0x3f, 0x35, 0xdf, 0x57, 0x4d, 0x1f, 0x93, 0x2e,
1510 		      0x40, 0xc4, 0xff, 0x25, 0x5b, 0x36, 0xa2, 0x66
1511 );
1512 
1513 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_confounder,
1514 		      0x76, 0x3e, 0x65, 0x36, 0x7e, 0x86, 0x4f, 0x02,
1515 		      0xf5, 0x51, 0x53, 0xc7, 0xe3, 0xb5, 0x8a, 0xf1
1516 );
1517 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_result,
1518 		      0x40, 0x01, 0x3e, 0x2d, 0xf5, 0x8e, 0x87, 0x51,
1519 		      0x95, 0x7d, 0x28, 0x78, 0xbc, 0xd2, 0xd6, 0xfe,
1520 		      0x10, 0x1c, 0xcf, 0xd5, 0x56, 0xcb, 0x1e, 0xae,
1521 		      0x79, 0xdb, 0x3c, 0x3e, 0xe8, 0x64, 0x29, 0xf2,
1522 		      0xb2, 0xa6, 0x02, 0xac, 0x86
1523 );
1524 DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_hmac,
1525 		      0xfe, 0xf6, 0xec, 0xb6, 0x47, 0xd6, 0x29, 0x5f,
1526 		      0xae, 0x07, 0x7a, 0x1f, 0xeb, 0x51, 0x75, 0x08,
1527 		      0xd2, 0xc1, 0x6b, 0x41, 0x92, 0xe0, 0x1f, 0x62
1528 );
1529 
1530 static const struct gss_krb5_test_param rfc8009_encrypt_test_params[] = {
1531 	{
1532 		.desc			= "Encrypt empty plaintext with aes128-cts-hmac-sha256-128",
1533 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1534 		.plaintext		= &rfc8009_enc_empty_plaintext,
1535 		.confounder		= &rfc8009_enc_test1_confounder,
1536 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1537 		.expected_result	= &rfc8009_enc_test1_expected_result,
1538 		.expected_hmac		= &rfc8009_enc_test1_expected_hmac,
1539 	},
1540 	{
1541 		.desc			= "Encrypt short plaintext with aes128-cts-hmac-sha256-128",
1542 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1543 		.plaintext		= &rfc8009_enc_short_plaintext,
1544 		.confounder		= &rfc8009_enc_test2_confounder,
1545 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1546 		.expected_result	= &rfc8009_enc_test2_expected_result,
1547 		.expected_hmac		= &rfc8009_enc_test2_expected_hmac,
1548 	},
1549 	{
1550 		.desc			= "Encrypt block plaintext with aes128-cts-hmac-sha256-128",
1551 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1552 		.plaintext		= &rfc8009_enc_block_plaintext,
1553 		.confounder		= &rfc8009_enc_test3_confounder,
1554 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1555 		.expected_result	= &rfc8009_enc_test3_expected_result,
1556 		.expected_hmac		= &rfc8009_enc_test3_expected_hmac,
1557 	},
1558 	{
1559 		.desc			= "Encrypt long plaintext with aes128-cts-hmac-sha256-128",
1560 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1561 		.plaintext		= &rfc8009_enc_long_plaintext,
1562 		.confounder		= &rfc8009_enc_test4_confounder,
1563 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1564 		.expected_result	= &rfc8009_enc_test4_expected_result,
1565 		.expected_hmac		= &rfc8009_enc_test4_expected_hmac,
1566 	},
1567 	{
1568 		.desc			= "Encrypt empty plaintext with aes256-cts-hmac-sha384-192",
1569 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1570 		.plaintext		= &rfc8009_enc_empty_plaintext,
1571 		.confounder		= &rfc8009_enc_test5_confounder,
1572 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1573 		.expected_result	= &rfc8009_enc_test5_expected_result,
1574 		.expected_hmac		= &rfc8009_enc_test5_expected_hmac,
1575 	},
1576 	{
1577 		.desc			= "Encrypt short plaintext with aes256-cts-hmac-sha384-192",
1578 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1579 		.plaintext		= &rfc8009_enc_short_plaintext,
1580 		.confounder		= &rfc8009_enc_test6_confounder,
1581 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1582 		.expected_result	= &rfc8009_enc_test6_expected_result,
1583 		.expected_hmac		= &rfc8009_enc_test6_expected_hmac,
1584 	},
1585 	{
1586 		.desc			= "Encrypt block plaintext with aes256-cts-hmac-sha384-192",
1587 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1588 		.plaintext		= &rfc8009_enc_block_plaintext,
1589 		.confounder		= &rfc8009_enc_test7_confounder,
1590 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1591 		.expected_result	= &rfc8009_enc_test7_expected_result,
1592 		.expected_hmac		= &rfc8009_enc_test7_expected_hmac,
1593 	},
1594 	{
1595 		.desc			= "Encrypt long plaintext with aes256-cts-hmac-sha384-192",
1596 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1597 		.plaintext		= &rfc8009_enc_long_plaintext,
1598 		.confounder		= &rfc8009_enc_test8_confounder,
1599 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1600 		.expected_result	= &rfc8009_enc_test8_expected_result,
1601 		.expected_hmac		= &rfc8009_enc_test8_expected_hmac,
1602 	},
1603 };
1604 
1605 /* Creates the function rfc8009_encrypt_gen_params */
1606 KUNIT_ARRAY_PARAM(rfc8009_encrypt, rfc8009_encrypt_test_params,
1607 		  gss_krb5_get_desc);
1608 
1609 static void rfc8009_encrypt_case(struct kunit *test)
1610 {
1611 	const struct gss_krb5_test_param *param = test->param_value;
1612 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
1613 	const struct gss_krb5_enctype *gk5e;
1614 	struct xdr_netobj Ke, Ki, checksum;
1615 	u8 usage_data[GSS_KRB5_K5CLENGTH];
1616 	struct xdr_netobj usage = {
1617 		.data = usage_data,
1618 		.len = sizeof(usage_data),
1619 	};
1620 	struct crypto_ahash *ahash_tfm;
1621 	struct xdr_buf buf;
1622 	void *text;
1623 	size_t len;
1624 	u32 err;
1625 
1626 	/* Arrange */
1627 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1628 	if (!gk5e)
1629 		kunit_skip(test, "Encryption type is not available");
1630 
1631 	*(__be32 *)usage.data = cpu_to_be32(2);
1632 
1633 	Ke.len = gk5e->Ke_length;
1634 	Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL);
1635 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data);
1636 	usage.data[4] = KEY_USAGE_SEED_ENCRYPTION;
1637 	err = gk5e->derive_key(gk5e, param->base_key, &Ke,
1638 			       &usage, GFP_KERNEL);
1639 	KUNIT_ASSERT_EQ(test, err, 0);
1640 
1641 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
1642 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
1643 	err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len);
1644 	KUNIT_ASSERT_EQ(test, err, 0);
1645 
1646 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
1647 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
1648 	err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len);
1649 	KUNIT_ASSERT_EQ(test, err, 0);
1650 
1651 	len = param->confounder->len + param->plaintext->len;
1652 	text = kunit_kzalloc(test, len, GFP_KERNEL);
1653 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
1654 	memcpy(text, param->confounder->data, param->confounder->len);
1655 	memcpy(text + param->confounder->len, param->plaintext->data,
1656 	       param->plaintext->len);
1657 
1658 	memset(&buf, 0, sizeof(buf));
1659 	buf.head[0].iov_base = text;
1660 	buf.head[0].iov_len = param->confounder->len + param->plaintext->len;
1661 	buf.len = buf.head[0].iov_len;
1662 
1663 	checksum.len = gk5e->cksumlength;
1664 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
1665 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
1666 
1667 	Ki.len = gk5e->Ki_length;
1668 	Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL);
1669 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data);
1670 	usage.data[4] = KEY_USAGE_SEED_INTEGRITY;
1671 	err = gk5e->derive_key(gk5e, param->base_key, &Ki,
1672 			       &usage, GFP_KERNEL);
1673 	KUNIT_ASSERT_EQ(test, err, 0);
1674 
1675 	ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
1676 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm);
1677 	err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len);
1678 	KUNIT_ASSERT_EQ(test, err, 0);
1679 
1680 	/* Act */
1681 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
1682 	KUNIT_ASSERT_EQ(test, err, 0);
1683 	err = krb5_etm_checksum(cts_tfm, ahash_tfm, &buf, 0, &checksum);
1684 	KUNIT_ASSERT_EQ(test, err, 0);
1685 
1686 	/* Assert */
1687 	KUNIT_EXPECT_EQ_MSG(test,
1688 			    param->expected_result->len, buf.len,
1689 			    "ciphertext length mismatch");
1690 	KUNIT_EXPECT_EQ_MSG(test,
1691 			    memcmp(param->expected_result->data,
1692 				   buf.head[0].iov_base,
1693 				   param->expected_result->len), 0,
1694 			    "ciphertext mismatch");
1695 	KUNIT_EXPECT_EQ_MSG(test, memcmp(param->expected_hmac->data,
1696 					 checksum.data,
1697 					 checksum.len), 0,
1698 			    "HMAC mismatch");
1699 
1700 	crypto_free_ahash(ahash_tfm);
1701 	crypto_free_sync_skcipher(cts_tfm);
1702 	crypto_free_sync_skcipher(cbc_tfm);
1703 }
1704 
1705 static struct kunit_case rfc8009_test_cases[] = {
1706 	{
1707 		.name			= "RFC 8009 key derivation",
1708 		.run_case		= kdf_case,
1709 		.generate_params	= rfc8009_kdf_gen_params,
1710 	},
1711 	{
1712 		.name			= "RFC 8009 checksum",
1713 		.run_case		= checksum_case,
1714 		.generate_params	= rfc8009_checksum_gen_params,
1715 	},
1716 	{
1717 		.name			= "RFC 8009 encryption",
1718 		.run_case		= rfc8009_encrypt_case,
1719 		.generate_params	= rfc8009_encrypt_gen_params,
1720 	},
1721 	{}
1722 };
1723 
1724 static struct kunit_suite rfc8009_suite = {
1725 	.name			= "RFC 8009 suite",
1726 	.test_cases		= rfc8009_test_cases,
1727 };
1728 
1729 /*
1730  * Encryption self-tests
1731  */
1732 
1733 DEFINE_STR_XDR_NETOBJ(encrypt_selftest_plaintext,
1734 		      "This is the plaintext for the encryption self-test.");
1735 
1736 static const struct gss_krb5_test_param encrypt_selftest_params[] = {
1737 	{
1738 		.desc			= "aes128-cts-hmac-sha1-96 encryption self-test",
1739 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
1740 		.Ke			= &rfc3962_encryption_key,
1741 		.plaintext		= &encrypt_selftest_plaintext,
1742 	},
1743 	{
1744 		.desc			= "aes256-cts-hmac-sha1-96 encryption self-test",
1745 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA1_96,
1746 		.Ke			= &rfc3962_encryption_key,
1747 		.plaintext		= &encrypt_selftest_plaintext,
1748 	},
1749 	{
1750 		.desc			= "camellia128-cts-cmac encryption self-test",
1751 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1752 		.Ke			= &camellia128_cts_cmac_Ke,
1753 		.plaintext		= &encrypt_selftest_plaintext,
1754 	},
1755 	{
1756 		.desc			= "camellia256-cts-cmac encryption self-test",
1757 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1758 		.Ke			= &camellia256_cts_cmac_Ke,
1759 		.plaintext		= &encrypt_selftest_plaintext,
1760 	},
1761 	{
1762 		.desc			= "aes128-cts-hmac-sha256-128 encryption self-test",
1763 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1764 		.Ke			= &aes128_cts_hmac_sha256_128_Ke,
1765 		.plaintext		= &encrypt_selftest_plaintext,
1766 	},
1767 	{
1768 		.desc			= "aes256-cts-hmac-sha384-192 encryption self-test",
1769 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1770 		.Ke			= &aes256_cts_hmac_sha384_192_Ke,
1771 		.plaintext		= &encrypt_selftest_plaintext,
1772 	},
1773 };
1774 
1775 /* Creates the function encrypt_selftest_gen_params */
1776 KUNIT_ARRAY_PARAM(encrypt_selftest, encrypt_selftest_params,
1777 		  gss_krb5_get_desc);
1778 
1779 /*
1780  * Encrypt and decrypt plaintext, and ensure the input plaintext
1781  * matches the output plaintext. A confounder is not added in this
1782  * case.
1783  */
1784 static void encrypt_selftest_case(struct kunit *test)
1785 {
1786 	const struct gss_krb5_test_param *param = test->param_value;
1787 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
1788 	const struct gss_krb5_enctype *gk5e;
1789 	struct xdr_buf buf;
1790 	void *text;
1791 	int err;
1792 
1793 	/* Arrange */
1794 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1795 	if (!gk5e)
1796 		kunit_skip(test, "Encryption type is not available");
1797 
1798 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
1799 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
1800 	err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len);
1801 	KUNIT_ASSERT_EQ(test, err, 0);
1802 
1803 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
1804 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
1805 	err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len);
1806 	KUNIT_ASSERT_EQ(test, err, 0);
1807 
1808 	text = kunit_kzalloc(test, roundup(param->plaintext->len,
1809 					   crypto_sync_skcipher_blocksize(cbc_tfm)),
1810 			     GFP_KERNEL);
1811 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
1812 
1813 	memcpy(text, param->plaintext->data, param->plaintext->len);
1814 	memset(&buf, 0, sizeof(buf));
1815 	buf.head[0].iov_base = text;
1816 	buf.head[0].iov_len = param->plaintext->len;
1817 	buf.len = buf.head[0].iov_len;
1818 
1819 	/* Act */
1820 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
1821 	KUNIT_ASSERT_EQ(test, err, 0);
1822 	err = krb5_cbc_cts_decrypt(cts_tfm, cbc_tfm, 0, &buf);
1823 	KUNIT_ASSERT_EQ(test, err, 0);
1824 
1825 	/* Assert */
1826 	KUNIT_EXPECT_EQ_MSG(test,
1827 			    param->plaintext->len, buf.len,
1828 			    "length mismatch");
1829 	KUNIT_EXPECT_EQ_MSG(test,
1830 			    memcmp(param->plaintext->data,
1831 				   buf.head[0].iov_base, buf.len), 0,
1832 			    "plaintext mismatch");
1833 
1834 	crypto_free_sync_skcipher(cts_tfm);
1835 	crypto_free_sync_skcipher(cbc_tfm);
1836 }
1837 
1838 static struct kunit_case encryption_test_cases[] = {
1839 	{
1840 		.name			= "Encryption self-tests",
1841 		.run_case		= encrypt_selftest_case,
1842 		.generate_params	= encrypt_selftest_gen_params,
1843 	},
1844 	{}
1845 };
1846 
1847 static struct kunit_suite encryption_test_suite = {
1848 	.name			= "Encryption test suite",
1849 	.test_cases		= encryption_test_cases,
1850 };
1851 
1852 kunit_test_suites(&rfc3961_suite,
1853 		  &rfc3962_suite,
1854 		  &rfc6803_suite,
1855 		  &rfc8009_suite,
1856 		  &encryption_test_suite);
1857 
1858 MODULE_DESCRIPTION("Test RPCSEC GSS Kerberos 5 functions");
1859 MODULE_LICENSE("GPL");
1860