1eebd8c2dSChuck Lever // SPDX-License-Identifier: GPL-2.0
2eebd8c2dSChuck Lever /*
3eebd8c2dSChuck Lever  * Copyright (c) 2022 Oracle and/or its affiliates.
4eebd8c2dSChuck Lever  *
5eebd8c2dSChuck Lever  * KUnit test of SunRPC's GSS Kerberos mechanism. Subsystem
6eebd8c2dSChuck Lever  * name is "rpcsec_gss_krb5".
7eebd8c2dSChuck Lever  */
8eebd8c2dSChuck Lever 
9eebd8c2dSChuck Lever #include <kunit/test.h>
10eebd8c2dSChuck Lever #include <kunit/visibility.h>
11eebd8c2dSChuck Lever 
12eebd8c2dSChuck Lever #include <linux/kernel.h>
1302142b2cSChuck Lever #include <crypto/hash.h>
14eebd8c2dSChuck Lever 
15eebd8c2dSChuck Lever #include <linux/sunrpc/xdr.h>
16eebd8c2dSChuck Lever #include <linux/sunrpc/gss_krb5.h>
17eebd8c2dSChuck Lever 
18eebd8c2dSChuck Lever #include "gss_krb5_internal.h"
19eebd8c2dSChuck Lever 
20eebd8c2dSChuck Lever MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
21eebd8c2dSChuck Lever 
22eebd8c2dSChuck Lever struct gss_krb5_test_param {
23eebd8c2dSChuck Lever 	const char			*desc;
246eb6b8a4SChuck Lever 	u32				enctype;
25eebd8c2dSChuck Lever 	u32				nfold;
26b958cff6SChuck Lever 	u32				constant;
276eb6b8a4SChuck Lever 	const struct xdr_netobj		*base_key;
28e1a9a384SChuck Lever 	const struct xdr_netobj		*Ke;
296eb6b8a4SChuck Lever 	const struct xdr_netobj		*usage;
30eebd8c2dSChuck Lever 	const struct xdr_netobj		*plaintext;
31b958cff6SChuck Lever 	const struct xdr_netobj		*confounder;
32eebd8c2dSChuck Lever 	const struct xdr_netobj		*expected_result;
334d2d15c0SChuck Lever 	const struct xdr_netobj		*expected_hmac;
34e1a9a384SChuck Lever 	const struct xdr_netobj		*next_iv;
35eebd8c2dSChuck Lever };
36eebd8c2dSChuck Lever 
37eebd8c2dSChuck Lever static inline void gss_krb5_get_desc(const struct gss_krb5_test_param *param,
38eebd8c2dSChuck Lever 				     char *desc)
39eebd8c2dSChuck Lever {
40eebd8c2dSChuck Lever 	strscpy(desc, param->desc, KUNIT_PARAM_DESC_SIZE);
41eebd8c2dSChuck Lever }
42eebd8c2dSChuck Lever 
436eb6b8a4SChuck Lever static void kdf_case(struct kunit *test)
446eb6b8a4SChuck Lever {
456eb6b8a4SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
466eb6b8a4SChuck Lever 	const struct gss_krb5_enctype *gk5e;
476eb6b8a4SChuck Lever 	struct xdr_netobj derivedkey;
486eb6b8a4SChuck Lever 	int err;
496eb6b8a4SChuck Lever 
506eb6b8a4SChuck Lever 	/* Arrange */
516eb6b8a4SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
52*fe90151cSChuck Lever 	if (!gk5e)
53*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
546eb6b8a4SChuck Lever 
556eb6b8a4SChuck Lever 	derivedkey.data = kunit_kzalloc(test, param->expected_result->len,
566eb6b8a4SChuck Lever 					GFP_KERNEL);
576eb6b8a4SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, derivedkey.data);
586eb6b8a4SChuck Lever 	derivedkey.len = param->expected_result->len;
596eb6b8a4SChuck Lever 
606eb6b8a4SChuck Lever 	/* Act */
616eb6b8a4SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &derivedkey,
626eb6b8a4SChuck Lever 			       param->usage, GFP_KERNEL);
636eb6b8a4SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
646eb6b8a4SChuck Lever 
656eb6b8a4SChuck Lever 	/* Assert */
666eb6b8a4SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
676eb6b8a4SChuck Lever 			    memcmp(param->expected_result->data,
686eb6b8a4SChuck Lever 				   derivedkey.data, derivedkey.len), 0,
696eb6b8a4SChuck Lever 			    "key mismatch");
706eb6b8a4SChuck Lever }
716eb6b8a4SChuck Lever 
7202142b2cSChuck Lever static void checksum_case(struct kunit *test)
7302142b2cSChuck Lever {
7402142b2cSChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
7502142b2cSChuck Lever 	struct xdr_buf buf = {
7602142b2cSChuck Lever 		.head[0].iov_base	= param->plaintext->data,
7702142b2cSChuck Lever 		.head[0].iov_len	= param->plaintext->len,
7802142b2cSChuck Lever 		.len			= param->plaintext->len,
7902142b2cSChuck Lever 	};
8002142b2cSChuck Lever 	const struct gss_krb5_enctype *gk5e;
8102142b2cSChuck Lever 	struct xdr_netobj Kc, checksum;
8202142b2cSChuck Lever 	struct crypto_ahash *tfm;
8302142b2cSChuck Lever 	int err;
8402142b2cSChuck Lever 
8502142b2cSChuck Lever 	/* Arrange */
8602142b2cSChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
87*fe90151cSChuck Lever 	if (!gk5e)
88*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
8902142b2cSChuck Lever 
9002142b2cSChuck Lever 	Kc.len = gk5e->Kc_length;
9102142b2cSChuck Lever 	Kc.data = kunit_kzalloc(test, Kc.len, GFP_KERNEL);
9202142b2cSChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Kc.data);
9302142b2cSChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &Kc,
9402142b2cSChuck Lever 			       param->usage, GFP_KERNEL);
9502142b2cSChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
9602142b2cSChuck Lever 
9702142b2cSChuck Lever 	tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
9802142b2cSChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, tfm);
9902142b2cSChuck Lever 	err = crypto_ahash_setkey(tfm, Kc.data, Kc.len);
10002142b2cSChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
10102142b2cSChuck Lever 
10202142b2cSChuck Lever 	checksum.len = gk5e->cksumlength;
10302142b2cSChuck Lever 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
10402142b2cSChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
10502142b2cSChuck Lever 
10602142b2cSChuck Lever 	/* Act */
10702142b2cSChuck Lever 	err = gss_krb5_checksum(tfm, NULL, 0, &buf, 0, &checksum);
10802142b2cSChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
10902142b2cSChuck Lever 
11002142b2cSChuck Lever 	/* Assert */
11102142b2cSChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
11202142b2cSChuck Lever 			    memcmp(param->expected_result->data,
11302142b2cSChuck Lever 				   checksum.data, checksum.len), 0,
11402142b2cSChuck Lever 			    "checksum mismatch");
11502142b2cSChuck Lever 
11602142b2cSChuck Lever 	crypto_free_ahash(tfm);
11702142b2cSChuck Lever }
11802142b2cSChuck Lever 
119eebd8c2dSChuck Lever #define DEFINE_HEX_XDR_NETOBJ(name, hex_array...)		\
120eebd8c2dSChuck Lever 	static const u8 name ## _data[] = { hex_array };	\
121eebd8c2dSChuck Lever 	static const struct xdr_netobj name = {			\
122eebd8c2dSChuck Lever 		.data	= (u8 *)name##_data,			\
123eebd8c2dSChuck Lever 		.len	= sizeof(name##_data),			\
124eebd8c2dSChuck Lever 	}
125eebd8c2dSChuck Lever 
12602142b2cSChuck Lever #define DEFINE_STR_XDR_NETOBJ(name, string)			\
12702142b2cSChuck Lever 	static const u8 name ## _str[] = string;		\
12802142b2cSChuck Lever 	static const struct xdr_netobj name = {			\
12902142b2cSChuck Lever 		.data	= (u8 *)name##_str,			\
13002142b2cSChuck Lever 		.len	= sizeof(name##_str) - 1,		\
13102142b2cSChuck Lever 	}
13202142b2cSChuck Lever 
133eebd8c2dSChuck Lever /*
134eebd8c2dSChuck Lever  * RFC 3961 Appendix A.1.  n-fold
135eebd8c2dSChuck Lever  *
136eebd8c2dSChuck Lever  * The n-fold function is defined in section 5.1 of RFC 3961.
137eebd8c2dSChuck Lever  *
138eebd8c2dSChuck Lever  * This test material is copyright (C) The Internet Society (2005).
139eebd8c2dSChuck Lever  */
140eebd8c2dSChuck Lever 
141eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_plaintext,
142eebd8c2dSChuck Lever 		      0x30, 0x31, 0x32, 0x33, 0x34, 0x35
143eebd8c2dSChuck Lever );
144eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_expected_result,
145eebd8c2dSChuck Lever 		      0xbe, 0x07, 0x26, 0x31, 0x27, 0x6b, 0x19, 0x55
146eebd8c2dSChuck Lever );
147eebd8c2dSChuck Lever 
148eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_plaintext,
149eebd8c2dSChuck Lever 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
150eebd8c2dSChuck Lever );
151eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_expected_result,
152eebd8c2dSChuck Lever 		      0x78, 0xa0, 0x7b, 0x6c, 0xaf, 0x85, 0xfa
153eebd8c2dSChuck Lever );
154eebd8c2dSChuck Lever 
155eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_plaintext,
156eebd8c2dSChuck Lever 		      0x52, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x43, 0x6f,
157eebd8c2dSChuck Lever 		      0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2c,
158eebd8c2dSChuck Lever 		      0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x75, 0x6e,
159eebd8c2dSChuck Lever 		      0x6e, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x64,
160eebd8c2dSChuck Lever 		      0x65
161eebd8c2dSChuck Lever );
162eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_expected_result,
163eebd8c2dSChuck Lever 		      0xbb, 0x6e, 0xd3, 0x08, 0x70, 0xb7, 0xf0, 0xe0
164eebd8c2dSChuck Lever );
165eebd8c2dSChuck Lever 
166eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_plaintext,
167eebd8c2dSChuck Lever 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
168eebd8c2dSChuck Lever );
169eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_expected_result,
170eebd8c2dSChuck Lever 		      0x59, 0xe4, 0xa8, 0xca, 0x7c, 0x03, 0x85, 0xc3,
171eebd8c2dSChuck Lever 		      0xc3, 0x7b, 0x3f, 0x6d, 0x20, 0x00, 0x24, 0x7c,
172eebd8c2dSChuck Lever 		      0xb6, 0xe6, 0xbd, 0x5b, 0x3e
173eebd8c2dSChuck Lever );
174eebd8c2dSChuck Lever 
175eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_plaintext,
176eebd8c2dSChuck Lever 		      0x4d, 0x41, 0x53, 0x53, 0x41, 0x43, 0x48, 0x56,
177eebd8c2dSChuck Lever 		      0x53, 0x45, 0x54, 0x54, 0x53, 0x20, 0x49, 0x4e,
178eebd8c2dSChuck Lever 		      0x53, 0x54, 0x49, 0x54, 0x56, 0x54, 0x45, 0x20,
179eebd8c2dSChuck Lever 		      0x4f, 0x46, 0x20, 0x54, 0x45, 0x43, 0x48, 0x4e,
180eebd8c2dSChuck Lever 		      0x4f, 0x4c, 0x4f, 0x47, 0x59
181eebd8c2dSChuck Lever );
182eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_expected_result,
183eebd8c2dSChuck Lever 		      0xdb, 0x3b, 0x0d, 0x8f, 0x0b, 0x06, 0x1e, 0x60,
184eebd8c2dSChuck Lever 		      0x32, 0x82, 0xb3, 0x08, 0xa5, 0x08, 0x41, 0x22,
185eebd8c2dSChuck Lever 		      0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b
186eebd8c2dSChuck Lever );
187eebd8c2dSChuck Lever 
188eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_plaintext,
189eebd8c2dSChuck Lever 		      0x51
190eebd8c2dSChuck Lever );
191eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_expected_result,
192eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
193eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
194eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15
195eebd8c2dSChuck Lever );
196eebd8c2dSChuck Lever 
197eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_plaintext,
198eebd8c2dSChuck Lever 		      0x62, 0x61
199eebd8c2dSChuck Lever );
200eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_expected_result,
201eebd8c2dSChuck Lever 		      0xfb, 0x25, 0xd5, 0x31, 0xae, 0x89, 0x74, 0x49,
202eebd8c2dSChuck Lever 		      0x9f, 0x52, 0xfd, 0x92, 0xea, 0x98, 0x57, 0xc4,
203eebd8c2dSChuck Lever 		      0xba, 0x24, 0xcf, 0x29, 0x7e
204eebd8c2dSChuck Lever );
205eebd8c2dSChuck Lever 
206eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test_kerberos,
207eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
208eebd8c2dSChuck Lever );
209eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test8_expected_result,
210eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
211eebd8c2dSChuck Lever );
212eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test9_expected_result,
213eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
214eebd8c2dSChuck Lever 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93
215eebd8c2dSChuck Lever );
216eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test10_expected_result,
217eebd8c2dSChuck Lever 		      0x83, 0x72, 0xc2, 0x36, 0x34, 0x4e, 0x5f, 0x15,
218eebd8c2dSChuck Lever 		      0x50, 0xcd, 0x07, 0x47, 0xe1, 0x5d, 0x62, 0xca,
219eebd8c2dSChuck Lever 		      0x7a, 0x5a, 0x3b, 0xce, 0xa4
220eebd8c2dSChuck Lever );
221eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test11_expected_result,
222eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
223eebd8c2dSChuck Lever 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93,
224eebd8c2dSChuck Lever 		      0x5c, 0x9b, 0xdc, 0xda, 0xd9, 0x5c, 0x98, 0x99,
225eebd8c2dSChuck Lever 		      0xc4, 0xca, 0xe4, 0xde, 0xe6, 0xd6, 0xca, 0xe4
226eebd8c2dSChuck Lever );
227eebd8c2dSChuck Lever 
228eebd8c2dSChuck Lever static const struct gss_krb5_test_param rfc3961_nfold_test_params[] = {
229eebd8c2dSChuck Lever 	{
230eebd8c2dSChuck Lever 		.desc			= "64-fold(\"012345\")",
231eebd8c2dSChuck Lever 		.nfold			= 64,
232eebd8c2dSChuck Lever 		.plaintext		= &nfold_test1_plaintext,
233eebd8c2dSChuck Lever 		.expected_result	= &nfold_test1_expected_result,
234eebd8c2dSChuck Lever 	},
235eebd8c2dSChuck Lever 	{
236eebd8c2dSChuck Lever 		.desc			= "56-fold(\"password\")",
237eebd8c2dSChuck Lever 		.nfold			= 56,
238eebd8c2dSChuck Lever 		.plaintext		= &nfold_test2_plaintext,
239eebd8c2dSChuck Lever 		.expected_result	= &nfold_test2_expected_result,
240eebd8c2dSChuck Lever 	},
241eebd8c2dSChuck Lever 	{
242eebd8c2dSChuck Lever 		.desc			= "64-fold(\"Rough Consensus, and Running Code\")",
243eebd8c2dSChuck Lever 		.nfold			= 64,
244eebd8c2dSChuck Lever 		.plaintext		= &nfold_test3_plaintext,
245eebd8c2dSChuck Lever 		.expected_result	= &nfold_test3_expected_result,
246eebd8c2dSChuck Lever 	},
247eebd8c2dSChuck Lever 	{
248eebd8c2dSChuck Lever 		.desc			= "168-fold(\"password\")",
249eebd8c2dSChuck Lever 		.nfold			= 168,
250eebd8c2dSChuck Lever 		.plaintext		= &nfold_test4_plaintext,
251eebd8c2dSChuck Lever 		.expected_result	= &nfold_test4_expected_result,
252eebd8c2dSChuck Lever 	},
253eebd8c2dSChuck Lever 	{
254eebd8c2dSChuck Lever 		.desc			= "192-fold(\"MASSACHVSETTS INSTITVTE OF TECHNOLOGY\")",
255eebd8c2dSChuck Lever 		.nfold			= 192,
256eebd8c2dSChuck Lever 		.plaintext		= &nfold_test5_plaintext,
257eebd8c2dSChuck Lever 		.expected_result	= &nfold_test5_expected_result,
258eebd8c2dSChuck Lever 	},
259eebd8c2dSChuck Lever 	{
260eebd8c2dSChuck Lever 		.desc			= "168-fold(\"Q\")",
261eebd8c2dSChuck Lever 		.nfold			= 168,
262eebd8c2dSChuck Lever 		.plaintext		= &nfold_test6_plaintext,
263eebd8c2dSChuck Lever 		.expected_result	= &nfold_test6_expected_result,
264eebd8c2dSChuck Lever 	},
265eebd8c2dSChuck Lever 	{
266eebd8c2dSChuck Lever 		.desc			= "168-fold(\"ba\")",
267eebd8c2dSChuck Lever 		.nfold			= 168,
268eebd8c2dSChuck Lever 		.plaintext		= &nfold_test7_plaintext,
269eebd8c2dSChuck Lever 		.expected_result	= &nfold_test7_expected_result,
270eebd8c2dSChuck Lever 	},
271eebd8c2dSChuck Lever 	{
272eebd8c2dSChuck Lever 		.desc			= "64-fold(\"kerberos\")",
273eebd8c2dSChuck Lever 		.nfold			= 64,
274eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
275eebd8c2dSChuck Lever 		.expected_result	= &nfold_test8_expected_result,
276eebd8c2dSChuck Lever 	},
277eebd8c2dSChuck Lever 	{
278eebd8c2dSChuck Lever 		.desc			= "128-fold(\"kerberos\")",
279eebd8c2dSChuck Lever 		.nfold			= 128,
280eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
281eebd8c2dSChuck Lever 		.expected_result	= &nfold_test9_expected_result,
282eebd8c2dSChuck Lever 	},
283eebd8c2dSChuck Lever 	{
284eebd8c2dSChuck Lever 		.desc			= "168-fold(\"kerberos\")",
285eebd8c2dSChuck Lever 		.nfold			= 168,
286eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
287eebd8c2dSChuck Lever 		.expected_result	= &nfold_test10_expected_result,
288eebd8c2dSChuck Lever 	},
289eebd8c2dSChuck Lever 	{
290eebd8c2dSChuck Lever 		.desc			= "256-fold(\"kerberos\")",
291eebd8c2dSChuck Lever 		.nfold			= 256,
292eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
293eebd8c2dSChuck Lever 		.expected_result	= &nfold_test11_expected_result,
294eebd8c2dSChuck Lever 	},
295eebd8c2dSChuck Lever };
296eebd8c2dSChuck Lever 
297eebd8c2dSChuck Lever /* Creates the function rfc3961_nfold_gen_params */
298eebd8c2dSChuck Lever KUNIT_ARRAY_PARAM(rfc3961_nfold, rfc3961_nfold_test_params, gss_krb5_get_desc);
299eebd8c2dSChuck Lever 
300eebd8c2dSChuck Lever static void rfc3961_nfold_case(struct kunit *test)
301eebd8c2dSChuck Lever {
302eebd8c2dSChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
303eebd8c2dSChuck Lever 	u8 *result;
304eebd8c2dSChuck Lever 
305eebd8c2dSChuck Lever 	/* Arrange */
306eebd8c2dSChuck Lever 	result = kunit_kzalloc(test, 4096, GFP_KERNEL);
307eebd8c2dSChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, result);
308eebd8c2dSChuck Lever 
309eebd8c2dSChuck Lever 	/* Act */
310eebd8c2dSChuck Lever 	krb5_nfold(param->plaintext->len * 8, param->plaintext->data,
311eebd8c2dSChuck Lever 		   param->expected_result->len * 8, result);
312eebd8c2dSChuck Lever 
313eebd8c2dSChuck Lever 	/* Assert */
314eebd8c2dSChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
315eebd8c2dSChuck Lever 			    memcmp(param->expected_result->data,
316eebd8c2dSChuck Lever 				   result, param->expected_result->len), 0,
317eebd8c2dSChuck Lever 			    "result mismatch");
318eebd8c2dSChuck Lever }
319eebd8c2dSChuck Lever 
3206eb6b8a4SChuck Lever /*
3216eb6b8a4SChuck Lever  * RFC 3961 Appendix A.3.  DES3 DR and DK
3226eb6b8a4SChuck Lever  *
3236eb6b8a4SChuck Lever  * These tests show the derived-random and derived-key values for the
3246eb6b8a4SChuck Lever  * des3-hmac-sha1-kd encryption scheme, using the DR and DK functions
3256eb6b8a4SChuck Lever  * defined in section 6.3.1.  The input keys were randomly generated;
3266eb6b8a4SChuck Lever  * the usage values are from this specification.
3276eb6b8a4SChuck Lever  *
3286eb6b8a4SChuck Lever  * This test material is copyright (C) The Internet Society (2005).
3296eb6b8a4SChuck Lever  */
3306eb6b8a4SChuck Lever 
3316eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_155,
3326eb6b8a4SChuck Lever 		      0x00, 0x00, 0x00, 0x01, 0x55
3336eb6b8a4SChuck Lever );
3346eb6b8a4SChuck Lever 
3356eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_1aa,
3366eb6b8a4SChuck Lever 		      0x00, 0x00, 0x00, 0x01, 0xaa
3376eb6b8a4SChuck Lever );
3386eb6b8a4SChuck Lever 
3396eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_kerberos,
3406eb6b8a4SChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
3416eb6b8a4SChuck Lever );
3426eb6b8a4SChuck Lever 
3436eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_base_key,
3446eb6b8a4SChuck Lever 		      0xdc, 0xe0, 0x6b, 0x1f, 0x64, 0xc8, 0x57, 0xa1,
3456eb6b8a4SChuck Lever 		      0x1c, 0x3d, 0xb5, 0x7c, 0x51, 0x89, 0x9b, 0x2c,
3466eb6b8a4SChuck Lever 		      0xc1, 0x79, 0x10, 0x08, 0xce, 0x97, 0x3b, 0x92
3476eb6b8a4SChuck Lever );
3486eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_derived_key,
3496eb6b8a4SChuck Lever 		      0x92, 0x51, 0x79, 0xd0, 0x45, 0x91, 0xa7, 0x9b,
3506eb6b8a4SChuck Lever 		      0x5d, 0x31, 0x92, 0xc4, 0xa7, 0xe9, 0xc2, 0x89,
3516eb6b8a4SChuck Lever 		      0xb0, 0x49, 0xc7, 0x1f, 0x6e, 0xe6, 0x04, 0xcd
3526eb6b8a4SChuck Lever );
3536eb6b8a4SChuck Lever 
3546eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_base_key,
3556eb6b8a4SChuck Lever 		      0x5e, 0x13, 0xd3, 0x1c, 0x70, 0xef, 0x76, 0x57,
3566eb6b8a4SChuck Lever 		      0x46, 0x57, 0x85, 0x31, 0xcb, 0x51, 0xc1, 0x5b,
3576eb6b8a4SChuck Lever 		      0xf1, 0x1c, 0xa8, 0x2c, 0x97, 0xce, 0xe9, 0xf2
3586eb6b8a4SChuck Lever );
3596eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_derived_key,
3606eb6b8a4SChuck Lever 		      0x9e, 0x58, 0xe5, 0xa1, 0x46, 0xd9, 0x94, 0x2a,
3616eb6b8a4SChuck Lever 		      0x10, 0x1c, 0x46, 0x98, 0x45, 0xd6, 0x7a, 0x20,
3626eb6b8a4SChuck Lever 		      0xe3, 0xc4, 0x25, 0x9e, 0xd9, 0x13, 0xf2, 0x07
3636eb6b8a4SChuck Lever );
3646eb6b8a4SChuck Lever 
3656eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_base_key,
3666eb6b8a4SChuck Lever 		      0x98, 0xe6, 0xfd, 0x8a, 0x04, 0xa4, 0xb6, 0x85,
3676eb6b8a4SChuck Lever 		      0x9b, 0x75, 0xa1, 0x76, 0x54, 0x0b, 0x97, 0x52,
3686eb6b8a4SChuck Lever 		      0xba, 0xd3, 0xec, 0xd6, 0x10, 0xa2, 0x52, 0xbc
3696eb6b8a4SChuck Lever );
3706eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_derived_key,
3716eb6b8a4SChuck Lever 		      0x13, 0xfe, 0xf8, 0x0d, 0x76, 0x3e, 0x94, 0xec,
3726eb6b8a4SChuck Lever 		      0x6d, 0x13, 0xfd, 0x2c, 0xa1, 0xd0, 0x85, 0x07,
3736eb6b8a4SChuck Lever 		      0x02, 0x49, 0xda, 0xd3, 0x98, 0x08, 0xea, 0xbf
3746eb6b8a4SChuck Lever );
3756eb6b8a4SChuck Lever 
3766eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_base_key,
3776eb6b8a4SChuck Lever 		      0x62, 0x2a, 0xec, 0x25, 0xa2, 0xfe, 0x2c, 0xad,
3786eb6b8a4SChuck Lever 		      0x70, 0x94, 0x68, 0x0b, 0x7c, 0x64, 0x94, 0x02,
3796eb6b8a4SChuck Lever 		      0x80, 0x08, 0x4c, 0x1a, 0x7c, 0xec, 0x92, 0xb5
3806eb6b8a4SChuck Lever );
3816eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_derived_key,
3826eb6b8a4SChuck Lever 		      0xf8, 0xdf, 0xbf, 0x04, 0xb0, 0x97, 0xe6, 0xd9,
3836eb6b8a4SChuck Lever 		      0xdc, 0x07, 0x02, 0x68, 0x6b, 0xcb, 0x34, 0x89,
3846eb6b8a4SChuck Lever 		      0xd9, 0x1f, 0xd9, 0xa4, 0x51, 0x6b, 0x70, 0x3e
3856eb6b8a4SChuck Lever );
3866eb6b8a4SChuck Lever 
3876eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_base_key,
3886eb6b8a4SChuck Lever 		      0xd3, 0xf8, 0x29, 0x8c, 0xcb, 0x16, 0x64, 0x38,
3896eb6b8a4SChuck Lever 		      0xdc, 0xb9, 0xb9, 0x3e, 0xe5, 0xa7, 0x62, 0x92,
3906eb6b8a4SChuck Lever 		      0x86, 0xa4, 0x91, 0xf8, 0x38, 0xf8, 0x02, 0xfb
3916eb6b8a4SChuck Lever );
3926eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_derived_key,
3936eb6b8a4SChuck Lever 		      0x23, 0x70, 0xda, 0x57, 0x5d, 0x2a, 0x3d, 0xa8,
3946eb6b8a4SChuck Lever 		      0x64, 0xce, 0xbf, 0xdc, 0x52, 0x04, 0xd5, 0x6d,
3956eb6b8a4SChuck Lever 		      0xf7, 0x79, 0xa7, 0xdf, 0x43, 0xd9, 0xda, 0x43
3966eb6b8a4SChuck Lever );
3976eb6b8a4SChuck Lever 
3986eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_base_key,
3996eb6b8a4SChuck Lever 		      0xc1, 0x08, 0x16, 0x49, 0xad, 0xa7, 0x43, 0x62,
4006eb6b8a4SChuck Lever 		      0xe6, 0xa1, 0x45, 0x9d, 0x01, 0xdf, 0xd3, 0x0d,
4016eb6b8a4SChuck Lever 		      0x67, 0xc2, 0x23, 0x4c, 0x94, 0x07, 0x04, 0xda
4026eb6b8a4SChuck Lever );
4036eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_derived_key,
4046eb6b8a4SChuck Lever 		      0x34, 0x80, 0x57, 0xec, 0x98, 0xfd, 0xc4, 0x80,
4056eb6b8a4SChuck Lever 		      0x16, 0x16, 0x1c, 0x2a, 0x4c, 0x7a, 0x94, 0x3e,
4066eb6b8a4SChuck Lever 		      0x92, 0xae, 0x49, 0x2c, 0x98, 0x91, 0x75, 0xf7
4076eb6b8a4SChuck Lever );
4086eb6b8a4SChuck Lever 
4096eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_base_key,
4106eb6b8a4SChuck Lever 		      0x5d, 0x15, 0x4a, 0xf2, 0x38, 0xf4, 0x67, 0x13,
4116eb6b8a4SChuck Lever 		      0x15, 0x57, 0x19, 0xd5, 0x5e, 0x2f, 0x1f, 0x79,
4126eb6b8a4SChuck Lever 		      0x0d, 0xd6, 0x61, 0xf2, 0x79, 0xa7, 0x91, 0x7c
4136eb6b8a4SChuck Lever );
4146eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_derived_key,
4156eb6b8a4SChuck Lever 		      0xa8, 0x80, 0x8a, 0xc2, 0x67, 0xda, 0xda, 0x3d,
4166eb6b8a4SChuck Lever 		      0xcb, 0xe9, 0xa7, 0xc8, 0x46, 0x26, 0xfb, 0xc7,
4176eb6b8a4SChuck Lever 		      0x61, 0xc2, 0x94, 0xb0, 0x13, 0x15, 0xe5, 0xc1
4186eb6b8a4SChuck Lever );
4196eb6b8a4SChuck Lever 
4206eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_base_key,
4216eb6b8a4SChuck Lever 		      0x79, 0x85, 0x62, 0xe0, 0x49, 0x85, 0x2f, 0x57,
4226eb6b8a4SChuck Lever 		      0xdc, 0x8c, 0x34, 0x3b, 0xa1, 0x7f, 0x2c, 0xa1,
4236eb6b8a4SChuck Lever 		      0xd9, 0x73, 0x94, 0xef, 0xc8, 0xad, 0xc4, 0x43
4246eb6b8a4SChuck Lever );
4256eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_derived_key,
4266eb6b8a4SChuck Lever 		      0xc8, 0x13, 0xf8, 0x8a, 0x3b, 0xe3, 0xb3, 0x34,
4276eb6b8a4SChuck Lever 		      0xf7, 0x54, 0x25, 0xce, 0x91, 0x75, 0xfb, 0xe3,
4286eb6b8a4SChuck Lever 		      0xc8, 0x49, 0x3b, 0x89, 0xc8, 0x70, 0x3b, 0x49
4296eb6b8a4SChuck Lever );
4306eb6b8a4SChuck Lever 
4316eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_base_key,
4326eb6b8a4SChuck Lever 		      0x26, 0xdc, 0xe3, 0x34, 0xb5, 0x45, 0x29, 0x2f,
4336eb6b8a4SChuck Lever 		      0x2f, 0xea, 0xb9, 0xa8, 0x70, 0x1a, 0x89, 0xa4,
4346eb6b8a4SChuck Lever 		      0xb9, 0x9e, 0xb9, 0x94, 0x2c, 0xec, 0xd0, 0x16
4356eb6b8a4SChuck Lever );
4366eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_derived_key,
4376eb6b8a4SChuck Lever 		      0xf4, 0x8f, 0xfd, 0x6e, 0x83, 0xf8, 0x3e, 0x73,
4386eb6b8a4SChuck Lever 		      0x54, 0xe6, 0x94, 0xfd, 0x25, 0x2c, 0xf8, 0x3b,
4396eb6b8a4SChuck Lever 		      0xfe, 0x58, 0xf7, 0xd5, 0xba, 0x37, 0xec, 0x5d
4406eb6b8a4SChuck Lever );
4416eb6b8a4SChuck Lever 
4426eb6b8a4SChuck Lever static const struct gss_krb5_test_param rfc3961_kdf_test_params[] = {
4436eb6b8a4SChuck Lever 	{
4446eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 1",
4456eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4466eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test1_base_key,
4476eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
4486eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test1_derived_key,
4496eb6b8a4SChuck Lever 	},
4506eb6b8a4SChuck Lever 	{
4516eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 2",
4526eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4536eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test2_base_key,
4546eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
4556eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test2_derived_key,
4566eb6b8a4SChuck Lever 	},
4576eb6b8a4SChuck Lever 	{
4586eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 3",
4596eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4606eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test3_base_key,
4616eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
4626eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test3_derived_key,
4636eb6b8a4SChuck Lever 	},
4646eb6b8a4SChuck Lever 	{
4656eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 4",
4666eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4676eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test4_base_key,
4686eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
4696eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test4_derived_key,
4706eb6b8a4SChuck Lever 	},
4716eb6b8a4SChuck Lever 	{
4726eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 5",
4736eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4746eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test5_base_key,
4756eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_kerberos,
4766eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test5_derived_key,
4776eb6b8a4SChuck Lever 	},
4786eb6b8a4SChuck Lever 	{
4796eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 6",
4806eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4816eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test6_base_key,
4826eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
4836eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test6_derived_key,
4846eb6b8a4SChuck Lever 	},
4856eb6b8a4SChuck Lever 	{
4866eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 7",
4876eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4886eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test7_base_key,
4896eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
4906eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test7_derived_key,
4916eb6b8a4SChuck Lever 	},
4926eb6b8a4SChuck Lever 	{
4936eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 8",
4946eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
4956eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test8_base_key,
4966eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
4976eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test8_derived_key,
4986eb6b8a4SChuck Lever 	},
4996eb6b8a4SChuck Lever 	{
5006eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 9",
5016eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
5026eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test9_base_key,
5036eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
5046eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test9_derived_key,
5056eb6b8a4SChuck Lever 	},
5066eb6b8a4SChuck Lever };
5076eb6b8a4SChuck Lever 
5086eb6b8a4SChuck Lever /* Creates the function rfc3961_kdf_gen_params */
5096eb6b8a4SChuck Lever KUNIT_ARRAY_PARAM(rfc3961_kdf, rfc3961_kdf_test_params, gss_krb5_get_desc);
5106eb6b8a4SChuck Lever 
511eebd8c2dSChuck Lever static struct kunit_case rfc3961_test_cases[] = {
512eebd8c2dSChuck Lever 	{
513eebd8c2dSChuck Lever 		.name			= "RFC 3961 n-fold",
514eebd8c2dSChuck Lever 		.run_case		= rfc3961_nfold_case,
515eebd8c2dSChuck Lever 		.generate_params	= rfc3961_nfold_gen_params,
516eebd8c2dSChuck Lever 	},
5176eb6b8a4SChuck Lever 	{
5186eb6b8a4SChuck Lever 		.name			= "RFC 3961 key derivation",
5196eb6b8a4SChuck Lever 		.run_case		= kdf_case,
5206eb6b8a4SChuck Lever 		.generate_params	= rfc3961_kdf_gen_params,
5216eb6b8a4SChuck Lever 	},
522eebd8c2dSChuck Lever };
523eebd8c2dSChuck Lever 
524eebd8c2dSChuck Lever static struct kunit_suite rfc3961_suite = {
525eebd8c2dSChuck Lever 	.name			= "RFC 3961 tests",
526eebd8c2dSChuck Lever 	.test_cases		= rfc3961_test_cases,
527eebd8c2dSChuck Lever };
528eebd8c2dSChuck Lever 
529e1a9a384SChuck Lever /*
530e1a9a384SChuck Lever  * From RFC 3962 Appendix B:   Sample Test Vectors
531e1a9a384SChuck Lever  *
532e1a9a384SChuck Lever  * Some test vectors for CBC with ciphertext stealing, using an
533e1a9a384SChuck Lever  * initial vector of all-zero.
534e1a9a384SChuck Lever  *
535e1a9a384SChuck Lever  * This test material is copyright (C) The Internet Society (2005).
536e1a9a384SChuck Lever  */
537e1a9a384SChuck Lever 
538e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_encryption_key,
539e1a9a384SChuck Lever 		      0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
540e1a9a384SChuck Lever 		      0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
541e1a9a384SChuck Lever );
542e1a9a384SChuck Lever 
543e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_plaintext,
544e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
545e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
546e1a9a384SChuck Lever 		      0x20
547e1a9a384SChuck Lever );
548e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_expected_result,
549e1a9a384SChuck Lever 		      0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
550e1a9a384SChuck Lever 		      0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
551e1a9a384SChuck Lever 		      0x97
552e1a9a384SChuck Lever );
553e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test1_next_iv,
554e1a9a384SChuck Lever 		      0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
555e1a9a384SChuck Lever 		      0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f
556e1a9a384SChuck Lever );
557e1a9a384SChuck Lever 
558e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_plaintext,
559e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
560e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
561e1a9a384SChuck Lever 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
562e1a9a384SChuck Lever 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
563e1a9a384SChuck Lever );
564e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_expected_result,
565e1a9a384SChuck Lever 		      0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
566e1a9a384SChuck Lever 		      0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
567e1a9a384SChuck Lever 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
568e1a9a384SChuck Lever 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
569e1a9a384SChuck Lever );
570e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test2_next_iv,
571e1a9a384SChuck Lever 		      0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
572e1a9a384SChuck Lever 		      0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22
573e1a9a384SChuck Lever );
574e1a9a384SChuck Lever 
575e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_plaintext,
576e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
577e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
578e1a9a384SChuck Lever 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
579e1a9a384SChuck Lever 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43
580e1a9a384SChuck Lever );
581e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_expected_result,
582e1a9a384SChuck Lever 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
583e1a9a384SChuck Lever 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
584e1a9a384SChuck Lever 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
585e1a9a384SChuck Lever 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84
586e1a9a384SChuck Lever );
587e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test3_next_iv,
588e1a9a384SChuck Lever 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
589e1a9a384SChuck Lever 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8
590e1a9a384SChuck Lever );
591e1a9a384SChuck Lever 
592e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_plaintext,
593e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
594e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
595e1a9a384SChuck Lever 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
596e1a9a384SChuck Lever 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
597e1a9a384SChuck Lever 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
598e1a9a384SChuck Lever 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c
599e1a9a384SChuck Lever );
600e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_expected_result,
601e1a9a384SChuck Lever 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
602e1a9a384SChuck Lever 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
603e1a9a384SChuck Lever 		      0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
604e1a9a384SChuck Lever 		      0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
605e1a9a384SChuck Lever 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
606e1a9a384SChuck Lever 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5
607e1a9a384SChuck Lever );
608e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test4_next_iv,
609e1a9a384SChuck Lever 		      0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
610e1a9a384SChuck Lever 		      0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e
611e1a9a384SChuck Lever );
612e1a9a384SChuck Lever 
613e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_plaintext,
614e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
615e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
616e1a9a384SChuck Lever 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
617e1a9a384SChuck Lever 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
618e1a9a384SChuck Lever 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
619e1a9a384SChuck Lever 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20
620e1a9a384SChuck Lever );
621e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_expected_result,
622e1a9a384SChuck Lever 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
623e1a9a384SChuck Lever 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
624e1a9a384SChuck Lever 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
625e1a9a384SChuck Lever 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
626e1a9a384SChuck Lever 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
627e1a9a384SChuck Lever 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8
628e1a9a384SChuck Lever );
629e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test5_next_iv,
630e1a9a384SChuck Lever 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
631e1a9a384SChuck Lever 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8
632e1a9a384SChuck Lever );
633e1a9a384SChuck Lever 
634e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_plaintext,
635e1a9a384SChuck Lever 		      0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
636e1a9a384SChuck Lever 		      0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
637e1a9a384SChuck Lever 		      0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
638e1a9a384SChuck Lever 		      0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
639e1a9a384SChuck Lever 		      0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
640e1a9a384SChuck Lever 		      0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
641e1a9a384SChuck Lever 		      0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
642e1a9a384SChuck Lever 		      0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e
643e1a9a384SChuck Lever );
644e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_expected_result,
645e1a9a384SChuck Lever 		      0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
646e1a9a384SChuck Lever 		      0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
647e1a9a384SChuck Lever 		      0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
648e1a9a384SChuck Lever 		      0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
649e1a9a384SChuck Lever 		      0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
650e1a9a384SChuck Lever 		      0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
651e1a9a384SChuck Lever 		      0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
652e1a9a384SChuck Lever 		      0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8
653e1a9a384SChuck Lever );
654e1a9a384SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc3962_enc_test6_next_iv,
655e1a9a384SChuck Lever 		      0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
656e1a9a384SChuck Lever 		      0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40
657e1a9a384SChuck Lever );
658e1a9a384SChuck Lever 
659e1a9a384SChuck Lever static const struct gss_krb5_test_param rfc3962_encrypt_test_params[] = {
660e1a9a384SChuck Lever 	{
661e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 1",
662e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
663e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
664e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test1_plaintext,
665e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test1_expected_result,
666e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test1_next_iv,
667e1a9a384SChuck Lever 	},
668e1a9a384SChuck Lever 	{
669e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 2",
670e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
671e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
672e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test2_plaintext,
673e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test2_expected_result,
674e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test2_next_iv,
675e1a9a384SChuck Lever 	},
676e1a9a384SChuck Lever 	{
677e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 3",
678e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
679e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
680e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test3_plaintext,
681e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test3_expected_result,
682e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test3_next_iv,
683e1a9a384SChuck Lever 	},
684e1a9a384SChuck Lever 	{
685e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 4",
686e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
687e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
688e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test4_plaintext,
689e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test4_expected_result,
690e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test4_next_iv,
691e1a9a384SChuck Lever 	},
692e1a9a384SChuck Lever 	{
693e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 5",
694e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
695e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
696e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test5_plaintext,
697e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test5_expected_result,
698e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test5_next_iv,
699e1a9a384SChuck Lever 	},
700e1a9a384SChuck Lever 	{
701e1a9a384SChuck Lever 		.desc			= "Encrypt with aes128-cts-hmac-sha1-96 case 6",
702e1a9a384SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
703e1a9a384SChuck Lever 		.Ke			= &rfc3962_encryption_key,
704e1a9a384SChuck Lever 		.plaintext		= &rfc3962_enc_test6_plaintext,
705e1a9a384SChuck Lever 		.expected_result	= &rfc3962_enc_test6_expected_result,
706e1a9a384SChuck Lever 		.next_iv		= &rfc3962_enc_test6_next_iv,
707e1a9a384SChuck Lever 	},
708e1a9a384SChuck Lever };
709e1a9a384SChuck Lever 
710e1a9a384SChuck Lever /* Creates the function rfc3962_encrypt_gen_params */
711e1a9a384SChuck Lever KUNIT_ARRAY_PARAM(rfc3962_encrypt, rfc3962_encrypt_test_params,
712e1a9a384SChuck Lever 		  gss_krb5_get_desc);
713e1a9a384SChuck Lever 
714e1a9a384SChuck Lever /*
715e1a9a384SChuck Lever  * This tests the implementation of the encryption part of the mechanism.
716e1a9a384SChuck Lever  * It does not apply a confounder or test the result of HMAC over the
717e1a9a384SChuck Lever  * plaintext.
718e1a9a384SChuck Lever  */
719e1a9a384SChuck Lever static void rfc3962_encrypt_case(struct kunit *test)
720e1a9a384SChuck Lever {
721e1a9a384SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
722e1a9a384SChuck Lever 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
723e1a9a384SChuck Lever 	const struct gss_krb5_enctype *gk5e;
724e1a9a384SChuck Lever 	struct xdr_buf buf;
725e1a9a384SChuck Lever 	void *iv, *text;
726e1a9a384SChuck Lever 	u32 err;
727e1a9a384SChuck Lever 
728e1a9a384SChuck Lever 	/* Arrange */
729e1a9a384SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
730*fe90151cSChuck Lever 	if (!gk5e)
731*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
732e1a9a384SChuck Lever 
733e1a9a384SChuck Lever 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
734e1a9a384SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
735e1a9a384SChuck Lever 	err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len);
736e1a9a384SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
737e1a9a384SChuck Lever 
738e1a9a384SChuck Lever 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
739e1a9a384SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
740e1a9a384SChuck Lever 	err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len);
741e1a9a384SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
742e1a9a384SChuck Lever 
743e1a9a384SChuck Lever 	iv = kunit_kzalloc(test, crypto_sync_skcipher_ivsize(cts_tfm), GFP_KERNEL);
744e1a9a384SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, iv);
745e1a9a384SChuck Lever 
746e1a9a384SChuck Lever 	text = kunit_kzalloc(test, param->plaintext->len, GFP_KERNEL);
747e1a9a384SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
748e1a9a384SChuck Lever 
749e1a9a384SChuck Lever 	memcpy(text, param->plaintext->data, param->plaintext->len);
750e1a9a384SChuck Lever 	memset(&buf, 0, sizeof(buf));
751e1a9a384SChuck Lever 	buf.head[0].iov_base = text;
752e1a9a384SChuck Lever 	buf.head[0].iov_len = param->plaintext->len;
753e1a9a384SChuck Lever 	buf.len = buf.head[0].iov_len;
754e1a9a384SChuck Lever 
755e1a9a384SChuck Lever 	/* Act */
756e1a9a384SChuck Lever 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL,
757e1a9a384SChuck Lever 				   iv, crypto_sync_skcipher_ivsize(cts_tfm));
758e1a9a384SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
759e1a9a384SChuck Lever 
760e1a9a384SChuck Lever 	/* Assert */
761e1a9a384SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
762e1a9a384SChuck Lever 			    param->expected_result->len, buf.len,
763e1a9a384SChuck Lever 			    "ciphertext length mismatch");
764e1a9a384SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
765e1a9a384SChuck Lever 			    memcmp(param->expected_result->data,
766e1a9a384SChuck Lever 				   text, param->expected_result->len), 0,
767e1a9a384SChuck Lever 			    "ciphertext mismatch");
768e1a9a384SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
769e1a9a384SChuck Lever 			    memcmp(param->next_iv->data, iv,
770e1a9a384SChuck Lever 				   param->next_iv->len), 0,
771e1a9a384SChuck Lever 			    "IV mismatch");
772e1a9a384SChuck Lever 
773e1a9a384SChuck Lever 	crypto_free_sync_skcipher(cts_tfm);
774e1a9a384SChuck Lever 	crypto_free_sync_skcipher(cbc_tfm);
775e1a9a384SChuck Lever }
776e1a9a384SChuck Lever 
777e1a9a384SChuck Lever static struct kunit_case rfc3962_test_cases[] = {
778e1a9a384SChuck Lever 	{
779e1a9a384SChuck Lever 		.name			= "RFC 3962 encryption",
780e1a9a384SChuck Lever 		.run_case		= rfc3962_encrypt_case,
781e1a9a384SChuck Lever 		.generate_params	= rfc3962_encrypt_gen_params,
782e1a9a384SChuck Lever 	},
783e1a9a384SChuck Lever };
784e1a9a384SChuck Lever 
785e1a9a384SChuck Lever static struct kunit_suite rfc3962_suite = {
786e1a9a384SChuck Lever 	.name			= "RFC 3962 suite",
787e1a9a384SChuck Lever 	.test_cases		= rfc3962_test_cases,
788e1a9a384SChuck Lever };
789e1a9a384SChuck Lever 
79035f6e42eSChuck Lever /*
79135f6e42eSChuck Lever  * From RFC 6803 Section 10.  Test vectors
79235f6e42eSChuck Lever  *
79335f6e42eSChuck Lever  * Sample results for key derivation
79435f6e42eSChuck Lever  *
79535f6e42eSChuck Lever  * Copyright (c) 2012 IETF Trust and the persons identified as the
79635f6e42eSChuck Lever  * document authors.  All rights reserved.
79735f6e42eSChuck Lever  */
79835f6e42eSChuck Lever 
79935f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_basekey,
80035f6e42eSChuck Lever 		      0x57, 0xd0, 0x29, 0x72, 0x98, 0xff, 0xd9, 0xd3,
80135f6e42eSChuck Lever 		      0x5d, 0xe5, 0xa4, 0x7f, 0xb4, 0xbd, 0xe2, 0x4b
80235f6e42eSChuck Lever );
80335f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Kc,
80435f6e42eSChuck Lever 		      0xd1, 0x55, 0x77, 0x5a, 0x20, 0x9d, 0x05, 0xf0,
80535f6e42eSChuck Lever 		      0x2b, 0x38, 0xd4, 0x2a, 0x38, 0x9e, 0x5a, 0x56
80635f6e42eSChuck Lever );
80735f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ke,
80835f6e42eSChuck Lever 		      0x64, 0xdf, 0x83, 0xf8, 0x5a, 0x53, 0x2f, 0x17,
80935f6e42eSChuck Lever 		      0x57, 0x7d, 0x8c, 0x37, 0x03, 0x57, 0x96, 0xab
81035f6e42eSChuck Lever );
81135f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia128_cts_cmac_Ki,
81235f6e42eSChuck Lever 		      0x3e, 0x4f, 0xbd, 0xf3, 0x0f, 0xb8, 0x25, 0x9c,
81335f6e42eSChuck Lever 		      0x42, 0x5c, 0xb6, 0xc9, 0x6f, 0x1f, 0x46, 0x35
81435f6e42eSChuck Lever );
81535f6e42eSChuck Lever 
81635f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_basekey,
81735f6e42eSChuck Lever 		      0xb9, 0xd6, 0x82, 0x8b, 0x20, 0x56, 0xb7, 0xbe,
81835f6e42eSChuck Lever 		      0x65, 0x6d, 0x88, 0xa1, 0x23, 0xb1, 0xfa, 0xc6,
81935f6e42eSChuck Lever 		      0x82, 0x14, 0xac, 0x2b, 0x72, 0x7e, 0xcf, 0x5f,
82035f6e42eSChuck Lever 		      0x69, 0xaf, 0xe0, 0xc4, 0xdf, 0x2a, 0x6d, 0x2c
82135f6e42eSChuck Lever );
82235f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Kc,
82335f6e42eSChuck Lever 		      0xe4, 0x67, 0xf9, 0xa9, 0x55, 0x2b, 0xc7, 0xd3,
82435f6e42eSChuck Lever 		      0x15, 0x5a, 0x62, 0x20, 0xaf, 0x9c, 0x19, 0x22,
82535f6e42eSChuck Lever 		      0x0e, 0xee, 0xd4, 0xff, 0x78, 0xb0, 0xd1, 0xe6,
82635f6e42eSChuck Lever 		      0xa1, 0x54, 0x49, 0x91, 0x46, 0x1a, 0x9e, 0x50
82735f6e42eSChuck Lever );
82835f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ke,
82935f6e42eSChuck Lever 		      0x41, 0x2a, 0xef, 0xc3, 0x62, 0xa7, 0x28, 0x5f,
83035f6e42eSChuck Lever 		      0xc3, 0x96, 0x6c, 0x6a, 0x51, 0x81, 0xe7, 0x60,
83135f6e42eSChuck Lever 		      0x5a, 0xe6, 0x75, 0x23, 0x5b, 0x6d, 0x54, 0x9f,
83235f6e42eSChuck Lever 		      0xbf, 0xc9, 0xab, 0x66, 0x30, 0xa4, 0xc6, 0x04
83335f6e42eSChuck Lever );
83435f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(camellia256_cts_cmac_Ki,
83535f6e42eSChuck Lever 		      0xfa, 0x62, 0x4f, 0xa0, 0xe5, 0x23, 0x99, 0x3f,
83635f6e42eSChuck Lever 		      0xa3, 0x88, 0xae, 0xfd, 0xc6, 0x7e, 0x67, 0xeb,
83735f6e42eSChuck Lever 		      0xcd, 0x8c, 0x08, 0xe8, 0xa0, 0x24, 0x6b, 0x1d,
83835f6e42eSChuck Lever 		      0x73, 0xb0, 0xd1, 0xdd, 0x9f, 0xc5, 0x82, 0xb0
83935f6e42eSChuck Lever );
84035f6e42eSChuck Lever 
84135f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_checksum,
84235f6e42eSChuck Lever 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_CHECKSUM
84335f6e42eSChuck Lever );
84435f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_encryption,
84535f6e42eSChuck Lever 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_ENCRYPTION
84635f6e42eSChuck Lever );
84735f6e42eSChuck Lever DEFINE_HEX_XDR_NETOBJ(usage_integrity,
84835f6e42eSChuck Lever 		      0x00, 0x00, 0x00, 0x02, KEY_USAGE_SEED_INTEGRITY
84935f6e42eSChuck Lever );
85035f6e42eSChuck Lever 
85135f6e42eSChuck Lever static const struct gss_krb5_test_param rfc6803_kdf_test_params[] = {
85235f6e42eSChuck Lever 	{
85335f6e42eSChuck Lever 		.desc			= "Derive Kc subkey for camellia128-cts-cmac",
85435f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
85535f6e42eSChuck Lever 		.base_key		= &camellia128_cts_cmac_basekey,
85635f6e42eSChuck Lever 		.usage			= &usage_checksum,
85735f6e42eSChuck Lever 		.expected_result	= &camellia128_cts_cmac_Kc,
85835f6e42eSChuck Lever 	},
85935f6e42eSChuck Lever 	{
86035f6e42eSChuck Lever 		.desc			= "Derive Ke subkey for camellia128-cts-cmac",
86135f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
86235f6e42eSChuck Lever 		.base_key		= &camellia128_cts_cmac_basekey,
86335f6e42eSChuck Lever 		.usage			= &usage_encryption,
86435f6e42eSChuck Lever 		.expected_result	= &camellia128_cts_cmac_Ke,
86535f6e42eSChuck Lever 	},
86635f6e42eSChuck Lever 	{
86735f6e42eSChuck Lever 		.desc			= "Derive Ki subkey for camellia128-cts-cmac",
86835f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
86935f6e42eSChuck Lever 		.base_key		= &camellia128_cts_cmac_basekey,
87035f6e42eSChuck Lever 		.usage			= &usage_integrity,
87135f6e42eSChuck Lever 		.expected_result	= &camellia128_cts_cmac_Ki,
87235f6e42eSChuck Lever 	},
87335f6e42eSChuck Lever 	{
87435f6e42eSChuck Lever 		.desc			= "Derive Kc subkey for camellia256-cts-cmac",
87535f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
87635f6e42eSChuck Lever 		.base_key		= &camellia256_cts_cmac_basekey,
87735f6e42eSChuck Lever 		.usage			= &usage_checksum,
87835f6e42eSChuck Lever 		.expected_result	= &camellia256_cts_cmac_Kc,
87935f6e42eSChuck Lever 	},
88035f6e42eSChuck Lever 	{
88135f6e42eSChuck Lever 		.desc			= "Derive Ke subkey for camellia256-cts-cmac",
88235f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
88335f6e42eSChuck Lever 		.base_key		= &camellia256_cts_cmac_basekey,
88435f6e42eSChuck Lever 		.usage			= &usage_encryption,
88535f6e42eSChuck Lever 		.expected_result	= &camellia256_cts_cmac_Ke,
88635f6e42eSChuck Lever 	},
88735f6e42eSChuck Lever 	{
88835f6e42eSChuck Lever 		.desc			= "Derive Ki subkey for camellia256-cts-cmac",
88935f6e42eSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
89035f6e42eSChuck Lever 		.base_key		= &camellia256_cts_cmac_basekey,
89135f6e42eSChuck Lever 		.usage			= &usage_integrity,
89235f6e42eSChuck Lever 		.expected_result	= &camellia256_cts_cmac_Ki,
89335f6e42eSChuck Lever 	},
89435f6e42eSChuck Lever };
89535f6e42eSChuck Lever 
89635f6e42eSChuck Lever /* Creates the function rfc6803_kdf_gen_params */
89735f6e42eSChuck Lever KUNIT_ARRAY_PARAM(rfc6803_kdf, rfc6803_kdf_test_params, gss_krb5_get_desc);
89835f6e42eSChuck Lever 
89902142b2cSChuck Lever /*
90002142b2cSChuck Lever  * From RFC 6803 Section 10.  Test vectors
90102142b2cSChuck Lever  *
90202142b2cSChuck Lever  * Sample checksums.
90302142b2cSChuck Lever  *
90402142b2cSChuck Lever  * Copyright (c) 2012 IETF Trust and the persons identified as the
90502142b2cSChuck Lever  * document authors.  All rights reserved.
90602142b2cSChuck Lever  *
90702142b2cSChuck Lever  * XXX: These tests are likely to fail on EBCDIC or Unicode platforms.
90802142b2cSChuck Lever  */
90902142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test1_plaintext,
91002142b2cSChuck Lever 		      "abcdefghijk");
91102142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_basekey,
91202142b2cSChuck Lever 		      0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93,
91302142b2cSChuck Lever 		      0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3
91402142b2cSChuck Lever );
91502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_usage,
91602142b2cSChuck Lever 		      0x00, 0x00, 0x00, 0x07, KEY_USAGE_SEED_CHECKSUM
91702142b2cSChuck Lever );
91802142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test1_expected_result,
91902142b2cSChuck Lever 		      0x11, 0x78, 0xe6, 0xc5, 0xc4, 0x7a, 0x8c, 0x1a,
92002142b2cSChuck Lever 		      0xe0, 0xc4, 0xb9, 0xc7, 0xd4, 0xeb, 0x7b, 0x6b
92102142b2cSChuck Lever );
92202142b2cSChuck Lever 
92302142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test2_plaintext,
92402142b2cSChuck Lever 		      "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
92502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_basekey,
92602142b2cSChuck Lever 		      0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d,
92702142b2cSChuck Lever 		      0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c
92802142b2cSChuck Lever );
92902142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_usage,
93002142b2cSChuck Lever 		      0x00, 0x00, 0x00, 0x08, KEY_USAGE_SEED_CHECKSUM
93102142b2cSChuck Lever );
93202142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test2_expected_result,
93302142b2cSChuck Lever 		      0xd1, 0xb3, 0x4f, 0x70, 0x04, 0xa7, 0x31, 0xf2,
93402142b2cSChuck Lever 		      0x3a, 0x0c, 0x00, 0xbf, 0x6c, 0x3f, 0x75, 0x3a
93502142b2cSChuck Lever );
93602142b2cSChuck Lever 
93702142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test3_plaintext,
93802142b2cSChuck Lever 		      "123456789");
93902142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_basekey,
94002142b2cSChuck Lever 		      0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57,
94102142b2cSChuck Lever 		      0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03,
94202142b2cSChuck Lever 		      0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd,
94302142b2cSChuck Lever 		      0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b
94402142b2cSChuck Lever );
94502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_usage,
94602142b2cSChuck Lever 		      0x00, 0x00, 0x00, 0x09, KEY_USAGE_SEED_CHECKSUM
94702142b2cSChuck Lever );
94802142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test3_expected_result,
94902142b2cSChuck Lever 		      0x87, 0xa1, 0x2c, 0xfd, 0x2b, 0x96, 0x21, 0x48,
95002142b2cSChuck Lever 		      0x10, 0xf0, 0x1c, 0x82, 0x6e, 0x77, 0x44, 0xb1
95102142b2cSChuck Lever );
95202142b2cSChuck Lever 
95302142b2cSChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_checksum_test4_plaintext,
95402142b2cSChuck Lever 		      "!@#$%^&*()!@#$%^&*()!@#$%^&*()");
95502142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_basekey,
95602142b2cSChuck Lever 		      0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15,
95702142b2cSChuck Lever 		      0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe,
95802142b2cSChuck Lever 		      0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33,
95902142b2cSChuck Lever 		      0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05
96002142b2cSChuck Lever );
96102142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_usage,
96202142b2cSChuck Lever 		      0x00, 0x00, 0x00, 0x0a, KEY_USAGE_SEED_CHECKSUM
96302142b2cSChuck Lever );
96402142b2cSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_checksum_test4_expected_result,
96502142b2cSChuck Lever 		      0x3f, 0xa0, 0xb4, 0x23, 0x55, 0xe5, 0x2b, 0x18,
96602142b2cSChuck Lever 		      0x91, 0x87, 0x29, 0x4a, 0xa2, 0x52, 0xab, 0x64
96702142b2cSChuck Lever );
96802142b2cSChuck Lever 
96902142b2cSChuck Lever static const struct gss_krb5_test_param rfc6803_checksum_test_params[] = {
97002142b2cSChuck Lever 	{
97102142b2cSChuck Lever 		.desc			= "camellia128-cts-cmac checksum test 1",
97202142b2cSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
97302142b2cSChuck Lever 		.base_key		= &rfc6803_checksum_test1_basekey,
97402142b2cSChuck Lever 		.usage			= &rfc6803_checksum_test1_usage,
97502142b2cSChuck Lever 		.plaintext		= &rfc6803_checksum_test1_plaintext,
97602142b2cSChuck Lever 		.expected_result	= &rfc6803_checksum_test1_expected_result,
97702142b2cSChuck Lever 	},
97802142b2cSChuck Lever 	{
97902142b2cSChuck Lever 		.desc			= "camellia128-cts-cmac checksum test 2",
98002142b2cSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
98102142b2cSChuck Lever 		.base_key		= &rfc6803_checksum_test2_basekey,
98202142b2cSChuck Lever 		.usage			= &rfc6803_checksum_test2_usage,
98302142b2cSChuck Lever 		.plaintext		= &rfc6803_checksum_test2_plaintext,
98402142b2cSChuck Lever 		.expected_result	= &rfc6803_checksum_test2_expected_result,
98502142b2cSChuck Lever 	},
98602142b2cSChuck Lever 	{
98702142b2cSChuck Lever 		.desc			= "camellia256-cts-cmac checksum test 3",
98802142b2cSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
98902142b2cSChuck Lever 		.base_key		= &rfc6803_checksum_test3_basekey,
99002142b2cSChuck Lever 		.usage			= &rfc6803_checksum_test3_usage,
99102142b2cSChuck Lever 		.plaintext		= &rfc6803_checksum_test3_plaintext,
99202142b2cSChuck Lever 		.expected_result	= &rfc6803_checksum_test3_expected_result,
99302142b2cSChuck Lever 	},
99402142b2cSChuck Lever 	{
99502142b2cSChuck Lever 		.desc			= "camellia256-cts-cmac checksum test 4",
99602142b2cSChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
99702142b2cSChuck Lever 		.base_key		= &rfc6803_checksum_test4_basekey,
99802142b2cSChuck Lever 		.usage			= &rfc6803_checksum_test4_usage,
99902142b2cSChuck Lever 		.plaintext		= &rfc6803_checksum_test4_plaintext,
100002142b2cSChuck Lever 		.expected_result	= &rfc6803_checksum_test4_expected_result,
100102142b2cSChuck Lever 	},
100202142b2cSChuck Lever };
100302142b2cSChuck Lever 
100402142b2cSChuck Lever /* Creates the function rfc6803_checksum_gen_params */
100502142b2cSChuck Lever KUNIT_ARRAY_PARAM(rfc6803_checksum, rfc6803_checksum_test_params,
100602142b2cSChuck Lever 		  gss_krb5_get_desc);
100702142b2cSChuck Lever 
1008b958cff6SChuck Lever /*
1009b958cff6SChuck Lever  * From RFC 6803 Section 10.  Test vectors
1010b958cff6SChuck Lever  *
1011b958cff6SChuck Lever  * Sample encryptions (all using the default cipher state)
1012b958cff6SChuck Lever  *
1013b958cff6SChuck Lever  * Copyright (c) 2012 IETF Trust and the persons identified as the
1014b958cff6SChuck Lever  * document authors.  All rights reserved.
1015b958cff6SChuck Lever  *
1016b958cff6SChuck Lever  * Key usage values are from errata 4326 against RFC 6803.
1017b958cff6SChuck Lever  */
1018b958cff6SChuck Lever 
1019b958cff6SChuck Lever static const struct xdr_netobj rfc6803_enc_empty_plaintext = {
1020b958cff6SChuck Lever 	.len	= 0,
1021b958cff6SChuck Lever };
1022b958cff6SChuck Lever 
1023b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_1byte_plaintext, "1");
1024b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_9byte_plaintext, "9 bytesss");
1025b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_13byte_plaintext, "13 bytes byte");
1026b958cff6SChuck Lever DEFINE_STR_XDR_NETOBJ(rfc6803_enc_30byte_plaintext,
1027b958cff6SChuck Lever 		      "30 bytes bytes bytes bytes byt"
1028b958cff6SChuck Lever );
1029b958cff6SChuck Lever 
1030b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_confounder,
1031b958cff6SChuck Lever 		      0xb6, 0x98, 0x22, 0xa1, 0x9a, 0x6b, 0x09, 0xc0,
1032b958cff6SChuck Lever 		      0xeb, 0xc8, 0x55, 0x7d, 0x1f, 0x1b, 0x6c, 0x0a
1033b958cff6SChuck Lever );
1034b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_basekey,
1035b958cff6SChuck Lever 		      0x1d, 0xc4, 0x6a, 0x8d, 0x76, 0x3f, 0x4f, 0x93,
1036b958cff6SChuck Lever 		      0x74, 0x2b, 0xcb, 0xa3, 0x38, 0x75, 0x76, 0xc3
1037b958cff6SChuck Lever );
1038b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test1_expected_result,
1039b958cff6SChuck Lever 		      0xc4, 0x66, 0xf1, 0x87, 0x10, 0x69, 0x92, 0x1e,
1040b958cff6SChuck Lever 		      0xdb, 0x7c, 0x6f, 0xde, 0x24, 0x4a, 0x52, 0xdb,
1041b958cff6SChuck Lever 		      0x0b, 0xa1, 0x0e, 0xdc, 0x19, 0x7b, 0xdb, 0x80,
1042b958cff6SChuck Lever 		      0x06, 0x65, 0x8c, 0xa3, 0xcc, 0xce, 0x6e, 0xb8
1043b958cff6SChuck Lever );
1044b958cff6SChuck Lever 
1045b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_confounder,
1046b958cff6SChuck Lever 		      0x6f, 0x2f, 0xc3, 0xc2, 0xa1, 0x66, 0xfd, 0x88,
1047b958cff6SChuck Lever 		      0x98, 0x96, 0x7a, 0x83, 0xde, 0x95, 0x96, 0xd9
1048b958cff6SChuck Lever );
1049b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_basekey,
1050b958cff6SChuck Lever 		      0x50, 0x27, 0xbc, 0x23, 0x1d, 0x0f, 0x3a, 0x9d,
1051b958cff6SChuck Lever 		      0x23, 0x33, 0x3f, 0x1c, 0xa6, 0xfd, 0xbe, 0x7c
1052b958cff6SChuck Lever );
1053b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test2_expected_result,
1054b958cff6SChuck Lever 		      0x84, 0x2d, 0x21, 0xfd, 0x95, 0x03, 0x11, 0xc0,
1055b958cff6SChuck Lever 		      0xdd, 0x46, 0x4a, 0x3f, 0x4b, 0xe8, 0xd6, 0xda,
1056b958cff6SChuck Lever 		      0x88, 0xa5, 0x6d, 0x55, 0x9c, 0x9b, 0x47, 0xd3,
1057b958cff6SChuck Lever 		      0xf9, 0xa8, 0x50, 0x67, 0xaf, 0x66, 0x15, 0x59,
1058b958cff6SChuck Lever 		      0xb8
1059b958cff6SChuck Lever );
1060b958cff6SChuck Lever 
1061b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_confounder,
1062b958cff6SChuck Lever 		      0xa5, 0xb4, 0xa7, 0x1e, 0x07, 0x7a, 0xee, 0xf9,
1063b958cff6SChuck Lever 		      0x3c, 0x87, 0x63, 0xc1, 0x8f, 0xdb, 0x1f, 0x10
1064b958cff6SChuck Lever );
1065b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_basekey,
1066b958cff6SChuck Lever 		      0xa1, 0xbb, 0x61, 0xe8, 0x05, 0xf9, 0xba, 0x6d,
1067b958cff6SChuck Lever 		      0xde, 0x8f, 0xdb, 0xdd, 0xc0, 0x5c, 0xde, 0xa0
1068b958cff6SChuck Lever );
1069b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test3_expected_result,
1070b958cff6SChuck Lever 		      0x61, 0x9f, 0xf0, 0x72, 0xe3, 0x62, 0x86, 0xff,
1071b958cff6SChuck Lever 		      0x0a, 0x28, 0xde, 0xb3, 0xa3, 0x52, 0xec, 0x0d,
1072b958cff6SChuck Lever 		      0x0e, 0xdf, 0x5c, 0x51, 0x60, 0xd6, 0x63, 0xc9,
1073b958cff6SChuck Lever 		      0x01, 0x75, 0x8c, 0xcf, 0x9d, 0x1e, 0xd3, 0x3d,
1074b958cff6SChuck Lever 		      0x71, 0xdb, 0x8f, 0x23, 0xaa, 0xbf, 0x83, 0x48,
1075b958cff6SChuck Lever 		      0xa0
1076b958cff6SChuck Lever );
1077b958cff6SChuck Lever 
1078b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_confounder,
1079b958cff6SChuck Lever 		      0x19, 0xfe, 0xe4, 0x0d, 0x81, 0x0c, 0x52, 0x4b,
1080b958cff6SChuck Lever 		      0x5b, 0x22, 0xf0, 0x18, 0x74, 0xc6, 0x93, 0xda
1081b958cff6SChuck Lever );
1082b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_basekey,
1083b958cff6SChuck Lever 		      0x2c, 0xa2, 0x7a, 0x5f, 0xaf, 0x55, 0x32, 0x24,
1084b958cff6SChuck Lever 		      0x45, 0x06, 0x43, 0x4e, 0x1c, 0xef, 0x66, 0x76
1085b958cff6SChuck Lever );
1086b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test4_expected_result,
1087b958cff6SChuck Lever 		      0xb8, 0xec, 0xa3, 0x16, 0x7a, 0xe6, 0x31, 0x55,
1088b958cff6SChuck Lever 		      0x12, 0xe5, 0x9f, 0x98, 0xa7, 0xc5, 0x00, 0x20,
1089b958cff6SChuck Lever 		      0x5e, 0x5f, 0x63, 0xff, 0x3b, 0xb3, 0x89, 0xaf,
1090b958cff6SChuck Lever 		      0x1c, 0x41, 0xa2, 0x1d, 0x64, 0x0d, 0x86, 0x15,
1091b958cff6SChuck Lever 		      0xc9, 0xed, 0x3f, 0xbe, 0xb0, 0x5a, 0xb6, 0xac,
1092b958cff6SChuck Lever 		      0xb6, 0x76, 0x89, 0xb5, 0xea
1093b958cff6SChuck Lever );
1094b958cff6SChuck Lever 
1095b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_confounder,
1096b958cff6SChuck Lever 		      0xca, 0x7a, 0x7a, 0xb4, 0xbe, 0x19, 0x2d, 0xab,
1097b958cff6SChuck Lever 		      0xd6, 0x03, 0x50, 0x6d, 0xb1, 0x9c, 0x39, 0xe2
1098b958cff6SChuck Lever );
1099b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_basekey,
1100b958cff6SChuck Lever 		      0x78, 0x24, 0xf8, 0xc1, 0x6f, 0x83, 0xff, 0x35,
1101b958cff6SChuck Lever 		      0x4c, 0x6b, 0xf7, 0x51, 0x5b, 0x97, 0x3f, 0x43
1102b958cff6SChuck Lever );
1103b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test5_expected_result,
1104b958cff6SChuck Lever 		      0xa2, 0x6a, 0x39, 0x05, 0xa4, 0xff, 0xd5, 0x81,
1105b958cff6SChuck Lever 		      0x6b, 0x7b, 0x1e, 0x27, 0x38, 0x0d, 0x08, 0x09,
1106b958cff6SChuck Lever 		      0x0c, 0x8e, 0xc1, 0xf3, 0x04, 0x49, 0x6e, 0x1a,
1107b958cff6SChuck Lever 		      0xbd, 0xcd, 0x2b, 0xdc, 0xd1, 0xdf, 0xfc, 0x66,
1108b958cff6SChuck Lever 		      0x09, 0x89, 0xe1, 0x17, 0xa7, 0x13, 0xdd, 0xbb,
1109b958cff6SChuck Lever 		      0x57, 0xa4, 0x14, 0x6c, 0x15, 0x87, 0xcb, 0xa4,
1110b958cff6SChuck Lever 		      0x35, 0x66, 0x65, 0x59, 0x1d, 0x22, 0x40, 0x28,
1111b958cff6SChuck Lever 		      0x2f, 0x58, 0x42, 0xb1, 0x05, 0xa5
1112b958cff6SChuck Lever );
1113b958cff6SChuck Lever 
1114b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_confounder,
1115b958cff6SChuck Lever 		      0x3c, 0xbb, 0xd2, 0xb4, 0x59, 0x17, 0x94, 0x10,
1116b958cff6SChuck Lever 		      0x67, 0xf9, 0x65, 0x99, 0xbb, 0x98, 0x92, 0x6c
1117b958cff6SChuck Lever );
1118b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_basekey,
1119b958cff6SChuck Lever 		      0xb6, 0x1c, 0x86, 0xcc, 0x4e, 0x5d, 0x27, 0x57,
1120b958cff6SChuck Lever 		      0x54, 0x5a, 0xd4, 0x23, 0x39, 0x9f, 0xb7, 0x03,
1121b958cff6SChuck Lever 		      0x1e, 0xca, 0xb9, 0x13, 0xcb, 0xb9, 0x00, 0xbd,
1122b958cff6SChuck Lever 		      0x7a, 0x3c, 0x6d, 0xd8, 0xbf, 0x92, 0x01, 0x5b
1123b958cff6SChuck Lever );
1124b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test6_expected_result,
1125b958cff6SChuck Lever 		      0x03, 0x88, 0x6d, 0x03, 0x31, 0x0b, 0x47, 0xa6,
1126b958cff6SChuck Lever 		      0xd8, 0xf0, 0x6d, 0x7b, 0x94, 0xd1, 0xdd, 0x83,
1127b958cff6SChuck Lever 		      0x7e, 0xcc, 0xe3, 0x15, 0xef, 0x65, 0x2a, 0xff,
1128b958cff6SChuck Lever 		      0x62, 0x08, 0x59, 0xd9, 0x4a, 0x25, 0x92, 0x66
1129b958cff6SChuck Lever );
1130b958cff6SChuck Lever 
1131b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_confounder,
1132b958cff6SChuck Lever 		      0xde, 0xf4, 0x87, 0xfc, 0xeb, 0xe6, 0xde, 0x63,
1133b958cff6SChuck Lever 		      0x46, 0xd4, 0xda, 0x45, 0x21, 0xbb, 0xa2, 0xd2
1134b958cff6SChuck Lever );
1135b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_basekey,
1136b958cff6SChuck Lever 		      0x1b, 0x97, 0xfe, 0x0a, 0x19, 0x0e, 0x20, 0x21,
1137b958cff6SChuck Lever 		      0xeb, 0x30, 0x75, 0x3e, 0x1b, 0x6e, 0x1e, 0x77,
1138b958cff6SChuck Lever 		      0xb0, 0x75, 0x4b, 0x1d, 0x68, 0x46, 0x10, 0x35,
1139b958cff6SChuck Lever 		      0x58, 0x64, 0x10, 0x49, 0x63, 0x46, 0x38, 0x33
1140b958cff6SChuck Lever );
1141b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test7_expected_result,
1142b958cff6SChuck Lever 		      0x2c, 0x9c, 0x15, 0x70, 0x13, 0x3c, 0x99, 0xbf,
1143b958cff6SChuck Lever 		      0x6a, 0x34, 0xbc, 0x1b, 0x02, 0x12, 0x00, 0x2f,
1144b958cff6SChuck Lever 		      0xd1, 0x94, 0x33, 0x87, 0x49, 0xdb, 0x41, 0x35,
1145b958cff6SChuck Lever 		      0x49, 0x7a, 0x34, 0x7c, 0xfc, 0xd9, 0xd1, 0x8a,
1146b958cff6SChuck Lever 		      0x12
1147b958cff6SChuck Lever );
1148b958cff6SChuck Lever 
1149b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_confounder,
1150b958cff6SChuck Lever 		      0xad, 0x4f, 0xf9, 0x04, 0xd3, 0x4e, 0x55, 0x53,
1151b958cff6SChuck Lever 		      0x84, 0xb1, 0x41, 0x00, 0xfc, 0x46, 0x5f, 0x88
1152b958cff6SChuck Lever );
1153b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_basekey,
1154b958cff6SChuck Lever 		      0x32, 0x16, 0x4c, 0x5b, 0x43, 0x4d, 0x1d, 0x15,
1155b958cff6SChuck Lever 		      0x38, 0xe4, 0xcf, 0xd9, 0xbe, 0x80, 0x40, 0xfe,
1156b958cff6SChuck Lever 		      0x8c, 0x4a, 0xc7, 0xac, 0xc4, 0xb9, 0x3d, 0x33,
1157b958cff6SChuck Lever 		      0x14, 0xd2, 0x13, 0x36, 0x68, 0x14, 0x7a, 0x05
1158b958cff6SChuck Lever );
1159b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test8_expected_result,
1160b958cff6SChuck Lever 		      0x9c, 0x6d, 0xe7, 0x5f, 0x81, 0x2d, 0xe7, 0xed,
1161b958cff6SChuck Lever 		      0x0d, 0x28, 0xb2, 0x96, 0x35, 0x57, 0xa1, 0x15,
1162b958cff6SChuck Lever 		      0x64, 0x09, 0x98, 0x27, 0x5b, 0x0a, 0xf5, 0x15,
1163b958cff6SChuck Lever 		      0x27, 0x09, 0x91, 0x3f, 0xf5, 0x2a, 0x2a, 0x9c,
1164b958cff6SChuck Lever 		      0x8e, 0x63, 0xb8, 0x72, 0xf9, 0x2e, 0x64, 0xc8,
1165b958cff6SChuck Lever 		      0x39
1166b958cff6SChuck Lever );
1167b958cff6SChuck Lever 
1168b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_confounder,
1169b958cff6SChuck Lever 		      0xcf, 0x9b, 0xca, 0x6d, 0xf1, 0x14, 0x4e, 0x0c,
1170b958cff6SChuck Lever 		      0x0a, 0xf9, 0xb8, 0xf3, 0x4c, 0x90, 0xd5, 0x14
1171b958cff6SChuck Lever );
1172b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_basekey,
1173b958cff6SChuck Lever 		      0xb0, 0x38, 0xb1, 0x32, 0xcd, 0x8e, 0x06, 0x61,
1174b958cff6SChuck Lever 		      0x22, 0x67, 0xfa, 0xb7, 0x17, 0x00, 0x66, 0xd8,
1175b958cff6SChuck Lever 		      0x8a, 0xec, 0xcb, 0xa0, 0xb7, 0x44, 0xbf, 0xc6,
1176b958cff6SChuck Lever 		      0x0d, 0xc8, 0x9b, 0xca, 0x18, 0x2d, 0x07, 0x15
1177b958cff6SChuck Lever );
1178b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test9_expected_result,
1179b958cff6SChuck Lever 		      0xee, 0xec, 0x85, 0xa9, 0x81, 0x3c, 0xdc, 0x53,
1180b958cff6SChuck Lever 		      0x67, 0x72, 0xab, 0x9b, 0x42, 0xde, 0xfc, 0x57,
1181b958cff6SChuck Lever 		      0x06, 0xf7, 0x26, 0xe9, 0x75, 0xdd, 0xe0, 0x5a,
1182b958cff6SChuck Lever 		      0x87, 0xeb, 0x54, 0x06, 0xea, 0x32, 0x4c, 0xa1,
1183b958cff6SChuck Lever 		      0x85, 0xc9, 0x98, 0x6b, 0x42, 0xaa, 0xbe, 0x79,
1184b958cff6SChuck Lever 		      0x4b, 0x84, 0x82, 0x1b, 0xee
1185b958cff6SChuck Lever );
1186b958cff6SChuck Lever 
1187b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_confounder,
1188b958cff6SChuck Lever 		      0x64, 0x4d, 0xef, 0x38, 0xda, 0x35, 0x00, 0x72,
1189b958cff6SChuck Lever 		      0x75, 0x87, 0x8d, 0x21, 0x68, 0x55, 0xe2, 0x28
1190b958cff6SChuck Lever );
1191b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_basekey,
1192b958cff6SChuck Lever 		      0xcc, 0xfc, 0xd3, 0x49, 0xbf, 0x4c, 0x66, 0x77,
1193b958cff6SChuck Lever 		      0xe8, 0x6e, 0x4b, 0x02, 0xb8, 0xea, 0xb9, 0x24,
1194b958cff6SChuck Lever 		      0xa5, 0x46, 0xac, 0x73, 0x1c, 0xf9, 0xbf, 0x69,
1195b958cff6SChuck Lever 		      0x89, 0xb9, 0x96, 0xe7, 0xd6, 0xbf, 0xbb, 0xa7
1196b958cff6SChuck Lever );
1197b958cff6SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc6803_enc_test10_expected_result,
1198b958cff6SChuck Lever 		      0x0e, 0x44, 0x68, 0x09, 0x85, 0x85, 0x5f, 0x2d,
1199b958cff6SChuck Lever 		      0x1f, 0x18, 0x12, 0x52, 0x9c, 0xa8, 0x3b, 0xfd,
1200b958cff6SChuck Lever 		      0x8e, 0x34, 0x9d, 0xe6, 0xfd, 0x9a, 0xda, 0x0b,
1201b958cff6SChuck Lever 		      0xaa, 0xa0, 0x48, 0xd6, 0x8e, 0x26, 0x5f, 0xeb,
1202b958cff6SChuck Lever 		      0xf3, 0x4a, 0xd1, 0x25, 0x5a, 0x34, 0x49, 0x99,
1203b958cff6SChuck Lever 		      0xad, 0x37, 0x14, 0x68, 0x87, 0xa6, 0xc6, 0x84,
1204b958cff6SChuck Lever 		      0x57, 0x31, 0xac, 0x7f, 0x46, 0x37, 0x6a, 0x05,
1205b958cff6SChuck Lever 		      0x04, 0xcd, 0x06, 0x57, 0x14, 0x74
1206b958cff6SChuck Lever );
1207b958cff6SChuck Lever 
1208b958cff6SChuck Lever static const struct gss_krb5_test_param rfc6803_encrypt_test_params[] = {
1209b958cff6SChuck Lever 	{
1210b958cff6SChuck Lever 		.desc			= "Encrypt empty plaintext with camellia128-cts-cmac",
1211b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1212b958cff6SChuck Lever 		.constant		= 0,
1213b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test1_basekey,
1214b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_empty_plaintext,
1215b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test1_confounder,
1216b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test1_expected_result,
1217b958cff6SChuck Lever 	},
1218b958cff6SChuck Lever 	{
1219b958cff6SChuck Lever 		.desc			= "Encrypt 1 byte with camellia128-cts-cmac",
1220b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1221b958cff6SChuck Lever 		.constant		= 1,
1222b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test2_basekey,
1223b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_1byte_plaintext,
1224b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test2_confounder,
1225b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test2_expected_result,
1226b958cff6SChuck Lever 	},
1227b958cff6SChuck Lever 	{
1228b958cff6SChuck Lever 		.desc			= "Encrypt 9 bytes with camellia128-cts-cmac",
1229b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1230b958cff6SChuck Lever 		.constant		= 2,
1231b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test3_basekey,
1232b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_9byte_plaintext,
1233b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test3_confounder,
1234b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test3_expected_result,
1235b958cff6SChuck Lever 	},
1236b958cff6SChuck Lever 	{
1237b958cff6SChuck Lever 		.desc			= "Encrypt 13 bytes with camellia128-cts-cmac",
1238b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1239b958cff6SChuck Lever 		.constant		= 3,
1240b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test4_basekey,
1241b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_13byte_plaintext,
1242b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test4_confounder,
1243b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test4_expected_result,
1244b958cff6SChuck Lever 	},
1245b958cff6SChuck Lever 	{
1246b958cff6SChuck Lever 		.desc			= "Encrypt 30 bytes with camellia128-cts-cmac",
1247b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1248b958cff6SChuck Lever 		.constant		= 4,
1249b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test5_basekey,
1250b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_30byte_plaintext,
1251b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test5_confounder,
1252b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test5_expected_result,
1253b958cff6SChuck Lever 	},
1254b958cff6SChuck Lever 	{
1255b958cff6SChuck Lever 		.desc			= "Encrypt empty plaintext with camellia256-cts-cmac",
1256b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1257b958cff6SChuck Lever 		.constant		= 0,
1258b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test6_basekey,
1259b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_empty_plaintext,
1260b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test6_confounder,
1261b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test6_expected_result,
1262b958cff6SChuck Lever 	},
1263b958cff6SChuck Lever 	{
1264b958cff6SChuck Lever 		.desc			= "Encrypt 1 byte with camellia256-cts-cmac",
1265b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1266b958cff6SChuck Lever 		.constant		= 1,
1267b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test7_basekey,
1268b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_1byte_plaintext,
1269b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test7_confounder,
1270b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test7_expected_result,
1271b958cff6SChuck Lever 	},
1272b958cff6SChuck Lever 	{
1273b958cff6SChuck Lever 		.desc			= "Encrypt 9 bytes with camellia256-cts-cmac",
1274b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1275b958cff6SChuck Lever 		.constant		= 2,
1276b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test8_basekey,
1277b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_9byte_plaintext,
1278b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test8_confounder,
1279b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test8_expected_result,
1280b958cff6SChuck Lever 	},
1281b958cff6SChuck Lever 	{
1282b958cff6SChuck Lever 		.desc			= "Encrypt 13 bytes with camellia256-cts-cmac",
1283b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1284b958cff6SChuck Lever 		.constant		= 3,
1285b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test9_basekey,
1286b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_13byte_plaintext,
1287b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test9_confounder,
1288b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test9_expected_result,
1289b958cff6SChuck Lever 	},
1290b958cff6SChuck Lever 	{
1291b958cff6SChuck Lever 		.desc			= "Encrypt 30 bytes with camellia256-cts-cmac",
1292b958cff6SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1293b958cff6SChuck Lever 		.constant		= 4,
1294b958cff6SChuck Lever 		.base_key		= &rfc6803_enc_test10_basekey,
1295b958cff6SChuck Lever 		.plaintext		= &rfc6803_enc_30byte_plaintext,
1296b958cff6SChuck Lever 		.confounder		= &rfc6803_enc_test10_confounder,
1297b958cff6SChuck Lever 		.expected_result	= &rfc6803_enc_test10_expected_result,
1298b958cff6SChuck Lever 	},
1299b958cff6SChuck Lever };
1300b958cff6SChuck Lever 
1301b958cff6SChuck Lever /* Creates the function rfc6803_encrypt_gen_params */
1302b958cff6SChuck Lever KUNIT_ARRAY_PARAM(rfc6803_encrypt, rfc6803_encrypt_test_params,
1303b958cff6SChuck Lever 		  gss_krb5_get_desc);
1304b958cff6SChuck Lever 
1305b958cff6SChuck Lever static void rfc6803_encrypt_case(struct kunit *test)
1306b958cff6SChuck Lever {
1307b958cff6SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
1308b958cff6SChuck Lever 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
1309b958cff6SChuck Lever 	const struct gss_krb5_enctype *gk5e;
1310b958cff6SChuck Lever 	struct xdr_netobj Ke, Ki, checksum;
1311b958cff6SChuck Lever 	u8 usage_data[GSS_KRB5_K5CLENGTH];
1312b958cff6SChuck Lever 	struct xdr_netobj usage = {
1313b958cff6SChuck Lever 		.data = usage_data,
1314b958cff6SChuck Lever 		.len = sizeof(usage_data),
1315b958cff6SChuck Lever 	};
1316b958cff6SChuck Lever 	struct crypto_ahash *ahash_tfm;
1317b958cff6SChuck Lever 	unsigned int blocksize;
1318b958cff6SChuck Lever 	struct xdr_buf buf;
1319b958cff6SChuck Lever 	void *text;
1320b958cff6SChuck Lever 	size_t len;
1321b958cff6SChuck Lever 	u32 err;
1322b958cff6SChuck Lever 
1323b958cff6SChuck Lever 	/* Arrange */
1324b958cff6SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1325*fe90151cSChuck Lever 	if (!gk5e)
1326*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
1327b958cff6SChuck Lever 
1328b958cff6SChuck Lever 	usage.data[3] = param->constant;
1329b958cff6SChuck Lever 
1330b958cff6SChuck Lever 	Ke.len = gk5e->Ke_length;
1331b958cff6SChuck Lever 	Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL);
1332b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data);
1333b958cff6SChuck Lever 	usage.data[4] = KEY_USAGE_SEED_ENCRYPTION;
1334b958cff6SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &Ke, &usage, GFP_KERNEL);
1335b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1336b958cff6SChuck Lever 
1337b958cff6SChuck Lever 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
1338b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
1339b958cff6SChuck Lever 	err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len);
1340b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1341b958cff6SChuck Lever 
1342b958cff6SChuck Lever 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
1343b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
1344b958cff6SChuck Lever 	err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len);
1345b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1346b958cff6SChuck Lever 	blocksize = crypto_sync_skcipher_blocksize(cts_tfm);
1347b958cff6SChuck Lever 
1348b958cff6SChuck Lever 	len = param->confounder->len + param->plaintext->len + blocksize;
1349b958cff6SChuck Lever 	text = kunit_kzalloc(test, len, GFP_KERNEL);
1350b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
1351b958cff6SChuck Lever 	memcpy(text, param->confounder->data, param->confounder->len);
1352b958cff6SChuck Lever 	memcpy(text + param->confounder->len, param->plaintext->data,
1353b958cff6SChuck Lever 	       param->plaintext->len);
1354b958cff6SChuck Lever 
1355b958cff6SChuck Lever 	memset(&buf, 0, sizeof(buf));
1356b958cff6SChuck Lever 	buf.head[0].iov_base = text;
1357b958cff6SChuck Lever 	buf.head[0].iov_len = param->confounder->len + param->plaintext->len;
1358b958cff6SChuck Lever 	buf.len = buf.head[0].iov_len;
1359b958cff6SChuck Lever 
1360b958cff6SChuck Lever 	checksum.len = gk5e->cksumlength;
1361b958cff6SChuck Lever 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
1362b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
1363b958cff6SChuck Lever 
1364b958cff6SChuck Lever 	Ki.len = gk5e->Ki_length;
1365b958cff6SChuck Lever 	Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL);
1366b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data);
1367b958cff6SChuck Lever 	usage.data[4] = KEY_USAGE_SEED_INTEGRITY;
1368b958cff6SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &Ki,
1369b958cff6SChuck Lever 			       &usage, GFP_KERNEL);
1370b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1371b958cff6SChuck Lever 	ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
1372b958cff6SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm);
1373b958cff6SChuck Lever 	err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len);
1374b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1375b958cff6SChuck Lever 
1376b958cff6SChuck Lever 	/* Act */
1377b958cff6SChuck Lever 	err = gss_krb5_checksum(ahash_tfm, NULL, 0, &buf, 0, &checksum);
1378b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1379b958cff6SChuck Lever 
1380b958cff6SChuck Lever 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
1381b958cff6SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1382b958cff6SChuck Lever 
1383b958cff6SChuck Lever 	/* Assert */
1384b958cff6SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test, param->expected_result->len,
1385b958cff6SChuck Lever 			    buf.len + checksum.len,
1386b958cff6SChuck Lever 			    "ciphertext length mismatch");
1387b958cff6SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
1388b958cff6SChuck Lever 			    memcmp(param->expected_result->data,
1389b958cff6SChuck Lever 				   buf.head[0].iov_base, buf.len), 0,
1390b958cff6SChuck Lever 			    "encrypted result mismatch");
1391b958cff6SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
1392b958cff6SChuck Lever 			    memcmp(param->expected_result->data +
1393b958cff6SChuck Lever 				   (param->expected_result->len - checksum.len),
1394b958cff6SChuck Lever 				   checksum.data, checksum.len), 0,
1395b958cff6SChuck Lever 			    "HMAC mismatch");
1396b958cff6SChuck Lever 
1397b958cff6SChuck Lever 	crypto_free_ahash(ahash_tfm);
1398b958cff6SChuck Lever 	crypto_free_sync_skcipher(cts_tfm);
1399b958cff6SChuck Lever 	crypto_free_sync_skcipher(cbc_tfm);
1400b958cff6SChuck Lever }
1401b958cff6SChuck Lever 
140235f6e42eSChuck Lever static struct kunit_case rfc6803_test_cases[] = {
140335f6e42eSChuck Lever 	{
140435f6e42eSChuck Lever 		.name			= "RFC 6803 key derivation",
140535f6e42eSChuck Lever 		.run_case		= kdf_case,
140635f6e42eSChuck Lever 		.generate_params	= rfc6803_kdf_gen_params,
140735f6e42eSChuck Lever 	},
140802142b2cSChuck Lever 	{
140902142b2cSChuck Lever 		.name			= "RFC 6803 checksum",
141002142b2cSChuck Lever 		.run_case		= checksum_case,
141102142b2cSChuck Lever 		.generate_params	= rfc6803_checksum_gen_params,
141202142b2cSChuck Lever 	},
1413b958cff6SChuck Lever 	{
1414b958cff6SChuck Lever 		.name			= "RFC 6803 encryption",
1415b958cff6SChuck Lever 		.run_case		= rfc6803_encrypt_case,
1416b958cff6SChuck Lever 		.generate_params	= rfc6803_encrypt_gen_params,
1417b958cff6SChuck Lever 	},
141835f6e42eSChuck Lever };
141935f6e42eSChuck Lever 
142035f6e42eSChuck Lever static struct kunit_suite rfc6803_suite = {
142135f6e42eSChuck Lever 	.name			= "RFC 6803 suite",
142235f6e42eSChuck Lever 	.test_cases		= rfc6803_test_cases,
142335f6e42eSChuck Lever };
142435f6e42eSChuck Lever 
1425fcbad14bSChuck Lever /*
1426fcbad14bSChuck Lever  * From RFC 8009 Appendix A.  Test Vectors
1427fcbad14bSChuck Lever  *
1428fcbad14bSChuck Lever  * Sample results for SHA-2 enctype key derivation
1429fcbad14bSChuck Lever  *
1430fcbad14bSChuck Lever  * This test material is copyright (c) 2016 IETF Trust and the
1431fcbad14bSChuck Lever  * persons identified as the document authors.  All rights reserved.
1432fcbad14bSChuck Lever  */
1433fcbad14bSChuck Lever 
1434fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_basekey,
1435fcbad14bSChuck Lever 		      0x37, 0x05, 0xd9, 0x60, 0x80, 0xc1, 0x77, 0x28,
1436fcbad14bSChuck Lever 		      0xa0, 0xe8, 0x00, 0xea, 0xb6, 0xe0, 0xd2, 0x3c
1437fcbad14bSChuck Lever );
1438fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Kc,
1439fcbad14bSChuck Lever 		      0xb3, 0x1a, 0x01, 0x8a, 0x48, 0xf5, 0x47, 0x76,
1440fcbad14bSChuck Lever 		      0xf4, 0x03, 0xe9, 0xa3, 0x96, 0x32, 0x5d, 0xc3
1441fcbad14bSChuck Lever );
1442fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ke,
1443fcbad14bSChuck Lever 		      0x9b, 0x19, 0x7d, 0xd1, 0xe8, 0xc5, 0x60, 0x9d,
1444fcbad14bSChuck Lever 		      0x6e, 0x67, 0xc3, 0xe3, 0x7c, 0x62, 0xc7, 0x2e
1445fcbad14bSChuck Lever );
1446fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes128_cts_hmac_sha256_128_Ki,
1447fcbad14bSChuck Lever 		      0x9f, 0xda, 0x0e, 0x56, 0xab, 0x2d, 0x85, 0xe1,
1448fcbad14bSChuck Lever 		      0x56, 0x9a, 0x68, 0x86, 0x96, 0xc2, 0x6a, 0x6c
1449fcbad14bSChuck Lever );
1450fcbad14bSChuck Lever 
1451fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_basekey,
1452fcbad14bSChuck Lever 		      0x6d, 0x40, 0x4d, 0x37, 0xfa, 0xf7, 0x9f, 0x9d,
1453fcbad14bSChuck Lever 		      0xf0, 0xd3, 0x35, 0x68, 0xd3, 0x20, 0x66, 0x98,
1454fcbad14bSChuck Lever 		      0x00, 0xeb, 0x48, 0x36, 0x47, 0x2e, 0xa8, 0xa0,
1455fcbad14bSChuck Lever 		      0x26, 0xd1, 0x6b, 0x71, 0x82, 0x46, 0x0c, 0x52
1456fcbad14bSChuck Lever );
1457fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Kc,
1458fcbad14bSChuck Lever 		      0xef, 0x57, 0x18, 0xbe, 0x86, 0xcc, 0x84, 0x96,
1459fcbad14bSChuck Lever 		      0x3d, 0x8b, 0xbb, 0x50, 0x31, 0xe9, 0xf5, 0xc4,
1460fcbad14bSChuck Lever 		      0xba, 0x41, 0xf2, 0x8f, 0xaf, 0x69, 0xe7, 0x3d
1461fcbad14bSChuck Lever );
1462fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ke,
1463fcbad14bSChuck Lever 		      0x56, 0xab, 0x22, 0xbe, 0xe6, 0x3d, 0x82, 0xd7,
1464fcbad14bSChuck Lever 		      0xbc, 0x52, 0x27, 0xf6, 0x77, 0x3f, 0x8e, 0xa7,
1465fcbad14bSChuck Lever 		      0xa5, 0xeb, 0x1c, 0x82, 0x51, 0x60, 0xc3, 0x83,
1466fcbad14bSChuck Lever 		      0x12, 0x98, 0x0c, 0x44, 0x2e, 0x5c, 0x7e, 0x49
1467fcbad14bSChuck Lever );
1468fcbad14bSChuck Lever DEFINE_HEX_XDR_NETOBJ(aes256_cts_hmac_sha384_192_Ki,
1469fcbad14bSChuck Lever 		      0x69, 0xb1, 0x65, 0x14, 0xe3, 0xcd, 0x8e, 0x56,
1470fcbad14bSChuck Lever 		      0xb8, 0x20, 0x10, 0xd5, 0xc7, 0x30, 0x12, 0xb6,
1471fcbad14bSChuck Lever 		      0x22, 0xc4, 0xd0, 0x0f, 0xfc, 0x23, 0xed, 0x1f
1472fcbad14bSChuck Lever );
1473fcbad14bSChuck Lever 
1474fcbad14bSChuck Lever static const struct gss_krb5_test_param rfc8009_kdf_test_params[] = {
1475fcbad14bSChuck Lever 	{
1476fcbad14bSChuck Lever 		.desc			= "Derive Kc subkey for aes128-cts-hmac-sha256-128",
1477fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1478fcbad14bSChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1479fcbad14bSChuck Lever 		.usage			= &usage_checksum,
1480fcbad14bSChuck Lever 		.expected_result	= &aes128_cts_hmac_sha256_128_Kc,
1481fcbad14bSChuck Lever 	},
1482fcbad14bSChuck Lever 	{
1483fcbad14bSChuck Lever 		.desc			= "Derive Ke subkey for aes128-cts-hmac-sha256-128",
1484fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1485fcbad14bSChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1486fcbad14bSChuck Lever 		.usage			= &usage_encryption,
1487fcbad14bSChuck Lever 		.expected_result	= &aes128_cts_hmac_sha256_128_Ke,
1488fcbad14bSChuck Lever 	},
1489fcbad14bSChuck Lever 	{
1490fcbad14bSChuck Lever 		.desc			= "Derive Ki subkey for aes128-cts-hmac-sha256-128",
1491fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1492fcbad14bSChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1493fcbad14bSChuck Lever 		.usage			= &usage_integrity,
1494fcbad14bSChuck Lever 		.expected_result	= &aes128_cts_hmac_sha256_128_Ki,
1495fcbad14bSChuck Lever 	},
1496fcbad14bSChuck Lever 	{
1497fcbad14bSChuck Lever 		.desc			= "Derive Kc subkey for aes256-cts-hmac-sha384-192",
1498fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1499fcbad14bSChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1500fcbad14bSChuck Lever 		.usage			= &usage_checksum,
1501fcbad14bSChuck Lever 		.expected_result	= &aes256_cts_hmac_sha384_192_Kc,
1502fcbad14bSChuck Lever 	},
1503fcbad14bSChuck Lever 	{
1504fcbad14bSChuck Lever 		.desc			= "Derive Ke subkey for aes256-cts-hmac-sha384-192",
1505fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1506fcbad14bSChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1507fcbad14bSChuck Lever 		.usage			= &usage_encryption,
1508fcbad14bSChuck Lever 		.expected_result	= &aes256_cts_hmac_sha384_192_Ke,
1509fcbad14bSChuck Lever 	},
1510fcbad14bSChuck Lever 	{
1511fcbad14bSChuck Lever 		.desc			= "Derive Ki subkey for aes256-cts-hmac-sha384-192",
1512fcbad14bSChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1513fcbad14bSChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1514fcbad14bSChuck Lever 		.usage			= &usage_integrity,
1515fcbad14bSChuck Lever 		.expected_result	= &aes256_cts_hmac_sha384_192_Ki,
1516fcbad14bSChuck Lever 	},
1517fcbad14bSChuck Lever };
1518fcbad14bSChuck Lever 
1519fcbad14bSChuck Lever /* Creates the function rfc8009_kdf_gen_params */
1520fcbad14bSChuck Lever KUNIT_ARRAY_PARAM(rfc8009_kdf, rfc8009_kdf_test_params, gss_krb5_get_desc);
1521fcbad14bSChuck Lever 
1522003caf4fSChuck Lever /*
1523003caf4fSChuck Lever  * From RFC 8009 Appendix A.  Test Vectors
1524003caf4fSChuck Lever  *
1525003caf4fSChuck Lever  * These sample checksums use the above sample key derivation results,
1526003caf4fSChuck Lever  * including use of the same base-key and key usage values.
1527003caf4fSChuck Lever  *
1528003caf4fSChuck Lever  * This test material is copyright (c) 2016 IETF Trust and the
1529003caf4fSChuck Lever  * persons identified as the document authors.  All rights reserved.
1530003caf4fSChuck Lever  */
1531003caf4fSChuck Lever 
1532003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_plaintext,
1533003caf4fSChuck Lever 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1534003caf4fSChuck Lever 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1535003caf4fSChuck Lever 		      0x10, 0x11, 0x12, 0x13, 0x14
1536003caf4fSChuck Lever );
1537003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test1_expected_result,
1538003caf4fSChuck Lever 		      0xd7, 0x83, 0x67, 0x18, 0x66, 0x43, 0xd6, 0x7b,
1539003caf4fSChuck Lever 		      0x41, 0x1c, 0xba, 0x91, 0x39, 0xfc, 0x1d, 0xee
1540003caf4fSChuck Lever );
1541003caf4fSChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_checksum_test2_expected_result,
1542003caf4fSChuck Lever 		      0x45, 0xee, 0x79, 0x15, 0x67, 0xee, 0xfc, 0xa3,
1543003caf4fSChuck Lever 		      0x7f, 0x4a, 0xc1, 0xe0, 0x22, 0x2d, 0xe8, 0x0d,
1544003caf4fSChuck Lever 		      0x43, 0xc3, 0xbf, 0xa0, 0x66, 0x99, 0x67, 0x2a
1545003caf4fSChuck Lever );
1546003caf4fSChuck Lever 
1547003caf4fSChuck Lever static const struct gss_krb5_test_param rfc8009_checksum_test_params[] = {
1548003caf4fSChuck Lever 	{
1549003caf4fSChuck Lever 		.desc			= "Checksum with aes128-cts-hmac-sha256-128",
1550003caf4fSChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1551003caf4fSChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
1552003caf4fSChuck Lever 		.usage			= &usage_checksum,
1553003caf4fSChuck Lever 		.plaintext		= &rfc8009_checksum_plaintext,
1554003caf4fSChuck Lever 		.expected_result	= &rfc8009_checksum_test1_expected_result,
1555003caf4fSChuck Lever 	},
1556003caf4fSChuck Lever 	{
1557003caf4fSChuck Lever 		.desc			= "Checksum with aes256-cts-hmac-sha384-192",
1558003caf4fSChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1559003caf4fSChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
1560003caf4fSChuck Lever 		.usage			= &usage_checksum,
1561003caf4fSChuck Lever 		.plaintext		= &rfc8009_checksum_plaintext,
1562003caf4fSChuck Lever 		.expected_result	= &rfc8009_checksum_test2_expected_result,
1563003caf4fSChuck Lever 	},
1564003caf4fSChuck Lever };
1565003caf4fSChuck Lever 
1566003caf4fSChuck Lever /* Creates the function rfc8009_checksum_gen_params */
1567003caf4fSChuck Lever KUNIT_ARRAY_PARAM(rfc8009_checksum, rfc8009_checksum_test_params,
1568003caf4fSChuck Lever 		  gss_krb5_get_desc);
1569003caf4fSChuck Lever 
15704d2d15c0SChuck Lever /*
15714d2d15c0SChuck Lever  * From RFC 8009 Appendix A.  Test Vectors
15724d2d15c0SChuck Lever  *
15734d2d15c0SChuck Lever  * Sample encryptions (all using the default cipher state):
15744d2d15c0SChuck Lever  * --------------------------------------------------------
15754d2d15c0SChuck Lever  *
15764d2d15c0SChuck Lever  * These sample encryptions use the above sample key derivation results,
15774d2d15c0SChuck Lever  * including use of the same base-key and key usage values.
15784d2d15c0SChuck Lever  *
15794d2d15c0SChuck Lever  * This test material is copyright (c) 2016 IETF Trust and the
15804d2d15c0SChuck Lever  * persons identified as the document authors.  All rights reserved.
15814d2d15c0SChuck Lever  */
15824d2d15c0SChuck Lever 
15834d2d15c0SChuck Lever static const struct xdr_netobj rfc8009_enc_empty_plaintext = {
15844d2d15c0SChuck Lever 	.len	= 0,
15854d2d15c0SChuck Lever };
15864d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_short_plaintext,
15874d2d15c0SChuck Lever 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05
15884d2d15c0SChuck Lever );
15894d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_block_plaintext,
15904d2d15c0SChuck Lever 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
15914d2d15c0SChuck Lever 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
15924d2d15c0SChuck Lever );
15934d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_long_plaintext,
15944d2d15c0SChuck Lever 		      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
15954d2d15c0SChuck Lever 		      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
15964d2d15c0SChuck Lever 		      0x10, 0x11, 0x12, 0x13, 0x14
15974d2d15c0SChuck Lever );
15984d2d15c0SChuck Lever 
15994d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_confounder,
16004d2d15c0SChuck Lever 		      0x7e, 0x58, 0x95, 0xea, 0xf2, 0x67, 0x24, 0x35,
16014d2d15c0SChuck Lever 		      0xba, 0xd8, 0x17, 0xf5, 0x45, 0xa3, 0x71, 0x48
16024d2d15c0SChuck Lever );
16034d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_result,
16044d2d15c0SChuck Lever 		      0xef, 0x85, 0xfb, 0x89, 0x0b, 0xb8, 0x47, 0x2f,
16054d2d15c0SChuck Lever 		      0x4d, 0xab, 0x20, 0x39, 0x4d, 0xca, 0x78, 0x1d
16064d2d15c0SChuck Lever );
16074d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test1_expected_hmac,
16084d2d15c0SChuck Lever 		      0xad, 0x87, 0x7e, 0xda, 0x39, 0xd5, 0x0c, 0x87,
16094d2d15c0SChuck Lever 		      0x0c, 0x0d, 0x5a, 0x0a, 0x8e, 0x48, 0xc7, 0x18
16104d2d15c0SChuck Lever );
16114d2d15c0SChuck Lever 
16124d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_confounder,
16134d2d15c0SChuck Lever 		      0x7b, 0xca, 0x28, 0x5e, 0x2f, 0xd4, 0x13, 0x0f,
16144d2d15c0SChuck Lever 		      0xb5, 0x5b, 0x1a, 0x5c, 0x83, 0xbc, 0x5b, 0x24
16154d2d15c0SChuck Lever );
16164d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_result,
16174d2d15c0SChuck Lever 		      0x84, 0xd7, 0xf3, 0x07, 0x54, 0xed, 0x98, 0x7b,
16184d2d15c0SChuck Lever 		      0xab, 0x0b, 0xf3, 0x50, 0x6b, 0xeb, 0x09, 0xcf,
16194d2d15c0SChuck Lever 		      0xb5, 0x54, 0x02, 0xce, 0xf7, 0xe6
16204d2d15c0SChuck Lever );
16214d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test2_expected_hmac,
16224d2d15c0SChuck Lever 		      0x87, 0x7c, 0xe9, 0x9e, 0x24, 0x7e, 0x52, 0xd1,
16234d2d15c0SChuck Lever 		      0x6e, 0xd4, 0x42, 0x1d, 0xfd, 0xf8, 0x97, 0x6c
16244d2d15c0SChuck Lever );
16254d2d15c0SChuck Lever 
16264d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_confounder,
16274d2d15c0SChuck Lever 		      0x56, 0xab, 0x21, 0x71, 0x3f, 0xf6, 0x2c, 0x0a,
16284d2d15c0SChuck Lever 		      0x14, 0x57, 0x20, 0x0f, 0x6f, 0xa9, 0x94, 0x8f
16294d2d15c0SChuck Lever );
16304d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_result,
16314d2d15c0SChuck Lever 		      0x35, 0x17, 0xd6, 0x40, 0xf5, 0x0d, 0xdc, 0x8a,
16324d2d15c0SChuck Lever 		      0xd3, 0x62, 0x87, 0x22, 0xb3, 0x56, 0x9d, 0x2a,
16334d2d15c0SChuck Lever 		      0xe0, 0x74, 0x93, 0xfa, 0x82, 0x63, 0x25, 0x40,
16344d2d15c0SChuck Lever 		      0x80, 0xea, 0x65, 0xc1, 0x00, 0x8e, 0x8f, 0xc2
16354d2d15c0SChuck Lever );
16364d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test3_expected_hmac,
16374d2d15c0SChuck Lever 		      0x95, 0xfb, 0x48, 0x52, 0xe7, 0xd8, 0x3e, 0x1e,
16384d2d15c0SChuck Lever 		      0x7c, 0x48, 0xc3, 0x7e, 0xeb, 0xe6, 0xb0, 0xd3
16394d2d15c0SChuck Lever );
16404d2d15c0SChuck Lever 
16414d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_confounder,
16424d2d15c0SChuck Lever 		      0xa7, 0xa4, 0xe2, 0x9a, 0x47, 0x28, 0xce, 0x10,
16434d2d15c0SChuck Lever 		      0x66, 0x4f, 0xb6, 0x4e, 0x49, 0xad, 0x3f, 0xac
16444d2d15c0SChuck Lever );
16454d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_result,
16464d2d15c0SChuck Lever 		      0x72, 0x0f, 0x73, 0xb1, 0x8d, 0x98, 0x59, 0xcd,
16474d2d15c0SChuck Lever 		      0x6c, 0xcb, 0x43, 0x46, 0x11, 0x5c, 0xd3, 0x36,
16484d2d15c0SChuck Lever 		      0xc7, 0x0f, 0x58, 0xed, 0xc0, 0xc4, 0x43, 0x7c,
16494d2d15c0SChuck Lever 		      0x55, 0x73, 0x54, 0x4c, 0x31, 0xc8, 0x13, 0xbc,
16504d2d15c0SChuck Lever 		      0xe1, 0xe6, 0xd0, 0x72, 0xc1
16514d2d15c0SChuck Lever );
16524d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test4_expected_hmac,
16534d2d15c0SChuck Lever 		      0x86, 0xb3, 0x9a, 0x41, 0x3c, 0x2f, 0x92, 0xca,
16544d2d15c0SChuck Lever 		      0x9b, 0x83, 0x34, 0xa2, 0x87, 0xff, 0xcb, 0xfc
16554d2d15c0SChuck Lever );
16564d2d15c0SChuck Lever 
16574d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_confounder,
16584d2d15c0SChuck Lever 		      0xf7, 0x64, 0xe9, 0xfa, 0x15, 0xc2, 0x76, 0x47,
16594d2d15c0SChuck Lever 		      0x8b, 0x2c, 0x7d, 0x0c, 0x4e, 0x5f, 0x58, 0xe4
16604d2d15c0SChuck Lever );
16614d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_result,
16624d2d15c0SChuck Lever 		      0x41, 0xf5, 0x3f, 0xa5, 0xbf, 0xe7, 0x02, 0x6d,
16634d2d15c0SChuck Lever 		      0x91, 0xfa, 0xf9, 0xbe, 0x95, 0x91, 0x95, 0xa0
16644d2d15c0SChuck Lever );
16654d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test5_expected_hmac,
16664d2d15c0SChuck Lever 		      0x58, 0x70, 0x72, 0x73, 0xa9, 0x6a, 0x40, 0xf0,
16674d2d15c0SChuck Lever 		      0xa0, 0x19, 0x60, 0x62, 0x1a, 0xc6, 0x12, 0x74,
16684d2d15c0SChuck Lever 		      0x8b, 0x9b, 0xbf, 0xbe, 0x7e, 0xb4, 0xce, 0x3c
16694d2d15c0SChuck Lever );
16704d2d15c0SChuck Lever 
16714d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_confounder,
16724d2d15c0SChuck Lever 		      0xb8, 0x0d, 0x32, 0x51, 0xc1, 0xf6, 0x47, 0x14,
16734d2d15c0SChuck Lever 		      0x94, 0x25, 0x6f, 0xfe, 0x71, 0x2d, 0x0b, 0x9a
16744d2d15c0SChuck Lever );
16754d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_result,
16764d2d15c0SChuck Lever 		      0x4e, 0xd7, 0xb3, 0x7c, 0x2b, 0xca, 0xc8, 0xf7,
16774d2d15c0SChuck Lever 		      0x4f, 0x23, 0xc1, 0xcf, 0x07, 0xe6, 0x2b, 0xc7,
16784d2d15c0SChuck Lever 		      0xb7, 0x5f, 0xb3, 0xf6, 0x37, 0xb9
16794d2d15c0SChuck Lever );
16804d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test6_expected_hmac,
16814d2d15c0SChuck Lever 		      0xf5, 0x59, 0xc7, 0xf6, 0x64, 0xf6, 0x9e, 0xab,
16824d2d15c0SChuck Lever 		      0x7b, 0x60, 0x92, 0x23, 0x75, 0x26, 0xea, 0x0d,
16834d2d15c0SChuck Lever 		      0x1f, 0x61, 0xcb, 0x20, 0xd6, 0x9d, 0x10, 0xf2
16844d2d15c0SChuck Lever );
16854d2d15c0SChuck Lever 
16864d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_confounder,
16874d2d15c0SChuck Lever 		      0x53, 0xbf, 0x8a, 0x0d, 0x10, 0x52, 0x65, 0xd4,
16884d2d15c0SChuck Lever 		      0xe2, 0x76, 0x42, 0x86, 0x24, 0xce, 0x5e, 0x63
16894d2d15c0SChuck Lever );
16904d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_result,
16914d2d15c0SChuck Lever 		      0xbc, 0x47, 0xff, 0xec, 0x79, 0x98, 0xeb, 0x91,
16924d2d15c0SChuck Lever 		      0xe8, 0x11, 0x5c, 0xf8, 0xd1, 0x9d, 0xac, 0x4b,
16934d2d15c0SChuck Lever 		      0xbb, 0xe2, 0xe1, 0x63, 0xe8, 0x7d, 0xd3, 0x7f,
16944d2d15c0SChuck Lever 		      0x49, 0xbe, 0xca, 0x92, 0x02, 0x77, 0x64, 0xf6
16954d2d15c0SChuck Lever );
16964d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test7_expected_hmac,
16974d2d15c0SChuck Lever 		      0x8c, 0xf5, 0x1f, 0x14, 0xd7, 0x98, 0xc2, 0x27,
16984d2d15c0SChuck Lever 		      0x3f, 0x35, 0xdf, 0x57, 0x4d, 0x1f, 0x93, 0x2e,
16994d2d15c0SChuck Lever 		      0x40, 0xc4, 0xff, 0x25, 0x5b, 0x36, 0xa2, 0x66
17004d2d15c0SChuck Lever );
17014d2d15c0SChuck Lever 
17024d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_confounder,
17034d2d15c0SChuck Lever 		      0x76, 0x3e, 0x65, 0x36, 0x7e, 0x86, 0x4f, 0x02,
17044d2d15c0SChuck Lever 		      0xf5, 0x51, 0x53, 0xc7, 0xe3, 0xb5, 0x8a, 0xf1
17054d2d15c0SChuck Lever );
17064d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_result,
17074d2d15c0SChuck Lever 		      0x40, 0x01, 0x3e, 0x2d, 0xf5, 0x8e, 0x87, 0x51,
17084d2d15c0SChuck Lever 		      0x95, 0x7d, 0x28, 0x78, 0xbc, 0xd2, 0xd6, 0xfe,
17094d2d15c0SChuck Lever 		      0x10, 0x1c, 0xcf, 0xd5, 0x56, 0xcb, 0x1e, 0xae,
17104d2d15c0SChuck Lever 		      0x79, 0xdb, 0x3c, 0x3e, 0xe8, 0x64, 0x29, 0xf2,
17114d2d15c0SChuck Lever 		      0xb2, 0xa6, 0x02, 0xac, 0x86
17124d2d15c0SChuck Lever );
17134d2d15c0SChuck Lever DEFINE_HEX_XDR_NETOBJ(rfc8009_enc_test8_expected_hmac,
17144d2d15c0SChuck Lever 		      0xfe, 0xf6, 0xec, 0xb6, 0x47, 0xd6, 0x29, 0x5f,
17154d2d15c0SChuck Lever 		      0xae, 0x07, 0x7a, 0x1f, 0xeb, 0x51, 0x75, 0x08,
17164d2d15c0SChuck Lever 		      0xd2, 0xc1, 0x6b, 0x41, 0x92, 0xe0, 0x1f, 0x62
17174d2d15c0SChuck Lever );
17184d2d15c0SChuck Lever 
17194d2d15c0SChuck Lever static const struct gss_krb5_test_param rfc8009_encrypt_test_params[] = {
17204d2d15c0SChuck Lever 	{
17214d2d15c0SChuck Lever 		.desc			= "Encrypt empty plaintext with aes128-cts-hmac-sha256-128",
17224d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
17234d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_empty_plaintext,
17244d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test1_confounder,
17254d2d15c0SChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
17264d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test1_expected_result,
17274d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test1_expected_hmac,
17284d2d15c0SChuck Lever 	},
17294d2d15c0SChuck Lever 	{
17304d2d15c0SChuck Lever 		.desc			= "Encrypt short plaintext with aes128-cts-hmac-sha256-128",
17314d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
17324d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_short_plaintext,
17334d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test2_confounder,
17344d2d15c0SChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
17354d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test2_expected_result,
17364d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test2_expected_hmac,
17374d2d15c0SChuck Lever 	},
17384d2d15c0SChuck Lever 	{
17394d2d15c0SChuck Lever 		.desc			= "Encrypt block plaintext with aes128-cts-hmac-sha256-128",
17404d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
17414d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_block_plaintext,
17424d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test3_confounder,
17434d2d15c0SChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
17444d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test3_expected_result,
17454d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test3_expected_hmac,
17464d2d15c0SChuck Lever 	},
17474d2d15c0SChuck Lever 	{
17484d2d15c0SChuck Lever 		.desc			= "Encrypt long plaintext with aes128-cts-hmac-sha256-128",
17494d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
17504d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_long_plaintext,
17514d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test4_confounder,
17524d2d15c0SChuck Lever 		.base_key		= &aes128_cts_hmac_sha256_128_basekey,
17534d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test4_expected_result,
17544d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test4_expected_hmac,
17554d2d15c0SChuck Lever 	},
17564d2d15c0SChuck Lever 	{
17574d2d15c0SChuck Lever 		.desc			= "Encrypt empty plaintext with aes256-cts-hmac-sha384-192",
17584d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
17594d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_empty_plaintext,
17604d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test5_confounder,
17614d2d15c0SChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
17624d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test5_expected_result,
17634d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test5_expected_hmac,
17644d2d15c0SChuck Lever 	},
17654d2d15c0SChuck Lever 	{
17664d2d15c0SChuck Lever 		.desc			= "Encrypt short plaintext with aes256-cts-hmac-sha384-192",
17674d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
17684d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_short_plaintext,
17694d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test6_confounder,
17704d2d15c0SChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
17714d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test6_expected_result,
17724d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test6_expected_hmac,
17734d2d15c0SChuck Lever 	},
17744d2d15c0SChuck Lever 	{
17754d2d15c0SChuck Lever 		.desc			= "Encrypt block plaintext with aes256-cts-hmac-sha384-192",
17764d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
17774d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_block_plaintext,
17784d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test7_confounder,
17794d2d15c0SChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
17804d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test7_expected_result,
17814d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test7_expected_hmac,
17824d2d15c0SChuck Lever 	},
17834d2d15c0SChuck Lever 	{
17844d2d15c0SChuck Lever 		.desc			= "Encrypt long plaintext with aes256-cts-hmac-sha384-192",
17854d2d15c0SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
17864d2d15c0SChuck Lever 		.plaintext		= &rfc8009_enc_long_plaintext,
17874d2d15c0SChuck Lever 		.confounder		= &rfc8009_enc_test8_confounder,
17884d2d15c0SChuck Lever 		.base_key		= &aes256_cts_hmac_sha384_192_basekey,
17894d2d15c0SChuck Lever 		.expected_result	= &rfc8009_enc_test8_expected_result,
17904d2d15c0SChuck Lever 		.expected_hmac		= &rfc8009_enc_test8_expected_hmac,
17914d2d15c0SChuck Lever 	},
17924d2d15c0SChuck Lever };
17934d2d15c0SChuck Lever 
17944d2d15c0SChuck Lever /* Creates the function rfc8009_encrypt_gen_params */
17954d2d15c0SChuck Lever KUNIT_ARRAY_PARAM(rfc8009_encrypt, rfc8009_encrypt_test_params,
17964d2d15c0SChuck Lever 		  gss_krb5_get_desc);
17974d2d15c0SChuck Lever 
17984d2d15c0SChuck Lever static void rfc8009_encrypt_case(struct kunit *test)
17994d2d15c0SChuck Lever {
18004d2d15c0SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
18014d2d15c0SChuck Lever 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
18024d2d15c0SChuck Lever 	const struct gss_krb5_enctype *gk5e;
18034d2d15c0SChuck Lever 	struct xdr_netobj Ke, Ki, checksum;
18044d2d15c0SChuck Lever 	u8 usage_data[GSS_KRB5_K5CLENGTH];
18054d2d15c0SChuck Lever 	struct xdr_netobj usage = {
18064d2d15c0SChuck Lever 		.data = usage_data,
18074d2d15c0SChuck Lever 		.len = sizeof(usage_data),
18084d2d15c0SChuck Lever 	};
18094d2d15c0SChuck Lever 	struct crypto_ahash *ahash_tfm;
18104d2d15c0SChuck Lever 	struct xdr_buf buf;
18114d2d15c0SChuck Lever 	void *text;
18124d2d15c0SChuck Lever 	size_t len;
18134d2d15c0SChuck Lever 	u32 err;
18144d2d15c0SChuck Lever 
18154d2d15c0SChuck Lever 	/* Arrange */
18164d2d15c0SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1817*fe90151cSChuck Lever 	if (!gk5e)
1818*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
18194d2d15c0SChuck Lever 
18204d2d15c0SChuck Lever 	*(__be32 *)usage.data = cpu_to_be32(2);
18214d2d15c0SChuck Lever 
18224d2d15c0SChuck Lever 	Ke.len = gk5e->Ke_length;
18234d2d15c0SChuck Lever 	Ke.data = kunit_kzalloc(test, Ke.len, GFP_KERNEL);
18244d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ke.data);
18254d2d15c0SChuck Lever 	usage.data[4] = KEY_USAGE_SEED_ENCRYPTION;
18264d2d15c0SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &Ke,
18274d2d15c0SChuck Lever 			       &usage, GFP_KERNEL);
18284d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18294d2d15c0SChuck Lever 
18304d2d15c0SChuck Lever 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
18314d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
18324d2d15c0SChuck Lever 	err = crypto_sync_skcipher_setkey(cbc_tfm, Ke.data, Ke.len);
18334d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18344d2d15c0SChuck Lever 
18354d2d15c0SChuck Lever 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
18364d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
18374d2d15c0SChuck Lever 	err = crypto_sync_skcipher_setkey(cts_tfm, Ke.data, Ke.len);
18384d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18394d2d15c0SChuck Lever 
18404d2d15c0SChuck Lever 	len = param->confounder->len + param->plaintext->len;
18414d2d15c0SChuck Lever 	text = kunit_kzalloc(test, len, GFP_KERNEL);
18424d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
18434d2d15c0SChuck Lever 	memcpy(text, param->confounder->data, param->confounder->len);
18444d2d15c0SChuck Lever 	memcpy(text + param->confounder->len, param->plaintext->data,
18454d2d15c0SChuck Lever 	       param->plaintext->len);
18464d2d15c0SChuck Lever 
18474d2d15c0SChuck Lever 	memset(&buf, 0, sizeof(buf));
18484d2d15c0SChuck Lever 	buf.head[0].iov_base = text;
18494d2d15c0SChuck Lever 	buf.head[0].iov_len = param->confounder->len + param->plaintext->len;
18504d2d15c0SChuck Lever 	buf.len = buf.head[0].iov_len;
18514d2d15c0SChuck Lever 
18524d2d15c0SChuck Lever 	checksum.len = gk5e->cksumlength;
18534d2d15c0SChuck Lever 	checksum.data = kunit_kzalloc(test, checksum.len, GFP_KERNEL);
18544d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, checksum.data);
18554d2d15c0SChuck Lever 
18564d2d15c0SChuck Lever 	Ki.len = gk5e->Ki_length;
18574d2d15c0SChuck Lever 	Ki.data = kunit_kzalloc(test, Ki.len, GFP_KERNEL);
18584d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, Ki.data);
18594d2d15c0SChuck Lever 	usage.data[4] = KEY_USAGE_SEED_INTEGRITY;
18604d2d15c0SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &Ki,
18614d2d15c0SChuck Lever 			       &usage, GFP_KERNEL);
18624d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18634d2d15c0SChuck Lever 
18644d2d15c0SChuck Lever 	ahash_tfm = crypto_alloc_ahash(gk5e->cksum_name, 0, CRYPTO_ALG_ASYNC);
18654d2d15c0SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ahash_tfm);
18664d2d15c0SChuck Lever 	err = crypto_ahash_setkey(ahash_tfm, Ki.data, Ki.len);
18674d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18684d2d15c0SChuck Lever 
18694d2d15c0SChuck Lever 	/* Act */
18704d2d15c0SChuck Lever 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
18714d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18724d2d15c0SChuck Lever 	err = krb5_etm_checksum(cts_tfm, ahash_tfm, &buf, 0, &checksum);
18734d2d15c0SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
18744d2d15c0SChuck Lever 
18754d2d15c0SChuck Lever 	/* Assert */
18764d2d15c0SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
18774d2d15c0SChuck Lever 			    param->expected_result->len, buf.len,
18784d2d15c0SChuck Lever 			    "ciphertext length mismatch");
18794d2d15c0SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
18804d2d15c0SChuck Lever 			    memcmp(param->expected_result->data,
18814d2d15c0SChuck Lever 				   buf.head[0].iov_base,
18824d2d15c0SChuck Lever 				   param->expected_result->len), 0,
18834d2d15c0SChuck Lever 			    "ciphertext mismatch");
18844d2d15c0SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test, memcmp(param->expected_hmac->data,
18854d2d15c0SChuck Lever 					 checksum.data,
18864d2d15c0SChuck Lever 					 checksum.len), 0,
18874d2d15c0SChuck Lever 			    "HMAC mismatch");
18884d2d15c0SChuck Lever 
18894d2d15c0SChuck Lever 	crypto_free_ahash(ahash_tfm);
18904d2d15c0SChuck Lever 	crypto_free_sync_skcipher(cts_tfm);
18914d2d15c0SChuck Lever 	crypto_free_sync_skcipher(cbc_tfm);
18924d2d15c0SChuck Lever }
18934d2d15c0SChuck Lever 
1894fcbad14bSChuck Lever static struct kunit_case rfc8009_test_cases[] = {
1895fcbad14bSChuck Lever 	{
1896fcbad14bSChuck Lever 		.name			= "RFC 8009 key derivation",
1897fcbad14bSChuck Lever 		.run_case		= kdf_case,
1898fcbad14bSChuck Lever 		.generate_params	= rfc8009_kdf_gen_params,
1899fcbad14bSChuck Lever 	},
1900003caf4fSChuck Lever 	{
1901003caf4fSChuck Lever 		.name			= "RFC 8009 checksum",
1902003caf4fSChuck Lever 		.run_case		= checksum_case,
1903003caf4fSChuck Lever 		.generate_params	= rfc8009_checksum_gen_params,
1904003caf4fSChuck Lever 	},
19054d2d15c0SChuck Lever 	{
19064d2d15c0SChuck Lever 		.name			= "RFC 8009 encryption",
19074d2d15c0SChuck Lever 		.run_case		= rfc8009_encrypt_case,
19084d2d15c0SChuck Lever 		.generate_params	= rfc8009_encrypt_gen_params,
19094d2d15c0SChuck Lever 	},
1910fcbad14bSChuck Lever };
1911fcbad14bSChuck Lever 
1912fcbad14bSChuck Lever static struct kunit_suite rfc8009_suite = {
1913fcbad14bSChuck Lever 	.name			= "RFC 8009 suite",
1914fcbad14bSChuck Lever 	.test_cases		= rfc8009_test_cases,
1915fcbad14bSChuck Lever };
1916fcbad14bSChuck Lever 
1917c4a9f055SChuck Lever /*
1918c4a9f055SChuck Lever  * Encryption self-tests
1919c4a9f055SChuck Lever  */
1920c4a9f055SChuck Lever 
1921c4a9f055SChuck Lever DEFINE_STR_XDR_NETOBJ(encrypt_selftest_plaintext,
1922c4a9f055SChuck Lever 		      "This is the plaintext for the encryption self-test.");
1923c4a9f055SChuck Lever 
1924c4a9f055SChuck Lever static const struct gss_krb5_test_param encrypt_selftest_params[] = {
1925c4a9f055SChuck Lever 	{
1926c4a9f055SChuck Lever 		.desc			= "aes128-cts-hmac-sha1-96 encryption self-test",
1927c4a9f055SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA1_96,
1928c4a9f055SChuck Lever 		.Ke			= &rfc3962_encryption_key,
1929c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1930c4a9f055SChuck Lever 	},
1931c4a9f055SChuck Lever 	{
1932c4a9f055SChuck Lever 		.desc			= "aes256-cts-hmac-sha1-96 encryption self-test",
1933c4a9f055SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA1_96,
1934c4a9f055SChuck Lever 		.Ke			= &rfc3962_encryption_key,
1935c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1936c4a9f055SChuck Lever 	},
1937c4a9f055SChuck Lever 	{
1938c4a9f055SChuck Lever 		.desc			= "camellia128-cts-cmac encryption self-test",
1939c4a9f055SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA128_CTS_CMAC,
1940c4a9f055SChuck Lever 		.Ke			= &camellia128_cts_cmac_Ke,
1941c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1942c4a9f055SChuck Lever 	},
1943c4a9f055SChuck Lever 	{
1944c4a9f055SChuck Lever 		.desc			= "camellia256-cts-cmac encryption self-test",
1945c4a9f055SChuck Lever 		.enctype		= ENCTYPE_CAMELLIA256_CTS_CMAC,
1946c4a9f055SChuck Lever 		.Ke			= &camellia256_cts_cmac_Ke,
1947c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1948c4a9f055SChuck Lever 	},
1949c4a9f055SChuck Lever 	{
1950c4a9f055SChuck Lever 		.desc			= "aes128-cts-hmac-sha256-128 encryption self-test",
1951c4a9f055SChuck Lever 		.enctype		= ENCTYPE_AES128_CTS_HMAC_SHA256_128,
1952c4a9f055SChuck Lever 		.Ke			= &aes128_cts_hmac_sha256_128_Ke,
1953c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1954c4a9f055SChuck Lever 	},
1955c4a9f055SChuck Lever 	{
1956c4a9f055SChuck Lever 		.desc			= "aes256-cts-hmac-sha384-192 encryption self-test",
1957c4a9f055SChuck Lever 		.enctype		= ENCTYPE_AES256_CTS_HMAC_SHA384_192,
1958c4a9f055SChuck Lever 		.Ke			= &aes256_cts_hmac_sha384_192_Ke,
1959c4a9f055SChuck Lever 		.plaintext		= &encrypt_selftest_plaintext,
1960c4a9f055SChuck Lever 	},
1961c4a9f055SChuck Lever };
1962c4a9f055SChuck Lever 
1963c4a9f055SChuck Lever /* Creates the function encrypt_selftest_gen_params */
1964c4a9f055SChuck Lever KUNIT_ARRAY_PARAM(encrypt_selftest, encrypt_selftest_params,
1965c4a9f055SChuck Lever 		  gss_krb5_get_desc);
1966c4a9f055SChuck Lever 
1967c4a9f055SChuck Lever /*
1968c4a9f055SChuck Lever  * Encrypt and decrypt plaintext, and ensure the input plaintext
1969c4a9f055SChuck Lever  * matches the output plaintext. A confounder is not added in this
1970c4a9f055SChuck Lever  * case.
1971c4a9f055SChuck Lever  */
1972c4a9f055SChuck Lever static void encrypt_selftest_case(struct kunit *test)
1973c4a9f055SChuck Lever {
1974c4a9f055SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
1975c4a9f055SChuck Lever 	struct crypto_sync_skcipher *cts_tfm, *cbc_tfm;
1976c4a9f055SChuck Lever 	const struct gss_krb5_enctype *gk5e;
1977c4a9f055SChuck Lever 	struct xdr_buf buf;
1978c4a9f055SChuck Lever 	void *text;
1979c4a9f055SChuck Lever 	int err;
1980c4a9f055SChuck Lever 
1981c4a9f055SChuck Lever 	/* Arrange */
1982c4a9f055SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
1983*fe90151cSChuck Lever 	if (!gk5e)
1984*fe90151cSChuck Lever 		kunit_skip(test, "Encryption type is not available");
1985c4a9f055SChuck Lever 
1986c4a9f055SChuck Lever 	cbc_tfm = crypto_alloc_sync_skcipher(gk5e->aux_cipher, 0, 0);
1987c4a9f055SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cbc_tfm);
1988c4a9f055SChuck Lever 	err = crypto_sync_skcipher_setkey(cbc_tfm, param->Ke->data, param->Ke->len);
1989c4a9f055SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1990c4a9f055SChuck Lever 
1991c4a9f055SChuck Lever 	cts_tfm = crypto_alloc_sync_skcipher(gk5e->encrypt_name, 0, 0);
1992c4a9f055SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cts_tfm);
1993c4a9f055SChuck Lever 	err = crypto_sync_skcipher_setkey(cts_tfm, param->Ke->data, param->Ke->len);
1994c4a9f055SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
1995c4a9f055SChuck Lever 
1996c4a9f055SChuck Lever 	text = kunit_kzalloc(test, roundup(param->plaintext->len,
1997c4a9f055SChuck Lever 					   crypto_sync_skcipher_blocksize(cbc_tfm)),
1998c4a9f055SChuck Lever 			     GFP_KERNEL);
1999c4a9f055SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, text);
2000c4a9f055SChuck Lever 
2001c4a9f055SChuck Lever 	memcpy(text, param->plaintext->data, param->plaintext->len);
2002c4a9f055SChuck Lever 	memset(&buf, 0, sizeof(buf));
2003c4a9f055SChuck Lever 	buf.head[0].iov_base = text;
2004c4a9f055SChuck Lever 	buf.head[0].iov_len = param->plaintext->len;
2005c4a9f055SChuck Lever 	buf.len = buf.head[0].iov_len;
2006c4a9f055SChuck Lever 
2007c4a9f055SChuck Lever 	/* Act */
2008c4a9f055SChuck Lever 	err = krb5_cbc_cts_encrypt(cts_tfm, cbc_tfm, 0, &buf, NULL, NULL, 0);
2009c4a9f055SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
2010c4a9f055SChuck Lever 	err = krb5_cbc_cts_decrypt(cts_tfm, cbc_tfm, 0, &buf);
2011c4a9f055SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
2012c4a9f055SChuck Lever 
2013c4a9f055SChuck Lever 	/* Assert */
2014c4a9f055SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
2015c4a9f055SChuck Lever 			    param->plaintext->len, buf.len,
2016c4a9f055SChuck Lever 			    "length mismatch");
2017c4a9f055SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
2018c4a9f055SChuck Lever 			    memcmp(param->plaintext->data,
2019c4a9f055SChuck Lever 				   buf.head[0].iov_base, buf.len), 0,
2020c4a9f055SChuck Lever 			    "plaintext mismatch");
2021c4a9f055SChuck Lever 
2022c4a9f055SChuck Lever 	crypto_free_sync_skcipher(cts_tfm);
2023c4a9f055SChuck Lever 	crypto_free_sync_skcipher(cbc_tfm);
2024c4a9f055SChuck Lever }
2025c4a9f055SChuck Lever 
2026c4a9f055SChuck Lever static struct kunit_case encryption_test_cases[] = {
2027c4a9f055SChuck Lever 	{
2028c4a9f055SChuck Lever 		.name			= "Encryption self-tests",
2029c4a9f055SChuck Lever 		.run_case		= encrypt_selftest_case,
2030c4a9f055SChuck Lever 		.generate_params	= encrypt_selftest_gen_params,
2031c4a9f055SChuck Lever 	},
2032c4a9f055SChuck Lever };
2033c4a9f055SChuck Lever 
2034c4a9f055SChuck Lever static struct kunit_suite encryption_test_suite = {
2035c4a9f055SChuck Lever 	.name			= "Encryption test suite",
2036c4a9f055SChuck Lever 	.test_cases		= encryption_test_cases,
2037c4a9f055SChuck Lever };
2038c4a9f055SChuck Lever 
2039e1a9a384SChuck Lever kunit_test_suites(&rfc3961_suite,
204035f6e42eSChuck Lever 		  &rfc3962_suite,
2041fcbad14bSChuck Lever 		  &rfc6803_suite,
2042c4a9f055SChuck Lever 		  &rfc8009_suite,
2043c4a9f055SChuck Lever 		  &encryption_test_suite);
2044eebd8c2dSChuck Lever 
2045eebd8c2dSChuck Lever MODULE_DESCRIPTION("Test RPCSEC GSS Kerberos 5 functions");
2046eebd8c2dSChuck Lever MODULE_LICENSE("GPL");
2047