1 | /*===-- llvm-c/blake3.h - BLAKE3 C Interface ----------------------*- C -*-===*\ |
2 | |* *| |
3 | |* Released into the public domain with CC0 1.0 *| |
4 | |* See 'llvm/lib/Support/BLAKE3/LICENSE' for info. *| |
5 | |* SPDX-License-Identifier: CC0-1.0 *| |
6 | |* *| |
7 | |*===----------------------------------------------------------------------===*| |
8 | |* *| |
9 | |* This header declares the C interface to LLVM's BLAKE3 implementation. *| |
10 | |* Original BLAKE3 C API: https://github.com/BLAKE3-team/BLAKE3/tree/1.3.1/c *| |
11 | |* *| |
12 | |* Symbols are prefixed with 'llvm' to avoid a potential conflict with *| |
13 | |* another BLAKE3 version within the same program. *| |
14 | |* *| |
15 | \*===----------------------------------------------------------------------===*/ |
16 | |
17 | #ifndef LLVM_C_BLAKE3_H |
18 | #define LLVM_C_BLAKE3_H |
19 | |
20 | #include <stddef.h> |
21 | #include <stdint.h> |
22 | |
23 | #ifdef __cplusplus |
24 | extern "C" { |
25 | #endif |
26 | |
27 | #define LLVM_BLAKE3_VERSION_STRING "1.3.1" |
28 | #define LLVM_BLAKE3_KEY_LEN 32 |
29 | #define LLVM_BLAKE3_OUT_LEN 32 |
30 | #define LLVM_BLAKE3_BLOCK_LEN 64 |
31 | #define LLVM_BLAKE3_CHUNK_LEN 1024 |
32 | #define LLVM_BLAKE3_MAX_DEPTH 54 |
33 | |
34 | // This struct is a private implementation detail. It has to be here because |
35 | // it's part of llvm_blake3_hasher below. |
36 | typedef struct { |
37 | uint32_t cv[8]; |
38 | uint64_t chunk_counter; |
39 | uint8_t buf[LLVM_BLAKE3_BLOCK_LEN]; |
40 | uint8_t buf_len; |
41 | uint8_t blocks_compressed; |
42 | uint8_t flags; |
43 | } llvm_blake3_chunk_state; |
44 | |
45 | typedef struct { |
46 | uint32_t key[8]; |
47 | llvm_blake3_chunk_state chunk; |
48 | uint8_t cv_stack_len; |
49 | // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example, |
50 | // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk |
51 | // requires a 4th entry, rather than merging everything down to 1, because we |
52 | // don't know whether more input is coming. This is different from how the |
53 | // reference implementation does things. |
54 | uint8_t cv_stack[(LLVM_BLAKE3_MAX_DEPTH + 1) * LLVM_BLAKE3_OUT_LEN]; |
55 | } llvm_blake3_hasher; |
56 | |
57 | const char *llvm_blake3_version(void); |
58 | void llvm_blake3_hasher_init(llvm_blake3_hasher *self); |
59 | void llvm_blake3_hasher_init_keyed(llvm_blake3_hasher *self, |
60 | const uint8_t key[LLVM_BLAKE3_KEY_LEN]); |
61 | void llvm_blake3_hasher_init_derive_key(llvm_blake3_hasher *self, |
62 | const char *context); |
63 | void llvm_blake3_hasher_init_derive_key_raw(llvm_blake3_hasher *self, |
64 | const void *context, |
65 | size_t context_len); |
66 | void llvm_blake3_hasher_update(llvm_blake3_hasher *self, const void *input, |
67 | size_t input_len); |
68 | void llvm_blake3_hasher_finalize(const llvm_blake3_hasher *self, uint8_t *out, |
69 | size_t out_len); |
70 | void llvm_blake3_hasher_finalize_seek(const llvm_blake3_hasher *self, |
71 | uint64_t seek, uint8_t *out, |
72 | size_t out_len); |
73 | void llvm_blake3_hasher_reset(llvm_blake3_hasher *self); |
74 | |
75 | #ifdef __cplusplus |
76 | } |
77 | #endif |
78 | |
79 | #endif /* LLVM_C_BLAKE3_H */ |
80 | |