summaryrefslogtreecommitdiff
path: root/src/ref
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@airbus.com>2019-05-21 11:06:56 +0200
committerKévin Le Gouguec <kevin.legouguec@airbus.com>2019-05-21 11:08:02 +0200
commit4d14b26ea179f42f2b1b0ad6d3f19e69c95d7fdc (patch)
treed3840e160cd96eab81723e301bf106a888d46d51 /src/ref
parent96fa2a449999e2e3a077a9a5c5c061d59fcf8c10 (diff)
downloadlilliput-ae-implem-4d14b26ea179f42f2b1b0ad6d3f19e69c95d7fdc.tar.xz
Extraction des multiplications hors de tweakey.c
De façon à ce que d'autres versions puissent réutiliser l'un ou l'autre.
Diffstat (limited to 'src/ref')
-rw-r--r--src/ref/constants.h2
-rw-r--r--src/ref/implem.mk2
-rw-r--r--src/ref/multiplications.h114
-rw-r--r--src/ref/tweakey.c92
4 files changed, 119 insertions, 91 deletions
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 <stdint.h>
+
+#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 <stdint.h>
#include <string.h>
#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] = {