1 /* hash.c has unit tests
3 * Copyright (C) 2006-2012 Sawtooth Consulting Ltd.
5 * This file is part of CyaSSL.
7 * CyaSSL is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * CyaSSL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
28 #include <cyassl/ctaocrypt/md4.h>
29 #include <cyassl/ctaocrypt/md5.h>
30 #include <cyassl/ctaocrypt/sha.h>
31 #include <cyassl/ctaocrypt/sha256.h>
32 #include <cyassl/ctaocrypt/sha512.h>
33 #include <cyassl/ctaocrypt/ripemd.h>
34 #include <cyassl/ctaocrypt/hmac.h>
36 #include <tests/unit.h>
38 typedef struct testVector {
48 int sha256_test(void);
49 int sha512_test(void);
50 int sha384_test(void);
51 int ripemd_test(void);
58 printf(" Begin HASH Tests\n");
61 if ( (ret = md4_test()) ) {
62 printf( " MD4 test failed!\n");
65 printf( " MD4 test passed!\n");
68 if ( (ret = md5_test()) ) {
69 printf( " MD5 test failed!\n");
72 printf( " MD5 test passed!\n");
74 if ( (ret = sha_test()) ) {
75 printf( " SHA test failed!\n");
78 printf( " SHA test passed!\n");
81 if ( (ret = sha256_test()) ) {
82 printf( " SHA-256 test failed!\n");
85 printf( " SHA-256 test passed!\n");
89 if ( (ret = sha512_test()) ) {
90 printf( " SHA-512 test failed!\n");
93 printf( " SHA-512 test passed!\n");
97 if ( (ret = sha384_test()) ) {
98 printf( " SHA-384 test failed!\n");
101 printf( " SHA-384 test passed!\n");
105 if ( (ret = ripemd_test()) ) {
106 printf( " RIPEMD test failed!\n");
109 printf( " RIPEMD test passed!\n");
113 if ( (ret = hmac_test()) ) {
114 printf( " HMAC test failed!\n");
117 printf( " HMAC test passed!\n");
120 printf(" End HASH Tests\n");
130 byte hash[MD4_DIGEST_SIZE];
132 testVector a, b, c, d, e, f, g;
133 testVector test_md4[7];
134 int times = sizeof(test_md4) / sizeof(testVector), i;
137 a.output = "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31\xb7\x3c\x59\xd7\xe0\xc0\x89"
139 a.inLen = strlen(a.input);
140 a.outLen = strlen(a.output);
143 b.output = "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46\x24\x5e\x05\xfb\xdb\xd6\xfb"
145 b.inLen = strlen(b.input);
146 b.outLen = strlen(b.output);
149 c.output = "\xa4\x48\x01\x7a\xaf\x21\xd8\x52\x5f\xc1\x0a\xe8\x7a\xa6\x72"
151 c.inLen = strlen(c.input);
152 c.outLen = strlen(c.output);
154 d.input = "message digest";
155 d.output = "\xd9\x13\x0a\x81\x64\x54\x9f\xe8\x18\x87\x48\x06\xe1\xc7\x01"
157 d.inLen = strlen(d.input);
158 d.outLen = strlen(d.output);
160 e.input = "abcdefghijklmnopqrstuvwxyz";
161 e.output = "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd\xee\xa8\xed\x63\xdf\x41\x2d"
163 e.inLen = strlen(e.input);
164 e.outLen = strlen(e.output);
166 f.input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345"
168 f.output = "\x04\x3f\x85\x82\xf2\x41\xdb\x35\x1c\xe6\x27\xe1\x53\xe7\xf0"
170 f.inLen = strlen(f.input);
171 f.outLen = strlen(f.output);
173 g.input = "1234567890123456789012345678901234567890123456789012345678"
174 "9012345678901234567890";
175 g.output = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19\x9c\x3e\x7b\x16\x4f\xcc\x05"
177 g.inLen = strlen(g.input);
178 g.outLen = strlen(g.output);
190 for (i = 0; i < times; ++i) {
191 Md4Update(&md4, (byte*)test_md4[i].input, (word32)test_md4[i].inLen);
192 Md4Final(&md4, hash);
194 if (memcmp(hash, test_md4[i].output, MD4_DIGEST_SIZE) != 0)
206 byte hash[MD5_DIGEST_SIZE];
208 testVector a, b, c, d, e;
209 testVector test_md5[5];
210 int times = sizeof(test_md5) / sizeof(testVector), i;
213 a.output = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0\xd6\x96\x3f\x7d\x28\xe1\x7f"
215 a.inLen = strlen(a.input);
216 a.outLen = strlen(a.output);
218 b.input = "message digest";
219 b.output = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61"
221 b.inLen = strlen(b.input);
222 b.outLen = strlen(b.output);
224 c.input = "abcdefghijklmnopqrstuvwxyz";
225 c.output = "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00\x7d\xfb\x49\x6c\xca\x67\xe1"
227 c.inLen = strlen(c.input);
228 c.outLen = strlen(c.output);
230 d.input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345"
232 d.output = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5\xa5\x61\x1c\x2c\x9f\x41\x9d"
234 d.inLen = strlen(d.input);
235 d.outLen = strlen(d.output);
237 e.input = "1234567890123456789012345678901234567890123456789012345678"
238 "9012345678901234567890";
239 e.output = "\x57\xed\xf4\xa2\x2b\xe3\xc9\x55\xac\x49\xda\x2e\x21\x07\xb6"
241 e.inLen = strlen(e.input);
242 e.outLen = strlen(e.output);
252 for (i = 0; i < times; ++i) {
253 Md5Update(&md5, (byte*)test_md5[i].input, (word32)test_md5[i].inLen);
254 Md5Final(&md5, hash);
256 if (memcmp(hash, test_md5[i].output, MD5_DIGEST_SIZE) != 0)
266 byte hash[SHA_DIGEST_SIZE];
268 testVector a, b, c, d;
269 testVector test_sha[4];
270 int times = sizeof(test_sha) / sizeof(struct testVector), i;
273 a.output = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2"
274 "\x6C\x9C\xD0\xD8\x9D";
275 a.inLen = strlen(a.input);
276 a.outLen = strlen(a.output);
278 b.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
279 b.output = "\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29"
280 "\xE5\xE5\x46\x70\xF1";
281 b.inLen = strlen(b.input);
282 b.outLen = strlen(b.output);
284 c.input = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
286 c.output = "\x00\x98\xBA\x82\x4B\x5C\x16\x42\x7B\xD7\xA1\x12\x2A\x5A\x44"
287 "\x2A\x25\xEC\x64\x4D";
288 c.inLen = strlen(c.input);
289 c.outLen = strlen(c.output);
291 d.input = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
292 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
294 d.output = "\xAD\x5B\x3F\xDB\xCB\x52\x67\x78\xC2\x83\x9D\x2F\x15\x1E\xA7"
295 "\x53\x99\x5E\x26\xA0";
296 d.inLen = strlen(d.input);
297 d.outLen = strlen(d.output);
306 for (i = 0; i < times; ++i) {
307 ShaUpdate(&sha, (byte*)test_sha[i].input, (word32)test_sha[i].inLen);
308 ShaFinal(&sha, hash);
310 if (memcmp(hash, test_sha[i].output, SHA_DIGEST_SIZE) != 0)
318 int sha256_test(void)
321 byte hash[SHA256_DIGEST_SIZE];
324 testVector test_sha[2];
325 int times = sizeof(test_sha) / sizeof(struct testVector), i;
328 a.output = "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22"
329 "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00"
331 a.inLen = strlen(a.input);
332 a.outLen = strlen(a.output);
334 b.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
335 b.output = "\x24\x8D\x6A\x61\xD2\x06\x38\xB8\xE5\xC0\x26\x93\x0C\x3E\x60"
336 "\x39\xA3\x3C\xE4\x59\x64\xFF\x21\x67\xF6\xEC\xED\xD4\x19\xDB"
338 b.inLen = strlen(b.input);
339 b.outLen = strlen(b.output);
346 for (i = 0; i < times; ++i) {
347 Sha256Update(&sha, (byte*)test_sha[i].input,(word32)test_sha[i].inLen);
348 Sha256Final(&sha, hash);
350 if (memcmp(hash, test_sha[i].output, SHA256_DIGEST_SIZE) != 0)
359 int sha512_test(void)
362 byte hash[SHA512_DIGEST_SIZE];
365 testVector test_sha[2];
366 int times = sizeof(test_sha) / sizeof(struct testVector), i;
369 a.output = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41"
370 "\x31\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55"
371 "\xd3\x9a\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3"
372 "\xfe\xeb\xbd\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f"
374 a.inLen = strlen(a.input);
375 a.outLen = strlen(a.output);
377 b.input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi"
378 "jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
379 b.output = "\x8e\x95\x9b\x75\xda\xe3\x13\xda\x8c\xf4\xf7\x28\x14\xfc\x14"
380 "\x3f\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1\x72\x99\xae\xad\xb6\x88"
381 "\x90\x18\x50\x1d\x28\x9e\x49\x00\xf7\xe4\x33\x1b\x99\xde\xc4"
382 "\xb5\x43\x3a\xc7\xd3\x29\xee\xb6\xdd\x26\x54\x5e\x96\xe5\x5b"
384 b.inLen = strlen(b.input);
385 b.outLen = strlen(b.output);
392 for (i = 0; i < times; ++i) {
393 Sha512Update(&sha, (byte*)test_sha[i].input,(word32)test_sha[i].inLen);
394 Sha512Final(&sha, hash);
396 if (memcmp(hash, test_sha[i].output, SHA512_DIGEST_SIZE) != 0)
408 byte hash[SHA384_DIGEST_SIZE];
411 testVector test_sha[2];
412 int times = sizeof(test_sha) / sizeof(struct testVector), i;
415 a.output = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50"
416 "\x07\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff"
417 "\x5b\xed\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34"
419 a.inLen = strlen(a.input);
420 a.outLen = strlen(a.output);
422 b.input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi"
423 "jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
424 b.output = "\x09\x33\x0c\x33\xf7\x11\x47\xe8\x3d\x19\x2f\xc7\x82\xcd\x1b"
425 "\x47\x53\x11\x1b\x17\x3b\x3b\x05\xd2\x2f\xa0\x80\x86\xe3\xb0"
426 "\xf7\x12\xfc\xc7\xc7\x1a\x55\x7e\x2d\xb9\x66\xc3\xe9\xfa\x91"
428 b.inLen = strlen(b.input);
429 b.outLen = strlen(b.output);
436 for (i = 0; i < times; ++i) {
437 Sha384Update(&sha, (byte*)test_sha[i].input,(word32)test_sha[i].inLen);
438 Sha384Final(&sha, hash);
440 if (memcmp(hash, test_sha[i].output, SHA384_DIGEST_SIZE) != 0)
449 int ripemd_test(void)
452 byte hash[RIPEMD_DIGEST_SIZE];
454 testVector a, b, c, d;
455 testVector test_ripemd[4];
456 int times = sizeof(test_ripemd) / sizeof(struct testVector), i;
459 a.output = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6"
460 "\xb0\x87\xf1\x5a\x0b\xfc";
461 a.inLen = strlen(a.input);
462 a.outLen = strlen(a.output);
464 b.input = "message digest";
465 b.output = "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8\x81\xb1\x23\xa8"
466 "\x5f\xfa\x21\x59\x5f\x36";
467 b.inLen = strlen(b.input);
468 b.outLen = strlen(b.output);
470 c.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
471 c.output = "\x12\xa0\x53\x38\x4a\x9c\x0c\x88\xe4\x05\xa0\x6c\x27\xdc"
472 "\xf4\x9a\xda\x62\xeb\x2b";
473 c.inLen = strlen(c.input);
474 c.outLen = strlen(c.output);
476 d.input = "12345678901234567890123456789012345678901234567890123456"
477 "789012345678901234567890";
478 d.output = "\x9b\x75\x2e\x45\x57\x3d\x4b\x39\xf4\xdb\xd3\x32\x3c\xab"
479 "\x82\xbf\x63\x32\x6b\xfb";
480 d.inLen = strlen(d.input);
481 d.outLen = strlen(d.output);
490 for (i = 0; i < times; ++i) {
491 RipeMdUpdate(&ripemd, (byte*)test_ripemd[i].input,
492 (word32)test_ripemd[i].inLen);
493 RipeMdFinal(&ripemd, hash);
495 if (memcmp(hash, test_ripemd[i].output, RIPEMD_DIGEST_SIZE) != 0)
501 #endif /* CYASSL_RIPEMD */
507 byte hash[MD5_DIGEST_SIZE];
511 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
513 "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
517 testVector test_hmac[3];
519 int times = sizeof(test_hmac) / sizeof(testVector), i;
521 a.input = "Hi There";
522 a.output = "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc"
524 a.inLen = strlen(a.input);
525 a.outLen = strlen(a.output);
527 b.input = "what do ya want for nothing?";
528 b.output = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7"
530 b.inLen = strlen(b.input);
531 b.outLen = strlen(b.output);
533 c.input = "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
534 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
535 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
536 "\xDD\xDD\xDD\xDD\xDD\xDD";
537 c.output = "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3"
539 c.inLen = strlen(c.input);
540 c.outLen = strlen(c.output);
546 for (i = 0; i < times; ++i) {
547 HmacSetKey(&hmac, MD5, (byte*)keys[i], (word32)strlen(keys[i]));
548 HmacUpdate(&hmac, (byte*)test_hmac[i].input,
549 (word32)test_hmac[i].inLen);
550 HmacFinal(&hmac, hash);
552 if (memcmp(hash, test_hmac[i].output, MD5_DIGEST_SIZE) != 0)