diff --git a/tests/unittests/tests-hashes/tests-hashes-sha224.c b/tests/unittests/tests-hashes/tests-hashes-sha224.c new file mode 100644 index 0000000000..22223cde2e --- /dev/null +++ b/tests/unittests/tests-hashes/tests-hashes-sha224.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2020 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + + /** + * @ingroup unittests + * @{ + * + * @file + * @brief testcases for the sha224 implementation + * + * @author Peter Kietzmann + * + * @} + */ + +#include +#include +#include +#include + +#include "embUnit/embUnit.h" + +#include "hashes/sha224.h" + +#include "tests-hashes.h" + +/** + * @brief expected hash for test 01 + * i.e. 3eda9ffe5537a588f54d0b2a453e5fa932986d0bc0f9556924f5c2379b2c91b0 + * + * converted using: + * s=$(echo '' | sed -e 's/../0x&, /g' | sed 's/, $//'); echo {$s}\; + * + * where is the above sequence of characters 3e...b0 + */ + +/** + * @brief expected hash for test empty + * i.e. d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f + */ +static const unsigned char hempty[] = + {0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47, + 0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2, + 0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4, + 0x2f}; + +/** + * @brief expected hash for "abc" + * (from FIPS 180-2 Appendix B.1) + */ +static const unsigned char h_abc[] = + {0x23, 0x09, 0x7d, 0x22, 0x34, 0x05, 0xd8, 0x22, 0x86, + 0x42, 0xa4, 0x77, 0xbd, 0xa2, 0x55, 0xb3, 0x2a, 0xad, + 0xbc, 0xe4, 0xbd, 0xa0, 0xb3, 0xf7, 0xe3, 0x6c, 0x9d, + 0xa7}; +/** + * @brief expected hash for "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + * (from FIPS 180-2 Appendix B.2) + */ +static const unsigned char h_abc_long[] = + {0x75, 0x38, 0x8b, 0x16, 0x51, 0x27, 0x76, 0xcc, 0x5d, + 0xba, 0x5d, 0xa1, 0xfd, 0x89, 0x01, 0x50, 0xb0, 0xc6, + 0x45, 0x5c, 0xb4, 0xf5, 0x8b, 0x19, 0x52, 0x52, 0x25, + 0x25}; + +/** + * @brief expected hash for test long_sequence + * i.e. 34674aab568a93190425d9f9d7e96ff835635630e3d2638218a9103b + */ +static const unsigned char hlong_sequence[] = + {0x34, 0x67, 0x4a, 0xab, 0x56, 0x8a, 0x93, 0x19, 0x04, + 0x25, 0xd9, 0xf9, 0xd7, 0xe9, 0x6f, 0xf8, 0x35, 0x63, + 0x56, 0x30, 0xe3, 0xd2, 0x63, 0x82, 0x18, 0xa9, 0x10, + 0x3b}; + +static int calc_and_compare_hash(const char *str, const unsigned char *expected) +{ + static unsigned char hash[28]; + sha224_context_t sha224; + + sha224_init(&sha224); + sha224_update(&sha224, (uint8_t*)str, strlen(str)); + sha224_final(&sha224, hash); + + return (memcmp(expected, hash, 28) == 0); +} + +static int calc_and_compare_hash_wrapper(const char *str, const unsigned char *expected) +{ + static unsigned char hash[SHA224_DIGEST_LENGTH]; + + sha224((uint8_t*)str, strlen(str), hash); + + return (memcmp(expected, hash, SHA224_DIGEST_LENGTH) == 0); +} + +static void test_hashes_sha224_hash_sequence_empty(void) +{ + const char *teststring = ""; + TEST_ASSERT(calc_and_compare_hash(teststring, hempty)); + TEST_ASSERT(calc_and_compare_hash_wrapper(teststring, hempty)); +} + +static void test_hashes_sha224_hash_sequence_abc(void) +{ + char *teststring = "abc"; + TEST_ASSERT(calc_and_compare_hash(teststring, h_abc)); + TEST_ASSERT(calc_and_compare_hash_wrapper(teststring, h_abc)); +} + +static void test_hashes_sha224_hash_sequence_abc_long(void) +{ + char *teststring = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + TEST_ASSERT(calc_and_compare_hash(teststring, h_abc_long)); + TEST_ASSERT(calc_and_compare_hash_wrapper(teststring, h_abc_long)); +} + +static void test_hashes_sha256_hash_long_sequence(void) +{ + char *teststring = {"RIOT is an open-source microkernel-based operating system, designed" + " to match the requirements of Internet of Things (IoT) devices and" + " other embedded devices. These requirements include a very low memory" + " footprint (on the order of a few kilobytes), high energy efficiency" + ", real-time capabilities, communication stacks for both wireless and" + " wired networks, and support for a wide range of low-power hardware."}; + TEST_ASSERT(calc_and_compare_hash(teststring, hlong_sequence)); + TEST_ASSERT(calc_and_compare_hash_wrapper(teststring, hlong_sequence)); +} + +Test *tests_hashes_sha224_tests(void) +{ + EMB_UNIT_TESTFIXTURES(fixtures) { + new_TestFixture(test_hashes_sha224_hash_sequence_empty), + new_TestFixture(test_hashes_sha224_hash_sequence_abc), + new_TestFixture(test_hashes_sha224_hash_sequence_abc_long), + new_TestFixture(test_hashes_sha256_hash_long_sequence), + }; + + EMB_UNIT_TESTCALLER(hashes_sha224_tests, NULL, NULL, + fixtures); + + return (Test *)&hashes_sha224_tests; +} diff --git a/tests/unittests/tests-hashes/tests-hashes.c b/tests/unittests/tests-hashes/tests-hashes.c index a815c58043..c35b00cbab 100644 --- a/tests/unittests/tests-hashes/tests-hashes.c +++ b/tests/unittests/tests-hashes/tests-hashes.c @@ -25,6 +25,7 @@ void tests_hashes(void) TESTS_RUN(tests_hashes_md5_tests()); TESTS_RUN(tests_hashes_cmac_tests()); TESTS_RUN(tests_hashes_sha1_tests()); + TESTS_RUN(tests_hashes_sha224_tests()); TESTS_RUN(tests_hashes_sha256_tests()); TESTS_RUN(tests_hashes_sha256_hmac_tests()); TESTS_RUN(tests_hashes_sha256_chain_tests()); diff --git a/tests/unittests/tests-hashes/tests-hashes.h b/tests/unittests/tests-hashes/tests-hashes.h index 19a0d20ad4..6cc289236f 100644 --- a/tests/unittests/tests-hashes/tests-hashes.h +++ b/tests/unittests/tests-hashes/tests-hashes.h @@ -51,6 +51,13 @@ Test *tests_hashes_md5_tests(void); */ Test *tests_hashes_sha1_tests(void); +/** + * @brief Generates tests for hashes/sha224.h + * + * @return embUnit tests if successful, NULL if not. + */ +Test *tests_hashes_sha224_tests(void); + /** * @brief Generates tests for hashes/sha256.h *