• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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