HashReturn Init(hashState *state, int hashbitlen) { KeccakInitialize(); switch(hashbitlen) { case 0: // Arbitrary length output state->capacity = 576; break; case 224: state->capacity = 448; break; case 256: state->capacity = 512; break; case 384: state->capacity = 768; break; case 512: state->capacity = 1024; break; default: return BAD_HASHLEN; } state->rate = KeccakPermutationSize - state->capacity; state->diversifier = hashbitlen/8; state->hashbitlen = hashbitlen; KeccakInitializeState(state->state); memset(state->dataQueue, 0, KeccakMaximumRateInBytes); state->bitsInQueue = 0; state->squeezing = 0; state->bitsAvailableForSqueezing = 0; return SUCCESS; }
int InitDuplex(duplexState *state, unsigned int rate, unsigned int capacity) { if (rate+capacity != 1600) return 1; if ((rate <= 0) || (rate > 1600)) return 1; KeccakInitialize(); state->rate = rate; state->capacity = capacity; state->rho_max = rate-2; KeccakInitializeState(state->state); return 0; }
static int InitSponge(spongeState *state, unsigned int rate, unsigned int capacity) { if (rate+capacity != 1600) return 1; if ((rate <= 0) || (rate >= 1600) || ((rate % 64) != 0)) return 1; KeccakInitialize(); state->rate = rate; state->capacity = capacity; state->fixedOutputLength = 0; KeccakInitializeState(state->state); memset(state->dataQueue, 0, KeccakMaximumRateInBytes); state->bitsInQueue = 0; state->squeezing = 0; state->bitsAvailableForSqueezing = 0; return 0; }
HashReturn InitEx(hashState *state, unsigned int rate, unsigned int capacity, unsigned char diversifier) { if (rate+capacity != 1600) return BAD_HASHLEN; if ((rate <= 0) || (rate >= 1600) || ((rate % 64) != 0)) return BAD_HASHLEN; KeccakInitialize(); state->rate = rate; state->capacity = capacity; state->diversifier = diversifier; state->hashbitlen = 0; KeccakInitializeState(state->state); memset(state->dataQueue, 0, KeccakMaximumRateInBytes); state->bitsInQueue = 0; state->squeezing = 0; state->bitsAvailableForSqueezing = 0; return SUCCESS; }