1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2024 Philippe Reynes <philippe.reynes@softathome.com>
4  *
5  * Unit tests for sha256_hmac functions
6  */
7 
8 #include <command.h>
9 #include <test/lib.h>
10 #include <test/test.h>
11 #include <test/ut.h>
12 #include <u-boot/sha256.h>
13 
14 struct test_sha256_hmac_s {
15 	const unsigned char *key;
16 	int keylen;
17 	const unsigned char *input;
18 	int ilen;
19 	const unsigned char *expected;
20 	int elen;
21 };
22 
23 /*
24  * data comes from:
25  * https://datatracker.ietf.org/doc/html/rfc4231
26  */
27 static unsigned char key_test1[] = {
28 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
29 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
30 
31 static unsigned char input_test1[] = {
32 	0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 };
33 
34 static unsigned char expected_test1[] = {
35 	0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53,
36 	0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b,
37 	0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7,
38 	0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7 };
39 
40 static unsigned char key_test2[] = { 0x4a, 0x65, 0x66, 0x65 };
41 
42 static unsigned char input_test2[] = {
43 	0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
44 	0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
45 	0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
46 	0x69, 0x6e, 0x67, 0x3f };
47 
48 static unsigned char expected_test2[] = {
49 	0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
50 	0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
51 	0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
52 	0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 };
53 
54 static unsigned char key_test3[] = {
55 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
56 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
57 	0xaa, 0xaa, 0xaa, 0xaa };
58 
59 static unsigned char input_test3[] = {
60 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
61 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
62 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
63 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
64 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
65 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
66 	0xdd, 0xdd };
67 
68 static unsigned char expected_test3[] = {
69 	0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46,
70 	0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7,
71 	0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
72 	0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe };
73 
74 static unsigned char key_test4[] = {
75 	0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
76 	0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
77 	0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
78 	0x19,
79 };
80 
81 static unsigned char input_test4[] = {
82 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
83 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
84 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
85 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
86 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
87 	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
88 	0xcd, 0xcd,
89 };
90 
91 static unsigned char expected_test4[] = {
92 	0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e,
93 	0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a,
94 	0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
95 	0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
96 };
97 
98 static unsigned char key_test5[] = {
99 	0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
100 	0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
101 	0x0c, 0x0c, 0x0c, 0x0c,
102 };
103 
104 static unsigned char input_test5[] = {
105 	0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74,
106 	0x68, 0x20, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61,
107 	0x74, 0x69, 0x6f, 0x6e,
108 };
109 
110 static unsigned char expected_test5[] = {
111 	0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
112 	0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
113 };
114 
115 static unsigned char key_test6[] = {
116 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
117 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
118 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
119 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
120 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
121 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
122 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
123 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
124 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
125 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
126 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
127 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
128 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
129 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
130 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
131 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
132 	0xaa, 0xaa, 0xaa };
133 
134 static unsigned char input_test6[] = {
135 	0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69,
136 	0x6e, 0x67, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65,
137 	0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42,
138 	0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a,
139 	0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20,
140 	0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79,
141 	0x20, 0x46, 0x69, 0x72, 0x73, 0x74 };
142 
143 static unsigned char expected_test6[] = {
144 	0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f,
145 	0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f,
146 	0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
147 	0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54 };
148 
149 static unsigned char key_test7[] = {
150 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
151 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
152 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
153 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
154 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
155 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
156 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
157 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
158 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
159 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
160 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
161 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
162 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
163 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
164 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
165 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
166 	0xaa, 0xaa, 0xaa,
167 };
168 
169 static unsigned char input_test7[] = {
170 	0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
171 	0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75,
172 	0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c,
173 	0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68,
174 	0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
175 	0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65,
176 	0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20,
177 	0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74,
178 	0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63,
179 	0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64,
180 	0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x65,
181 	0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65,
182 	0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
183 	0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20,
184 	0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62,
185 	0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65,
186 	0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
187 	0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c,
188 	0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e,
189 };
190 
191 static unsigned char expected_test7[] = {
192 	0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb,
193 	0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44,
194 	0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
195 	0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
196 };
197 
198 static struct test_sha256_hmac_s test_sha256_hmac[] = {
199 	{
200 		.key = key_test1,
201 		.keylen = sizeof(key_test1),
202 		.input = input_test1,
203 		.ilen = sizeof(input_test1),
204 		.expected = expected_test1,
205 		.elen = sizeof(expected_test1),
206 	},
207 	{
208 		.key = key_test2,
209 		.keylen = sizeof(key_test2),
210 		.input = input_test2,
211 		.ilen = sizeof(input_test2),
212 		.expected = expected_test2,
213 		.elen = sizeof(expected_test2),
214 	},
215 	{
216 		.key = key_test3,
217 		.keylen = sizeof(key_test3),
218 		.input = input_test3,
219 		.ilen = sizeof(input_test3),
220 		.expected = expected_test3,
221 		.elen = sizeof(expected_test3),
222 	},
223 	{
224 		.key = key_test4,
225 		.keylen = sizeof(key_test4),
226 		.input = input_test4,
227 		.ilen = sizeof(input_test4),
228 		.expected = expected_test4,
229 		.elen = sizeof(expected_test4),
230 	},
231 	{
232 		.key = key_test5,
233 		.keylen = sizeof(key_test5),
234 		.input = input_test5,
235 		.ilen = sizeof(input_test5),
236 		.expected = expected_test5,
237 		.elen = sizeof(expected_test5),
238 	},
239 	{
240 		.key = key_test6,
241 		.keylen = sizeof(key_test6),
242 		.input = input_test6,
243 		.ilen = sizeof(input_test6),
244 		.expected = expected_test6,
245 		.elen = sizeof(expected_test6),
246 	},
247 	{
248 		.key = key_test7,
249 		.keylen = sizeof(key_test7),
250 		.input = input_test7,
251 		.ilen = sizeof(input_test7),
252 		.expected = expected_test7,
253 		.elen = sizeof(expected_test7),
254 	},
255 };
256 
_lib_test_sha256_hmac_run(struct unit_test_state * uts,const unsigned char * key,int keylen,const unsigned char * input,int ilen,const unsigned char * expected,int elen)257 static int _lib_test_sha256_hmac_run(struct unit_test_state *uts,
258 				     const unsigned char *key, int keylen,
259 				     const unsigned char *input, int ilen,
260 				     const unsigned char *expected, int elen)
261 {
262 	unsigned char output[SHA256_SUM_LEN];
263 	int ret;
264 
265 	ut_assert(elen <= sizeof(output));
266 	ret = sha256_hmac(key, keylen, input, ilen, output);
267 	ut_assert(!ret);
268 	ut_asserteq_mem(expected, output, elen);
269 
270 	return 0;
271 }
272 
lib_test_sha256_hmac_run(struct unit_test_state * uts,struct test_sha256_hmac_s * test)273 static int lib_test_sha256_hmac_run(struct unit_test_state *uts,
274 				    struct test_sha256_hmac_s *test)
275 {
276 	return _lib_test_sha256_hmac_run(uts, test->key, test->keylen,
277 					 test->input, test->ilen,
278 					 test->expected, test->elen);
279 }
280 
lib_test_sha256_hmac(struct unit_test_state * uts)281 static int lib_test_sha256_hmac(struct unit_test_state *uts)
282 {
283 	int i, ret = 0;
284 
285 	for (i = 0; i < ARRAY_SIZE(test_sha256_hmac); i++) {
286 		ret = lib_test_sha256_hmac_run(uts, &test_sha256_hmac[i]);
287 		if (ret)
288 			return ret;
289 	}
290 
291 	return 0;
292 }
293 
294 LIB_TEST(lib_test_sha256_hmac, 0);
295