This repository contains an 128-bit AES decryption algorithm, that runs on a Smart-Card with an AVR ATmega644 microcontroller on it. The code was implemented in the scope of a "Smart-Card Laboratory" at the Technical University of Munich, with the purpose to decrypt chunks of a video stream while communicating with a Smart-Card reader or Terminal. The communication between the Smart-Card an the Terminal occurs over the Smart-Card's ISO7816 I/O contact and follows the T=0 protocol specified in ISO7816. This markdown page provides some information on build configurations & gives an overview of the code.
The code for the clone consists of these main classes:
- The
Communicationclass manages the T=0 protocol to communicate with the Terminal. - The
AESclass contains all the functionality required for the 128-bit AES decryption running on the processor. - The
AESMathclass contains some math helper functions for the decryption. - The
Hidingclass implements countermeasures Shuffling & Dummy-Ops. - The
Maskingclass implements the Masking countermeasure. - The
RNGclass implements a small, lightweight Random-Number-Generator. - The
Loggerclass can be used to log message to a serial console over USART & USB. Note that this functionality is only available in debug mode.
-
This project uses CMake and requires Version 3.5 or higher.
-
If you want to flash the executable onto an ATmega644 yourself, make sure to install
avrdude(e.g. on Debian:sudo apt-get install avrdude)
The repository is built using CMake. To build the default .hex file that can be flashed on the ATmega644 using an AVR programmer, do the following:
-
Create a build directory:
$ mkdir build/ -
Change into the directory:
$ cd build/ -
Run CMake:
$ cmake .. -
If you only want to compile the project, run:
$ make -
If you also want to flash it onto an ATmega644, run:
$ make flash
There are a couple of CMake options that can be turned on/off.
To see a complete list of them, run: $ cmake -L .. from you build folder.
The Smart-Card used in this laboratory came with an USART to USB converter chip. This makes it possible to log messages to a serial console on a PC over the ATmega644's USART peripheral. If you are compiling this code for your own Smart-Card, you might run into issues with USART. To enable logging of debug messages, the project can be compiled in debug mode. Note that this greatly increases the executable size & that some UART message might interfere with the Terminal communication. If these message are unwanted, the project can also be compiled in release mode.
- Run
$ cmake -DDebug=ON ..to build the project in debug mode. - Run
$ cmake -DDebug=OFF ..to build the project in release mode. - The default value is
OFF.
The AES implementation contains a number of DPA countermeasures, including Masking, Shuffling the S-Box access & inserting Dummy NOPs. You can enable/disable these countermeasures with CMake flags:
- Masking: When masking is enabled, the current 16-byte AES state & all round-keys, will be masked with 6 randomly generated masks. These masks will be applied once before the first round, re-applied after every inverse MixColumns operation & removed after the last round. To enable/disable masking, do the following:
- Run
$ cmake -DMasking=ON ..to enable masking. - Run
$ cmake -DMasking=OFF ..to disable masking. - The default value is
OFF.
- Run
- Shuffling: Another countermeasure that was added is the shuffling of S-Box accesses. When reading values from the S-Box look-up table, these accesses are not performed in a specific order, but a random. The goal of this is to randomize the chips power consumption during decryption. To enable/disable Shuffling, do the following:
- Run
$ cmake -DShuffling=ONto enable Shuffling. - Run
$ cmake -DShuffling=OFFto disable Shuffling. - The default value is
OFF.
- Run
- Dummy-Ops: The last countermeasure that was implemented are Dummy NOPs. These are inserted before every AES operation (AddRoundKey, InvMixCol, InvShiftRows, InvSubBytes) to also randomize the power consumption during decryption. To enable/disable Dummy-Ops do the following:
- Run
$ cmake -DDummyOps=ONto enable Dummy-Ops. - Run
$ cmake -DDummyOps=OFFto disable Dummy-Ops. - The default value is
OFF.
- Run
The Doxygen custom CSS template used in this project can be found here.