Skip to content

Commit 1df9e4d

Browse files
committed
Librhash: Support Blake3 hash function
1 parent 113be33 commit 1df9e4d

File tree

10 files changed

+483
-18
lines changed

10 files changed

+483
-18
lines changed

.github/workflows/run_test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ jobs:
2929
build-powerpc64:
3030
runs-on: ubuntu-latest
3131
name: Build and test on PowerPC 64
32+
needs: build
3233

3334
steps:
3435
- uses: actions/checkout@v4

librhash/Makefile

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
include config.mak
44

5-
HEADERS = algorithms.h byte_order.h plug_openssl.h rhash.h rhash_torrent.h aich.h blake2b.h blake2s.h crc32.h ed2k.h edonr.h hex.h md4.h md5.h sha1.h sha_ni.h sha256.h sha512.h sha3.h ripemd-160.h gost12.h gost94.h has160.h snefru.h tiger.h tth.h torrent.h ustd.h util.h whirlpool.h
6-
SOURCES = algorithms.c byte_order.c plug_openssl.c rhash.c rhash_torrent.c aich.c blake2b.c blake2s.c crc32.c ed2k.c edonr.c hex.c md4.c md5.c sha1.c sha_ni.c sha256.c sha512.c sha3.c ripemd-160.c gost12.c gost94.c has160.c snefru.c tiger.c tiger_sbox.c tth.c torrent.c util.c whirlpool.c whirlpool_sbox.c
5+
HEADERS = algorithms.h byte_order.h plug_openssl.h rhash.h rhash_torrent.h aich.h blake2b.h blake2s.h blake3.h crc32.h ed2k.h edonr.h hex.h md4.h md5.h sha1.h sha_ni.h sha256.h sha512.h sha3.h ripemd-160.h gost12.h gost94.h has160.h snefru.h tiger.h tth.h torrent.h ustd.h util.h whirlpool.h
6+
SOURCES = algorithms.c byte_order.c plug_openssl.c rhash.c rhash_torrent.c aich.c blake2b.c blake2s.c blake3.c crc32.c ed2k.c edonr.c hex.c md4.c md5.c sha1.c sha_ni.c sha256.c sha512.c sha3.c ripemd-160.c gost12.c gost94.c has160.c snefru.c tiger.c tiger_sbox.c tth.c torrent.c util.c whirlpool.c whirlpool_sbox.c
77
OBJECTS = $(SOURCES:.c=.o)
88
LIB_HEADERS = rhash.h rhash_torrent.h
99
TEST_STATIC = test_static$(EXEC_EXT)
@@ -70,9 +70,10 @@ aich.o: aich.c aich.h algorithms.h rhash.h byte_order.h ustd.h sha1.h \
7070
$(CC) -c $(CFLAGS) $< -o $@
7171

7272
algorithms.o: algorithms.c algorithms.h rhash.h byte_order.h ustd.h \
73-
util.h aich.h sha1.h blake2b.h blake2s.h crc32.h ed2k.h md4.h edonr.h \
74-
gost12.h gost94.h has160.h md5.h ripemd-160.h snefru.h sha_ni.h sha256.h \
75-
sha512.h sha3.h tiger.h torrent.h tth.h whirlpool.h plug_openssl.h
73+
util.h aich.h sha1.h blake2b.h blake2s.h blake3.h crc32.h ed2k.h md4.h \
74+
edonr.h gost12.h gost94.h has160.h md5.h ripemd-160.h snefru.h sha_ni.h \
75+
sha256.h sha512.h sha3.h tiger.h torrent.h tth.h whirlpool.h \
76+
plug_openssl.h
7677
$(CC) -c $(CFLAGS) $< -o $@
7778

7879
blake2b.o: blake2b.c blake2b.h ustd.h byte_order.h
@@ -81,6 +82,9 @@ blake2b.o: blake2b.c blake2b.h ustd.h byte_order.h
8182
blake2s.o: blake2s.c blake2s.h ustd.h byte_order.h
8283
$(CC) -c $(CFLAGS) $< -o $@
8384

85+
blake3.o: blake3.c blake3.h ustd.h byte_order.h
86+
$(CC) -c $(CFLAGS) $< -o $@
87+
8488
byte_order.o: byte_order.c byte_order.h ustd.h
8589
$(CC) -c $(CFLAGS) $< -o $@
8690

