diff options
author | Mattias Andrée <maandree@kth.se> | 2022-01-08 22:57:27 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2022-01-08 22:57:27 +0100 |
commit | 12abd974fdf8362d41d688c478528c6b8047fa87 (patch) | |
tree | 096ace7f908e66089f379248e9fe036a85e4a1cb /libblake.h | |
parent | Add last_node parameter to libblake_blake2[sb]_digest (diff) | |
download | libblake-12abd974fdf8362d41d688c478528c6b8047fa87.tar.gz libblake-12abd974fdf8362d41d688c478528c6b8047fa87.tar.bz2 libblake-12abd974fdf8362d41d688c478528c6b8047fa87.tar.xz |
Add BLAKE2X
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libblake.h')
-rw-r--r-- | libblake.h | 76 |
1 files changed, 73 insertions, 3 deletions
@@ -75,8 +75,7 @@ struct libblake_blake2s_params { uint_least8_t fanout; /* normally 1 */ uint_least8_t depth; /* normally 1 */ uint_least32_t leaf_len; /* normally 0 */ - uint_least32_t node_offset; /* normally 0 */ - uint_least16_t xof_len; /* normally 0 */ + uint_least64_t node_offset; /* (48-bits) normally 0 */ uint_least8_t node_depth; /* normally 0 */ uint_least8_t inner_len; /* normally 0 */ uint_least8_t salt[8]; @@ -89,8 +88,35 @@ struct libblake_blake2b_params { uint_least8_t fanout; /* normally 1 */ uint_least8_t depth; /* normally 1 */ uint_least32_t leaf_len; /* normally 0 */ + uint_least64_t node_offset; /* normally 0 */ + uint_least8_t node_depth; /* normally 0 */ + uint_least8_t inner_len; /* normally 0 */ + uint_least8_t salt[16]; + uint_least8_t pepper[16]; +}; + +struct libblake_blake2xs_params { + uint_least8_t digest_len; /* in bytes, [1, 32] */ + uint_least8_t key_len; /* in bytes, [0, 32] */ + uint_least8_t fanout; /* normally 1 */ + uint_least8_t depth; /* normally 1 */ + uint_least32_t leaf_len; /* normally 0 */ uint_least32_t node_offset; /* normally 0 */ - uint_least32_t xof_len; /* normally 0 */ + uint_least16_t xof_len; /* max if not known in advance */ + uint_least8_t node_depth; /* normally 0 */ + uint_least8_t inner_len; /* normally 0 */ + uint_least8_t salt[8]; + uint_least8_t pepper[8]; +}; + +struct libblake_blake2xb_params { + uint_least8_t digest_len; /* in bytes, [1, 64] */ + uint_least8_t key_len; /* in bytes, [0, 64] */ + uint_least8_t fanout; /* normally 1 */ + uint_least8_t depth; /* normally 1 */ + uint_least32_t leaf_len; /* normally 0 */ + uint_least32_t node_offset; /* normally 0 */ + uint_least32_t xof_len; /* max if not known in advance */ uint_least8_t node_depth; /* normally 0 */ uint_least8_t inner_len; /* normally 0 */ uint_least8_t salt[16]; @@ -109,6 +135,18 @@ struct libblake_blake2b_state { uint_least64_t f[2]; }; +struct libblake_blake2xs_state { + struct libblake_blake2s_state b2s; + struct libblake_blake2xs_params xof_params; + unsigned char intermediate[64]; +}; + +struct libblake_blake2xb_state { + struct libblake_blake2b_state b2b; + struct libblake_blake2xb_params xof_params; + unsigned char intermediate[128]; +}; + void libblake_blake2s_init(struct libblake_blake2s_state *state, const struct libblake_blake2s_params *params, const unsigned char *key /* append null bytes until 64 bytes; if key is used */); size_t libblake_blake2s_update(struct libblake_blake2s_state *state, const void *data, size_t len); @@ -123,4 +161,36 @@ void libblake_blake2b_digest(struct libblake_blake2b_state *state, void *data, s size_t output_len, unsigned char output[static output_len]); LIBBLAKE_CONST__ size_t libblake_blake2b_digest_get_required_input_size(size_t len); +void libblake_blake2xs_init(struct libblake_blake2xs_state *state, const struct libblake_blake2xs_params *params, + const unsigned char *key /* append null bytes until 64 bytes; if key is used */); +inline size_t libblake_blake2xs_update(struct libblake_blake2xs_state *state, const void *data, size_t len) { + return libblake_blake2s_update(&state->b2s, data, len); +} +inline void libblake_blake2xs_predigest(struct libblake_blake2xs_state *state, void *data, size_t len, int last_node) { + libblake_blake2s_digest(&state->b2s, data, len, last_node, (size_t)state->xof_params.digest_len, state->intermediate); +} +LIBBLAKE_PURE__ inline size_t libblake_blake2xs_predigest_get_required_input_size(const struct libblake_blake2xs_state *state) { + return libblake_blake2s_digest_get_required_input_size((size_t)state->xof_params.digest_len); +} +void libblake_blake2xs_digest(const struct libblake_blake2xs_state *state, + uint_least32_t i /* start 0, increase by 1 until i * 32 >= desired hash length */, + uint_least8_t len /* desired hash MIN(length - i * 32, 32) */, + unsigned char output[static len] /* output for hash offset by i * 32 */); + +void libblake_blake2xb_init(struct libblake_blake2xb_state *state, const struct libblake_blake2xb_params *params, + const unsigned char *key /* append null bytes until 128 bytes; if key is used */); +inline size_t libblake_blake2xb_update(struct libblake_blake2xb_state *state, const void *data, size_t len) { + return libblake_blake2b_update(&state->b2b, data, len); +} +inline void libblake_blake2xb_predigest(struct libblake_blake2xb_state *state, void *data, size_t len, int last_node) { + libblake_blake2b_digest(&state->b2b, data, len, last_node, state->xof_params.digest_len, state->intermediate); +} +LIBBLAKE_PURE__ inline size_t libblake_blake2xb_predigest_get_required_input_size(const struct libblake_blake2xb_state *state) { + return libblake_blake2b_digest_get_required_input_size((size_t)state->xof_params.digest_len); +} +void libblake_blake2xb_digest(const struct libblake_blake2xb_state *state, + uint_least32_t i /* start 0, increase by 1 until i * 64 >= desired hash length */, + uint_least8_t len /* desired hash MIN(length - i * 64, 64) */, + unsigned char output[static len] /* output for hash offset by i * 64 */); + #endif |