process.c 1.35 KB
Newer Older
Martin Schläffer committed
1 2 3 4 5 6 7 8 9 10 11 12
#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);
Martin Schläffer committed
13 14 15
    s->x0 = XOR(s->x0, tmp0);
    s->x1 = XOR(s->x1, tmp1);
    if (mode & ASCON_SQUEEZE) {
Martin Schläffer committed
16 17 18
      STORE64(out, s->x0);
      STORE64(out + 8, s->x1);
    }
Martin Schläffer committed
19
    if (mode & ASCON_INSERT) {
Martin Schläffer committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
      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);
Martin Schläffer committed
36 37 38
    s->x0 = XOR(s->x0, tmp0);
    s->x1 = XOR(s->x1, tmp1);
    if (mode & ASCON_SQUEEZE) {
Martin Schläffer committed
39 40 41 42 43 44
      if (len >= 8) STORE64(out, s->x0);
      if (len > 8)
        STORE(out + 8, s->x1, len - 8);
      else
        STORE(out, s->x0, len);
    }
Martin Schläffer committed
45
    if (mode & ASCON_INSERT) {
Martin Schläffer committed
46 47
      if (len >= 8) s->x0 = tmp0;
      if (len > 8) {
Martin Schläffer committed
48 49
        s->x1 = CLEAR(s->x1, len - 8);
        s->x1 = XOR(s->x1, tmp1);
Martin Schläffer committed
50
      } else {
Martin Schläffer committed
51 52
        s->x0 = CLEAR(s->x0, len);
        s->x0 = XOR(s->x0, tmp0);
Martin Schläffer committed
53 54 55 56
      }
    }
  }
  if (len < 8)
Martin Schläffer committed
57
    s->x0 = XOR(s->x0, PAD(len % 8));
Martin Schläffer committed
58
  else
Martin Schläffer committed
59
    s->x1 = XOR(s->x1, PAD(len % 8));
Martin Schläffer committed
60
}