aboutsummaryrefslogtreecommitdiffstats
path: root/libblake.h
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2022-01-08 22:57:27 +0100
committerMattias Andrée <maandree@kth.se>2022-01-08 22:57:27 +0100
commit12abd974fdf8362d41d688c478528c6b8047fa87 (patch)
tree096ace7f908e66089f379248e9fe036a85e4a1cb /libblake.h
parentAdd last_node parameter to libblake_blake2[sb]_digest (diff)
downloadlibblake-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.h76
1 files changed, 73 insertions, 3 deletions
diff --git a/libblake.h b/libblake.h
index 5e49726..7dc11a4 100644
--- a/libblake.h
+++ b/libblake.h
@@ -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