process.c 1.32 KB
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#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));
}