summaryrefslogtreecommitdiff
path: root/src/add_felicsref/tweakey.c
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@airbus.com>2019-05-21 14:22:34 +0200
committerKévin Le Gouguec <kevin.legouguec@airbus.com>2019-05-21 14:28:55 +0200
commit664e71185f32402751fa0fe19eaca1015af29fa6 (patch)
tree552b79ddd3a1e597b3ec2d6636c3dd2c216ebcb0 /src/add_felicsref/tweakey.c
parent9bc87082cec1dc078a6c9c1d62098aced5ea8331 (diff)
downloadlilliput-ae-implem-664e71185f32402751fa0fe19eaca1015af29fa6.tar.xz
Dé-duplication de code dans l'implémentation FELICS
Apparemment les différents gcc de FELICS arrivent encore à comprendre qu'ils peuvent inligner les multiplications ; c'est quand on passe par un tableau de pointeurs de fonction qu'ils baissent les bras.
Diffstat (limited to 'src/add_felicsref/tweakey.c')
-rw-r--r--src/add_felicsref/tweakey.c43
1 files changed, 14 insertions, 29 deletions
diff --git a/src/add_felicsref/tweakey.c b/src/add_felicsref/tweakey.c
index c5532f8..1057565 100644
--- a/src/add_felicsref/tweakey.c
+++ b/src/add_felicsref/tweakey.c
@@ -70,46 +70,31 @@ void tweakey_state_extract(
}
-void tweakey_state_update(uint8_t TK[TWEAKEY_BYTES])
-{
- /* Skip lane 0, as it is multiplied by the identity matrix. */
+typedef void (*matrix_multiplication)(const uint8_t x[LANE_BYTES], uint8_t y[LANE_BYTES]);
- size_t j;
- uint8_t *TKj;
+static void _multiply(uint8_t TKj[LANE_BYTES], matrix_multiplication alpha)
+{
uint8_t TKj_old[LANE_BYTES];
-
- j = 1;
- TKj = TK + j*LANE_BYTES;
memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_M(TKj_old, TKj);
+ alpha(TKj_old, TKj);
+}
- j = 2;
- TKj = TK + j*LANE_BYTES;
- memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_M2(TKj_old, TKj);
+void tweakey_state_update(uint8_t TK[TWEAKEY_BYTES])
+{
+ /* Skip lane 0, as it is multiplied by the identity matrix. */
- j = 3;
- TKj = TK + j*LANE_BYTES;
- memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_M3(TKj_old, TKj);
+ _multiply(TK + 1*LANE_BYTES, _multiply_M);
+ _multiply(TK + 2*LANE_BYTES, _multiply_M2);
+ _multiply(TK + 3*LANE_BYTES, _multiply_M3);
#if LANES_NB >= 5
- j = 4;
- TKj = TK + j*LANE_BYTES;
- memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_MR(TKj_old, TKj);
+ _multiply(TK + 4*LANE_BYTES, _multiply_MR);
#if LANES_NB >= 6
- j = 5;
- TKj = TK + j*LANE_BYTES;
- memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_MR2(TKj_old, TKj);
+ _multiply(TK + 5*LANE_BYTES, _multiply_MR2);
#if LANES_NB >= 7
- j = 6;
- TKj = TK + j*LANE_BYTES;
- memcpy(TKj_old, TKj, LANE_BYTES);
- _multiply_MR3(TKj_old, TKj);
+ _multiply(TK + 6*LANE_BYTES, _multiply_MR3);
#endif
#endif
#endif