1/* see LICENSE file for copyright and license details */
2#ifndef ARUU_LIBBLAKE3_H
3#define ARUU_LIBBLAKE3_H
4
5#include <stddef.h>
6#include <stdint.h>
7
8#define BLAKE3_KEY_LEN 32
9#define BLAKE3_OUT_LEN 32
10#define BLAKE3_BLOCK_LEN 64
11#define BLAKE3_CHUNK_LEN 1024
12#define BLAKE3_MAX_DEPTH 54
13
14struct Blake3ChunkState {
15 uint32_t cv[8];
16 uint64_t chunk_counter;
17 uint8_t buf[BLAKE3_BLOCK_LEN];
18 uint8_t buf_len;
19 uint8_t blocks_compressed;
20 uint8_t flags;
21};
22
23struct Blake3Hasher {
24 uint32_t key[8];
25 struct Blake3ChunkState chunk;
26 uint8_t cv_stack_len;
27 uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];
28};
29
30void blake3_hasher_init(struct Blake3Hasher *self);
31void blake3_hasher_init_keyed(struct Blake3Hasher *self, const uint8_t key[BLAKE3_KEY_LEN]);
32void blake3_hasher_init_derive_key(struct Blake3Hasher *self, const char *context);
33void blake3_hasher_init_derive_key_raw(struct Blake3Hasher *self, const void *context,
34 size_t context_len);
35void blake3_hasher_update(struct Blake3Hasher *self, const void *input, size_t input_len);
36void blake3_hasher_finalize(const struct Blake3Hasher *self, uint8_t *out, size_t out_len);
37void blake3_hasher_finalize_seek(const struct Blake3Hasher *self, uint64_t seek, uint8_t *out,
38 size_t out_len);
39void blake3_hasher_reset(struct Blake3Hasher *self);
40
41const char *blake3_version(void);
42
43#endif