#include #include #include #include "cipher.h" #include "lilliput-ae.h" static const uint8_t _0n[BLOCK_BYTES] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t _upper_nibble(uint8_t i) { return i >> 4; } static uint8_t _lower_nibble(uint8_t i) { return i & 0x0f; } static void _encrypt(const uint8_t K[KEY_BYTES], const uint8_t T[TWEAK_BYTES], const uint8_t M[BLOCK_BYTES], uint8_t C[BLOCK_BYTES]) { lilliput_tbc_encrypt(K, T, M, C, NULL); } static void _decrypt(const uint8_t K[KEY_BYTES], const uint8_t T[TWEAK_BYTES], const uint8_t C[BLOCK_BYTES], uint8_t M[BLOCK_BYTES]) { lilliput_tbc_decrypt(K, T, C, M, NULL); } static void _xor_into(uint8_t dest[BLOCK_BYTES], const uint8_t src[BLOCK_BYTES]) { for (size_t i=0; i> 8*i; tweak[i] = b; } /* Assume padding bytes have already been memset to 0. */ tweak[TWEAK_BYTES-1] |= prefix << 4; } static void _fill_msg_tweak( uint8_t prefix, const uint8_t N[NONCE_BYTES], uint64_t block_nb, uint8_t tweak[TWEAK_BYTES] ) { /* The 192-bit tweak is filled as follows: * * - bits 1- 68: block number * 1- 64: actual 64-bit block number * 64- 68: 0-padding * - bits 67-188: nonce * - bits 189-192: constant 4-bit prefix */ for (size_t i=0; i> 8*i; tweak[i] = b; } tweak[sizeof(block_nb)] = _lower_nibble(N[0]) << 4; for (size_t i=1; i