permutations.h 3.84 KB
Newer Older
Enrico Pozzobon 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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_

#include <stdint.h>

#include "api.h"
#include "ascon.h"
#include "config.h"
#include "printstate.h"
#include "round.h"

#define ASCON_128_KEYBYTES 16
#define ASCON_128A_KEYBYTES 16
#define ASCON_80PQ_KEYBYTES 20

#define ASCON_128_RATE 8
#define ASCON_128A_RATE 16
#define ASCON_HASH_RATE 8

#define ASCON_128_PA_ROUNDS 12
#define ASCON_128_PB_ROUNDS 6

#define ASCON_128A_PA_ROUNDS 12
#define ASCON_128A_PB_ROUNDS 8

#define ASCON_HASH_PA_ROUNDS 12
#define ASCON_HASH_PB_ROUNDS 12

#define ASCON_HASHA_PA_ROUNDS 12
#define ASCON_HASHA_PB_ROUNDS 8

#define ASCON_HASH_BYTES 32

#define ASCON_128_IV WORD_T(0x8040000020301000ull)
#define ASCON_128A_IV WORD_T(0xc000000030200000ull)
#define ASCON_80PQ_IV WORD_T(0x8040800020301000ull)
#define ASCON_HASH_IV WORD_T(0x0040000020200002ull)
#define ASCON_XOF_IV WORD_T(0x0040000020200000ull)

#define ASCON_HASH_IV0 WORD_T(0xfa8e976bb985dc4dull)
#define ASCON_HASH_IV1 WORD_T(0xc8085072a40ccd94ull)
#define ASCON_HASH_IV2 WORD_T(0xfe1781be5a847314ull)
#define ASCON_HASH_IV3 WORD_T(0x2f871f6c6d0082b2ull)
#define ASCON_HASH_IV4 WORD_T(0x7a1ba68850ec407eull)

#define ASCON_HASHA_IV0 WORD_T(0x194c0f180a5d41e4ull)
#define ASCON_HASHA_IV1 WORD_T(0x7faa87825647f3a7ull)
#define ASCON_HASHA_IV2 WORD_T(0x606dbe06db8da430ull)
#define ASCON_HASHA_IV3 WORD_T(0xe0dd6bcf19fbce3bull)
#define ASCON_HASHA_IV4 WORD_T(0x9720dc4446473d8bull)

#define ASCON_XOF_IV0 WORD_T(0x8a46f0d354e771b8ull)
#define ASCON_XOF_IV1 WORD_T(0x04489f4084368cd0ull)
#define ASCON_XOF_IV2 WORD_T(0x6c94f2150dbcf66cull)
#define ASCON_XOF_IV3 WORD_T(0x48965294f143b44eull)
#define ASCON_XOF_IV4 WORD_T(0x0788515fe0e5fb8aull)

#define ASCON_XOFA_IV0 WORD_T(0x4ab43d4f16a80d2cull)
#define ASCON_XOFA_IV1 WORD_T(0xd0ae310bf0f619ceull)
#define ASCON_XOFA_IV2 WORD_T(0xc08cf3c801d89cf3ull)
#define ASCON_XOFA_IV3 WORD_T(0x3859d2094dac0b35ull)
#define ASCON_XOFA_IV4 WORD_T(0xd274992be52b5357ull)

#define START(n) (12 - n)
#define RC(c) WORD_T(c)

forceinline void P12ROUNDS(state_t* s) {
  ROUND(s, RC(0x0101010100000000ull));
  ROUND(s, RC(0x0101010000000001ull));
  ROUND(s, RC(0x0101000100000100ull));
  ROUND(s, RC(0x0101000000000101ull));
  ROUND(s, RC(0x0100010100010000ull));
  ROUND(s, RC(0x0100010000010001ull));
  ROUND(s, RC(0x0100000100010100ull));
  ROUND(s, RC(0x0100000000010101ull));
  ROUND(s, RC(0x0001010101000000ull));
  ROUND(s, RC(0x0001010001000001ull));
  ROUND(s, RC(0x0001000101000100ull));
  ROUND(s, RC(0x0001000001000101ull));
}

forceinline void P8ROUNDS(state_t* s) {
  ROUND(s, RC(0x0100010100010000ull));
  ROUND(s, RC(0x0100010000010001ull));
  ROUND(s, RC(0x0100000100010100ull));
  ROUND(s, RC(0x0100000000010101ull));
  ROUND(s, RC(0x0001010101000000ull));
  ROUND(s, RC(0x0001010001000001ull));
  ROUND(s, RC(0x0001000101000100ull));
  ROUND(s, RC(0x0001000001000101ull));
}

forceinline void P6ROUNDS(state_t* s) {
  ROUND(s, RC(0x0100000100010100ull));
  ROUND(s, RC(0x0100000000010101ull));
  ROUND(s, RC(0x0001010101000000ull));
  ROUND(s, RC(0x0001010001000001ull));
  ROUND(s, RC(0x0001000101000100ull));
  ROUND(s, RC(0x0001000001000101ull));
}

extern const uint64_t constants[12];

forceinline void PROUNDS(state_t* s, int nr) {
  for (int i = START(nr); i < 12; i++) ROUND(s, RC(constants[i]));
}

#if ASCON_INLINE_PERM && ASCON_UNROLL_LOOPS

forceinline void P(state_t* s, int nr) {
  if (nr == 12) P12ROUNDS(s);
  if (nr == 8) P8ROUNDS(s);
  if (nr == 6) P6ROUNDS(s);
}

#elif !ASCON_INLINE_PERM && ASCON_UNROLL_LOOPS

void P12(state_t* s);
void P8(state_t* s);
void P6(state_t* s);

forceinline void P(state_t* s, int nr) {
  if (nr == 12) P12(s);
  if (nr == 8) P8(s);
  if (nr == 6) P6(s);
}

#elif ASCON_INLINE_PERM && !ASCON_UNROLL_LOOPS

forceinline void P(state_t* s, int nr) { PROUNDS(s, nr); }

#else /* !ASCON_INLINE_PERM && !ASCON_UNROLL_LOOPS */

void P(state_t* s, int nr);

#endif

#endif /* PERMUTATIONS_H_ */