round.h 1.37 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 64 65 66 67 68 69
#ifndef ROUND_H_
#define ROUND_H_

#include "ascon.h"
#include "printstate.h"

__forceinline void KINIT(word_t* K0, word_t* K1, word_t* K2) {
  *K0 = WORD_T(0);
  *K1 = WORD_T(0);
  *K2 = WORD_T(0);
}

__forceinline void PINIT(state_t* s) {
  s->x0 = WORD_T(0);
  s->x1 = WORD_T(0);
  s->x2 = WORD_T(0);
  s->x3 = WORD_T(0);
  s->x4 = WORD_T(0);
}

__forceinline void ROUND(state_t* s, uint64_t C) {
  state_t t;
  s->x2 ^= C;
  s->x0 ^= s->x4;
  s->x4 ^= s->x3;
  s->x2 ^= s->x1;
  t.x0 = s->x0;
  t.x4 = s->x4;
  t.x3 = s->x3;
  t.x1 = s->x1;
  t.x2 = s->x2;
  s->x0 = t.x0 ^ (~t.x1 & t.x2);
  s->x2 = t.x2 ^ (~t.x3 & t.x4);
  s->x4 = t.x4 ^ (~t.x0 & t.x1);
  s->x1 = t.x1 ^ (~t.x2 & t.x3);
  s->x3 = t.x3 ^ (~t.x4 & t.x0);
  s->x1 ^= s->x0;
  t.x1 = s->x1;
  s->x1 = ROR64(s->x1, 39);
  s->x3 ^= s->x2;
  t.x2 = s->x2;
  s->x2 = ROR64(s->x2, 1);
  t.x4 = s->x4;
  t.x2 ^= s->x2;
  s->x2 = ROR64(s->x2, 6 - 1);
  t.x3 = s->x3;
  t.x1 ^= s->x1;
  s->x3 = ROR64(s->x3, 10);
  s->x0 ^= s->x4;
  s->x4 = ROR64(s->x4, 7);
  t.x3 ^= s->x3;
  s->x2 ^= t.x2;
  s->x1 = ROR64(s->x1, 61 - 39);
  t.x0 = s->x0;
  s->x2 = ~s->x2;
  s->x3 = ROR64(s->x3, 17 - 10);
  t.x4 ^= s->x4;
  s->x4 = ROR64(s->x4, 41 - 7);
  s->x3 ^= t.x3;
  s->x1 ^= t.x1;
  s->x0 = ROR64(s->x0, 19);
  s->x4 ^= t.x4;
  t.x0 ^= s->x0;
  s->x0 = ROR64(s->x0, 28 - 19);
  s->x0 ^= t.x0;
  printstate(" round output", s);
}

#endif /* ROUND_H_ */