Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 */ |