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

GIFT-128 block cipher. More...

#include <stddef.h>
#include <stdint.h>
#include "internal-gift128-config.h"

Go to the source code of this file.

Data Structures

struct  gift128b_key_schedule_t
 Structure of the key schedule for GIFT-128 (bit-sliced). More...
 

Macros

#define GIFT128_BLOCK_SIZE   16
 Size of a GIFT-128 block in bytes.
 
#define GIFT128_ROUND_KEYS   80
 Number of round keys for the GIFT-128 key schedule.
 
#define GIFT128T_TWEAK_0   0x00000000
 
#define GIFT128T_TWEAK_1   0xe1e1e1e1
 
#define GIFT128T_TWEAK_2   0xd2d2d2d2
 
#define GIFT128T_TWEAK_3   0x33333333
 
#define GIFT128T_TWEAK_4   0xb4b4b4b4
 
#define GIFT128T_TWEAK_5   0x55555555
 
#define GIFT128T_TWEAK_6   0x66666666
 
#define GIFT128T_TWEAK_7   0x87878787
 
#define GIFT128T_TWEAK_8   0x78787878
 
#define GIFT128T_TWEAK_9   0x99999999
 
#define GIFT128T_TWEAK_10   0xaaaaaaaa
 
#define GIFT128T_TWEAK_11   0x4b4b4b4b
 
#define GIFT128T_TWEAK_12   0xcccccccc
 
#define GIFT128T_TWEAK_13   0x2d2d2d2d
 
#define GIFT128T_TWEAK_14   0x1e1e1e1e
 
#define GIFT128T_TWEAK_15   0xffffffff
 

Typedefs

typedef gift128b_key_schedule_t gift128n_key_schedule_t
 Structure of the key schedule for GIFT-128 (nibble-based).
 

Functions

void gift128b_init (gift128b_key_schedule_t *ks, const unsigned char *key)
 Initializes the key schedule for GIFT-128 (bit-sliced). More...
 
void gift128b_encrypt (const gift128b_key_schedule_t *ks, unsigned char *output, const unsigned char *input)
 Encrypts a 128-bit block with GIFT-128 (bit-sliced). More...
 
void gift128b_encrypt_preloaded (const gift128b_key_schedule_t *ks, uint32_t output[4], const uint32_t input[4])
 Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). More...
 
void gift128b_decrypt (const gift128b_key_schedule_t *ks, unsigned char *output, const unsigned char *input)
 Decrypts a 128-bit block with GIFT-128 (bit-sliced). More...
 
void gift128n_init (gift128n_key_schedule_t *ks, const unsigned char *key)
 Initializes the key schedule for GIFT-128 (nibble-based). More...
 
void gift128n_encrypt (const gift128n_key_schedule_t *ks, unsigned char *output, const unsigned char *input)
 Encrypts a 128-bit block with GIFT-128 (nibble-based). More...
 
void gift128n_decrypt (const gift128n_key_schedule_t *ks, unsigned char *output, const unsigned char *input)
 Decrypts a 128-bit block with GIFT-128 (nibble-based). More...
 
void gift128t_encrypt (const gift128n_key_schedule_t *ks, unsigned char *output, const unsigned char *input, uint32_t tweak)
 Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). More...
 
void gift128t_decrypt (const gift128n_key_schedule_t *ks, unsigned char *output, const unsigned char *input, uint32_t tweak)
 Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). More...
 

Detailed Description

GIFT-128 block cipher.

There are three versions of GIFT-128 in use within the second round submissions to the NIST lightweight cryptography competition.

The most efficient version for 32-bit software implementation is the GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT.

The second is the nibble-based version from HYENA. We implement the HYENA version as a wrapper around the bit-sliced version.

The third version is a variant on the HYENA nibble-based version that includes a 4-bit tweak value for domain separation. It is used by the ESTATE submission to NIST.

Technically there is a fourth version of GIFT-128 which is the one that appeared in the original GIFT-128 paper. It is almost the same as the HYENA version except that the byte ordering is big-endian instead of HYENA's little-endian. The original version of GIFT-128 doesn't appear in any of the NIST submissions so we don't bother with it in this library.

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

Macro Definition Documentation

#define GIFT128T_TWEAK_0   0x00000000

