blob: 5279dd78e0f8ee432b46992676a8e407f08d8ebf [file] [log] [blame]
Philippe Reynesbda1dd02024-12-19 14:05:51 +01001// 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
14struct 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 */
27static 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
31static unsigned char input_test1[] = {
32 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 };
33
34static 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
40static unsigned char key_test2[] = { 0x4a, 0x65, 0x66, 0x65 };
41
42static 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
48static 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
54static 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
59static 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
68static 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
74static 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
81static 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
91static 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
98static 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
104static 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
110static unsigned char expected_test5[] = {
111 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
112 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
113};
114
115static 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
134static 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
143static 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
149static 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
169static 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
191static 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
198static 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
257static 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
273static 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
281static 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
294LIB_TEST(lib_test_sha256_hmac, 0);