#include "api.h" #include "ascon.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; while (len >= ASCON_RATE) { tmp0 = LOAD64(in); tmp1 = LOAD64(in + 8); s->x0 = XOR(s->x0, tmp0); s->x1 = XOR(s->x1, tmp1); if (mode & ASCON_SQUEEZE) { STORE64(out, s->x0); STORE64(out + 8, s->x1); } if (mode & ASCON_INSERT) { 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); s->x0 = XOR(s->x0, tmp0); s->x1 = XOR(s->x1, tmp1); if (mode & ASCON_SQUEEZE) { 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_INSERT) { if (len >= 8) s->x0 = tmp0; if (len > 8) { s->x1 = CLEAR(s->x1, len - 8); s->x1 = XOR(s->x1, tmp1); } else { s->x0 = CLEAR(s->x0, len); s->x0 = XOR(s->x0, tmp0); } } } if (len < 8) s->x0 = XOR(s->x0, PAD(len % 8)); else s->x1 = XOR(s->x1, PAD(len % 8)); }