#include #include #include "parameters.h" #include "tweakey.h" #define LANE_BITS 64 #define LANE_BYTES (LANE_BITS/8) #define LANES_NB (TWEAKEY_BYTES/LANE_BYTES) void tweakey_state_init( uint8_t TK[TWEAKEY_BYTES], const uint8_t key[KEY_BYTES], const uint8_t tweak[TWEAK_BYTES] ) { memcpy(TK, tweak, TWEAK_BYTES); memcpy(TK+TWEAK_BYTES, key, KEY_BYTES); } void tweakey_state_extract( const uint8_t TK[TWEAKEY_BYTES], uint8_t round_constant, uint8_t round_tweakey[ROUND_TWEAKEY_BYTES] ) { memset(round_tweakey, 0, ROUND_TWEAKEY_BYTES); for (size_t j=0; j>3; new[3] = old[2]; new[2] = old[1] ^ old[6]<<2; new[1] = old[0]; new[0] = old[7]; } static void _multiply_M2(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]) { uint8_t tmp[LANE_BYTES]; memcpy(tmp, old, LANE_BYTES); _multiply_M(old, tmp); _multiply_M(tmp, new); } static void _multiply_M3(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]) { uint8_t tmp[LANE_BYTES]; memcpy(tmp, old, LANE_BYTES); _multiply_M2(old, tmp); _multiply_M(tmp, new); } static void _multiply_MR(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]) { new[0] = old[1]; new[1] = old[2]; new[2] = old[3] ^ old[4]<<3; new[3] = old[4]; new[4] = old[5] ^ old[6]>>3; new[5] = old[6] ^ old[3]>>2; new[6] = old[7]; new[7] = old[0]; } static void _multiply_MR2(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]) { uint8_t tmp[LANE_BYTES]; memcpy(tmp, old, LANE_BYTES); _multiply_MR(old, tmp); _multiply_MR(tmp, new); } static void _multiply_MR3(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]) { uint8_t tmp[LANE_BYTES]; memcpy(tmp, old, LANE_BYTES); _multiply_MR2(old, tmp); _multiply_MR(tmp, new); } typedef void (*matrix_multiplication)(const uint8_t old[LANE_BYTES], uint8_t new[LANE_BYTES]); static const matrix_multiplication ALPHAS[6] = { _multiply_M, _multiply_M2, _multiply_M3, _multiply_MR, _multiply_MR2, _multiply_MR3 }; void tweakey_state_update(uint8_t TK[TWEAKEY_BYTES]) { /* Skip lane 0, as it is multiplied by the identity matrix. */ for (size_t j=1; j