#ifndef PERMUTATIONS_H_ #define PERMUTATIONS_H_ #include #include "api.h" #include "ascon.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_128_PA_ROUNDS 12 #define ASCON_128_PB_ROUNDS 6 #define ASCON_128A_PB_ROUNDS 8 #define ASCON_HASH_BYTES 32 #define ASCON_128_IV WORD_T(0x8021000008220000) #define ASCON_128A_IV WORD_T(0x8822000000200000) #define ASCON_80PQ_IV WORD_T(0xc021000008220000) #define ASCON_HASH_IV WORD_T(0x0020000008020010) #define ASCON_XOF_IV WORD_T(0x0020000008020000) #define ASCON_HASH_IV0 WORD_T(0xf9afb5c6a540dbc7) #define ASCON_HASH_IV1 WORD_T(0xbd2493011445a340) #define ASCON_HASH_IV2 WORD_T(0xcb9ba8b5604d4fc8) #define ASCON_HASH_IV3 WORD_T(0x12a4eede94514c98) #define ASCON_HASH_IV4 WORD_T(0x4bca84c06339f398) #define ASCON_XOF_IV0 WORD_T(0xc75782817e351ae6) #define ASCON_XOF_IV1 WORD_T(0x70045f441d238220) #define ASCON_XOF_IV2 WORD_T(0x5dd5ab52a13e3f04) #define ASCON_XOF_IV3 WORD_T(0x3e378142c30c1db2) #define ASCON_XOF_IV4 WORD_T(0x3735189db624d656) #if ASCON_RATE == 8 && CRYPTO_KEYBYTES == 16 #define IV ASCON_128_IV #define PA_ROUNDS 12 #define PB_ROUNDS 6 #define PB P6 #endif #if ASCON_RATE == 16 #define IV ASCON_128A_IV #define PA_ROUNDS 12 #define PB_ROUNDS 8 #define PB P8 #endif #if ASCON_RATE == 8 && CRYPTO_KEYBYTES == 20 #define IV ASCON_80PQ_IV #define PA_ROUNDS 12 #define PB_ROUNDS 6 #define PB P6 #endif #define START(n) (12 - n) #if ASCON_UNROLL_LOOPS __forceinline void P12ROUNDS(state_t* s) { ROUND(s, 0xc, 0xc); ROUND(s, 0x9, 0xc); ROUND(s, 0xc, 0x9); ROUND(s, 0x9, 0x9); ROUND(s, 0x6, 0xc); ROUND(s, 0x3, 0xc); ROUND(s, 0x6, 0x9); ROUND(s, 0x3, 0x9); ROUND(s, 0xc, 0x6); ROUND(s, 0x9, 0x6); ROUND(s, 0xc, 0x3); ROUND(s, 0x9, 0x3); } __forceinline void P8ROUNDS(state_t* s) { ROUND(s, 0x6, 0xc); ROUND(s, 0x3, 0xc); ROUND(s, 0x6, 0x9); ROUND(s, 0x3, 0x9); ROUND(s, 0xc, 0x6); ROUND(s, 0x9, 0x6); ROUND(s, 0xc, 0x3); ROUND(s, 0x9, 0x3); } __forceinline void P6ROUNDS(state_t* s) { ROUND(s, 0x6, 0x9); ROUND(s, 0x3, 0x9); ROUND(s, 0xc, 0x6); ROUND(s, 0x9, 0x6); ROUND(s, 0xc, 0x3); ROUND(s, 0x9, 0x3); } #else /* !ASCON_UNROLL_LOOPS */ extern const uint8_t constants[][2]; __forceinline void P12ROUNDS(state_t* s) { for (int i = START(12); i < 12; i++) ROUND(s, constants[i][0], constants[i][1]); } __forceinline void P8ROUNDS(state_t* s) { for (int i = START(8); i < 12; i++) ROUND(s, constants[i][0], constants[i][1]); } __forceinline void P6ROUNDS(state_t* s) { for (int i = START(6); i < 12; i++) ROUND(s, constants[i][0], constants[i][1]); } #endif #if ASCON_INLINE_PERM __forceinline void P12(state_t* s) { printstate(" permutation input", s); P12ROUNDS(s); } __forceinline void P8(state_t* s) { printstate(" permutation input", s); P8ROUNDS(s); } __forceinline void P6(state_t* s) { printstate(" permutation input", s); P6ROUNDS(s); } __forceinline void P(state_t* s, int i) { if (i == 12) P12(s); if (i == 8) P8(s); if (i == 6) P6(s); } #elif ASCON_SINGLE_PERM #define P12(s) P(s, 12) #define P8(s) P(s, 8) #define P6(s) P(s, 6) void P(state_t* s, uint8_t rounds); #else /* !ASCON_INLINE_PERM && !ASCON_SINGLE_PERM */ void P12(state_t* s); void P8(state_t* s); void P6(state_t* s); __forceinline void P(state_t* s, int i) { if (i == 12) P12(s); if (i == 8) P8(s); if (i == 6) P6(s); } #endif #endif /* PERMUTATIONS_H_ */