summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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