#include "rivide/crypto/sha3.h"
#include "rivide/crypto/keccak.h"
#include "rivide/rivide_config.h"
#include "rivide/utils/mem.h"
#define SHA3_DOMAIN_SEP 0x06
#define SHAKE_DOMAIN_SEP 0x1F
#define SHA3_256_RATE 136
#define SHA3_512_RATE 72
#define SHAKE128_RATE 168
#define SHAKE256_RATE 136
static void keccak_hash(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen,
uint8_t domain_sep, size_t rate) {
rivide_keccak_state_t ctx;
rivide_keccak_init(&ctx, rate);
rivide_keccak_absorb(&ctx, in, inlen);
rivide_keccak_finalize(&ctx, domain_sep);
rivide_keccak_squeeze(&ctx, out, outlen);
rivide_cleanse(&ctx, sizeof(ctx));
}
void rivide_sha3_256(uint8_t *out, const uint8_t *in, size_t inlen) {
keccak_hash(out, RIVIDE_SHA3_256_BYTES, in, inlen, SHA3_DOMAIN_SEP, SHA3_256_RATE);
}
void rivide_sha3_512(uint8_t *out, const uint8_t *in, size_t inlen) {
keccak_hash(out, RIVIDE_SHA3_512_BYTES, in, inlen, SHA3_DOMAIN_SEP, SHA3_512_RATE);
}
void rivide_shake128(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) {
keccak_hash(out, outlen, in, inlen, SHAKE_DOMAIN_SEP, SHAKE128_RATE);
}
void rivide_shake256(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) {
keccak_hash(out, outlen, in, inlen, SHAKE_DOMAIN_SEP, SHAKE256_RATE);
}
void rivide_shake128_init(rivide_keccak_state_t *ctx) {
rivide_keccak_init(ctx, SHAKE128_RATE);
}
void rivide_shake256_init(rivide_keccak_state_t *ctx) {
rivide_keccak_init(ctx, SHAKE256_RATE);
}
void rivide_shake_absorb(rivide_keccak_state_t *ctx, const uint8_t *in, size_t inlen) {
rivide_keccak_absorb(ctx, in, inlen);
}
void rivide_shake_squeeze(rivide_keccak_state_t *ctx, uint8_t *out, size_t outlen) {
if (!ctx->squeezing) {
rivide_keccak_finalize(ctx, SHAKE_DOMAIN_SEP);
}
rivide_keccak_squeeze(ctx, out, outlen);
}