xref: /aosp_15_r20/external/mesa3d/src/util/blake3/blake3.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker #ifndef BLAKE3_H
2*61046927SAndroid Build Coastguard Worker #define BLAKE3_H
3*61046927SAndroid Build Coastguard Worker 
4*61046927SAndroid Build Coastguard Worker #include <stddef.h>
5*61046927SAndroid Build Coastguard Worker #include <stdint.h>
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
8*61046927SAndroid Build Coastguard Worker extern "C" {
9*61046927SAndroid Build Coastguard Worker #endif
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #define BLAKE3_VERSION_STRING "1.5.1"
12*61046927SAndroid Build Coastguard Worker #define BLAKE3_KEY_LEN 32
13*61046927SAndroid Build Coastguard Worker #define BLAKE3_OUT_LEN 32
14*61046927SAndroid Build Coastguard Worker #define BLAKE3_BLOCK_LEN 64
15*61046927SAndroid Build Coastguard Worker #define BLAKE3_CHUNK_LEN 1024
16*61046927SAndroid Build Coastguard Worker #define BLAKE3_MAX_DEPTH 54
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker // This struct is a private implementation detail. It has to be here because
19*61046927SAndroid Build Coastguard Worker // it's part of blake3_hasher below.
20*61046927SAndroid Build Coastguard Worker typedef struct {
21*61046927SAndroid Build Coastguard Worker   uint32_t cv[8];
22*61046927SAndroid Build Coastguard Worker   uint64_t chunk_counter;
23*61046927SAndroid Build Coastguard Worker   uint8_t buf[BLAKE3_BLOCK_LEN];
24*61046927SAndroid Build Coastguard Worker   uint8_t buf_len;
25*61046927SAndroid Build Coastguard Worker   uint8_t blocks_compressed;
26*61046927SAndroid Build Coastguard Worker   uint8_t flags;
27*61046927SAndroid Build Coastguard Worker } blake3_chunk_state;
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker typedef struct blake3_hasher {
30*61046927SAndroid Build Coastguard Worker   uint32_t key[8];
31*61046927SAndroid Build Coastguard Worker   blake3_chunk_state chunk;
32*61046927SAndroid Build Coastguard Worker   uint8_t cv_stack_len;
33*61046927SAndroid Build Coastguard Worker   // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example,
34*61046927SAndroid Build Coastguard Worker   // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk
35*61046927SAndroid Build Coastguard Worker   // requires a 4th entry, rather than merging everything down to 1, because we
36*61046927SAndroid Build Coastguard Worker   // don't know whether more input is coming. This is different from how the
37*61046927SAndroid Build Coastguard Worker   // reference implementation does things.
38*61046927SAndroid Build Coastguard Worker   uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];
39*61046927SAndroid Build Coastguard Worker } blake3_hasher;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker const char *blake3_version(void);
42*61046927SAndroid Build Coastguard Worker void blake3_hasher_init(blake3_hasher *self);
43*61046927SAndroid Build Coastguard Worker void blake3_hasher_init_keyed(blake3_hasher *self,
44*61046927SAndroid Build Coastguard Worker                               const uint8_t key[BLAKE3_KEY_LEN]);
45*61046927SAndroid Build Coastguard Worker void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context);
46*61046927SAndroid Build Coastguard Worker void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context,
47*61046927SAndroid Build Coastguard Worker                                        size_t context_len);
48*61046927SAndroid Build Coastguard Worker void blake3_hasher_update(blake3_hasher *self, const void *input,
49*61046927SAndroid Build Coastguard Worker                           size_t input_len);
50*61046927SAndroid Build Coastguard Worker void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,
51*61046927SAndroid Build Coastguard Worker                             size_t out_len);
52*61046927SAndroid Build Coastguard Worker void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,
53*61046927SAndroid Build Coastguard Worker                                  uint8_t *out, size_t out_len);
54*61046927SAndroid Build Coastguard Worker void blake3_hasher_reset(blake3_hasher *self);
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
57*61046927SAndroid Build Coastguard Worker }
58*61046927SAndroid Build Coastguard Worker #endif
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker #endif /* BLAKE3_H */
61