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