HashReturn Init(hashState *state, int hashbitlen) { switch(hashbitlen) { case 0: // Default parameters, arbitrary length output InitSponge((spongeState*)state, 1024, 576); break; case 224: InitSponge((spongeState*)state, 1152, 448); break; case 256: InitSponge((spongeState*)state, 1088, 512); break; case 384: InitSponge((spongeState*)state, 832, 768); break; case 512: InitSponge((spongeState*)state, 576, 1024); break; default: return BAD_HASHLEN; } state->fixedOutputLength = hashbitlen; return HASH_SUCCESS; }
static int compress_keccak (uint8_t *out, const uint8_t *blocks[], unsigned int blocks_to_comp) { spongeState sponge; if (InitSponge (&sponge, KECCAK_RATE, KECCAK_CAPACITY)) return ERROR_KECCAK; for (unsigned int i = 0; i < blocks_to_comp; i++) { if (Absorb (&sponge, blocks[i], 8 * KECCAK_1600_BLOCK_SIZE)) return ERROR_KECCAK; } if (Squeeze (&sponge, out, 8 * KECCAK_1600_BLOCK_SIZE)) return ERROR_KECCAK; return ERROR_NONE; }
void keccak128(const unsigned char* in, const unsigned long long inlen, unsigned char *out) { spongeState state; InitSponge(&state, 1344, 256); Absorb(&state, in, inlen*8); Squeeze(&state, out, 128); }