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