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>
13eebd8c2dSChuck Lever 
14eebd8c2dSChuck Lever #include <linux/sunrpc/xdr.h>
15eebd8c2dSChuck Lever #include <linux/sunrpc/gss_krb5.h>
16eebd8c2dSChuck Lever 
17eebd8c2dSChuck Lever #include "gss_krb5_internal.h"
18eebd8c2dSChuck Lever 
19eebd8c2dSChuck Lever MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
20eebd8c2dSChuck Lever 
21eebd8c2dSChuck Lever struct gss_krb5_test_param {
22eebd8c2dSChuck Lever 	const char			*desc;
23*6eb6b8a4SChuck Lever 	u32				enctype;
24eebd8c2dSChuck Lever 	u32				nfold;
25*6eb6b8a4SChuck Lever 	const struct xdr_netobj		*base_key;
26*6eb6b8a4SChuck Lever 	const struct xdr_netobj		*usage;
27eebd8c2dSChuck Lever 	const struct xdr_netobj         *plaintext;
28eebd8c2dSChuck Lever 	const struct xdr_netobj		*expected_result;
29eebd8c2dSChuck Lever };
30eebd8c2dSChuck Lever 
31eebd8c2dSChuck Lever static inline void gss_krb5_get_desc(const struct gss_krb5_test_param *param,
32eebd8c2dSChuck Lever 				     char *desc)
33eebd8c2dSChuck Lever {
34eebd8c2dSChuck Lever 	strscpy(desc, param->desc, KUNIT_PARAM_DESC_SIZE);
35eebd8c2dSChuck Lever }
36eebd8c2dSChuck Lever 
37*6eb6b8a4SChuck Lever static void kdf_case(struct kunit *test)
38*6eb6b8a4SChuck Lever {
39*6eb6b8a4SChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
40*6eb6b8a4SChuck Lever 	const struct gss_krb5_enctype *gk5e;
41*6eb6b8a4SChuck Lever 	struct xdr_netobj derivedkey;
42*6eb6b8a4SChuck Lever 	int err;
43*6eb6b8a4SChuck Lever 
44*6eb6b8a4SChuck Lever 	/* Arrange */
45*6eb6b8a4SChuck Lever 	gk5e = gss_krb5_lookup_enctype(param->enctype);
46*6eb6b8a4SChuck Lever 	KUNIT_ASSERT_NOT_NULL(test, gk5e);
47*6eb6b8a4SChuck Lever 
48*6eb6b8a4SChuck Lever 	derivedkey.data = kunit_kzalloc(test, param->expected_result->len,
49*6eb6b8a4SChuck Lever 					GFP_KERNEL);
50*6eb6b8a4SChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, derivedkey.data);
51*6eb6b8a4SChuck Lever 	derivedkey.len = param->expected_result->len;
52*6eb6b8a4SChuck Lever 
53*6eb6b8a4SChuck Lever 	/* Act */
54*6eb6b8a4SChuck Lever 	err = gk5e->derive_key(gk5e, param->base_key, &derivedkey,
55*6eb6b8a4SChuck Lever 			       param->usage, GFP_KERNEL);
56*6eb6b8a4SChuck Lever 	KUNIT_ASSERT_EQ(test, err, 0);
57*6eb6b8a4SChuck Lever 
58*6eb6b8a4SChuck Lever 	/* Assert */
59*6eb6b8a4SChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
60*6eb6b8a4SChuck Lever 			    memcmp(param->expected_result->data,
61*6eb6b8a4SChuck Lever 				   derivedkey.data, derivedkey.len), 0,
62*6eb6b8a4SChuck Lever 			    "key mismatch");
63*6eb6b8a4SChuck Lever }
64*6eb6b8a4SChuck Lever 
65eebd8c2dSChuck Lever #define DEFINE_HEX_XDR_NETOBJ(name, hex_array...)		\
66eebd8c2dSChuck Lever 	static const u8 name ## _data[] = { hex_array };	\
67eebd8c2dSChuck Lever 	static const struct xdr_netobj name = {			\
68eebd8c2dSChuck Lever 		.data	= (u8 *)name##_data,			\
69eebd8c2dSChuck Lever 		.len	= sizeof(name##_data),			\
70eebd8c2dSChuck Lever 	}
71eebd8c2dSChuck Lever 
72eebd8c2dSChuck Lever /*
73eebd8c2dSChuck Lever  * RFC 3961 Appendix A.1.  n-fold
74eebd8c2dSChuck Lever  *
75eebd8c2dSChuck Lever  * The n-fold function is defined in section 5.1 of RFC 3961.
76eebd8c2dSChuck Lever  *
77eebd8c2dSChuck Lever  * This test material is copyright (C) The Internet Society (2005).
78eebd8c2dSChuck Lever  */
79eebd8c2dSChuck Lever 
80eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_plaintext,
81eebd8c2dSChuck Lever 		      0x30, 0x31, 0x32, 0x33, 0x34, 0x35
82eebd8c2dSChuck Lever );
83eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test1_expected_result,
84eebd8c2dSChuck Lever 		      0xbe, 0x07, 0x26, 0x31, 0x27, 0x6b, 0x19, 0x55
85eebd8c2dSChuck Lever );
86eebd8c2dSChuck Lever 
87eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_plaintext,
88eebd8c2dSChuck Lever 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
89eebd8c2dSChuck Lever );
90eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test2_expected_result,
91eebd8c2dSChuck Lever 		      0x78, 0xa0, 0x7b, 0x6c, 0xaf, 0x85, 0xfa
92eebd8c2dSChuck Lever );
93eebd8c2dSChuck Lever 
94eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_plaintext,
95eebd8c2dSChuck Lever 		      0x52, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x43, 0x6f,
96eebd8c2dSChuck Lever 		      0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2c,
97eebd8c2dSChuck Lever 		      0x20, 0x61, 0x6e, 0x64, 0x20, 0x52, 0x75, 0x6e,
98eebd8c2dSChuck Lever 		      0x6e, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x64,
99eebd8c2dSChuck Lever 		      0x65
100eebd8c2dSChuck Lever );
101eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test3_expected_result,
102eebd8c2dSChuck Lever 		      0xbb, 0x6e, 0xd3, 0x08, 0x70, 0xb7, 0xf0, 0xe0
103eebd8c2dSChuck Lever );
104eebd8c2dSChuck Lever 
105eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_plaintext,
106eebd8c2dSChuck Lever 		      0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64
107eebd8c2dSChuck Lever );
108eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test4_expected_result,
109eebd8c2dSChuck Lever 		      0x59, 0xe4, 0xa8, 0xca, 0x7c, 0x03, 0x85, 0xc3,
110eebd8c2dSChuck Lever 		      0xc3, 0x7b, 0x3f, 0x6d, 0x20, 0x00, 0x24, 0x7c,
111eebd8c2dSChuck Lever 		      0xb6, 0xe6, 0xbd, 0x5b, 0x3e
112eebd8c2dSChuck Lever );
113eebd8c2dSChuck Lever 
114eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_plaintext,
115eebd8c2dSChuck Lever 		      0x4d, 0x41, 0x53, 0x53, 0x41, 0x43, 0x48, 0x56,
116eebd8c2dSChuck Lever 		      0x53, 0x45, 0x54, 0x54, 0x53, 0x20, 0x49, 0x4e,
117eebd8c2dSChuck Lever 		      0x53, 0x54, 0x49, 0x54, 0x56, 0x54, 0x45, 0x20,
118eebd8c2dSChuck Lever 		      0x4f, 0x46, 0x20, 0x54, 0x45, 0x43, 0x48, 0x4e,
119eebd8c2dSChuck Lever 		      0x4f, 0x4c, 0x4f, 0x47, 0x59
120eebd8c2dSChuck Lever );
121eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test5_expected_result,
122eebd8c2dSChuck Lever 		      0xdb, 0x3b, 0x0d, 0x8f, 0x0b, 0x06, 0x1e, 0x60,
123eebd8c2dSChuck Lever 		      0x32, 0x82, 0xb3, 0x08, 0xa5, 0x08, 0x41, 0x22,
124eebd8c2dSChuck Lever 		      0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b
125eebd8c2dSChuck Lever );
126eebd8c2dSChuck Lever 
127eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_plaintext,
128eebd8c2dSChuck Lever 		      0x51
129eebd8c2dSChuck Lever );
130eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test6_expected_result,
131eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
132eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15, 0xa8, 0x45, 0x2a,
133eebd8c2dSChuck Lever 		      0x51, 0x8a, 0x54, 0xa2, 0x15
134eebd8c2dSChuck Lever );
135eebd8c2dSChuck Lever 
136eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_plaintext,
137eebd8c2dSChuck Lever 		      0x62, 0x61
138eebd8c2dSChuck Lever );
139eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test7_expected_result,
140eebd8c2dSChuck Lever 		      0xfb, 0x25, 0xd5, 0x31, 0xae, 0x89, 0x74, 0x49,
141eebd8c2dSChuck Lever 		      0x9f, 0x52, 0xfd, 0x92, 0xea, 0x98, 0x57, 0xc4,
142eebd8c2dSChuck Lever 		      0xba, 0x24, 0xcf, 0x29, 0x7e
143eebd8c2dSChuck Lever );
144eebd8c2dSChuck Lever 
145eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test_kerberos,
146eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
147eebd8c2dSChuck Lever );
148eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test8_expected_result,
149eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
150eebd8c2dSChuck Lever );
151eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test9_expected_result,
152eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
153eebd8c2dSChuck Lever 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93
154eebd8c2dSChuck Lever );
155eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test10_expected_result,
156eebd8c2dSChuck Lever 		      0x83, 0x72, 0xc2, 0x36, 0x34, 0x4e, 0x5f, 0x15,
157eebd8c2dSChuck Lever 		      0x50, 0xcd, 0x07, 0x47, 0xe1, 0x5d, 0x62, 0xca,
158eebd8c2dSChuck Lever 		      0x7a, 0x5a, 0x3b, 0xce, 0xa4
159eebd8c2dSChuck Lever );
160eebd8c2dSChuck Lever DEFINE_HEX_XDR_NETOBJ(nfold_test11_expected_result,
161eebd8c2dSChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73,
162eebd8c2dSChuck Lever 		      0x7b, 0x9b, 0x5b, 0x2b, 0x93, 0x13, 0x2b, 0x93,
163eebd8c2dSChuck Lever 		      0x5c, 0x9b, 0xdc, 0xda, 0xd9, 0x5c, 0x98, 0x99,
164eebd8c2dSChuck Lever 		      0xc4, 0xca, 0xe4, 0xde, 0xe6, 0xd6, 0xca, 0xe4
165eebd8c2dSChuck Lever );
166eebd8c2dSChuck Lever 
167eebd8c2dSChuck Lever static const struct gss_krb5_test_param rfc3961_nfold_test_params[] = {
168eebd8c2dSChuck Lever 	{
169eebd8c2dSChuck Lever 		.desc			= "64-fold(\"012345\")",
170eebd8c2dSChuck Lever 		.nfold			= 64,
171eebd8c2dSChuck Lever 		.plaintext		= &nfold_test1_plaintext,
172eebd8c2dSChuck Lever 		.expected_result	= &nfold_test1_expected_result,
173eebd8c2dSChuck Lever 	},
174eebd8c2dSChuck Lever 	{
175eebd8c2dSChuck Lever 		.desc			= "56-fold(\"password\")",
176eebd8c2dSChuck Lever 		.nfold			= 56,
177eebd8c2dSChuck Lever 		.plaintext		= &nfold_test2_plaintext,
178eebd8c2dSChuck Lever 		.expected_result	= &nfold_test2_expected_result,
179eebd8c2dSChuck Lever 	},
180eebd8c2dSChuck Lever 	{
181eebd8c2dSChuck Lever 		.desc			= "64-fold(\"Rough Consensus, and Running Code\")",
182eebd8c2dSChuck Lever 		.nfold			= 64,
183eebd8c2dSChuck Lever 		.plaintext		= &nfold_test3_plaintext,
184eebd8c2dSChuck Lever 		.expected_result	= &nfold_test3_expected_result,
185eebd8c2dSChuck Lever 	},
186eebd8c2dSChuck Lever 	{
187eebd8c2dSChuck Lever 		.desc			= "168-fold(\"password\")",
188eebd8c2dSChuck Lever 		.nfold			= 168,
189eebd8c2dSChuck Lever 		.plaintext		= &nfold_test4_plaintext,
190eebd8c2dSChuck Lever 		.expected_result	= &nfold_test4_expected_result,
191eebd8c2dSChuck Lever 	},
192eebd8c2dSChuck Lever 	{
193eebd8c2dSChuck Lever 		.desc			= "192-fold(\"MASSACHVSETTS INSTITVTE OF TECHNOLOGY\")",
194eebd8c2dSChuck Lever 		.nfold			= 192,
195eebd8c2dSChuck Lever 		.plaintext		= &nfold_test5_plaintext,
196eebd8c2dSChuck Lever 		.expected_result	= &nfold_test5_expected_result,
197eebd8c2dSChuck Lever 	},
198eebd8c2dSChuck Lever 	{
199eebd8c2dSChuck Lever 		.desc			= "168-fold(\"Q\")",
200eebd8c2dSChuck Lever 		.nfold			= 168,
201eebd8c2dSChuck Lever 		.plaintext		= &nfold_test6_plaintext,
202eebd8c2dSChuck Lever 		.expected_result	= &nfold_test6_expected_result,
203eebd8c2dSChuck Lever 	},
204eebd8c2dSChuck Lever 	{
205eebd8c2dSChuck Lever 		.desc			= "168-fold(\"ba\")",
206eebd8c2dSChuck Lever 		.nfold			= 168,
207eebd8c2dSChuck Lever 		.plaintext		= &nfold_test7_plaintext,
208eebd8c2dSChuck Lever 		.expected_result	= &nfold_test7_expected_result,
209eebd8c2dSChuck Lever 	},
210eebd8c2dSChuck Lever 	{
211eebd8c2dSChuck Lever 		.desc			= "64-fold(\"kerberos\")",
212eebd8c2dSChuck Lever 		.nfold			= 64,
213eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
214eebd8c2dSChuck Lever 		.expected_result	= &nfold_test8_expected_result,
215eebd8c2dSChuck Lever 	},
216eebd8c2dSChuck Lever 	{
217eebd8c2dSChuck Lever 		.desc			= "128-fold(\"kerberos\")",
218eebd8c2dSChuck Lever 		.nfold			= 128,
219eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
220eebd8c2dSChuck Lever 		.expected_result	= &nfold_test9_expected_result,
221eebd8c2dSChuck Lever 	},
222eebd8c2dSChuck Lever 	{
223eebd8c2dSChuck Lever 		.desc			= "168-fold(\"kerberos\")",
224eebd8c2dSChuck Lever 		.nfold			= 168,
225eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
226eebd8c2dSChuck Lever 		.expected_result	= &nfold_test10_expected_result,
227eebd8c2dSChuck Lever 	},
228eebd8c2dSChuck Lever 	{
229eebd8c2dSChuck Lever 		.desc			= "256-fold(\"kerberos\")",
230eebd8c2dSChuck Lever 		.nfold			= 256,
231eebd8c2dSChuck Lever 		.plaintext		= &nfold_test_kerberos,
232eebd8c2dSChuck Lever 		.expected_result	= &nfold_test11_expected_result,
233eebd8c2dSChuck Lever 	},
234eebd8c2dSChuck Lever };
235eebd8c2dSChuck Lever 
236eebd8c2dSChuck Lever /* Creates the function rfc3961_nfold_gen_params */
237eebd8c2dSChuck Lever KUNIT_ARRAY_PARAM(rfc3961_nfold, rfc3961_nfold_test_params, gss_krb5_get_desc);
238eebd8c2dSChuck Lever 
239eebd8c2dSChuck Lever static void rfc3961_nfold_case(struct kunit *test)
240eebd8c2dSChuck Lever {
241eebd8c2dSChuck Lever 	const struct gss_krb5_test_param *param = test->param_value;
242eebd8c2dSChuck Lever 	u8 *result;
243eebd8c2dSChuck Lever 
244eebd8c2dSChuck Lever 	/* Arrange */
245eebd8c2dSChuck Lever 	result = kunit_kzalloc(test, 4096, GFP_KERNEL);
246eebd8c2dSChuck Lever 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, result);
247eebd8c2dSChuck Lever 
248eebd8c2dSChuck Lever 	/* Act */
249eebd8c2dSChuck Lever 	krb5_nfold(param->plaintext->len * 8, param->plaintext->data,
250eebd8c2dSChuck Lever 		   param->expected_result->len * 8, result);
251eebd8c2dSChuck Lever 
252eebd8c2dSChuck Lever 	/* Assert */
253eebd8c2dSChuck Lever 	KUNIT_EXPECT_EQ_MSG(test,
254eebd8c2dSChuck Lever 			    memcmp(param->expected_result->data,
255eebd8c2dSChuck Lever 				   result, param->expected_result->len), 0,
256eebd8c2dSChuck Lever 			    "result mismatch");
257eebd8c2dSChuck Lever }
258eebd8c2dSChuck Lever 
259*6eb6b8a4SChuck Lever /*
260*6eb6b8a4SChuck Lever  * RFC 3961 Appendix A.3.  DES3 DR and DK
261*6eb6b8a4SChuck Lever  *
262*6eb6b8a4SChuck Lever  * These tests show the derived-random and derived-key values for the
263*6eb6b8a4SChuck Lever  * des3-hmac-sha1-kd encryption scheme, using the DR and DK functions
264*6eb6b8a4SChuck Lever  * defined in section 6.3.1.  The input keys were randomly generated;
265*6eb6b8a4SChuck Lever  * the usage values are from this specification.
266*6eb6b8a4SChuck Lever  *
267*6eb6b8a4SChuck Lever  * This test material is copyright (C) The Internet Society (2005).
268*6eb6b8a4SChuck Lever  */
269*6eb6b8a4SChuck Lever 
270*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_155,
271*6eb6b8a4SChuck Lever 		      0x00, 0x00, 0x00, 0x01, 0x55
272*6eb6b8a4SChuck Lever );
273*6eb6b8a4SChuck Lever 
274*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_1aa,
275*6eb6b8a4SChuck Lever 		      0x00, 0x00, 0x00, 0x01, 0xaa
276*6eb6b8a4SChuck Lever );
277*6eb6b8a4SChuck Lever 
278*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_usage_kerberos,
279*6eb6b8a4SChuck Lever 		      0x6b, 0x65, 0x72, 0x62, 0x65, 0x72, 0x6f, 0x73
280*6eb6b8a4SChuck Lever );
281*6eb6b8a4SChuck Lever 
282*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_base_key,
283*6eb6b8a4SChuck Lever 		      0xdc, 0xe0, 0x6b, 0x1f, 0x64, 0xc8, 0x57, 0xa1,
284*6eb6b8a4SChuck Lever 		      0x1c, 0x3d, 0xb5, 0x7c, 0x51, 0x89, 0x9b, 0x2c,
285*6eb6b8a4SChuck Lever 		      0xc1, 0x79, 0x10, 0x08, 0xce, 0x97, 0x3b, 0x92
286*6eb6b8a4SChuck Lever );
287*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test1_derived_key,
288*6eb6b8a4SChuck Lever 		      0x92, 0x51, 0x79, 0xd0, 0x45, 0x91, 0xa7, 0x9b,
289*6eb6b8a4SChuck Lever 		      0x5d, 0x31, 0x92, 0xc4, 0xa7, 0xe9, 0xc2, 0x89,
290*6eb6b8a4SChuck Lever 		      0xb0, 0x49, 0xc7, 0x1f, 0x6e, 0xe6, 0x04, 0xcd
291*6eb6b8a4SChuck Lever );
292*6eb6b8a4SChuck Lever 
293*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_base_key,
294*6eb6b8a4SChuck Lever 		      0x5e, 0x13, 0xd3, 0x1c, 0x70, 0xef, 0x76, 0x57,
295*6eb6b8a4SChuck Lever 		      0x46, 0x57, 0x85, 0x31, 0xcb, 0x51, 0xc1, 0x5b,
296*6eb6b8a4SChuck Lever 		      0xf1, 0x1c, 0xa8, 0x2c, 0x97, 0xce, 0xe9, 0xf2
297*6eb6b8a4SChuck Lever );
298*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test2_derived_key,
299*6eb6b8a4SChuck Lever 		      0x9e, 0x58, 0xe5, 0xa1, 0x46, 0xd9, 0x94, 0x2a,
300*6eb6b8a4SChuck Lever 		      0x10, 0x1c, 0x46, 0x98, 0x45, 0xd6, 0x7a, 0x20,
301*6eb6b8a4SChuck Lever 		      0xe3, 0xc4, 0x25, 0x9e, 0xd9, 0x13, 0xf2, 0x07
302*6eb6b8a4SChuck Lever );
303*6eb6b8a4SChuck Lever 
304*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_base_key,
305*6eb6b8a4SChuck Lever 		      0x98, 0xe6, 0xfd, 0x8a, 0x04, 0xa4, 0xb6, 0x85,
306*6eb6b8a4SChuck Lever 		      0x9b, 0x75, 0xa1, 0x76, 0x54, 0x0b, 0x97, 0x52,
307*6eb6b8a4SChuck Lever 		      0xba, 0xd3, 0xec, 0xd6, 0x10, 0xa2, 0x52, 0xbc
308*6eb6b8a4SChuck Lever );
309*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test3_derived_key,
310*6eb6b8a4SChuck Lever 		      0x13, 0xfe, 0xf8, 0x0d, 0x76, 0x3e, 0x94, 0xec,
311*6eb6b8a4SChuck Lever 		      0x6d, 0x13, 0xfd, 0x2c, 0xa1, 0xd0, 0x85, 0x07,
312*6eb6b8a4SChuck Lever 		      0x02, 0x49, 0xda, 0xd3, 0x98, 0x08, 0xea, 0xbf
313*6eb6b8a4SChuck Lever );
314*6eb6b8a4SChuck Lever 
315*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_base_key,
316*6eb6b8a4SChuck Lever 		      0x62, 0x2a, 0xec, 0x25, 0xa2, 0xfe, 0x2c, 0xad,
317*6eb6b8a4SChuck Lever 		      0x70, 0x94, 0x68, 0x0b, 0x7c, 0x64, 0x94, 0x02,
318*6eb6b8a4SChuck Lever 		      0x80, 0x08, 0x4c, 0x1a, 0x7c, 0xec, 0x92, 0xb5
319*6eb6b8a4SChuck Lever );
320*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test4_derived_key,
321*6eb6b8a4SChuck Lever 		      0xf8, 0xdf, 0xbf, 0x04, 0xb0, 0x97, 0xe6, 0xd9,
322*6eb6b8a4SChuck Lever 		      0xdc, 0x07, 0x02, 0x68, 0x6b, 0xcb, 0x34, 0x89,
323*6eb6b8a4SChuck Lever 		      0xd9, 0x1f, 0xd9, 0xa4, 0x51, 0x6b, 0x70, 0x3e
324*6eb6b8a4SChuck Lever );
325*6eb6b8a4SChuck Lever 
326*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_base_key,
327*6eb6b8a4SChuck Lever 		      0xd3, 0xf8, 0x29, 0x8c, 0xcb, 0x16, 0x64, 0x38,
328*6eb6b8a4SChuck Lever 		      0xdc, 0xb9, 0xb9, 0x3e, 0xe5, 0xa7, 0x62, 0x92,
329*6eb6b8a4SChuck Lever 		      0x86, 0xa4, 0x91, 0xf8, 0x38, 0xf8, 0x02, 0xfb
330*6eb6b8a4SChuck Lever );
331*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test5_derived_key,
332*6eb6b8a4SChuck Lever 		      0x23, 0x70, 0xda, 0x57, 0x5d, 0x2a, 0x3d, 0xa8,
333*6eb6b8a4SChuck Lever 		      0x64, 0xce, 0xbf, 0xdc, 0x52, 0x04, 0xd5, 0x6d,
334*6eb6b8a4SChuck Lever 		      0xf7, 0x79, 0xa7, 0xdf, 0x43, 0xd9, 0xda, 0x43
335*6eb6b8a4SChuck Lever );
336*6eb6b8a4SChuck Lever 
337*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_base_key,
338*6eb6b8a4SChuck Lever 		      0xc1, 0x08, 0x16, 0x49, 0xad, 0xa7, 0x43, 0x62,
339*6eb6b8a4SChuck Lever 		      0xe6, 0xa1, 0x45, 0x9d, 0x01, 0xdf, 0xd3, 0x0d,
340*6eb6b8a4SChuck Lever 		      0x67, 0xc2, 0x23, 0x4c, 0x94, 0x07, 0x04, 0xda
341*6eb6b8a4SChuck Lever );
342*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test6_derived_key,
343*6eb6b8a4SChuck Lever 		      0x34, 0x80, 0x57, 0xec, 0x98, 0xfd, 0xc4, 0x80,
344*6eb6b8a4SChuck Lever 		      0x16, 0x16, 0x1c, 0x2a, 0x4c, 0x7a, 0x94, 0x3e,
345*6eb6b8a4SChuck Lever 		      0x92, 0xae, 0x49, 0x2c, 0x98, 0x91, 0x75, 0xf7
346*6eb6b8a4SChuck Lever );
347*6eb6b8a4SChuck Lever 
348*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_base_key,
349*6eb6b8a4SChuck Lever 		      0x5d, 0x15, 0x4a, 0xf2, 0x38, 0xf4, 0x67, 0x13,
350*6eb6b8a4SChuck Lever 		      0x15, 0x57, 0x19, 0xd5, 0x5e, 0x2f, 0x1f, 0x79,
351*6eb6b8a4SChuck Lever 		      0x0d, 0xd6, 0x61, 0xf2, 0x79, 0xa7, 0x91, 0x7c
352*6eb6b8a4SChuck Lever );
353*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test7_derived_key,
354*6eb6b8a4SChuck Lever 		      0xa8, 0x80, 0x8a, 0xc2, 0x67, 0xda, 0xda, 0x3d,
355*6eb6b8a4SChuck Lever 		      0xcb, 0xe9, 0xa7, 0xc8, 0x46, 0x26, 0xfb, 0xc7,
356*6eb6b8a4SChuck Lever 		      0x61, 0xc2, 0x94, 0xb0, 0x13, 0x15, 0xe5, 0xc1
357*6eb6b8a4SChuck Lever );
358*6eb6b8a4SChuck Lever 
359*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_base_key,
360*6eb6b8a4SChuck Lever 		      0x79, 0x85, 0x62, 0xe0, 0x49, 0x85, 0x2f, 0x57,
361*6eb6b8a4SChuck Lever 		      0xdc, 0x8c, 0x34, 0x3b, 0xa1, 0x7f, 0x2c, 0xa1,
362*6eb6b8a4SChuck Lever 		      0xd9, 0x73, 0x94, 0xef, 0xc8, 0xad, 0xc4, 0x43
363*6eb6b8a4SChuck Lever );
364*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test8_derived_key,
365*6eb6b8a4SChuck Lever 		      0xc8, 0x13, 0xf8, 0x8a, 0x3b, 0xe3, 0xb3, 0x34,
366*6eb6b8a4SChuck Lever 		      0xf7, 0x54, 0x25, 0xce, 0x91, 0x75, 0xfb, 0xe3,
367*6eb6b8a4SChuck Lever 		      0xc8, 0x49, 0x3b, 0x89, 0xc8, 0x70, 0x3b, 0x49
368*6eb6b8a4SChuck Lever );
369*6eb6b8a4SChuck Lever 
370*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_base_key,
371*6eb6b8a4SChuck Lever 		      0x26, 0xdc, 0xe3, 0x34, 0xb5, 0x45, 0x29, 0x2f,
372*6eb6b8a4SChuck Lever 		      0x2f, 0xea, 0xb9, 0xa8, 0x70, 0x1a, 0x89, 0xa4,
373*6eb6b8a4SChuck Lever 		      0xb9, 0x9e, 0xb9, 0x94, 0x2c, 0xec, 0xd0, 0x16
374*6eb6b8a4SChuck Lever );
375*6eb6b8a4SChuck Lever DEFINE_HEX_XDR_NETOBJ(des3_dk_test9_derived_key,
376*6eb6b8a4SChuck Lever 		      0xf4, 0x8f, 0xfd, 0x6e, 0x83, 0xf8, 0x3e, 0x73,
377*6eb6b8a4SChuck Lever 		      0x54, 0xe6, 0x94, 0xfd, 0x25, 0x2c, 0xf8, 0x3b,
378*6eb6b8a4SChuck Lever 		      0xfe, 0x58, 0xf7, 0xd5, 0xba, 0x37, 0xec, 0x5d
379*6eb6b8a4SChuck Lever );
380*6eb6b8a4SChuck Lever 
381*6eb6b8a4SChuck Lever static const struct gss_krb5_test_param rfc3961_kdf_test_params[] = {
382*6eb6b8a4SChuck Lever 	{
383*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 1",
384*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
385*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test1_base_key,
386*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
387*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test1_derived_key,
388*6eb6b8a4SChuck Lever 	},
389*6eb6b8a4SChuck Lever 	{
390*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 2",
391*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
392*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test2_base_key,
393*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
394*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test2_derived_key,
395*6eb6b8a4SChuck Lever 	},
396*6eb6b8a4SChuck Lever 	{
397*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 3",
398*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
399*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test3_base_key,
400*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
401*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test3_derived_key,
402*6eb6b8a4SChuck Lever 	},
403*6eb6b8a4SChuck Lever 	{
404*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 4",
405*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
406*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test4_base_key,
407*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
408*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test4_derived_key,
409*6eb6b8a4SChuck Lever 	},
410*6eb6b8a4SChuck Lever 	{
411*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 5",
412*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
413*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test5_base_key,
414*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_kerberos,
415*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test5_derived_key,
416*6eb6b8a4SChuck Lever 	},
417*6eb6b8a4SChuck Lever 	{
418*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 6",
419*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
420*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test6_base_key,
421*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
422*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test6_derived_key,
423*6eb6b8a4SChuck Lever 	},
424*6eb6b8a4SChuck Lever 	{
425*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 7",
426*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
427*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test7_base_key,
428*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
429*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test7_derived_key,
430*6eb6b8a4SChuck Lever 	},
431*6eb6b8a4SChuck Lever 	{
432*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 8",
433*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
434*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test8_base_key,
435*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_155,
436*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test8_derived_key,
437*6eb6b8a4SChuck Lever 	},
438*6eb6b8a4SChuck Lever 	{
439*6eb6b8a4SChuck Lever 		.desc			= "des3-hmac-sha1 key derivation case 9",
440*6eb6b8a4SChuck Lever 		.enctype		= ENCTYPE_DES3_CBC_RAW,
441*6eb6b8a4SChuck Lever 		.base_key		= &des3_dk_test9_base_key,
442*6eb6b8a4SChuck Lever 		.usage			= &des3_dk_usage_1aa,
443*6eb6b8a4SChuck Lever 		.expected_result	= &des3_dk_test9_derived_key,
444*6eb6b8a4SChuck Lever 	},
445*6eb6b8a4SChuck Lever };
446*6eb6b8a4SChuck Lever 
447*6eb6b8a4SChuck Lever /* Creates the function rfc3961_kdf_gen_params */
448*6eb6b8a4SChuck Lever KUNIT_ARRAY_PARAM(rfc3961_kdf, rfc3961_kdf_test_params, gss_krb5_get_desc);
449*6eb6b8a4SChuck Lever 
450eebd8c2dSChuck Lever static struct kunit_case rfc3961_test_cases[] = {
451eebd8c2dSChuck Lever 	{
452eebd8c2dSChuck Lever 		.name			= "RFC 3961 n-fold",
453eebd8c2dSChuck Lever 		.run_case		= rfc3961_nfold_case,
454eebd8c2dSChuck Lever 		.generate_params	= rfc3961_nfold_gen_params,
455eebd8c2dSChuck Lever 	},
456*6eb6b8a4SChuck Lever 	{
457*6eb6b8a4SChuck Lever 		.name			= "RFC 3961 key derivation",
458*6eb6b8a4SChuck Lever 		.run_case		= kdf_case,
459*6eb6b8a4SChuck Lever 		.generate_params	= rfc3961_kdf_gen_params,
460*6eb6b8a4SChuck Lever 	},
461eebd8c2dSChuck Lever };
462eebd8c2dSChuck Lever 
463eebd8c2dSChuck Lever static struct kunit_suite rfc3961_suite = {
464eebd8c2dSChuck Lever 	.name			= "RFC 3961 tests",
465eebd8c2dSChuck Lever 	.test_cases		= rfc3961_test_cases,
466eebd8c2dSChuck Lever };
467eebd8c2dSChuck Lever 
468eebd8c2dSChuck Lever kunit_test_suites(&rfc3961_suite);
469eebd8c2dSChuck Lever 
470eebd8c2dSChuck Lever MODULE_DESCRIPTION("Test RPCSEC GSS Kerberos 5 functions");
471eebd8c2dSChuck Lever MODULE_LICENSE("GPL");
472