#include #include #include #include "cipher.h" #include "lilliput-ae.h" /* Most-significant nibbles for tweak values */ #define TWEAK_AD 0x2 #define TWEAK_AD_PADDING 0x6 #define TWEAK_MESSAGE 0x0 #define TWEAK_MESSAGE_NO_PADDING 0x1 #define TWEAK_MESSAGE_PADDING 0x5 static void _lilliput_tbc(const uint8_t key[KEY_BYTES], const uint8_t tweak[TWEAK_BYTES], const uint8_t message[BLOCK_BYTES], uint8_t ciphertext[BLOCK_BYTES]) { lilliput_tbc_encrypt(key, tweak, message, ciphertext, NULL); } static void _xor_into(uint8_t dest[BLOCK_BYTES], uint8_t src[BLOCK_BYTES]) { for (size_t i=0; i> 8*i; tweak[0] = b; } /* Assume bytes 8 to 15 have already been memset to 0. */ tweak[TWEAK_BYTES-1] ^= prefix << 4; } static void _process_associated_data( const uint8_t key[KEY_BYTES], size_t A_len, const uint8_t A[A_len], uint8_t Auth[BLOCK_BYTES] ) { uint8_t Ek_Ai[BLOCK_BYTES]; uint8_t tweak[TWEAK_BYTES]; memset(tweak, 0, TWEAK_BYTES); memset(Auth, 0, BLOCK_BYTES); size_t l_a = A_len / BLOCK_BYTES; size_t rest = A_len % BLOCK_BYTES; for (size_t i=0; i