13using namespace blake_util;
20template <
typename Builder>
27 field_ct block_words[BLAKE3_STATE_SIZE];
28 for (
size_t i = 0; i < BLAKE3_STATE_SIZE; ++i) {
49 for (
size_t idx = 0; idx < 7; idx++) {
50 round_fn(state, block_words, idx,
true);
54template <
typename Builder>
61 compress_pre(state, cv, block, block_len, flags);
70 for (
size_t i = 0; i < (BLAKE3_STATE_SIZE >> 1); i++) {
72 cv[i] = lookup[ColumnIdx::C3][0];
76template <
typename Builder>
85 compress_pre(state, cv, block, block_len, flags);
91 for (
size_t i = 0; i < (BLAKE3_STATE_SIZE >> 1); i++) {
102template <
typename Builder>
109 for (
size_t i = 0; i < (BLAKE3_OUT_LEN >> 2); ++i) {
114 for (
size_t i = 0; i < BLAKE3_BLOCK_LEN; i++) {
115 ret.
block[i] = block[i];
128 for (
size_t i = 0; i < (BLAKE3_KEY_LEN >> 2); ++i) {
133 for (
size_t i = 0; i < BLAKE3_BLOCK_LEN; i++) {
141template <
typename Builder>
144 if (input_len == 0) {
148 size_t start_counter = 0;
149 while (input_len > BLAKE3_BLOCK_LEN) {
150 compress_in_place(self->
cv,
151 input.
slice(start_counter, BLAKE3_BLOCK_LEN),
153 self->
flags | maybe_start_flag(self));
155 start_counter += BLAKE3_BLOCK_LEN;
156 input_len -= BLAKE3_BLOCK_LEN;
159 size_t take = BLAKE3_BLOCK_LEN - ((size_t)self->
buf_len);
160 if (take > input_len) {
163 for (
size_t i = 0; i < take; i++) {
164 self->
buf[self->
buf_len + i] = input[i + start_counter];
167 self->
buf_len =
static_cast<uint8_t
>(self->
buf_len + (uint8_t)take);
173 uint8_t block_flags = self->
flags | maybe_start_flag(self) | CHUNK_END;
178 for (
size_t i = 0; i < BLAKE3_OUT_LEN; i++) {
179 out[i] = wide_buf[i];
186 "Barretenberg does not support blake3s with input lengths greater than 1024 bytes.");
190 hasher_init(&hasher);
191 hasher_update(&hasher, input, input.
size());
193 hasher_finalize(&hasher, result);
#define ASSERT(expression,...)
static void hasher_init(blake3_hasher *self)
static byte_array_ct hash(const byte_array_ct &input)
static void compress_in_place(field_t< Builder > cv[8], const byte_array_ct &block, uint8_t block_len, uint8_t flags)
static void compress_xof(const field_t< Builder > cv[8], const byte_array_ct &block, uint8_t block_len, uint8_t flags, byte_array_ct &out)
static void compress_pre(field_t< Builder > state[BLAKE3_STATE_SIZE], const field_t< Builder > cv[8], const byte_array_ct &block, uint8_t block_len, uint8_t flags)
static void hasher_finalize(const blake3_hasher *self, byte_array_ct &out)
static output_t make_output(const field_t< Builder > input_cv[8], const byte_array_ct &block, uint8_t block_len, uint8_t flags)
static void hasher_update(blake3_hasher *self, const byte_array_ct &input, size_t input_len)
Represents a dynamic array of bytes in-circuit.
byte_array slice(size_t offset) const
Slice bytes from the byte array starting at offset. Does not add any constraints.
byte_array reverse() const
Reverse the bytes in the byte array.
byte_array & write_at(byte_array const &other, size_t index)
Overwrites this byte_array starting at index with the contents of other. Asserts that the write does ...
Builder * get_context() const
stdlib::field_t< Builder > field_ct
stdlib::byte_array< Builder > byte_array_ct
void round_fn(field_t< Builder > state[BLAKE_STATE_SIZE], field_t< Builder > msg[BLAKE_STATE_SIZE], size_t round, const bool which_blake=false)
byte_array< Builder > buf
field_t< Builder > key[8]
uint8_t blocks_compressed
byte_array< Builder > block
field_t< Builder > input_cv[8]