This repository contains the code used to obtain some of our results in the paper "Lower Bounds on the Degree of Block Ciphers".

The different folder contents are the following :

- "search" contains our implementation to detect the input/key/output patterns. Especially this is the implementation used to get the results for GIFT-64 and PRESENT

- "simple_verification_code" contains short and easy to read code to verify the number of trails for a given input/key/output pattern for GIFT-64, Skinny64 and AES.

- "pattern" contains the different input/key/ouput patterns used to get our results.

An installation of the MILP optimizer Gurobi is necessary (https://www.gurobi.com/)
The GUROBI_HOME environment variable should be set according to the Gurobi documentation.
If needed, edit the makefile to adjust to the correct paths/version of Gurobi, especially the -lgurobi_g++5.2 and -lgurobi81 flags

This implementation was tested using :

g++ version 9.3.0 (Arch Linux 9.3.0-1)
SageMath version 9.0, Release Date: 2020-01-01
Gurobi 9.0.0

and

g++ (Ubuntu 9.2.1-17ubuntu1~18.04.1) 9.2.1 20191102
SageMath version 8.1, Release Date: 2017-12-07
Gurobi 8.1.1

No guarantees are given when using different versions, but we do not expect any issue.
The only compiler-dependent instruction should be __builtin_popcountll