From c58cc09cf50a18058efb59e1b4fb73ab1e3a45a2 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Mon, 19 Feb 2024 16:05:59 +0100 Subject: lib: Fix CRC32 hashing I assumed that all hashes were stored in Big Endian, but apparently the CRC32 was still in machine endianness when calculated by the rhash implementation. Fixed and updated hash tests a bit. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- src/lib/hash.c | 2 ++ src/lib/tests/hash_test.c | 48 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/lib/hash.c b/src/lib/hash.c index 995ba0d2..b465f894 100644 --- a/src/lib/hash.c +++ b/src/lib/hash.c @@ -29,6 +29,7 @@ #include "config.h" +#include #include #ifdef HAVE_LIBGCRYPT @@ -90,6 +91,7 @@ void mem_hash(enum hash_algo algo, case HASH_CRC32: memset(dst, 0, CRC32_HASH_LEN); crc32((uint32_t *) dst, buf, len); + *(uint32_t *) dst = htobe32(*(uint32_t *) dst); break; case HASH_MD5: rhash_md5_init(&md5_ctx); diff --git a/src/lib/tests/hash_test.c b/src/lib/tests/hash_test.c index 1e618e48..970d9185 100644 --- a/src/lib/tests/hash_test.c +++ b/src/lib/tests/hash_test.c @@ -21,6 +21,7 @@ */ #include +#include #include #include @@ -40,6 +41,8 @@ struct vec_entry { static int test_crc32(void) { + int ret = 0; + struct vec_entry vec [] = { { "0", "f4dbdf21" }, { "123456789", "cbf43926" }, @@ -49,6 +52,8 @@ static int test_crc32(void) struct vec_entry * cur = vec; + TEST_START(); + while (cur->in != NULL) { uint8_t crc[4]; char res[9]; @@ -57,18 +62,22 @@ static int test_crc32(void) sprintf(res, HASH_FMT32, HASH_VAL32(crc)); if (strcmp(res, cur->out) != 0) { - printf("Hash failed %s != %s", res, cur->out); - return -1; + printf("Hash failed %s != %s.\n", res, cur->out); + ret |= -1; } ++cur; } - return 0; + TEST_END(ret); + + return ret; } static int test_md5(void) { + int ret = 0; + struct vec_entry vec [] = {{ "abc", "900150983cd24fb0d6963f7d28e17f72" @@ -85,6 +94,9 @@ static int test_md5(void) struct vec_entry * cur = vec; + TEST_START(); + + while (cur->in != NULL) { uint8_t md5[16]; char res[33]; @@ -93,18 +105,22 @@ static int test_md5(void) sprintf(res, HASH_FMT128, HASH_VAL128(md5)); if (strcmp(res, cur->out) != 0) { - printf("Hash failed %s != %s", res, cur->out); - return -1; + printf("Hash failed %s != %s.\n", res, cur->out); + ret |= -1; } ++cur; } - return 0; + TEST_END(ret); + + return ret; } static int test_sha3(void) { + int ret = 0; + uint8_t sha3[64]; char res[129]; @@ -114,12 +130,14 @@ static int test_sha3(void) "e642824c3f8cf24ad09234ee7d3c766f" "c9a3a5168d0c94ad73b46fdf"; + TEST_START(); + str_hash(HASH_SHA3_224, sha3, in); sprintf(res, HASH_FMT224, HASH_VAL224(sha3)); if (strcmp(res, out) != 0) { printf("SHA3-224 failed %s != %s", res, out); - return -1; + ret |= -1; } out = @@ -130,8 +148,8 @@ static int test_sha3(void) sprintf(res, HASH_FMT256, HASH_VAL256(sha3)); if (strcmp(res, out) != 0) { - printf("SHA3-256 failed %s != %s", res, out); - return -1; + printf("SHA3-256 failed %s != %s.\n", res, out); + ret |= -1; } out = @@ -143,8 +161,8 @@ static int test_sha3(void) sprintf(res, HASH_FMT384, HASH_VAL384(sha3)); if (strcmp(res, out) != 0) { - printf("SHA3-384failed %s != %s", res, out); - return -1; + printf("SHA3-384failed %s != %s.'n", res, out); + ret |= -1; } out = @@ -157,11 +175,13 @@ static int test_sha3(void) sprintf(res, HASH_FMT512, HASH_VAL512(sha3)); if (strcmp(res, out) != 0) { - printf("SHA3-512 failed %s != %s", res, out); - return -1; + printf("SHA3-512 failed %s != %s.\n", res, out); + ret |= -1; } - return 0; + TEST_END(ret); + + return ret; } int hash_test(int argc, -- cgit v1.2.3