summaryrefslogtreecommitdiff
path: root/crypto_aead/lilliputaei128v1/ref/cipher.c
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@airbus.com>2018-11-21 14:18:25 +0100
committerKévin Le Gouguec <kevin.legouguec@airbus.com>2018-11-21 14:32:25 +0100
commitb36b15af3c8e8f1846b82da0ca1942e610666e2f (patch)
tree5af76672e787eaedb4dcc926c0b3767f5cbd1970 /crypto_aead/lilliputaei128v1/ref/cipher.c
parentc1a5a0614b78a30405626847dd32e442f34b48ac (diff)
downloadlilliput-ae-implem-b36b15af3c8e8f1846b82da0ca1942e610666e2f.tar.xz
Ébauche du code de la partie TBC
I.e. définition des fonctions de haut-niveau ; reste à implémenter les fonctions en-dessous, et les sorties de debug.
Diffstat (limited to 'crypto_aead/lilliputaei128v1/ref/cipher.c')
-rw-r--r--crypto_aead/lilliputaei128v1/ref/cipher.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/crypto_aead/lilliputaei128v1/ref/cipher.c b/crypto_aead/lilliputaei128v1/ref/cipher.c
new file mode 100644
index 0000000..60e0d16
--- /dev/null
+++ b/crypto_aead/lilliputaei128v1/ref/cipher.c
@@ -0,0 +1,103 @@
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h> /* debug */
+#include <string.h>
+
+#include "cipher.h"
+#include "parameters.h"
+#include "tweakey.h"
+
+
+struct cipher_state
+{
+ uint8_t X[BLOCK_BYTES];
+ FILE* debug;
+};
+
+
+typedef struct cipher_state cipher_state;
+
+
+static void _state_init(cipher_state *X, const uint8_t message[BLOCK_BYTES], FILE* debug)
+{
+ memcpy(X->X, message, sizeof(X->X));
+ X->debug = debug;
+}
+
+
+static void _compute_round_tweakeys(
+ const uint8_t key[KEY_BYTES],
+ const uint8_t tweak[TWEAK_BYTES],
+ uint8_t RTK[ROUNDS][ROUND_TWEAKEY_BYTES]
+)
+{
+ tweakey_state TK;
+ tweakey_state_init(&TK, key, tweak, NULL);
+ tweakey_state_extract(&TK, RTK[0], 0);
+
+ for (uint8_t i=1; i<ROUNDS; i++)
+ {
+ tweakey_state_update(&TK);
+ tweakey_state_extract(&TK, RTK[i], i);
+ }
+}
+
+
+static void _nonlinear_layer(__attribute__((unused)) cipher_state *X, __attribute__((unused)) const uint8_t RTK[ROUND_TWEAKEY_BYTES])
+{
+
+}
+
+static void _linear_layer(__attribute__((unused)) cipher_state *X)
+{
+
+}
+
+static void _permutation_layer(__attribute__((unused)) cipher_state *X)
+{
+
+}
+
+static void _one_round_egfn(cipher_state *X, const uint8_t RTK[ROUND_TWEAKEY_BYTES], bool permute)
+{
+ _nonlinear_layer(X, RTK);
+ _linear_layer(X);
+ if (permute)
+ {
+ _permutation_layer(X);
+ }
+}
+
+
+void lilliput_tbc_encrypt(
+ const uint8_t key[KEY_BYTES],
+ const uint8_t tweak[TWEAK_BYTES],
+ const uint8_t message[BLOCK_BYTES],
+ uint8_t ciphertext[BLOCK_BYTES],
+ FILE *debug
+)
+{
+ cipher_state X;
+ _state_init(&X, message, debug);
+
+ uint8_t RTK[ROUNDS][ROUND_TWEAKEY_BYTES];
+ _compute_round_tweakeys(key, tweak, RTK);
+
+ for (uint8_t i=0; i<ROUNDS; i++)
+ {
+ _one_round_egfn(&X, RTK[i], i<ROUNDS-1);
+ }
+
+ memcpy(ciphertext, X.X, BLOCK_BYTES);
+}
+
+void lilliput_tbc_decrypt(
+ __attribute__((unused)) const uint8_t key[KEY_BYTES],
+ __attribute__((unused)) const uint8_t tweak[TWEAK_BYTES],
+ __attribute__((unused)) const uint8_t ciphertext[BLOCK_BYTES],
+ __attribute__((unused)) uint8_t message[BLOCK_BYTES],
+ __attribute__((unused)) FILE *debug
+)
+{
+
+}