#include "api.h" #include "ascon.h" #include "loadstore.h" #include "permutations.h" #include "printstate.h" void process_data(state_t* s, uint8_t* out, const uint8_t* in, uint64_t len, uint8_t mode) { word_t tmp0, tmp1; uint64_t t0, t1; uint64_t i; while (len >= ASCON_RATE) { tmp0 = LOAD64(in); tmp1 = LOAD64(in + 8); XOR(s->x0, tmp0); XOR(s->x1, tmp1); if (mode != ASCON_AD) { STORE64(out, s->x0); STORE64(out + 8, s->x1); } if (mode == ASCON_DEC) { s->x0 = tmp0; s->x1 = tmp1; } PB(s); in += ASCON_RATE; out += ASCON_RATE; len -= ASCON_RATE; } if (len) { tmp1 = WORD_T(0); if (len >= 8) tmp0 = LOAD64(in); if (len > 8) tmp1 = LOAD(in + 8, len - 8); else tmp0 = LOAD(in, len); XOR(s->x0, tmp0); XOR(s->x1, tmp1); if (mode != ASCON_AD) { if (len >= 8) STORE64(out, s->x0); if (len > 8) STORE(out + 8, s->x1, len - 8); else STORE(out, s->x0, len); } if (mode == ASCON_DEC) { if (len >= 8) s->x0 = tmp0; if (len > 8) { AND(s->x1, XMASK(len - 8)); XOR(s->x1, tmp1); } else { AND(s->x0, XMASK(len)); XOR(s->x0, tmp0); } } } if (len < 8) XOR(s->x0, PAD(len % 8)); else XOR(s->x1, PAD(len % 8)); }