librhash/algorithms.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "aich.h"
2424
#include "blake2b.h"
2525
#include "blake2s.h"
26+
#include "blake3.h"
2627
#include "crc32.h"
2728
#include "ed2k.h"
2829
#include "edonr.h"
@@ -91,6 +92,7 @@ rhash_info info_snf128 = { EXTENDED_HASH_ID(27), F_BE32, 16, "SNEFRU-128", "
9192
rhash_info info_snf256 = { EXTENDED_HASH_ID(28), F_BE32, 32, "SNEFRU-256", "snefru256" };
9293
rhash_info info_blake2s = { EXTENDED_HASH_ID(29), F_LE32, 32, "BLAKE2S", "blake2s" };
9394
rhash_info info_blake2b = { EXTENDED_HASH_ID(30), F_LE64, 64, "BLAKE2B", "blake2b" };
95+
rhash_info info_blake3 = { EXTENDED_HASH_ID(31), F_LE32 | F_SPCEXP, 32, "BLAKE3", "blake3" };
9496

9597
/* some helper macros */
9698
#define dgshft(name) ((uintptr_t)((char*)&((name##_ctx*)0)->hash))
@@ -135,6 +137,7 @@ rhash_hash_info rhash_hash_info_default[] =
135137
{ &info_snf256, sizeof(snefru_ctx), dgshft(snefru), iuf2(rhash_snefru256, rhash_snefru), 0 }, /* 256 bit */
136138
{ &info_blake2s, sizeof(blake2s_ctx), dgshft(blake2s), iuf(rhash_blake2s), 0 }, /* 256 bit */
137139
{ &info_blake2b, sizeof(blake2b_ctx), dgshft(blake2b), iuf(rhash_blake2b), 0 }, /* 512 bit */
140+
{ &info_blake3, sizeof(blake3_ctx), dgshft2(blake3, root.hash), iuf(rhash_blake3), 0 } /* 256 bit */
138141
};
139142

140143
#if defined(RHASH_SSE4_SHANI) && !defined(RHASH_DISABLE_SHANI)
@@ -218,7 +221,7 @@ const unsigned* rhash_get_all_hash_ids(unsigned all_id, size_t* count)
218221
EXTENDED_HASH_ID(16), EXTENDED_HASH_ID(17), EXTENDED_HASH_ID(18), EXTENDED_HASH_ID(19),
219222
EXTENDED_HASH_ID(20), EXTENDED_HASH_ID(21), EXTENDED_HASH_ID(22), EXTENDED_HASH_ID(23),
220223
EXTENDED_HASH_ID(24), EXTENDED_HASH_ID(25), EXTENDED_HASH_ID(26), EXTENDED_HASH_ID(27),
221-
EXTENDED_HASH_ID(28), EXTENDED_HASH_ID(29), EXTENDED_HASH_ID(30)
224+
EXTENDED_HASH_ID(28), EXTENDED_HASH_ID(29), EXTENDED_HASH_ID(30), EXTENDED_HASH_ID(31)
222225
};
223226
static const unsigned count_low = rhash_popcount(RHASH_LOW_HASHES_MASK);
224227
RHASH_ASSERT(RHASH_COUNTOF(all_ids) == RHASH_HASH_COUNT);
@@ -311,6 +314,9 @@ static void rhash_crc32c_final(uint32_t* crc32c, unsigned char* result)
311314
}
312315

313316
#if !defined(NO_IMPORT_EXPORT)
317+
#define EXTENDED_TTH EXTENDED_HASH_ID(5)
318+
#define EXTENDED_AICH EXTENDED_HASH_ID(8)
319+
314320
/**
315321
* Export a hash function context to a memory region,
316322
* or calculate the size required for context export.
@@ -323,16 +329,19 @@ static void rhash_crc32c_final(uint32_t* crc32c, unsigned char* result)
323329
*/
324330
size_t rhash_export_alg(unsigned hash_id, const void* ctx, void* out, size_t size)
325331
{
326-
if (IS_EXTENDED_HASH_ID(hash_id))
327-
hash_id = 1 << GET_EXTENDED_HASH_ID_INDEX(hash_id);
328332
switch (hash_id)
329333
{
330334
case RHASH_TTH:
335+
case EXTENDED_TTH:
331336
return rhash_tth_export((const tth_ctx*)ctx, out, size);
332337
case RHASH_BTIH:
338+
case EXTENDED_BTIH:
333339
return bt_export((const torrent_ctx*)ctx, out, size);
334340
case RHASH_AICH:
341+
case EXTENDED_AICH:
335342
return rhash_aich_export((const aich_ctx*)ctx, out, size);
343+
case RHASH_BLAKE3:
344+
return rhash_blake3_export((const blake3_ctx*)ctx, out, size);
336345
}
337346
return 0;
338347
}
@@ -348,16 +357,19 @@ size_t rhash_export_alg(unsigned hash_id, const void* ctx, void* out, size_t siz
348357
*/
349358
size_t rhash_import_alg(unsigned hash_id, void* ctx, const void* in, size_t size)
350359
{
351-
if (IS_EXTENDED_HASH_ID(hash_id))
352-
hash_id = 1 << GET_EXTENDED_HASH_ID_INDEX(hash_id);
353360
switch (hash_id)
354361
{
355362
case RHASH_TTH:
363+
case EXTENDED_TTH:
356364
return rhash_tth_import((tth_ctx*)ctx, in, size);
357365
case RHASH_BTIH:
366+
case EXTENDED_BTIH:
358367
return bt_import((torrent_ctx*)ctx, in, size);
359368
case RHASH_AICH:
369+
case EXTENDED_AICH:
360370
return rhash_aich_import((aich_ctx*)ctx, in, size);
371+
case RHASH_BLAKE3:
372+
return rhash_blake3_import((blake3_ctx*)ctx, in, size);
361373
}
362374
return 0;
363375
}

0 commit comments

Comments
 (0)