1 /*  test_sha256.c - TinyCrypt implementation of some SHA-256 tests */
2 
3 /*
4  *  Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are met:
8  *
9  *    - Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *
12  *    - Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  *    - Neither the name of Intel Corporation nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  *  POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34   DESCRIPTION
35   This module tests the following SHA256 routines:
36 
37   Scenarios tested include:
38   - NIST SHA256 test vectors
39 */
40 
41 #include <tinycrypt/sha256.h>
42 #include <tinycrypt/constants.h>
43 #include <test_utils.h>
44 
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <string.h>
48 #include <stdint.h>
49 
50 /*
51  * NIST SHA256 test vector 1.
52  */
test_1(void)53 unsigned int test_1(void)
54 {
55         unsigned int result = TC_PASS;
56 
57         TC_PRINT("SHA256 test #1:\n");
58         const uint8_t expected[32] = {
59 		0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
60 		0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
61 		0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
62         };
63         const char *m = "abc";
64         uint8_t digest[32];
65         struct tc_sha256_state_struct s;
66 
67         (void)tc_sha256_init(&s);
68         tc_sha256_update(&s, (const uint8_t *) m, strlen(m));
69         (void)tc_sha256_final(digest, &s);
70         result = check_result(1, expected, sizeof(expected),
71 			      digest, sizeof(digest));
72         TC_END_RESULT(result);
73         return result;
74 }
75 
76 /*
77  * NIST SHA256 test vector 2.
78  */
test_2(void)79 unsigned int test_2(void)
80 {
81         unsigned int result = TC_PASS;
82         TC_PRINT("SHA256 test #2:\n");
83         const uint8_t expected[32] = {
84 		0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93,
85 		0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
86 		0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
87         };
88         const char *m = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
89         uint8_t digest[32];
90         struct tc_sha256_state_struct s;
91 
92         (void)tc_sha256_init(&s);
93         tc_sha256_update(&s, (const uint8_t *) m, strlen(m));
94         (void) tc_sha256_final(digest, &s);
95 
96         result = check_result(2, expected, sizeof(expected),
97 			      digest, sizeof(digest));
98         TC_END_RESULT(result);
99         return result;
100 }
101 
test_3(void)102 unsigned int test_3(void)
103 {
104         unsigned int result = TC_PASS;
105         TC_PRINT("SHA256 test #3:\n");
106         const uint8_t expected[32] = {
107 		0x68, 0x32, 0x57, 0x20, 0xaa, 0xbd, 0x7c, 0x82, 0xf3, 0x0f, 0x55, 0x4b,
108 		0x31, 0x3d, 0x05, 0x70, 0xc9, 0x5a, 0xcc, 0xbb, 0x7d, 0xc4, 0xb5, 0xaa,
109 		0xe1, 0x12, 0x04, 0xc0, 0x8f, 0xfe, 0x73, 0x2b
110         };
111         const uint8_t m[1] = { 0xbd };
112         uint8_t digest[32];
113         struct tc_sha256_state_struct s;
114 
115         (void)tc_sha256_init(&s);
116         tc_sha256_update(&s, m, sizeof(m));
117         (void)tc_sha256_final(digest, &s);
118 
119         result = check_result(3, expected, sizeof(expected),
120 			      digest, sizeof(digest));
121         TC_END_RESULT(result);
122         return result;
123 }
124 
test_4(void)125 unsigned int test_4(void)
126 {
127         unsigned int result = TC_PASS;
128         TC_PRINT("SHA256 test #4:\n");
129         const uint8_t expected[32] = {
130 		0x7a, 0xbc, 0x22, 0xc0, 0xae, 0x5a, 0xf2, 0x6c, 0xe9, 0x3d, 0xbb, 0x94,
131 		0x43, 0x3a, 0x0e, 0x0b, 0x2e, 0x11, 0x9d, 0x01, 0x4f, 0x8e, 0x7f, 0x65,
132 		0xbd, 0x56, 0xc6, 0x1c, 0xcc, 0xcd, 0x95, 0x04
133         };
134         const uint8_t m[4] = { 0xc9, 0x8c, 0x8e, 0x55 };
135         uint8_t digest[32];
136         struct tc_sha256_state_struct s;
137 
138         (void)tc_sha256_init(&s);
139         tc_sha256_update(&s, m, sizeof(m));
140         (void)tc_sha256_final(digest, &s);
141 
142         result = check_result(4, expected, sizeof(expected),
143 			      digest, sizeof(digest));
144         TC_END_RESULT(result);
145         return result;
146 }
147 
test_5(void)148 unsigned int test_5(void)
149 {
150         unsigned int result = TC_PASS;
151         TC_PRINT("SHA256 test #5:\n");
152 
153         const uint8_t expected[32] = {
154 		0x02, 0x77, 0x94, 0x66, 0xcd, 0xec, 0x16, 0x38, 0x11, 0xd0, 0x78, 0x81,
155 		0x5c, 0x63, 0x3f, 0x21, 0x90, 0x14, 0x13, 0x08, 0x14, 0x49, 0x00, 0x2f,
156 		0x24, 0xaa, 0x3e, 0x80, 0xf0, 0xb8, 0x8e, 0xf7
157         };
158         uint8_t m[55];
159         uint8_t digest[32];
160         struct tc_sha256_state_struct s;
161 
162         (void)memset(m, 0x00, sizeof(m));
163 
164         (void)tc_sha256_init(&s);
165         tc_sha256_update(&s, m, sizeof(m));
166         (void)tc_sha256_final(digest, &s);
167 
168         result = check_result(5, expected, sizeof(expected),
169 			      digest, sizeof(digest));
170         TC_END_RESULT(result);
171         return result;
172 }
173 
test_6(void)174 unsigned int test_6(void)
175 {
176         unsigned int result = TC_PASS;
177         TC_PRINT("SHA256 test #6:\n");
178         const uint8_t expected[32] = {
179 		0xd4, 0x81, 0x7a, 0xa5, 0x49, 0x76, 0x28, 0xe7, 0xc7, 0x7e, 0x6b, 0x60,
180 		0x61, 0x07, 0x04, 0x2b, 0xbb, 0xa3, 0x13, 0x08, 0x88, 0xc5, 0xf4, 0x7a,
181 		0x37, 0x5e, 0x61, 0x79, 0xbe, 0x78, 0x9f, 0xbb
182         };
183         uint8_t m[56];
184         uint8_t digest[32];
185         struct tc_sha256_state_struct s;
186 
187         (void)memset(m, 0x00, sizeof(m));
188 
189         (void)tc_sha256_init(&s);
190         tc_sha256_update(&s, m, sizeof(m));
191         (void)tc_sha256_final(digest, &s);
192 
193         result = check_result(6, expected, sizeof(expected),
194 			      digest, sizeof(digest));
195         TC_END_RESULT(result);
196         return result;
197 }
198 
test_7(void)199 unsigned int test_7(void)
200 {
201         unsigned int result = TC_PASS;
202         TC_PRINT("SHA256 test #7:\n");
203         const uint8_t expected[32] = {
204 		0x65, 0xa1, 0x6c, 0xb7, 0x86, 0x13, 0x35, 0xd5, 0xac, 0xe3, 0xc6, 0x07,
205 		0x18, 0xb5, 0x05, 0x2e, 0x44, 0x66, 0x07, 0x26, 0xda, 0x4c, 0xd1, 0x3b,
206 		0xb7, 0x45, 0x38, 0x1b, 0x23, 0x5a, 0x17, 0x85
207         };
208         uint8_t m[57];
209         uint8_t digest[32];
210         struct tc_sha256_state_struct s;
211 
212         (void)memset(m, 0x00, sizeof(m));
213 
214         (void)tc_sha256_init(&s);
215         tc_sha256_update(&s, m, sizeof(m));
216         (void)tc_sha256_final(digest, &s);
217 
218         result = check_result(7, expected, sizeof(expected),
219 			      digest, sizeof(digest));
220         TC_END_RESULT(result);
221         return result;
222 }
223 
test_8(void)224 unsigned int test_8(void)
225 {
226         unsigned int result = TC_PASS;
227 
228         TC_PRINT("SHA256 test #8:\n");
229         const uint8_t expected[32] = {
230 		0xf5, 0xa5, 0xfd, 0x42, 0xd1, 0x6a, 0x20, 0x30, 0x27, 0x98, 0xef, 0x6e,
231 		0xd3, 0x09, 0x97, 0x9b, 0x43, 0x00, 0x3d, 0x23, 0x20, 0xd9, 0xf0, 0xe8,
232 		0xea, 0x98, 0x31, 0xa9, 0x27, 0x59, 0xfb, 0x4b
233         };
234         uint8_t m[64];
235         uint8_t digest[32];
236         struct tc_sha256_state_struct s;
237 
238         (void)memset(m, 0x00, sizeof(m));
239 
240         (void)tc_sha256_init(&s);
241         tc_sha256_update(&s, m, sizeof(m));
242         (void)tc_sha256_final(digest, &s);
243 
244         result = check_result(8, expected, sizeof(expected),
245 			      digest, sizeof(digest));
246         TC_END_RESULT(result);
247         return result;
248 }
249 
test_9(void)250 unsigned int test_9(void)
251 {
252         unsigned int result = TC_PASS;
253         TC_PRINT("SHA256 test #9:\n");
254         const uint8_t expected[32] = {
255 		0x54, 0x1b, 0x3e, 0x9d, 0xaa, 0x09, 0xb2, 0x0b, 0xf8, 0x5f, 0xa2, 0x73,
256 		0xe5, 0xcb, 0xd3, 0xe8, 0x01, 0x85, 0xaa, 0x4e, 0xc2, 0x98, 0xe7, 0x65,
257 		0xdb, 0x87, 0x74, 0x2b, 0x70, 0x13, 0x8a, 0x53
258         };
259         uint8_t m[1000];
260         uint8_t digest[32];
261         struct tc_sha256_state_struct s;
262 
263         (void)memset(m, 0x00, sizeof(m));
264 
265         (void)tc_sha256_init(&s);
266         tc_sha256_update(&s, m, sizeof(m));
267         (void)tc_sha256_final(digest, &s);
268 
269         result = check_result(9, expected, sizeof(expected),
270 			      digest, sizeof(digest));
271         TC_END_RESULT(result);
272         return result;
273 }
274 
test_10(void)275 unsigned int test_10(void)
276 {
277         unsigned int result = TC_PASS;
278         TC_PRINT("SHA256 test #10:\n");
279         const uint8_t expected[32] = {
280 		0xc2, 0xe6, 0x86, 0x82, 0x34, 0x89, 0xce, 0xd2, 0x01, 0x7f, 0x60, 0x59,
281 		0xb8, 0xb2, 0x39, 0x31, 0x8b, 0x63, 0x64, 0xf6, 0xdc, 0xd8, 0x35, 0xd0,
282 		0xa5, 0x19, 0x10, 0x5a, 0x1e, 0xad, 0xd6, 0xe4
283         };
284         uint8_t m[1000];
285         uint8_t digest[32];
286         struct tc_sha256_state_struct s;
287 
288         (void)memset(m, 0x41, sizeof(m));
289 
290         (void)tc_sha256_init(&s);
291         tc_sha256_update(&s, m, sizeof(m));
292         (void)tc_sha256_final(digest, &s);
293 
294         result = check_result(10, expected, sizeof(expected),
295 			      digest, sizeof(digest));
296         TC_END_RESULT(result);
297         return result;
298 }
299 
test_11(void)300 unsigned int test_11(void)
301 {
302         unsigned int result = TC_PASS;
303         TC_PRINT("SHA256 test #11:\n");
304         const uint8_t expected[32] = {
305 		0xf4, 0xd6, 0x2d, 0xde, 0xc0, 0xf3, 0xdd, 0x90, 0xea, 0x13, 0x80, 0xfa,
306 		0x16, 0xa5, 0xff, 0x8d, 0xc4, 0xc5, 0x4b, 0x21, 0x74, 0x06, 0x50, 0xf2,
307 		0x4a, 0xfc, 0x41, 0x20, 0x90, 0x35, 0x52, 0xb0
308         };
309         uint8_t m[1005];
310         uint8_t digest[32];
311         struct tc_sha256_state_struct s;
312 
313         (void)memset(m, 0x55, sizeof(m));
314 
315         (void)tc_sha256_init(&s);
316         tc_sha256_update(&s, m, sizeof(m));
317         (void)tc_sha256_final(digest, &s);
318 
319         result = check_result(11, expected, sizeof(expected),
320 			      digest, sizeof(digest));
321         TC_END_RESULT(result);
322         return result;
323 }
324 
test_12(void)325 unsigned int test_12(void)
326 {
327         unsigned int result = TC_PASS;
328         TC_PRINT("SHA256 test #12:\n");
329 
330         const uint8_t expected[32] = {
331 		0xd2, 0x97, 0x51, 0xf2, 0x64, 0x9b, 0x32, 0xff, 0x57, 0x2b, 0x5e, 0x0a,
332 		0x9f, 0x54, 0x1e, 0xa6, 0x60, 0xa5, 0x0f, 0x94, 0xff, 0x0b, 0xee, 0xdf,
333 		0xb0, 0xb6, 0x92, 0xb9, 0x24, 0xcc, 0x80, 0x25
334         };
335         uint8_t m[1000];
336         uint8_t digest[32];
337         struct tc_sha256_state_struct s;
338         unsigned int i;
339 
340         (void)memset(m, 0x00, sizeof(m));
341 
342         (void)tc_sha256_init(&s);
343         for (i = 0; i < 1000; ++i) {
344                 tc_sha256_update(&s, m, sizeof(m));
345         }
346         (void)tc_sha256_final(digest, &s);
347 
348         result = check_result(12, expected, sizeof(expected),
349 			      digest, sizeof(digest));
350         TC_END_RESULT(result);
351         return result;
352 }
353 
test_13(void)354 unsigned int test_13(void)
355 {
356         unsigned int result = TC_PASS;
357         TC_PRINT("SHA256 test #13:\n");
358         const uint8_t expected[32] = {
359 		0x15, 0xa1, 0x86, 0x8c, 0x12, 0xcc, 0x53, 0x95, 0x1e, 0x18, 0x23, 0x44,
360 		0x27, 0x74, 0x47, 0xcd, 0x09, 0x79, 0x53, 0x6b, 0xad, 0xcc, 0x51, 0x2a,
361 		0xd2, 0x4c, 0x67, 0xe9, 0xb2, 0xd4, 0xf3, 0xdd
362         };
363         uint8_t m[32768];
364         uint8_t digest[32];
365         struct tc_sha256_state_struct s;
366         unsigned int i;
367 
368         (void)memset(m, 0x5a, sizeof(m));
369 
370         (void)tc_sha256_init(&s);
371         for (i = 0; i < 16384; ++i) {
372                 tc_sha256_update(&s, m, sizeof(m));
373         }
374         (void)tc_sha256_final(digest, &s);
375 
376         result = check_result(13, expected, sizeof(expected),
377 			      digest, sizeof(digest));
378         TC_END_RESULT(result);
379         return result;
380 }
381 
test_14(void)382 unsigned int test_14(void)
383 {
384         unsigned int result = TC_PASS;
385         TC_PRINT("SHA256 test #14:\n");
386         const uint8_t expected[32] = {
387 		0x46, 0x1c, 0x19, 0xa9, 0x3b, 0xd4, 0x34, 0x4f, 0x92, 0x15, 0xf5, 0xec,
388 		0x64, 0x35, 0x70, 0x90, 0x34, 0x2b, 0xc6, 0x6b, 0x15, 0xa1, 0x48, 0x31,
389 		0x7d, 0x27, 0x6e, 0x31, 0xcb, 0xc2, 0x0b, 0x53
390         };
391         uint8_t m[32768];
392         uint8_t digest[32];
393         struct tc_sha256_state_struct s;
394         unsigned int i;
395 
396         (void)memset(m, 0x00, sizeof(m));
397 
398         (void) tc_sha256_init(&s);
399         for (i = 0; i < 33280; ++i) {
400                 tc_sha256_update(&s, m, sizeof(m));
401         }
402         (void) tc_sha256_final(digest, &s);
403 
404         result = check_result(14, expected, sizeof(expected),
405 			      digest, sizeof(digest));
406         TC_END_RESULT(result);
407         return result;
408 }
409 
410 /*
411  * Main task to test AES
412  */
413 
main(void)414 int main(void)
415 {
416         unsigned int result = TC_PASS;
417         TC_START("Performing SHA256 tests (NIST tests vectors):");
418 
419         result = test_1();
420         if (result == TC_FAIL) {
421 		/* terminate test */
422                 TC_ERROR("SHA256 test #1 failed.\n");
423                 goto exitTest;
424         }
425         result = test_2();
426         if (result == TC_FAIL) {
427 		/* terminate test */
428                 TC_ERROR("SHA256 test #2 failed.\n");
429                 goto exitTest;
430         }
431         result = test_3();
432         if (result == TC_FAIL) {
433 		/* terminate test */
434                 TC_ERROR("SHA256 test #3 failed.\n");
435                 goto exitTest;
436         }
437         result = test_4();
438         if (result == TC_FAIL) {
439 		/* terminate test */
440                 TC_ERROR("SHA256 test #4 failed.\n");
441                 goto exitTest;
442         }
443         result = test_5();
444         if (result == TC_FAIL) {
445 		/* terminate test */
446                 TC_ERROR("SHA256 test #5 failed.\n");
447                 goto exitTest;
448         }
449         result = test_6();
450         if (result == TC_FAIL) {
451 		/* terminate test */
452                 TC_ERROR("SHA256 test #6 failed.\n");
453                 goto exitTest;
454         }
455         result = test_7();
456         if (result == TC_FAIL) {
457 		/* terminate test */
458                 TC_ERROR("SHA256 test #7 failed.\n");
459                 goto exitTest;
460         }
461         result = test_8();
462         if (result == TC_FAIL) {
463 		/* terminate test */
464                 TC_ERROR("SHA256 test #8 failed.\n");
465                 goto exitTest;
466         }
467         result = test_9();
468         if (result == TC_FAIL) {
469 		/* terminate test */
470                 TC_ERROR("SHA256 test #9 failed.\n");
471                 goto exitTest;
472         }
473         result = test_10();
474         if (result == TC_FAIL) {
475 		/* terminate test */
476                 TC_ERROR("SHA256 test #10 failed.\n");
477                 goto exitTest;
478         }
479         result = test_11();
480         if (result == TC_FAIL) {
481 		/* terminate test */
482                 TC_ERROR("SHA256 test #11 failed.\n");
483                 goto exitTest;
484         }
485         result = test_12();
486         if (result == TC_FAIL) {
487 		/* terminate test */
488                 TC_ERROR("SHA256 test #12 failed.\n");
489                 goto exitTest;
490         }
491   	/* memory and computation intensive test cases: */
492         result = test_13();
493         if (result == TC_FAIL) {
494 		/* terminate test */
495                 TC_ERROR("SHA256 test #13 failed.\n");
496                 goto exitTest;
497         }
498         result = test_14();
499         if (result == TC_FAIL) {
500 		/* terminate test */
501                 TC_ERROR("SHA256 test #14 failed.\n");
502                 goto exitTest;
503         }
504 
505         TC_PRINT("All SHA256 tests succeeded!\n");
506 
507 exitTest:
508         TC_END_RESULT(result);
509         TC_END_REPORT(result);
510 }
511 
512