llvm_sys/
blake3.rs

1//! LLVM's BLAKE3 implementation.
2//! Original BLAKE3 C API: <https://github.com/BLAKE3-team/BLAKE3/tree/1.3.1/c>
3
4pub const LLVM_BLAKE3_VERSION_STRING: &str = "1.3.1";
5pub const LLVM_BLAKE3_KEY_LEN: usize = 32;
6pub const LLVM_BLAKE3_OUT_LEN: usize = 32;
7pub const LLVM_BLAKE3_BLOCK_LEN: usize = 64;
8pub const LLVM_BLAKE3_CHUNK_LEN: usize = 1024;
9pub const LLVM_BLAKE3_MAX_DEPTH: usize = 54;
10
11/// This struct is a private implementation detail. It has to be here because
12/// it's part of llvm_blake3_hasher below.
13#[repr(C)]
14struct llvm_blake3_chunk_state {
15    cv: [u32; 8],
16    chunk_counter: u64,
17    buf: [u8; LLVM_BLAKE3_BLOCK_LEN],
18    buf_len: u8,
19    blocks_compressed: u8,
20    flags: u8,
21}
22
23#[repr(C)]
24pub struct llvm_blake3_hasher {
25    key: [u32; 8],
26    chunk: llvm_blake3_chunk_state,
27    cv_stack_len: u8,
28    /// The stack size is MAX_DEPTH + 1 because we do lazy merging. For example,
29    /// with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk
30    /// requires a 4th entry, rather than merging everything down to 1, because we
31    /// don't know whether more input is coming. This is different from how the
32    /// reference implementation does things.
33    cv_stack: [u8; (LLVM_BLAKE3_MAX_DEPTH + 1) * LLVM_BLAKE3_OUT_LEN],
34}
35
36extern "C" {
37    pub fn llvm_blake3_version() -> *const ::libc::c_char;
38    pub fn llvm_blake3_hasher_init(hasher: *mut llvm_blake3_hasher);
39    pub fn llvm_blake3_hasher_init_keyed(hasher: *mut llvm_blake3_hasher, key: *const u8);
40    pub fn llvm_blake3_hasher_init_derive_key(
41        hasher: *mut llvm_blake3_hasher,
42        context: *const ::libc::c_char,
43    );
44    pub fn llvm_blake3_hasher_init_derive_key_raw(
45        hasher: *mut llvm_blake3_hasher,
46        context: *const ::libc::c_char,
47        context_len: usize,
48    );
49    pub fn llvm_blake3_hasher_update(
50        hasher: *mut llvm_blake3_hasher,
51        input: *const ::libc::c_void,
52        input_len: usize,
53    );
54    pub fn llvm_blake3_hasher_finalize(
55        hasher: *mut llvm_blake3_hasher,
56        out: *mut u8,
57        out_len: usize,
58    );
59    pub fn llvm_blake3_hasher_finalize_seek(
60        hasher: *mut llvm_blake3_hasher,
61        seek: u64,
62        out: *mut u8,
63        out_len: usize,
64    );
65    pub fn llvm_blake3_hasher_reset(hasher: *mut llvm_blake3_hasher);
66}