diff options
Diffstat (limited to 'src/add_tweakeyloop')
| l--------- | src/add_tweakeyloop/cipher.c | 1 | ||||
| l--------- | src/add_tweakeyloop/cipher.h | 1 | ||||
| l--------- | src/add_tweakeyloop/constants.h | 1 | ||||
| l--------- | src/add_tweakeyloop/lilliput-ae-utils.h | 1 | ||||
| l--------- | src/add_tweakeyloop/lilliput-ae.h | 1 | ||||
| l--------- | src/add_tweakeyloop/lilliput-i.c | 1 | ||||
| l--------- | src/add_tweakeyloop/lilliput-ii.c | 1 | ||||
| -rw-r--r-- | src/add_tweakeyloop/tweakey.c | 146 | ||||
| l--------- | src/add_tweakeyloop/tweakey.h | 1 |
9 files changed, 154 insertions, 0 deletions
diff --git a/src/add_tweakeyloop/cipher.c b/src/add_tweakeyloop/cipher.c new file mode 120000 index 0000000..a2ac6a3 --- /dev/null +++ b/src/add_tweakeyloop/cipher.c @@ -0,0 +1 @@ +../ref/cipher.c
\ No newline at end of file diff --git a/src/add_tweakeyloop/cipher.h b/src/add_tweakeyloop/cipher.h new file mode 120000 index 0000000..eab258b --- /dev/null +++ b/src/add_tweakeyloop/cipher.h @@ -0,0 +1 @@ +../ref/cipher.h
\ No newline at end of file diff --git a/src/add_tweakeyloop/constants.h b/src/add_tweakeyloop/constants.h new file mode 120000 index 0000000..67df0f3 --- /dev/null +++ b/src/add_tweakeyloop/constants.h @@ -0,0 +1 @@ +../ref/constants.h
\ No newline at end of file diff --git a/src/add_tweakeyloop/lilliput-ae-utils.h b/src/add_tweakeyloop/lilliput-ae-utils.h new file mode 120000 index 0000000..b46625b --- /dev/null +++ b/src/add_tweakeyloop/lilliput-ae-utils.h @@ -0,0 +1 @@ +../ref/lilliput-ae-utils.h
\ No newline at end of file diff --git a/src/add_tweakeyloop/lilliput-ae.h b/src/add_tweakeyloop/lilliput-ae.h new file mode 120000 index 0000000..66c8314 --- /dev/null +++ b/src/add_tweakeyloop/lilliput-ae.h @@ -0,0 +1 @@ +../ref/lilliput-ae.h
\ No newline at end of file diff --git a/src/add_tweakeyloop/lilliput-i.c b/src/add_tweakeyloop/lilliput-i.c new file mode 120000 index 0000000..46688d4 --- /dev/null +++ b/src/add_tweakeyloop/lilliput-i.c @@ -0,0 +1 @@ +../ref/lilliput-i.c
\ No newline at end of file diff --git a/src/add_tweakeyloop/lilliput-ii.c b/src/add_tweakeyloop/lilliput-ii.c new file mode 120000 index 0000000..09abf10 --- /dev/null +++ b/src/add_tweakeyloop/lilliput-ii.c @@ -0,0 +1 @@ +../ref/lilliput-ii.c
\ No newline at end of file diff --git a/src/add_tweakeyloop/tweakey.c b/src/add_tweakeyloop/tweakey.c new file mode 100644 index 0000000..b1f349e --- /dev/null +++ b/src/add_tweakeyloop/tweakey.c @@ -0,0 +1,146 @@ +/* +Implementation of the Lilliput-AE tweakable block cipher. + +Author: 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 provides an implementation of Lilliput-TBC's tweakey schedule, +where multiplications by matrices M and M_R to the power n are performed +by applying functions for M and M_R n times. +*/ + +#include <stdint.h> +#include <string.h> + +#include "constants.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<LANES_NB; j++) + { + const uint8_t *TKj = TK + j*LANE_BYTES; + + for (size_t k=0; k<LANE_BYTES; k++) + { + round_tweakey[k] ^= TKj[k]; + } + } + + round_tweakey[0] ^= round_constant; +} + + +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 M_x[LANE_BYTES]; + _multiply_M(x, M_x); + _multiply_M(M_x, y); +} + +static void _multiply_M3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t M_x[LANE_BYTES]; + uint8_t M2_x[LANE_BYTES]; + _multiply_M(x, M_x); + _multiply_M(M_x, M2_x); + _multiply_M(M2_x, y); +} + +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 MR_x[LANE_BYTES]; + _multiply_MR(x, MR_x); + _multiply_MR(MR_x, y); +} + +static void _multiply_MR3(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]) +{ + uint8_t MR_x[LANE_BYTES]; + uint8_t MR2_x[LANE_BYTES]; + _multiply_MR(x, MR_x); + _multiply_MR(MR_x, MR2_x); + _multiply_MR(MR2_x, y); +} + +typedef void (*matrix_multiplication)(const uint8_t x[LANE_BYTES], uint8_t y[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<LANES_NB; j++) + { + uint8_t *TKj = TK + j*LANE_BYTES; + + uint8_t TKj_old[LANE_BYTES]; + memcpy(TKj_old, TKj, LANE_BYTES); + + ALPHAS[j-1](TKj_old, TKj); + } +} diff --git a/src/add_tweakeyloop/tweakey.h b/src/add_tweakeyloop/tweakey.h new file mode 120000 index 0000000..7f2415f --- /dev/null +++ b/src/add_tweakeyloop/tweakey.h @@ -0,0 +1 @@ +../ref/tweakey.h
\ No newline at end of file |
