blob: 5277b44eba506de0501fe177800621ed5167db00 [file] [log] [blame]
Philippe Reynes0486d422024-12-19 14:05:53 +01001// 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
14struct 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 */
29static unsigned char salt_test1[] = {
30 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
31 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c };
32
33static 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
38static unsigned char info_test1[] = {
39 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9
40};
41
42static 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
51static 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
64static 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
77static 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
90static 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
104static unsigned char salt_test3[] = {
105};
106
107static 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
113static unsigned char info_test3[] = {
114};
115
116static 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
125static 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
158static 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
176static 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
185static 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
198LIB_TEST(lib_test_sha256_hkdf, 0);