/* See LICENSE file for copyright and license details. */ #include "common.h" #ifdef SUPPORT_BLAKE512 LIBHASHSUM_1_NONNULL_ static size_t process(struct libhashsum_hasher *this, const void *data, size_t bytes) { return libblake_blake512_update(&this->state.blake512.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_blake512_update(&this->state.blake512.s, data, bytes); m = &m[r]; bytes -= r; memcpy(this->state.blake512.buf, m, bytes + (size_t)(extra_bits > 0U)); if (extra_bits) this->state.blake512.buf[bytes] = libhashsum_reverse_byte__(this->state.blake512.buf[bytes]); libblake_blake512_digest(&this->state.blake512.s, this->state.blake512.buf, bytes, extra_bits, NULL, this->state.blake512.buf); memset(&this->state.blake512.s, 0, sizeof(this->state.blake512.s)); this->hash_output = this->state.blake512.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_blake512_update(&this->state.blake512.s, data, bytes); m = &m[r]; bytes -= r; size -= r; if (size < libblake_blake512_digest_get_required_input_size(bytes, extra_bits, NULL)) { memcpy(this->state.blake512.buf, m, bytes + (size_t)(extra_bits > 0U)); m = this->state.blake512.buf; } if (extra_bits) m[bytes] = libhashsum_reverse_byte__(m[bytes]); libblake_blake512_digest(&this->state.blake512.s, m, bytes, extra_bits, NULL, this->state.blake512.buf); memset(&this->state.blake512.s, 0, sizeof(this->state.blake512.s)); this->hash_output = this->state.blake512.buf; return 0; } int libhashsum_init_blake512_hasher(struct libhashsum_hasher *this) { libblake_init(); this->algorithm = LIBHASHSUM_BLAKE512; this->algorithm_string = "BLAKE512"; this->input_block_size = 128U; this->hash_size = LIBHASHSUM_BLAKE512_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_blake512_init2(&this->state.blake512.s, NULL); return 0; } #else int libhashsum_init_blake512_hasher(struct libhashsum_hasher *this) { (void) this; errno = ENOSYS; return -1; } #endif