summaryrefslogtreecommitdiff
path: root/src/lib/hash.c
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2026-04-25 22:46:05 +0200
committerSander Vrijders <sander@ouroboros.rocks>2026-05-06 09:04:41 +0200
commit20d4a472800cbc9338f0c6c9c3dfce8eb13663c7 (patch)
treeb796528ce6272c95c3e0fafe937fcc28898a3afc /src/lib/hash.c
parent77fdc9f1d162b2307d7752d56930710858f702b4 (diff)
downloadouroboros-20d4a472800cbc9338f0c6c9c3dfce8eb13663c7.tar.gz
ouroboros-20d4a472800cbc9338f0c6c9c3dfce8eb13663c7.zip
lib: Add CRC-64/NVMe checksum
Add CRC-64/NVMe implementation with compile-time hardware backend selection: x86 PCLMUL+SSE4.1 fold-by-16 (HAVE_PCLMUL) aarch64 PMULL fold-by-16 when (HAVE_PMULL) and a byte-table fallback. It's added as HASH_CRC64 to enum hash_algo (in the internal-use-only section after HASH_MD5). Both mem_hash() and hash_len() early-return for HASH_CRC64 because libgcrypt has no CRC-64/NVMe. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/lib/hash.c')
-rw-r--r--src/lib/hash.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/lib/hash.c b/src/lib/hash.c
index 7adee968..f32001d9 100644
--- a/src/lib/hash.c
+++ b/src/lib/hash.c
@@ -39,6 +39,7 @@
#include <ouroboros/md5.h>
#include <ouroboros/sha3.h>
#endif
+#include <ouroboros/crc64.h>
#include <string.h>
#include <assert.h>
#include <stdbool.h>
@@ -69,6 +70,8 @@ int hash_len_tbl [] = {
uint16_t hash_len(enum hash_algo algo)
{
+ if (algo == HASH_CRC64)
+ return CRC64_HASH_LEN;
#ifdef HAVE_LIBGCRYPT
return (uint16_t) gcry_md_get_algo_dlen(gcry_algo_tbl[algo]);
#else
@@ -81,6 +84,13 @@ void mem_hash(enum hash_algo algo,
const uint8_t * buf,
size_t len)
{
+ if (algo == HASH_CRC64) {
+ uint64_t crc = 0;
+
+ crc64_nvme(&crc, buf, len);
+ *(uint64_t *) dst = htobe64(crc);
+ return;
+ }
#ifdef HAVE_LIBGCRYPT
gcry_md_hash_buffer(gcry_algo_tbl[algo], dst, buf, len);
#else