From 4d14b26ea179f42f2b1b0ad6d3f19e69c95d7fdc Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Tue, 21 May 2019 11:06:56 +0200 Subject: Extraction des multiplications hors de tweakey.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De façon à ce que d'autres versions puissent réutiliser l'un ou l'autre. --- src/ref/constants.h | 2 + src/ref/implem.mk | 2 +- src/ref/multiplications.h | 114 ++++++++++++++++++++++++++++++++++++++++++++++ src/ref/tweakey.c | 92 +------------------------------------ 4 files changed, 119 insertions(+), 91 deletions(-) create mode 100644 src/ref/multiplications.h (limited to 'src/ref') diff --git a/src/ref/constants.h b/src/ref/constants.h index 6812fd8..d2da2a0 100644 --- a/src/ref/constants.h +++ b/src/ref/constants.h @@ -23,6 +23,7 @@ This file provides bit and byte lengths for input and output parameters. #include "parameters.h" #define TWEAKEY_LENGTH_BITS (TWEAK_LENGTH_BITS+KEY_LENGTH_BITS) +#define LANE_BITS 64 #define ROUND_TWEAKEY_LENGTH_BITS 64 #define BLOCK_LENGTH_BITS 128 #define NONCE_LENGTH_BITS 120 @@ -31,6 +32,7 @@ This file provides bit and byte lengths for input and output parameters. #define TWEAK_BYTES (TWEAK_LENGTH_BITS/8) #define KEY_BYTES (KEY_LENGTH_BITS/8) #define TWEAKEY_BYTES (TWEAKEY_LENGTH_BITS/8) +#define LANE_BYTES (LANE_BITS/8) #define ROUND_TWEAKEY_BYTES (ROUND_TWEAKEY_LENGTH_BITS/8) #define BLOCK_BYTES (BLOCK_LENGTH_BITS/8) #define NONCE_BYTES (NONCE_LENGTH_BITS/8) diff --git a/src/ref/implem.mk b/src/ref/implem.mk index f396696..a29b452 100644 --- a/src/ref/implem.mk +++ b/src/ref/implem.mk @@ -26,7 +26,7 @@ $(src_dir)/lilliput-ae.h $(src_dir)/cipher.h $(src_dir)/constants.h $(variant_dir)/parameters.h $(results_dir)/$(src_dir)/tweakey.o: $(src_dir)/tweakey.h \ -$(src_dir)/constants.h $(variant_dir)/parameters.h +$(src_dir)/constants.h $(src_dir)/multiplications.h $(variant_dir)/parameters.h $(results_dir)/test/test-tbc-encrypt.o $(results_dir)/test/test-tbc-decrypt.o $(results_dir)/test/traces-tbc.o: \ $(src_dir)/cipher.h diff --git a/src/ref/multiplications.h b/src/ref/multiplications.h new file mode 100644 index 0000000..32327f2 --- /dev/null +++ b/src/ref/multiplications.h @@ -0,0 +1,114 @@ +/* +Implementation of the Lilliput-AE tweakable block cipher. + +Authors, hereby denoted as "the implementer": + Kévin Le Gouguec, + 2019. + +For more information, feedback or questions, refer to our website: +https://paclido.fr/lilliput-ae + +To the extent possible under law, the implementer has waived all copyright +and related or neighboring rights to the source code in this file. +http://creativecommons.org/publicdomain/zero/1.0/ + +--- + +This file implements the alpha-multiplications used in Lilliput-TBC's +tweakey schedule, where each matrix M and M_R to the power n are +implemented in distinct functions with shifts and XORs. +*/ + +#ifndef MULTIPLICATIONS_H +#define MULTIPLICATIONS_H + +#include + +#include "constants.h" + +static void _multiply_M(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + y[7] = x[6]; + y[6] = x[5]; + y[5] = x[5]<<3 ^ x[4]; + y[4] = x[4]>>3 ^ x[3]; + y[3] = x[2]; + y[2] = x[6]<<2 ^ x[1]; + y[1] = x[0]; + y[0] = x[7]; +} + +static void _multiply_M2(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t x_M_5 = x[5]<<3 ^ x[4]; + uint8_t x_M_4 = x[4]>>3 ^ x[3]; + + y[7] = x[5]; + y[6] = x_M_5; + y[5] = x_M_5<<3 ^ x_M_4; + y[4] = x_M_4>>3 ^ x[2]; + y[3] = x[6]<<2 ^ x[1]; + y[2] = x[5]<<2 ^ x[0]; + y[1] = x[7]; + y[0] = x[6]; +} + +static void _multiply_M3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t x_M_5 = x[5]<<3 ^ x[4]; + uint8_t x_M_4 = x[4]>>3 ^ x[3]; + uint8_t x_M2_5 = x_M_5<<3 ^ x_M_4; + uint8_t x_M2_4 = x_M_4>>3 ^ x[2]; + + y[7] = x_M_5; + y[6] = x_M2_5; + y[5] = x_M2_5<<3 ^ x_M2_4; + y[4] = x_M2_4>>3 ^ x[6]<<2 ^ x[1]; + y[3] = x[5]<<2 ^ x[0]; + y[2] = x_M_5<<2 ^ x[7]; + y[1] = x[6]; + y[0] = x[5]; +} + +static void _multiply_MR(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + y[0] = x[1]; + y[1] = x[2]; + y[2] = x[3] ^ x[4]>>3; + y[3] = x[4]; + y[4] = x[5] ^ x[6]<<3; + y[5] = x[3]<<2 ^ x[6]; + y[6] = x[7]; + y[7] = x[0]; +} + +static void _multiply_MR2(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t x_MR_4 = x[5] ^ x[6]<<3; + + y[0] = x[2]; + y[1] = x[3] ^ x[4]>>3; + y[2] = x[4] ^ x_MR_4>>3; + y[3] = x_MR_4; + y[4] = x[3]<<2 ^ x[6] ^ x[7]<<3; + y[5] = x[4]<<2 ^ x[7]; + y[6] = x[0]; + y[7] = x[1]; +} + +static void _multiply_MR3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t x_MR_4 = x[5] ^ x[6]<<3; + uint8_t x_MR2_4 = x[3]<<2 ^ x[6] ^ x[7]<<3; + + y[0] = x[3] ^ x[4]>>3; + y[1] = x[4] ^ x_MR_4>>3; + y[2] = x_MR_4 ^ x_MR2_4>>3; + y[3] = x_MR2_4; + y[4] = x[0]<<3 ^ x[4]<<2 ^ x[7]; + y[5] = x_MR_4<<2 ^ x[0]; + y[6] = x[1]; + y[7] = x[2]; +} + +#endif /* MULTIPLICATIONS_H */ diff --git a/src/ref/tweakey.c b/src/ref/tweakey.c index 78c6060..bae09d3 100644 --- a/src/ref/tweakey.c +++ b/src/ref/tweakey.c @@ -14,20 +14,17 @@ http://creativecommons.org/publicdomain/zero/1.0/ --- -This file provides an implementation of Lilliput-TBC's tweakey schedule, -where multiplications by matrices M and M_R to the power n are performed -by functions expressing the exponentiated matrices with shifts and XORs. +This file provides the implementation of Lilliput-TBC's tweakey schedule. */ #include #include #include "constants.h" +#include "multiplications.h" #include "tweakey.h" -#define LANE_BITS 64 -#define LANE_BYTES (LANE_BITS/8) #define LANES_NB (TWEAKEY_BYTES/LANE_BYTES) @@ -64,91 +61,6 @@ void tweakey_state_extract( } -static void _multiply_M(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - y[7] = x[6]; - y[6] = x[5]; - y[5] = x[5]<<3 ^ x[4]; - y[4] = x[4]>>3 ^ x[3]; - y[3] = x[2]; - y[2] = x[6]<<2 ^ x[1]; - y[1] = x[0]; - y[0] = x[7]; -} - -static void _multiply_M2(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - uint8_t x_M_5 = x[5]<<3 ^ x[4]; - uint8_t x_M_4 = x[4]>>3 ^ x[3]; - - y[7] = x[5]; - y[6] = x_M_5; - y[5] = x_M_5<<3 ^ x_M_4; - y[4] = x_M_4>>3 ^ x[2]; - y[3] = x[6]<<2 ^ x[1]; - y[2] = x[5]<<2 ^ x[0]; - y[1] = x[7]; - y[0] = x[6]; -} - -static void _multiply_M3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - uint8_t x_M_5 = x[5]<<3 ^ x[4]; - uint8_t x_M_4 = x[4]>>3 ^ x[3]; - uint8_t x_M2_5 = x_M_5<<3 ^ x_M_4; - uint8_t x_M2_4 = x_M_4>>3 ^ x[2]; - - y[7] = x_M_5; - y[6] = x_M2_5; - y[5] = x_M2_5<<3 ^ x_M2_4; - y[4] = x_M2_4>>3 ^ x[6]<<2 ^ x[1]; - y[3] = x[5]<<2 ^ x[0]; - y[2] = x_M_5<<2 ^ x[7]; - y[1] = x[6]; - y[0] = x[5]; -} - -static void _multiply_MR(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - y[0] = x[1]; - y[1] = x[2]; - y[2] = x[3] ^ x[4]>>3; - y[3] = x[4]; - y[4] = x[5] ^ x[6]<<3; - y[5] = x[3]<<2 ^ x[6]; - y[6] = x[7]; - y[7] = x[0]; -} - -static void _multiply_MR2(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - uint8_t x_MR_4 = x[5] ^ x[6]<<3; - - y[0] = x[2]; - y[1] = x[3] ^ x[4]>>3; - y[2] = x[4] ^ x_MR_4>>3; - y[3] = x_MR_4; - y[4] = x[3]<<2 ^ x[6] ^ x[7]<<3; - y[5] = x[4]<<2 ^ x[7]; - y[6] = x[0]; - y[7] = x[1]; -} - -static void _multiply_MR3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) -{ - uint8_t x_MR_4 = x[5] ^ x[6]<<3; - uint8_t x_MR2_4 = x[3]<<2 ^ x[6] ^ x[7]<<3; - - y[0] = x[3] ^ x[4]>>3; - y[1] = x[4] ^ x_MR_4>>3; - y[2] = x_MR_4 ^ x_MR2_4>>3; - y[3] = x_MR2_4; - y[4] = x[0]<<3 ^ x[4]<<2 ^ x[7]; - y[5] = x_MR_4<<2 ^ x[0]; - y[6] = x[1]; - y[7] = x[2]; -} - typedef void (*matrix_multiplication)(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]); static const matrix_multiplication ALPHAS[6] = { -- cgit v1.2.3