word.h 1.9 KB
Newer Older
Martin Schläffer committed
1 2 3 4 5
#ifndef WORD_H_
#define WORD_H_

#include <stdint.h>

Enrico Pozzobon committed
6 7
#include "endian.h"
#include "forceinline.h"
Martin Schläffer committed
8 9 10

typedef uint64_t word_t;

Enrico Pozzobon committed
11 12 13 14 15
#define WORD_T
#define UINT64_T
#define U64TOWORD
#define WORDTOU64

Martin Schläffer committed
16 17 18 19 20 21
/* get byte from Ascon 64-bit word */
#define GETBYTE(x, i) ((uint8_t)((uint64_t)(x) >> (56 - 8 * (i))))

/* set byte in Ascon 64-bit word */
#define SETBYTE(b, i) ((uint64_t)(b) << (56 - 8 * (i)))

Enrico Pozzobon committed
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
forceinline word_t ROR(word_t x, int n) { return x >> n | x << (64 - n); }

forceinline word_t NOT(word_t a) { return ~a; }

forceinline word_t XOR(word_t a, word_t b) { return a ^ b; }

forceinline word_t AND(word_t a, word_t b) { return a & b; }

forceinline word_t KEYROT(word_t lo2hi, word_t hi2lo) {
  return lo2hi << 32 | hi2lo >> 32;
}

forceinline int NOTZERO(word_t a, word_t b) {
  uint64_t result = a | b;
  result |= result >> 32;
  result |= result >> 16;
  result |= result >> 8;
  return ((((int)(result & 0xff) - 1) >> 8) & 1) - 1;
}

forceinline word_t PAD(int i) { return 0x80ull << (56 - 8 * i); }

forceinline word_t CLEAR(word_t w, int n) {
  /* undefined for n == 0 */
  uint64_t mask = 0x00ffffffffffffffull >> (n * 8 - 8);
  return w & mask;
}

forceinline uint64_t MASK(int n) {
  /* undefined for n == 0 */
  return ~0ull >> (64 - 8 * n);
}

forceinline word_t LOAD(const uint8_t* bytes, int n) {
  uint64_t x = *(uint64_t*)bytes & MASK(n);
  return U64BIG(x);
}

forceinline void STORE(uint8_t* bytes, word_t w, int n) {
  *(uint64_t*)bytes &= ~MASK(n);
  *(uint64_t*)bytes |= U64BIG(w);
}
Martin Schläffer committed
64

Enrico Pozzobon committed
65
forceinline word_t LOADBYTES(const uint8_t* bytes, int n) {
Martin Schläffer committed
66
  uint64_t x = 0;
Enrico Pozzobon committed
67
  for (int i = 0; i < n; ++i) ((uint8_t*)&x)[7 - i] = bytes[i];
Martin Schläffer committed
68 69 70
  return x;
}

Enrico Pozzobon committed
71 72
forceinline void STOREBYTES(uint8_t* bytes, word_t w, int n) {
  for (int i = 0; i < n; ++i) bytes[i] = ((uint8_t*)&w)[7 - i];
Martin Schläffer committed
73 74 75 76 77 78 79 80
}

static inline uint64_t CLEARBYTES(uint64_t x, int n) {
  for (int i = 0; i < n; ++i) x &= ~SETBYTE(0xff, i);
  return x;
}

#endif /* WORD_H_ */