1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2024 Philippe Reynes <philippe.reynes@softathome.com>
4 *
5 * Unit tests for sha256_hkdf 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_hkdf_s {
15 const unsigned char *salt;
16 int saltlen;
17 const unsigned char *ikm;
18 int ikmlen;
19 const unsigned char *info;
20 int infolen;
21 const unsigned char *expected;
22 int expectedlen;
23 };
24
25 /*
26 * data comes from:
27 * https://www.rfc-editor.org/rfc/rfc5869
28 */
29 static unsigned char salt_test1[] = {
30 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
31 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c };
32
33 static unsigned char ikm_test1[] = {
34 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
35 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
36 };
37
38 static unsigned char info_test1[] = {
39 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9
40 };
41
42 static unsigned char expected_test1[] = {
43 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a,
44 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
45 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
46 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf,
47 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
48 0x58, 0x65
49 };
50
51 static unsigned char salt_test2[] = {
52 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
53 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
54 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
55 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
56 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
57 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
58 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
59 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
60 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
61 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
62 };
63
64 static unsigned char ikm_test2[] = {
65 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
66 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
67 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
68 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
69 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
70 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
71 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
72 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
73 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
74 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
75 };
76
77 static unsigned char info_test2[] = {
78 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
79 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
80 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
81 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
82 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
83 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
84 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
85 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
86 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
87 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
88 };
89
90 static unsigned char expected_test2[] = {
91 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1,
92 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34,
93 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
94 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c,
95 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72,
96 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
97 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8,
98 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71,
99 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
100 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f,
101 0x1d, 0x87,
102 };
103
104 static unsigned char salt_test3[] = {
105 };
106
107 static unsigned char ikm_test3[] = {
108 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
109 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
110 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
111 };
112
113 static unsigned char info_test3[] = {
114 };
115
116 static unsigned char expected_test3[] = {
117 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
118 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
119 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
120 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
121 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
122 0x96, 0xc8,
123 };
124
125 static struct test_sha256_hkdf_s test_sha256_hkdf[] = {
126 {
127 .salt = salt_test1,
128 .saltlen = sizeof(salt_test1),
129 .ikm = ikm_test1,
130 .ikmlen = sizeof(ikm_test1),
131 .info = info_test1,
132 .infolen = sizeof(info_test1),
133 .expected = expected_test1,
134 .expectedlen = sizeof(expected_test1),
135 },
136 {
137 .salt = salt_test2,
138 .saltlen = sizeof(salt_test2),
139 .ikm = ikm_test2,
140 .ikmlen = sizeof(ikm_test2),
141 .info = info_test2,
142 .infolen = sizeof(info_test2),
143 .expected = expected_test2,
144 .expectedlen = sizeof(expected_test2),
145 },
146 {
147 .salt = salt_test3,
148 .saltlen = sizeof(salt_test3),
149 .ikm = ikm_test3,
150 .ikmlen = sizeof(ikm_test3),
151 .info = info_test3,
152 .infolen = sizeof(info_test3),
153 .expected = expected_test3,
154 .expectedlen = sizeof(expected_test3),
155 },
156 };
157
_lib_test_sha256_hkdf_run(struct unit_test_state * uts,const unsigned char * salt,int saltlen,const unsigned char * ikm,int ikmlen,const unsigned char * info,int infolen,const unsigned char * expected,int expectedlen)158 static int _lib_test_sha256_hkdf_run(struct unit_test_state *uts,
159 const unsigned char *salt, int saltlen,
160 const unsigned char *ikm, int ikmlen,
161 const unsigned char *info, int infolen,
162 const unsigned char *expected,
163 int expectedlen)
164 {
165 unsigned char output[256];
166 int ret;
167
168 ut_assert(expectedlen <= sizeof(output));
169 ret = sha256_hkdf(salt, saltlen, ikm, ikmlen, info, infolen, output, expectedlen);
170 ut_assert(!ret);
171 ut_asserteq_mem(expected, output, expectedlen);
172
173 return 0;
174 }
175
lib_test_sha256_hkdf_run(struct unit_test_state * uts,struct test_sha256_hkdf_s * test)176 static int lib_test_sha256_hkdf_run(struct unit_test_state *uts,
177 struct test_sha256_hkdf_s *test)
178 {
179 return _lib_test_sha256_hkdf_run(uts, test->salt, test->saltlen,
180 test->ikm, test->ikmlen,
181 test->info, test->infolen,
182 test->expected, test->expectedlen);
183 }
184
lib_test_sha256_hkdf(struct unit_test_state * uts)185 static int lib_test_sha256_hkdf(struct unit_test_state *uts)
186 {
187 int i, ret = 0;
188
189 for (i = 0; i < ARRAY_SIZE(test_sha256_hkdf); i++) {
190 ret = lib_test_sha256_hkdf_run(uts, &test_sha256_hkdf[i]);
191 if (ret)
192 return ret;
193 }
194
195 return 0;
196 }
197
198 LIB_TEST(lib_test_sha256_hkdf, 0);
199