#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_ */