diff options
Diffstat (limited to 'lib/blake2/blake2s.h')
-rw-r--r-- | lib/blake2/blake2s.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/blake2/blake2s.h b/lib/blake2/blake2s.h new file mode 100644 index 0000000..64b4156 --- /dev/null +++ b/lib/blake2/blake2s.h @@ -0,0 +1,56 @@ +#pragma once + +#include <stddef.h> +#include <stdint.h> + +struct BLAKE2s_param { + uint8_t outlen; // digest length + uint8_t keylen; // key length + uint8_t fanout; + uint8_t depth; + uint32_t leaf_length; + uint32_t node_offset; + uint16_t node_offset_ex; + uint8_t node_depth; + uint8_t inner_length; + uint64_t salt; + uint64_t personalization; +}; + +struct BLAKE2s_ctx { + uint8_t b[64]; // input buffer + size_t c; // pointer for b[] + uint32_t h[8]; // chained state vector h + uint32_t t[2]; // total number of bytes + struct BLAKE2s_param param; // parameter block +}; + +/** + * 3.1 Mixing Function G + */ +void G(uint32_t V[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y); + +/** + * 3.2 Compression Function F + * @param t: 2w-bit offset counter t + * @param f: final block indicator flag f + */ +void F(struct BLAKE2s_ctx *context, uint32_t m[16], uint32_t f); + +int BLAKE2s_init(struct BLAKE2s_ctx *ctx, uint8_t outlen, const void *key, uint8_t keylen); +void BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd); +void BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out); + +// All-in-one convenience function. +static inline int +BLAKE2s(void *out, uint8_t outlen, // return buffer for digest + const void *key, uint8_t keylen, // optional secret key + const void *in, size_t inlen) // data to be hashed +{ + struct BLAKE2s_ctx ctx; + if (BLAKE2s_init(&ctx, outlen, key, keylen)) return -1; + BLAKE2s_update(&ctx, in, inlen); + BLAKE2s_final(&ctx, out); + + return 0; +} |