1 /*
2 * Test program for SHA256
3 * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Alternatively, this software may be distributed under the terms of BSD
10 * license.
11 *
12 * See README and COPYING for more details.
13 */
14
15 #include "includes.h"
16
17 #include "common.h"
18 #include "sha256.h"
19 #include "crypto.h"
20
21 struct {
22 char *data;
23 u8 hash[32];
24 } tests[] = {
25 {
26 "abc",
27 {
28 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
29 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
30 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
31 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
32 }
33 },
34 {
35 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
36 {
37 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
38 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
39 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
40 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
41 }
42 }
43 };
44
45 struct hmac_test {
46 u8 key[80];
47 size_t key_len;
48 u8 data[128];
49 size_t data_len;
50 u8 hash[32];
51 } hmac_tests[] = {
52 /* draft-ietf-ipsec-ciph-sha-256-01.txt */
53 {
54 {
55 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
56 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
57 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
58 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
59 },
60 32,
61 "abc", 3,
62 {
63 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
64 0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
65 0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
66 0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
67 }
68 },
69 {
70 {
71 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
72 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
73 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
74 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
75 },
76 32,
77 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
78 56,
79 {
80 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
81 0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
82 0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
83 0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
84 }
85 },
86 {
87 {
88 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
89 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
90 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
91 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
92 },
93 32,
94 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
95 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
96 112,
97 {
98 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
99 0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
100 0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
101 0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
102 }
103 },
104 {
105 {
106 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
107 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
108 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
109 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
110 },
111 32,
112 "Hi There",
113 8,
114 {
115 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
116 0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
117 0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
118 0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
119 }
120 },
121 {
122 "Jefe",
123 4,
124 "what do ya want for nothing?",
125 28,
126 {
127 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
128 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
129 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
130 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
131 }
132 },
133 {
134 {
135 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
136 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
137 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
138 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
139 },
140 32,
141 {
142 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
143 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
144 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
145 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
146 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
147 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
148 0xdd, 0xdd
149 },
150 50,
151 {
152 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
153 0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
154 0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
155 0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
156 }
157 },
158 {
159 {
160 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
161 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
162 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
163 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
164 0x21, 0x22, 0x23, 0x24, 0x25
165 },
166 37,
167 {
168 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
169 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
170 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
171 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
172 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
173 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
174 0xcd, 0xcd
175 },
176 50,
177 {
178 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
179 0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
180 0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
181 0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
182 }
183 },
184 {
185 {
186 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
187 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
188 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
189 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
190 },
191 32,
192 "Test With Truncation",
193 20,
194 {
195 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
196 0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
197 0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
198 0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
199 }
200 },
201 {
202 {
203 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
204 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
205 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
206 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
207 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
208 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
209 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
210 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
211 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
212 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
213 },
214 80,
215 "Test Using Larger Than Block-Size Key - Hash Key First",
216 54,
217 {
218 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
219 0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
220 0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
221 0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
222 }
223 },
224 {
225 {
226 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
227 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
228 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
229 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
230 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
231 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
232 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
233 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
234 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
235 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
236 },
237 80,
238 "Test Using Larger Than Block-Size Key and Larger Than One "
239 "Block-Size Data",
240 73,
241 {
242 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
243 0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
244 0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
245 0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
246 }
247 }
248 };
249
250
main(int argc,char * argv[])251 int main(int argc, char *argv[])
252 {
253
254 unsigned int i;
255 u8 hash[32];
256 const u8 *addr[2];
257 size_t len[2];
258 int errors = 0;
259
260 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
261 printf("SHA256 test case %d:", i + 1);
262
263 addr[0] = (u8 *) tests[i].data;
264 len[0] = strlen(tests[i].data);
265 sha256_vector(1, addr, len, hash);
266 if (memcmp(hash, tests[i].hash, 32) != 0) {
267 printf(" FAIL");
268 errors++;
269 } else
270 printf(" OK");
271
272 if (len[0]) {
273 addr[0] = (u8 *) tests[i].data;
274 len[0] = 1;
275 addr[1] = (u8 *) tests[i].data + 1;
276 len[1] = strlen(tests[i].data) - 1;
277 sha256_vector(2, addr, len, hash);
278 if (memcmp(hash, tests[i].hash, 32) != 0) {
279 printf(" FAIL");
280 errors++;
281 } else
282 printf(" OK");
283 }
284
285 printf("\n");
286 }
287
288 for (i = 0; i < sizeof(hmac_tests) / sizeof(hmac_tests[0]); i++) {
289 struct hmac_test *t = &hmac_tests[i];
290 printf("HMAC-SHA256 test case %d:", i + 1);
291
292 hmac_sha256(t->key, t->key_len, t->data, t->data_len, hash);
293 if (memcmp(hash, t->hash, 32) != 0) {
294 printf(" FAIL");
295 errors++;
296 } else
297 printf(" OK");
298
299 addr[0] = t->data;
300 len[0] = t->data_len;
301 hmac_sha256_vector(t->key, t->key_len, 1, addr, len, hash);
302 if (memcmp(hash, t->hash, 32) != 0) {
303 printf(" FAIL");
304 errors++;
305 } else
306 printf(" OK");
307
308 if (len[0]) {
309 addr[0] = t->data;
310 len[0] = 1;
311 addr[1] = t->data + 1;
312 len[1] = t->data_len - 1;
313 hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
314 hash);
315 if (memcmp(hash, t->hash, 32) != 0) {
316 printf(" FAIL");
317 errors++;
318 } else
319 printf(" OK");
320 }
321
322 printf("\n");
323 }
324
325 printf("Test IEEE 802.11r KDF\n");
326 sha256_prf("abc", 3, "KDF test", "data", 4, hash, sizeof(hash));
327 /* TODO: add proper test case for this */
328
329 return errors;
330 }
331