process.c 740 Bytes
Newer Older
Martin Schläffer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#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;
  int n = 0;
  while (len) {
    /* determine block size */
    n = len < ASCON_RATE ? len : ASCON_RATE;
    /* absorb data */
    tmp0 = LOAD(in, n);
    XOR(s->x0, tmp0);
    /* extract data */
    if (mode != ASCON_AD) STORE(out, s->x0, n);
    /* insert data */
    if (mode == ASCON_DEC) {
      AND(s->x0, XMASK(n));
      XOR(s->x0, tmp0);
    }
    /* compute permutation for full blocks */
    if (n == ASCON_RATE) PB(s);
    in += n;
    out += n;
    len -= n;
  }
  XOR(s->x0, PAD(n % 8));
}