diff options
author | Mattias Andrée <maandree@kth.se> | 2024-08-24 18:02:00 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2024-08-24 18:02:00 +0200 |
commit | 72111e7a53eaad7bea841ab8b09e70642bde00ae (patch) | |
tree | 016e0326b794f8a5b9cc03139b8a5ab094ed7411 /libhashsum_init_keccak_hasher.c | |
parent | Make it possible for libhashsum_state to grow in future versions (diff) | |
download | libhashsum-72111e7a53eaad7bea841ab8b09e70642bde00ae.tar.gz libhashsum-72111e7a53eaad7bea841ab8b09e70642bde00ae.tar.bz2 libhashsum-72111e7a53eaad7bea841ab8b09e70642bde00ae.tar.xz |
Add support for Keccak, SHA3, SHAKE, and RawSHAKE via libkeccak>=1.3 (this version introduced zerocopy)
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libhashsum_init_keccak_hasher.c')
-rw-r--r-- | libhashsum_init_keccak_hasher.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/libhashsum_init_keccak_hasher.c b/libhashsum_init_keccak_hasher.c new file mode 100644 index 0000000..93622f6 --- /dev/null +++ b/libhashsum_init_keccak_hasher.c @@ -0,0 +1,75 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifdef SUPPORT_KECCAK + + +int +libhashsum_init_keccak_hasher(struct libhashsum_hasher *this, size_t ratebits, size_t capbits, size_t hashbits) +{ + struct libkeccak_generalised_spec gspec; + struct libkeccak_spec spec; + + if ((ratebits | capbits | hashbits) > (size_t)LONG_MAX) { + errno = EINVAL; + return -1; + } else if (!ratebits || !capbits || !hashbits) { + libkeccak_generalised_spec_initialise(&gspec); + if (ratebits) + gspec.bitrate = (long int)ratebits; + if (capbits) + gspec.capacity = (long int)capbits; + if (hashbits) + gspec.output = (long int)hashbits; + if (libkeccak_degeneralise_spec(&gspec, &spec)) { + errno = EINVAL; + return -1; + } + ratebits = (size_t)spec.bitrate; + capbits = (size_t)spec.capacity; + hashbits = (size_t)spec.output; + } else { + spec.bitrate = (long int)ratebits; + spec.capacity = (long int)capbits; + spec.output = (long int)hashbits; + } + if (libkeccak_spec_check(&spec)) { + errno = EINVAL; + return -1; + } + + this->algorithm = LIBHASHSUM_KECCAK; + if ((capbits >> 1) == hashbits && !(capbits & 1U) && + 1600U >= capbits && ratebits == 1600U - capbits) { + if (hashbits == 224U) { + this->algorithm = LIBHASHSUM_KECCAK_224; + this->algorithm_string = "Keccak-224"; + } else if (hashbits == 256U) { + this->algorithm = LIBHASHSUM_KECCAK_256; + this->algorithm_string = "Keccak-256"; + } else if (hashbits == 384U) { + this->algorithm = LIBHASHSUM_KECCAK_384; + this->algorithm_string = "Keccak-384"; + } else if (hashbits == 512U) { + this->algorithm = LIBHASHSUM_KECCAK_512; + this->algorithm_string = "Keccak-512"; + } + } + if (this->algorithm == LIBHASHSUM_KECCAK) { + sprintf(this->state.keccak.algostr, "Keccak[r=%zu,c=%zu,n=%zu]", ratebits, capbits, hashbits); + this->algorithm_string = this->state.keccak.algostr; + } + + return libhashsum_init_keccak__(this, hashbits, &spec, ""); +} + + +#else +int +libhashsum_init_keccak_hasher(struct libhashsum_hasher *this, size_t hashbits) +{ + (void) this; + (void) hashbits; + errno = ENOSYS; + return -1; +} +#endif |