diff options
Diffstat (limited to 'libkeccak_state_marshal.c')
-rw-r--r-- | libkeccak_state_marshal.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libkeccak_state_marshal.c b/libkeccak_state_marshal.c new file mode 100644 index 0000000..2714a52 --- /dev/null +++ b/libkeccak_state_marshal.c @@ -0,0 +1,33 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + + +/** + * Marshal a `libkeccak_state_t` into a buffer + * + * @param state The state to marshal + * @param data The output buffer + * @return The number of bytes stored to `data` + */ +size_t +libkeccak_state_marshal(const libkeccak_state_t *restrict state, void *restrict data_) +{ +#define set(type, var) *((type *)data) = state->var, data += sizeof(type) / sizeof(char) + char *restrict data = data_; + set(long int, r); + set(long int, c); + set(long int, n); + set(long int, b); + set(long int, w); + set(int64_t, wmod); + set(long int, l); + set(long int, nr); + memcpy(data, state->S, sizeof(state->S)); + data += sizeof(state->S) / sizeof(char); + set(size_t, mptr); + set(size_t, mlen); + memcpy(data, state->M, state->mptr * sizeof(char)); + data += state->mptr; + return sizeof(libkeccak_state_t) - sizeof(char *) + state->mptr * sizeof(char); +#undef set +} |