Lightweight Cryptography Primitives
 All Data Structures Files Functions Variables Typedefs Macros Pages
Data Structures | Macros | Functions
internal-gift64.h File Reference

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...
 

Detailed Description

GIFT-64 block cipher.

References: https://eprint.iacr.org/2017/622.pdf, https://eprint.iacr.org/2020/412.pdf, https://giftcipher.github.io/gift/

Macro Definition Documentation

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

Function Documentation

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

Parameters
ksPoints to the GIFT-64 key schedule.
outputOutput buffer which must be at least 8 bytes in length.
inputInput 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).

Parameters
ksPoints to the GIFT-64 key schedule.
outputOutput buffer which must be at least 8 bytes in length.
inputInput 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).

Parameters
ksPoints to the key schedule to initialize.
keyPoints 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.

Parameters
ksPoints 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).

Parameters
ksPoints to the GIFT-64 key schedule.
outputOutput buffer which must be at least 8 bytes in length.
inputInput buffer which must be at least 8 bytes in length.
tweak4-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).

Parameters
ksPoints to the GIFT-64 key schedule.
outputOutput buffer which must be at least 8 bytes in length.
inputInput buffer which must be at least 8 bytes in length.
tweak4-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().