summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2024-02-19 16:05:59 +0100
committerSander Vrijders <[email protected]>2024-02-19 16:06:34 +0100
commitc58cc09cf50a18058efb59e1b4fb73ab1e3a45a2 (patch)
tree7674e6939fc30eb3b052686ea2ee95bde3580bca /src
parentd2556ebc3fbc59736863e53f5b2c35e72eb09ae8 (diff)
downloadouroboros-c58cc09cf50a18058efb59e1b4fb73ab1e3a45a2.tar.gz
ouroboros-c58cc09cf50a18058efb59e1b4fb73ab1e3a45a2.zip
lib: Fix CRC32 hashing0.21.1
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 <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/lib/hash.c2
-rw-r--r--src/lib/tests/hash_test.c48
2 files changed, 36 insertions, 14 deletions
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 <ouroboros/endian.h>
#include <ouroboros/hash.h>
#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 <ouroboros/hash.h>
+#include <ouroboros/test.h>
#include <stdlib.h>
#include <stdint.h>
@@ -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,