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