aboutsummaryrefslogtreecommitdiffstats
path: root/libkeccak_hmac_unmarshal.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libkeccak_hmac_unmarshal.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/libkeccak_hmac_unmarshal.c b/libkeccak_hmac_unmarshal.c
index 9627f1e..452efa3 100644
--- a/libkeccak_hmac_unmarshal.c
+++ b/libkeccak_hmac_unmarshal.c
@@ -5,7 +5,8 @@
/**
* Unmarshal a `struct libkeccak_hmac_state` from a buffer
*
- * @param state The slot for the unmarshalled state, must not be initialised (memory leak otherwise)
+ * @param state The slot for the unmarshalled state, must not be
+ * initialised (memory leak otherwise), can be `NULL`
* @param data The input buffer
* @return The number of bytes read from `data`, 0 on error
*/
@@ -18,33 +19,37 @@ libkeccak_hmac_unmarshal(struct libkeccak_hmac_state *restrict state, const void
state->key_opad = NULL;
state->key_ipad = NULL;
- parsed = libkeccak_state_unmarshal(&state->sponge, data);
- if (parsed == 0)
+ parsed = libkeccak_state_unmarshal(state ? &state->sponge : NULL, data);
+ if (!parsed)
return 0;
-
data += parsed / sizeof(char);
- state->key_length = *(const size_t *)data;
+
+ size = *(const size_t *)data;
data += sizeof(size_t) / sizeof(char);
+ if (state)
+ size = state->key_length;
size = (state->key_length + 7) >> 3;
- state->key_opad = malloc(2 * size);
- if (!state->key_opad) {
- libkeccak_state_destroy(&state->sponge);
- return 0;
+ if (state) {
+ state->key_opad = malloc(2 * size);
+ if (!state->key_opad) {
+ libkeccak_state_destroy(&state->sponge);
+ return 0;
+ }
+ memcpy(state->key_opad, data, size);
+ data += size / sizeof(char);
+
+ if (data[0]) {
+ state->key_ipad = state->key_opad + size / sizeof(char);
+ memcpy(state->key_ipad, state->key_opad, size);
+ for (i = 0; i < size / sizeof(char); i++)
+ state->key_ipad[i] ^= (char)(HMAC_OUTER_PAD ^ HMAC_INNER_PAD);
+ }
+
+ state->leftover = data[1];
+ state->buffer = NULL;
+ state->buffer_size = 0;
}
- memcpy(state->key_opad, data, size);
- data += size / sizeof(char);
-
- if (data[0]) {
- state->key_ipad = state->key_opad + size / sizeof(char);
- memcpy(state->key_ipad, state->key_opad, size);
- for (i = 0; i < size / sizeof(char); i++)
- state->key_ipad[i] ^= (char)(HMAC_OUTER_PAD ^ HMAC_INNER_PAD);
- }
-
- state->leftover = data[1];
- state->buffer = NULL;
- state->buffer_size = 0;
return parsed + sizeof(size_t) + size + 2 * sizeof(char);
}