|
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().
1.8.6