/* 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