diff options
Diffstat (limited to '')
-rw-r--r-- | libhashsum_init_blake384_hasher.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/libhashsum_init_blake384_hasher.c b/libhashsum_init_blake384_hasher.c new file mode 100644 index 0000000..6f92c6c --- /dev/null +++ b/libhashsum_init_blake384_hasher.c @@ -0,0 +1,98 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifdef SUPPORT_BLAKE384 + + +LIBHASHSUM_1_NONNULL_ +static size_t +process(struct libhashsum_hasher *this, const void *data, size_t bytes) +{ + return libblake_blake384_update(&this->state.blake384.s, data, bytes); +} + + +LIBHASHSUM_1_NONNULL_ +static int +finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, unsigned extra_bits) +{ + const uint8_t *m = data; + size_t r; + + if (extra_bits > 7U) { + errno = EINVAL; + return -1; + } + + r = libblake_blake384_update(&this->state.blake384.s, data, bytes); + m = &m[r]; + bytes -= r; + + memcpy(this->state.blake384.buf, m, bytes + (size_t)(extra_bits > 0U)); + if (extra_bits) + this->state.blake384.buf[bytes] = libhashsum_reverse_byte__(this->state.blake384.buf[bytes]); + libblake_blake384_digest(&this->state.blake384.s, this->state.blake384.buf, bytes, + extra_bits, NULL, this->state.blake384.buf); + memset(&this->state.blake384.s, 0, sizeof(this->state.blake384.s)); + this->hash_output = this->state.blake384.buf; + return 0; +} + + +LIBHASHSUM_1_NONNULL_ +static int +finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extra_bits, size_t size) +{ + uint8_t *m = data; + size_t r; + + if (extra_bits > 7U) { + errno = EINVAL; + return -1; + } + + r = libblake_blake384_update(&this->state.blake384.s, data, bytes); + m = &m[r]; + bytes -= r; + size -= r; + + if (size < libblake_blake384_digest_get_required_input_size(bytes, extra_bits, NULL)) { + memcpy(this->state.blake384.buf, m, bytes + (size_t)(extra_bits > 0U)); + m = this->state.blake384.buf; + } + if (extra_bits) + m[bytes] = libhashsum_reverse_byte__(m[bytes]); + libblake_blake384_digest(&this->state.blake384.s, m, bytes, extra_bits, NULL, this->state.blake384.buf); + memset(&this->state.blake384.s, 0, sizeof(this->state.blake384.s)); + this->hash_output = this->state.blake384.buf; + return 0; +} + + +int +libhashsum_init_blake384_hasher(struct libhashsum_hasher *this) +{ + libblake_init(); + this->algorithm = LIBHASHSUM_BLAKE384; + this->algorithm_string = "BLAKE384"; + this->input_block_size = 128U; + this->hash_size = LIBHASHSUM_BLAKE384_HASH_SIZE; + this->hash_output = NULL; + this->supports_non_whole_bytes = 1; + this->process = &process; + this->finalise_const = &finalise_const; + this->finalise = &finalise; + this->destroy = NULL; + libblake_blake384_init2(&this->state.blake384.s, NULL); + return 0; +} + + +#else +int +libhashsum_init_blake384_hasher(struct libhashsum_hasher *this) +{ + (void) this; + errno = ENOSYS; + return -1; +} +#endif |