#include #include #include /* debug */ #include "constants.h" #include "parameters.h" #include "tweakey.h" #define LANE_BITS 64 #define LANE_BYTES (LANE_BITS/8) #define LANES_NB (TWEAKEY_BYTES/LANE_BYTES) static void _dump_buffer(FILE *output, const char *header, size_t len, const uint8_t buf[len], int indent) { if (!output) { return; } fprintf(output, "%s\n", header); for (size_t line=0; lineTK, tweak, TWEAK_BYTES); memcpy(TK->TK+TWEAK_BYTES, key, KEY_BYTES); TK->debug = debug; _dump_buffer(debug, " Tweak is :", TWEAK_BYTES, tweak, 5); _dump_buffer(debug, " Key is :", KEY_BYTES, key, 5); _dump_buffer(debug, " Tweakey is :", sizeof(TK->TK), TK->TK, 5); } void tweakey_state_extract( const tweakey_state *TK, uint8_t round_tweakey[ROUND_TWEAKEY_BYTES], /* output */ uint8_t i /* round constant */ ) { memset(round_tweakey, 0, ROUND_TWEAKEY_BYTES); for (const uint8_t *lane=TK->TK; laneTK+TWEAKEY_BYTES; lane+=LANE_BYTES) { for (size_t j=0; jdebug, debug, sizeof(TK->TK), TK->TK, 5); _dump_buffer(TK->debug, " Subtweakey :", ROUND_TWEAKEY_BYTES, round_tweakey, 5); } static void _permute_state(tweakey_state *TK) { uint8_t TK_old[TWEAKEY_BYTES]; memcpy(TK_old, TK->TK, sizeof(TK_old)); /* TODO: homogenize indices; here j=lane; k=byte */ for (size_t j=0; jTK[j+k] = TK_old[j+h[k]]; } } } static void _multiply_state(tweakey_state *TK) { /* Lane 0 is multiplied by Id; lane 1 by P_0, lane 2 by P_1... */ for (size_t lane=1; laneTK[offset] = P_lane[TK->TK[offset]]; } } } void tweakey_state_update(tweakey_state *TK) { _dump_buffer(TK->debug, " Input Tweakey :", sizeof(TK->TK), TK->TK, 10); _permute_state(TK); _dump_buffer(TK->debug, " Post permutation Tweakey :", sizeof(TK->TK), TK->TK, 10); _multiply_state(TK); _dump_buffer(TK->debug, " Post multiplication Tweakey :", sizeof(TK->TK), TK->TK, 10); }