From 679c4501846391539061e53fbb6573daf407f8ba Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Mon, 9 Dec 2024 16:08:40 +0800 Subject: [PATCH] util/blake3: add _mesa_blake3_from_printed_string To convert printed blake3 string back to blake3 hash. Part-of: --- src/util/mesa-blake3.c | 27 ++++++++++++++++++++++++++- src/util/mesa-blake3.h | 5 ++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/util/mesa-blake3.c b/src/util/mesa-blake3.c index b813a288684..0f89f2da8a8 100644 --- a/src/util/mesa-blake3.c +++ b/src/util/mesa-blake3.c @@ -53,6 +53,13 @@ blake3_to_uint32(const blake3_hash blake3, out[i / 4] |= (uint32_t)blake3[i] << ((i % 4) * 8); } +static void +blake3_from_uint32(blake3_hash blake3, uint32_t in[BLAKE3_OUT_LEN32]) +{ + for (unsigned i = 0; i < BLAKE3_OUT_LEN; i++) + blake3[i] = (in[i / 4] >> ((i % 4) * 8)) & 0xff; +} + void _mesa_blake3_print(FILE *f, const blake3_hash blake3) { @@ -63,6 +70,24 @@ _mesa_blake3_print(FILE *f, const blake3_hash blake3) } } +bool +_mesa_blake3_from_printed_string(blake3_hash blake3, const char *printed) +{ + unsigned expected_len = BLAKE3_OUT_LEN32 * 12 - 2; + if (strlen(printed) != expected_len) + return false; + + uint32_t u32[BLAKE3_OUT_LEN32]; + for (unsigned i = 0; i < BLAKE3_OUT_LEN32; i++) { + int ret = sscanf(printed, i == BLAKE3_OUT_LEN32 - 1 ? "0x%08" PRIx32 : "0x%08" PRIx32 ", ", &u32[i]); + if (ret != 1) + return false; + printed += 12; + } + blake3_from_uint32(blake3, u32); + return true; +} + bool _mesa_printed_blake3_equal(const blake3_hash blake3, const uint32_t printed_blake3[BLAKE3_OUT_LEN32]) @@ -71,4 +96,4 @@ _mesa_printed_blake3_equal(const blake3_hash blake3, blake3_to_uint32(blake3, u32); return memcmp(u32, printed_blake3, sizeof(u32)) == 0; -} \ No newline at end of file +} diff --git a/src/util/mesa-blake3.h b/src/util/mesa-blake3.h index 10313a99672..504cad8911f 100644 --- a/src/util/mesa-blake3.h +++ b/src/util/mesa-blake3.h @@ -68,6 +68,9 @@ _mesa_blake3_compute(const void *data, size_t size, blake3_hash result); void _mesa_blake3_print(FILE *f, const blake3_hash blake3); +bool +_mesa_blake3_from_printed_string(blake3_hash blake3, const char *printed); + bool _mesa_printed_blake3_equal(const blake3_hash blake3, const uint32_t printed_blake3[BLAKE3_OUT_LEN32]); @@ -76,4 +79,4 @@ _mesa_printed_blake3_equal(const blake3_hash blake3, } /* extern C */ #endif -#endif \ No newline at end of file +#endif