TweGIFT-128 tweak value 0

#define GIFT128T_TWEAK_1   0xe1e1e1e1

TweGIFT-128 tweak value 1

#define GIFT128T_TWEAK_10   0xaaaaaaaa

TweGIFT-128 tweak value 10

#define GIFT128T_TWEAK_11   0x4b4b4b4b

TweGIFT-128 tweak value 11

#define GIFT128T_TWEAK_12   0xcccccccc

TweGIFT-128 tweak value 12

#define GIFT128T_TWEAK_13   0x2d2d2d2d

TweGIFT-128 tweak value 13

#define GIFT128T_TWEAK_14   0x1e1e1e1e

TweGIFT-128 tweak value 14

#define GIFT128T_TWEAK_15   0xffffffff

TweGIFT-128 tweak value 15

#define GIFT128T_TWEAK_2   0xd2d2d2d2

TweGIFT-128 tweak value 2

#define GIFT128T_TWEAK_3   0x33333333

TweGIFT-128 tweak value 3

#define GIFT128T_TWEAK_4   0xb4b4b4b4

TweGIFT-128 tweak value 4

#define GIFT128T_TWEAK_5   0x55555555

TweGIFT-128 tweak value 5

#define GIFT128T_TWEAK_6   0x66666666

TweGIFT-128 tweak value 6

#define GIFT128T_TWEAK_7   0x87878787

TweGIFT-128 tweak value 7

#define GIFT128T_TWEAK_8   0x78787878

TweGIFT-128 tweak value 8

#define GIFT128T_TWEAK_9   0x99999999

TweGIFT-128 tweak value 9

Function Documentation

void gift128b_decrypt ( const gift128b_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input 
)

Decrypts a 128-bit block with GIFT-128 (bit-sliced).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.

The input and output buffers can be the same buffer for in-place decryption.

void gift128b_encrypt ( const gift128b_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input 
)

Encrypts a 128-bit block with GIFT-128 (bit-sliced).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.

The input and output buffers can be the same buffer for in-place encryption.

void gift128b_encrypt_preloaded ( const gift128b_key_schedule_t ks,
uint32_t  output[4],
const uint32_t  input[4] 
)

Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.

The input and output buffers can be the same buffer for in-place encryption.

This version assumes that the input has already been pre-loaded from big-endian into host byte order in the supplied word array. The output is delivered in the same way.

void gift128b_init ( gift128b_key_schedule_t ks,
const unsigned char *  key 
)

Initializes the key schedule for GIFT-128 (bit-sliced).

Parameters
ksPoints to the key schedule to initialize.
keyPoints to the 16 bytes of the key data.
void gift128n_decrypt ( const gift128n_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input 
)

Decrypts a 128-bit block with GIFT-128 (nibble-based).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.

The input and output buffers can be the same buffer for in-place decryption.

void gift128n_encrypt ( const gift128n_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input 
)

Encrypts a 128-bit block with GIFT-128 (nibble-based).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.

The input and output buffers can be the same buffer for in-place encryption.

void gift128n_init ( gift128n_key_schedule_t ks,
const unsigned char *  key 
)

Initializes the key schedule for GIFT-128 (nibble-based).

Parameters
ksPoints to the key schedule to initialize.
keyPoints to the 16 bytes of the key data.
void gift128t_decrypt ( const gift128n_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input,
uint32_t  tweak 
)

Decrypts a 128-bit block with TweGIFT-128 (tweakable variant).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.
tweak4-bit tweak value expanded to 32-bit.

The input and output buffers can be the same buffer for in-place encryption.

This variant of GIFT-128 is used by the ESTATE 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 gift128n_encrypt().

void gift128t_encrypt ( const gift128n_key_schedule_t ks,
unsigned char *  output,
const unsigned char *  input,
uint32_t  tweak 
)

Encrypts a 128-bit block with TweGIFT-128 (tweakable variant).

Parameters
ksPoints to the GIFT-128 key schedule.
outputOutput buffer which must be at least 16 bytes in length.
inputInput buffer which must be at least 16 bytes in length.
tweak4-bit tweak value expanded to 32-bit.

The input and output buffers can be the same buffer for in-place encryption.

This variant of GIFT-128 is used by the ESTATE 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 gift128n_encrypt().