#include "api.h" #include "ascon.h" #include "permutations.h" #include "printstate.h" #include "word.h" int crypto_hash(uint8_t* out, const uint8_t* in, uint64_t len) { state_t s; /* initialization */ s.x0 = ASCON_HASH_IV; s.x1 = 0; s.x2 = 0; s.x3 = 0; s.x4 = 0; P12(&s); printstate("initialization", &s); /* absorb plaintext */ while (len >= ASCON_128_RATE) { s.x0 ^= LOADBYTES(in, 8); P12(&s); in += ASCON_128_RATE; len -= ASCON_128_RATE; } s.x0 ^= LOADBYTES(in, len); s.x0 ^= PAD(len); P12(&s); printstate("absorb plaintext", &s); /* squeeze output */ len = CRYPTO_BYTES; while (len > ASCON_128_RATE) { STOREBYTES(out, s.x0, 8); P12(&s); out += ASCON_128_RATE; len -= ASCON_128_RATE; } STOREBYTES(out, s.x0, 8); printstate("squeeze output", &s); return 0; }