#include "api.h"#include "ascon.h"#include "permutations.h"#include "printstate.h"voidascon_update(state_t*s,uint8_t*out,constuint8_t*in,uint64_tlen,uint8_tmode){constintnr=(ASCON_RATE==8)?6:8;word_ttmp0;intn=0;while(len){/* determine block size */n=len<ASCON_RATE?len:ASCON_RATE;/* absorb data */tmp0=LOAD(in,n);s->x0=XOR(s->x0,tmp0);/* extract data */if(mode&ASCON_SQUEEZE)STORE(out,s->x0,n);/* insert data */if(mode&ASCON_INSERT){s->x0=CLEAR(s->x0,n);s->x0=XOR(s->x0,tmp0);}/* compute permutation for full blocks */if(n==ASCON_RATE)P(s,nr);in+=n;out+=n;len-=n;}s->x0=XOR(s->x0,PAD(n%8));}