diff options
Diffstat (limited to 'crypto_aead/lilliputaei128v1/ref/cipher.c')
| -rw-r--r-- | crypto_aead/lilliputaei128v1/ref/cipher.c | 103 |
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 +) +{ + +} |
