/** * @file hmac_test.h * * @brief Tests for the hmac_t class. * */ /* * Copyright (C) 2005 Jan Hutter, Martin Willi * Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. See . * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include #include "hmac_test.h" #include #include /* * described in Header-File */ void test_hmac_sha1(protected_tester_t *tester) { /* * Test cases from RFC2202 * * test_case = 1 * key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b * key_len = 20 * data = "Hi There" * data_len = 8 * digest = 0xb617318655057264e28bc0b6fb378c8ef146be00 * * test_case = 2 * key = "Jefe" * key_len = 4 * data = "what do ya want for nothing?" * data_len = 28 * digest = 0xeffcdf6ae5eb2fa2d27416d5f184df9c259a7c79 * * test_case = 3 * key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa * key_len = 20 * data = 0xdd repeated 50 times * data_len = 50 * digest = 0x125d7342b9ac11cd91a39af48aa17b4f63f175d3 * * test_case = 4 * key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 * key_len = 25 * data = 0xcd repeated 50 times * data_len = 50 * digest = 0x4c9007f4026250c6bc8414f9bf50c86c2d7235da * * test_case = 5 * key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c * key_len = 20 * data = "Test With Truncation" * data_len = 20 * digest = 0x4c1a03424b55e07fe7f27be1d58bb9324a9a5a04 * digest-96 = 0x4c1a03424b55e07fe7f27be1 * * test_case = 6 * key = 0xaa repeated 80 times * key_len = 80 * data = "Test Using Larger Than Block-Size Key - Hash Key First" * data_len = 54 * digest = 0xaa4ae5e15272d00e95705637ce8a3b55ed402112 * * test_case = 7 * key = 0xaa repeated 80 times * key_len = 80 * data = "Test Using Larger Than Block-Size Key and Larger * Than One Block-Size Data" * data_len = 73 * digest = 0xe8e99d0f45237d786d6bbaa7965c7808bbff1a91 * * currently performing test 1, 2, 4 and 7 */ chunk_t keys[4]; chunk_t data[4]; chunk_t digest[4]; chunk_t reference[4]; int i; /* * values for test 1 */ u_int8_t key1[] = { 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b }; keys[0].ptr = key1; keys[0].len = sizeof(key1); data[0].ptr = "Hi There"; data[0].len = 8; u_int8_t reference1[] = { 0xb6,0x17,0x31,0x86, 0x55,0x05,0x72,0x64, 0xe2,0x8b,0xc0,0xb6, 0xfb,0x37,0x8c,0x8e, 0xf1,0x46,0xbe,0x00 }; reference[0].ptr = reference1; reference[0].len = sizeof(reference1); /* * values for test 2 */ u_int8_t reference2[] = { 0xef,0xfc,0xdf,0x6a, 0xe5,0xeb,0x2f,0xa2, 0xd2,0x74,0x16,0xd5, 0xf1,0x84,0xdf,0x9c, 0x25,0x9a,0x7c,0x79 }; keys[1].ptr = "Jefe"; keys[1].len = 4; data[1].ptr = "what do ya want for nothing?"; data[1].len = 28; reference[1].ptr = reference2; reference[1].len = sizeof(reference2); /* * values for test 7 */ u_int8_t key7[] = { 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, }; u_int8_t reference7[] = { 0xe8,0xe9,0x9d,0x0f, 0x45,0x23,0x7d,0x78, 0x6d,0x6b,0xba,0xa7, 0x96,0x5c,0x78,0x08, 0xbb,0xff,0x1a,0x91 }; keys[2].ptr = key7; keys[2].len = sizeof(key7); data[2].ptr = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"; data[2].len = 73; reference[2].ptr = reference7; reference[2].len = sizeof(reference7); for (i=0; i<3; i++) { hmac_t *hmac = hmac_create(HASH_SHA1); hmac->set_key(hmac, keys[i]); hmac->allocate_mac(hmac, data[i], &digest[i]); hmac->destroy(hmac); tester->assert_true(tester, digest[i].len == 20, "chunk len"); tester->assert_false(tester, memcmp(digest[i].ptr, reference[i].ptr, 20), "hmac value"); allocator_free(digest[i].ptr); } /* * test 4 is donne in append mode */ u_int8_t val = 0xcd; u_int8_t key4[] = { 0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0c, 0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19 }; keys[3].ptr = key4; keys[3].len = sizeof(key4); u_int8_t reference4[] = { 0x4c,0x90,0x07,0xf4, 0x02,0x62,0x50,0xc6, 0xbc,0x84,0x14,0xf9, 0xbf,0x50,0xc8,0x6c, 0x2d,0x72,0x35,0xda }; reference[3].ptr = reference4; reference[3].len = sizeof(reference4); hmac_t *hmac = hmac_create(HASH_SHA1); hmac->set_key(hmac, keys[3]); data[3].ptr = &val; data[3].len = 1; for (i=0; i<49; i++) { hmac->get_mac(hmac, data[3], NULL); } hmac->allocate_mac(hmac, data[3], &digest[3]); hmac->destroy(hmac); tester->assert_true(tester, digest[3].len == 20, "chunk len append mode"); tester->assert_false(tester, memcmp(digest[3].ptr, reference[3].ptr, 20), "hmac value append mode"); allocator_free(digest[3].ptr); } /* * described in Header-File */ void test_hmac_md5(protected_tester_t *tester) { /* * Test cases from RFC2202 * * test_case = 1 * key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b * key_len = 16 * data = "Hi There" * data_len = 8 * digest = 0x9294727a3638bb1c13f48ef8158bfc9d * * test_case = 2 * key = "Jefe" * key_len = 4 * data = "what do ya want for nothing?" * data_len = 28 * digest = 0x750c783e6ab0b503eaa86e310a5db738 * * test_case = 3 * key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa * key_len 16 * data = 0xdd repeated 50 times * data_len = 50 * digest = 0x56be34521d144c88dbb8c733f0e8b3f6 * * test_case = 4 * key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 * key_len 25 * data = 0xcd repeated 50 times * data_len = 50 * digest = 0x697eaf0aca3a3aea3a75164746ffaa79 * * test_case = 5 * key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c * key_len = 16 * data = "Test With Truncation" * data_len = 20 * digest = 0x56461ef2342edc00f9bab995690efd4c * digest-96 0x56461ef2342edc00f9bab995 * * test_case = 6 * key = 0xaa repeated 80 times * key_len = 80 * data = "Test Using Larger Than Block-Size Key - Hash Key First" * data_len = 54 * digest = 0x6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd * * test_case = 7 * key = 0xaa repeated 80 times * key_len = 80 * data = "Test Using Larger Than Block-Size Key and Larger * Than One Block-Size Data" * data_len = 73 * digest = 0x6f630fad67cda0ee1fb1f562db3aa53e * * * * currently performing test 1, 2, 4 and 7 * */ chunk_t keys[4]; chunk_t data[4]; chunk_t digest[4]; chunk_t reference[4]; int i; /* * values for test 1 */ u_int8_t key1[] = { 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, 0x0b,0x0b,0x0b,0x0b, }; keys[0].ptr = key1; keys[0].len = sizeof(key1); data[0].ptr = "Hi There"; data[0].len = 8; u_int8_t reference1[] = { 0x92,0x94,0x72,0x7a, 0x36,0x38,0xbb,0x1c, 0x13,0xf4,0x8e,0xf8, 0x15,0x8b,0xfc,0x9d }; reference[0].ptr = reference1; reference[0].len = sizeof(reference1); /* * values for test 2 */ u_int8_t reference2[] = { 0x75,0x0c,0x78,0x3e, 0x6a,0xb0,0xb5,0x03, 0xea,0xa8,0x6e,0x31, 0x0a,0x5d,0xb7,0x38 }; keys[1].ptr = "Jefe"; keys[1].len = 4; data[1].ptr = "what do ya want for nothing?"; data[1].len = 28; reference[1].ptr = reference2; reference[1].len = sizeof(reference2); /* * values for test 7 */ u_int8_t key7[] = { 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, }; u_int8_t reference7[] = { 0x6f,0x63,0x0f,0xad, 0x67,0xcd,0xa0,0xee, 0x1f,0xb1,0xf5,0x62, 0xdb,0x3a,0xa5,0x3e }; keys[2].ptr = key7; keys[2].len = sizeof(key7); data[2].ptr = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"; data[2].len = 73; reference[2].ptr = reference7; reference[2].len = sizeof(reference7); for (i=0; i<3; i++) { hmac_t *hmac = hmac_create(HASH_MD5); hmac->set_key(hmac, keys[i]); hmac->allocate_mac(hmac, data[i], &digest[i]); hmac->destroy(hmac); tester->assert_true(tester, digest[i].len == 16, "chunk len"); tester->assert_false(tester, memcmp(digest[i].ptr, reference[i].ptr, 16), "hmac value"); allocator_free(digest[i].ptr); } /* * test 4 is donne in append mode */ u_int8_t val = 0xcd; u_int8_t key4[] = { 0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0c, 0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14, 0x15,0x16,0x17,0x18, 0x19 }; keys[3].ptr = key4; keys[3].len = sizeof(key4); u_int8_t reference4[] = { 0x69,0x7e,0xaf,0x0a, 0xca,0x3a,0x3a,0xea, 0x3a,0x75,0x16,0x47, 0x46,0xff,0xaa,0x79 }; reference[3].ptr = reference4; reference[3].len = sizeof(reference4); hmac_t *hmac = hmac_create(HASH_MD5); hmac->set_key(hmac, keys[3]); data[3].ptr = &val; data[3].len = 1; for (i=0; i<49; i++) { hmac->get_mac(hmac, data[3], NULL); } hmac->allocate_mac(hmac, data[3], &digest[3]); hmac->destroy(hmac); tester->assert_true(tester, digest[3].len == 16, "chunk len append mode"); tester->assert_false(tester, memcmp(digest[3].ptr, reference[3].ptr, 16), "hmac value append mode"); allocator_free(digest[3].ptr); }