word.h 938 Bytes
Newer Older
Martin Schläffer committed
1 2 3 4 5 6 7 8 9 10
#ifndef WORD_H_
#define WORD_H_

#include <stdint.h>

#define WORDTOU64
#define U64TOWORD

typedef uint64_t word_t;

Enrico Pozzobon committed
11
/* get byte from 64-bit Ascon word */
Martin Schläffer committed
12 13
#define GETBYTE(x, i) ((uint8_t)((uint64_t)(x) >> (56 - 8 * (i))))

Enrico Pozzobon committed
14
/* set byte in 64-bit Ascon word */
Martin Schläffer committed
15 16
#define SETBYTE(b, i) ((uint64_t)(b) << (56 - 8 * (i)))

Enrico Pozzobon committed
17
/* set padding byte in 64-bit Ascon word */
Martin Schläffer committed
18 19
#define PAD(i) SETBYTE(0x80, i)

Enrico Pozzobon committed
20
/* load bytes into 64-bit Ascon word */
Martin Schläffer committed
21 22 23 24 25 26
static inline uint64_t LOADBYTES(const uint8_t* bytes, int n) {
  uint64_t x = 0;
  for (int i = 0; i < n; ++i) x |= SETBYTE(bytes[i], i);
  return x;
}

Enrico Pozzobon committed
27
/* store bytes from 64-bit Ascon word */
Martin Schläffer committed
28 29 30 31
static inline void STOREBYTES(uint8_t* bytes, uint64_t x, int n) {
  for (int i = 0; i < n; ++i) bytes[i] = GETBYTE(x, i);
}

Enrico Pozzobon committed
32
/* clear bytes in 64-bit Ascon word */
Martin Schläffer committed
33 34 35 36 37 38
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_ */