Lightweight Cryptography Primitives
|
GIFT-64 block cipher. More...
#include <stddef.h>
#include <stdint.h>
Go to the source code of this file.
Data Structures | |
struct | gift64n_key_schedule_t |
Structure of the key schedule for GIFT-64. More... | |
Macros | |
#define | GIFT64_LOW_MEMORY 0 |
Define this to 1 to use a low memory version of the key schedule. More... | |
#define | GIFT64_BLOCK_SIZE 8 |
Size of a GIFT-64 block in bytes. | |
#define | GIFT64T_TWEAK_0 0x0000 |
#define | GIFT64T_TWEAK_1 0xe1e1 |
#define | GIFT64T_TWEAK_2 0xd2d2 |
#define | GIFT64T_TWEAK_3 0x3333 |
#define | GIFT64T_TWEAK_4 0xb4b4 |
#define | GIFT64T_TWEAK_5 0x5555 |
#define | GIFT64T_TWEAK_6 0x6666 |
#define | GIFT64T_TWEAK_7 0x8787 |
#define | GIFT64T_TWEAK_8 0x7878 |
#define | GIFT64T_TWEAK_9 0x9999 |
#define | GIFT64T_TWEAK_10 0xaaaa |
#define | GIFT64T_TWEAK_11 0x4b4b |
#define | GIFT64T_TWEAK_12 0xcccc |
#define | GIFT64T_TWEAK_13 0x2d2d |
#define | GIFT64T_TWEAK_14 0x1e1e |
#define | GIFT64T_TWEAK_15 0xffff |
Functions | |
void | gift64n_update_round_keys (gift64n_key_schedule_t *ks) |
Updates the round keys after a change in the base key. More... | |
void | gift64n_init (gift64n_key_schedule_t *ks, const unsigned char *key) |
Initializes the key schedule for GIFT-64 (nibble-based). More... | |
void | gift64n_encrypt (const gift64n_key_schedule_t *ks, unsigned char *output, const unsigned char *input) |
Encrypts a 64-bit block with GIFT-64 (nibble-based). More... | |
void | gift64n_decrypt (const gift64n_key_schedule_t *ks, unsigned char *output, const unsigned char *input) |
Decrypts a 64-bit block with GIFT-64 (nibble-based). More... | |
void | gift64t_encrypt (const gift64n_key_schedule_t *ks, unsigned char *output, const unsigned char *input, uint16_t tweak) |
Encrypts a 64-bit block with TweGIFT-64 (tweakable variant). More... | |
void | gift64t_decrypt (const gift64n_key_schedule_t *ks, unsigned char *output, const unsigned char *input, uint16_t tweak) |
Decrypts a 64-bit block with TweGIFT-64 (tweakable variant). More... | |
GIFT-64 block cipher.
References: https://eprint.iacr.org/2017/622.pdf, https://eprint.iacr.org/2020/412.pdf, https://giftcipher.github.io/gift/
GIFT64_LOW_MEMORY 0 |
Define this to 1 to use a low memory version of the key schedule.
The default is to use the fix-sliced version of GIFT-64 which is very fast on 32-bit platforms but requires 48 bytes to store the key schedule. The large key schedule may be a problem on 8-bit and 16-bit platforms. The fix-sliced version also encrypts two blocks at a time in 32-bit words which is an unnecessary optimization for 8-bit platforms.
GIFT64_LOW_MEMORY can be defined to 1 to select the original non fix-sliced version which only requires 16 bytes to store the key, with the rest of the key schedule expanded on the fly.
#define GIFT64T_TWEAK_0 0x0000 |
TweGIFT-64 tweak value 0
#define GIFT64T_TWEAK_1 0xe1e1 |
TweGIFT-64 tweak value 1
#define GIFT64T_TWEAK_10 0xaaaa |
TweGIFT-64 tweak value 10
#define GIFT64T_TWEAK_11 0x4b4b |
TweGIFT-64 tweak value 11
#define GIFT64T_TWEAK_12 0xcccc |
TweGIFT-64 tweak value 12
#define GIFT64T_TWEAK_13 0x2d2d |
TweGIFT-64 tweak value 13
#define GIFT64T_TWEAK_14 0x1e1e |
TweGIFT-64 tweak value 14
#define GIFT64T_TWEAK_15 0xffff |
TweGIFT-64 tweak value 15
#define GIFT64T_TWEAK_2 0xd2d2 |
TweGIFT-64 tweak value 2
#define GIFT64T_TWEAK_3 0x3333 |
TweGIFT-64 tweak value 3
#define GIFT64T_TWEAK_4 0xb4b4 |
TweGIFT-64 tweak value 4
#define GIFT64T_TWEAK_5 0x5555 |
TweGIFT-64 tweak value 5
#define GIFT64T_TWEAK_6 0x6666 |
TweGIFT-64 tweak value 6
#define GIFT64T_TWEAK_7 0x8787 |
TweGIFT-64 tweak value 7
#define GIFT64T_TWEAK_8 0x7878 |
TweGIFT-64 tweak value 8
#define GIFT64T_TWEAK_9 0x9999 |
TweGIFT-64 tweak value 9
void gift64n_decrypt | ( | const gift64n_key_schedule_t * | ks, |
unsigned char * | output, | ||
const unsigned char * | input | ||
) |
Decrypts a 64-bit block with GIFT-64 (nibble-based).
ks | Points to the GIFT-64 key schedule. |
output | Output buffer which must be at least 8 bytes in length. |
input | Input buffer which must be at least 8 bytes in length. |
The input and output buffers can be the same buffer for in-place decryption.
void gift64n_encrypt | ( | const gift64n_key_schedule_t * | ks, |
unsigned char * | output, | ||
const unsigned char * | input | ||
) |
Encrypts a 64-bit block with GIFT-64 (nibble-based).
ks | Points to the GIFT-64 key schedule. |
output | Output buffer which must be at least 8 bytes in length. |
input | Input buffer which must be at least 8 bytes in length. |
The input and output buffers can be the same buffer for in-place encryption.
void gift64n_init | ( | gift64n_key_schedule_t * | ks, |
const unsigned char * | key | ||
) |
Initializes the key schedule for GIFT-64 (nibble-based).
ks | Points to the key schedule to initialize. |
key | Points to the 16 bytes of the key data. |
void gift64n_update_round_keys | ( | gift64n_key_schedule_t * | ks | ) |
Updates the round keys after a change in the base key.
ks | Points to the key schedule to update. |
void gift64t_decrypt | ( | const gift64n_key_schedule_t * | ks, |
unsigned char * | output, | ||
const unsigned char * | input, | ||
uint16_t | tweak | ||
) |
Decrypts a 64-bit block with TweGIFT-64 (tweakable variant).
ks | Points to the GIFT-64 key schedule. |
output | Output buffer which must be at least 8 bytes in length. |
input | Input buffer which must be at least 8 bytes in length. |
tweak | 4-bit tweak value expanded to 16-bit. |
The input and output buffers can be the same buffer for in-place encryption.
This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the NIST Lightweight Cryptography Competition. A 4-bit tweak is added to some of the rounds to provide domain separation. If the tweak is zero, then this function is identical to gift64n_decrypt().
void gift64t_encrypt | ( | const gift64n_key_schedule_t * | ks, |
unsigned char * | output, | ||
const unsigned char * | input, | ||
uint16_t | tweak | ||
) |
Encrypts a 64-bit block with TweGIFT-64 (tweakable variant).
ks | Points to the GIFT-64 key schedule. |
output | Output buffer which must be at least 8 bytes in length. |
input | Input buffer which must be at least 8 bytes in length. |
tweak | 4-bit tweak value expanded to 16-bit. |
The input and output buffers can be the same buffer for in-place encryption.
This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the NIST Lightweight Cryptography Competition. A 4-bit tweak is added to some of the rounds to provide domain separation. If the tweak is zero, then this function is identical to gift64n_encrypt().