diff options
| author | Mattias Andrée <maandree@kth.se> | 2024-09-15 02:15:08 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2024-09-15 02:15:08 +0200 |
| commit | d4ce8327ff902b5ecd42d057063c03793e6d91c2 (patch) | |
| tree | 7ec1db1573f12225d6f6c324865b1b49a5a9580d /extra/libkeccak_state_marshal.c | |
| parent | m (diff) | |
| download | libkeccak-d4ce8327ff902b5ecd42d057063c03793e6d91c2.tar.gz libkeccak-d4ce8327ff902b5ecd42d057063c03793e6d91c2.tar.bz2 libkeccak-d4ce8327ff902b5ecd42d057063c03793e6d91c2.tar.xz | |
Organise files
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'extra/libkeccak_state_marshal.c')
| -rw-r--r-- | extra/libkeccak_state_marshal.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/extra/libkeccak_state_marshal.c b/extra/libkeccak_state_marshal.c new file mode 100644 index 0000000..7541164 --- /dev/null +++ b/extra/libkeccak_state_marshal.c @@ -0,0 +1,55 @@ +/* See LICENSE file for copyright and license details. */ +#include "../common.h" + + +#if defined(__clang__) +# pragma clang diagnostic ignored "-Wcast-align" +#endif + + +/** + * Marshal a `struct libkeccak_state` into a buffer + * + * @param state The state to marshal + * @param data_ The output buffer, can be `NULL` + * @return The number of bytes stored to `data` + */ +size_t +libkeccak_state_marshal(const struct libkeccak_state *restrict state, void *restrict data_) +{ +#define set(VAR)\ + do {\ + __builtin_memcpy(data, &state->VAR, sizeof(state->VAR));\ + data += sizeof(state->VAR);\ + } while (0) + + unsigned char *restrict start = data_; + unsigned char *restrict data = start; + + if (!data) { + return 7 * sizeof(long int) + + 1 * sizeof(int64_t) + + sizeof(state->S) + + 2 * sizeof(size_t) + + state->mptr; + } + + set(r); + set(c); + set(n); + set(b); + set(w); + set(wmod); + set(l); + set(nr); + __builtin_memcpy(data, state->S, sizeof(state->S)); + data += sizeof(state->S); + set(mptr); + set(mlen); + memcpy(data, state->M, state->mptr * sizeof(char)); + data += state->mptr; + + return (size_t)(data - start); + +#undef set +} |
