| 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 | |