From 10f61ef8a2deafb3b801786ad37338c410ed21d7 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 17 Nov 2018 22:32:32 +0000 Subject: [PATCH] symm/keccak1600.c: Add new function to overwrite the state. This is somewhat more useful for implementing duplex-style constructions. --- debian/catacomb2.symbols | 1 + symm/keccak1600.c | 29 +++++++++++++++++++++++++++++ symm/keccak1600.h | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/debian/catacomb2.symbols b/debian/catacomb2.symbols index b6ffba11..44c2da7d 100644 --- a/debian/catacomb2.symbols +++ b/debian/catacomb2.symbols @@ -4042,6 +4042,7 @@ libcatacomb.so.2 catacomb2 #MINVER# keccak1600_init@Base 2.4.0 keccak1600_p@Base 2.4.0 keccak1600_mix@Base 2.4.0 + keccak1600_set@Base 2.5.99~ keccak1600_extract@Base 2.4.0 ## sha3 common diff --git a/symm/keccak1600.c b/symm/keccak1600.c index 499ab4f6..c2d82926 100644 --- a/symm/keccak1600.c +++ b/symm/keccak1600.c @@ -589,6 +589,35 @@ void keccak1600_mix(keccak1600_state *s, const kludge64 *p, size_t n) { a = TO_LANE(p[i]); XOR_LANE(s->S[i], s->S[i], a); } } +/* --- @keccak1600_set@ --- * + * + * Arguments: @keccak1600_state *s@ = a state to update + * @const kludge64 *p@ = pointer to 64-bit words to mix in + * @size_t n@ = size of the input, in 64-bit words + * + * Returns: --- + * + * Use: Stores data into a %$\Keccak[r, 1600 - r]$% state. Note that + * it's the caller's responsibility to pass in no more than + * %$r$% bits of data. + * + * This is not the operation you wanted for ordinary hashing. + * It's provided for the use of higher-level protocols which use + * duplexing and other fancy sponge features. + */ + +void keccak1600_set(keccak1600_state *s, const kludge64 *p, size_t n) +{ + uint32 m = COMPL_MASK; + unsigned i; + lane a; + + for (i = 0; i < n; i++) { + a = TO_LANE(p[i]); if (m&1) NOT_LANE(a, a); + s->S[i] = a; m >>= 1; + } +} + /* --- @keccak1600_extract@ --- * * * Arguments: @const keccak1600_state *s@ = a state to extract output from diff --git a/symm/keccak1600.h b/symm/keccak1600.h index 2867be96..f5aad98d 100644 --- a/symm/keccak1600.h +++ b/symm/keccak1600.h @@ -112,6 +112,26 @@ extern void keccak1600_init(keccak1600_state */*s*/); extern void keccak1600_mix(keccak1600_state */*s*/, const kludge64 */*p*/, size_t /*n*/); +/* --- @keccak1600_set@ --- * + * + * Arguments: @keccak1600_state *s@ = a state to update + * @const kludge64 *p@ = pointer to 64-bit words to mix in + * @size_t n@ = size of the input, in 64-bit words + * + * Returns: --- + * + * Use: Stores data into a %$\Keccak[r, 1600 - r]$% state. Note that + * it's the caller's responsibility to pass in no more than + * %$r$% bits of data. + * + * This is not the operation you wanted for ordinary hashing. + * It's provided for the use of higher-level protocols which use + * duplexing and other fancy sponge features. + */ + +extern void keccak1600_set(keccak1600_state */*s*/, + const kludge64 */*p*/, size_t /*n*/); + /* --- @keccak1600_extract@ --- * * * Arguments: @const keccak1600_state *s@ = a state to extract output from -- 2.11.0