2022-2024
Nous voulons développer un accélérateur matériel qui permettra de chiffrer un ensemble de données contenues en mémoire sans intervention du processeur durant la phase de calcul.
Ce module aura deux interfaces:
De plus, ce module doit pouvoir générer une interruption à la fin de la tâche de chiffrement.
D’un point de vue programmation, utiliser cet accélérateur passe par les étapes suivantes:
L’algorithme de chiffrement que nous utiliserons est PRESENT.
PRESENT est un algorithme de chiffrement symétrique par bloc (comme AES). Il entre dans les catégories des algorithmes légers (light weight block ciphers) destinés aux applications embarquées. Son architecture a été conçue pour permettre des implémentations matérielles compactes et efficaces. C’est un des rares algorithmes légers faisant partie d’un standard ISO.
Pour ce projet, la maitrise détaillée de l’algorithme de PRESENT et de son architecture interne ne sont pas nécessaires.
Les caractéristiques principales qu’il faut retenir:
Une implémentation de cet algorithme est fournie ici.
Le module principal possède l’interface suivante:
module present(
input clk,
input nrst,
input start,
output eoc,
input [63:0] plaintext,
input [127:0] key,
output[63:0] ciphertext
);
signal | direction | rôle |
---|---|---|
clk |
entrée | l’horloge principale |
nrst |
entrée | remise à zéro sur niveau bas |
start |
entrée | démarrage du chiffrement |
à 1 durant 1 cycle | ||
eoc |
sortie | indique la fin du chiffrement |
à 1 durant 1 cycle | ||
plaintext |
entrée | bloc de données à chiffrer |
sur 64 bits | ||
key |
entrée | clé de chiffrement |
sur 128 bits | ||
ciphertext |
sortie | bloc de données chiffrées |
sur 64 bits |
Cette figure montre le schéma de principe du module qu’il faut développer. Ce module possède deux interfaces Avalon:
Ce module devra contenir:
Quand le processeur en donnera l’ordre, le contrôleur ira lire des données en mémoire, les présentera au module de chiffrement, attendra la fin du chiffrement puis finalement écrira le résultat en mémoire. Ces étapes sont répétées jusqu’à atteindre le nombre de blocs souhaités.
N”oubliez pas que l’interface Avalon utilisée est une interface 32 bits, il faudra donc pour chaque bloc, deux lectures puis deux écritures.
Les registres de configuration tels que vus par le programmeur devraient être comme suit:
adresse | nom | taille | fonction |
---|---|---|---|
0x00 |
k0 |
32 bits | bits [31:0] de la clé |
0x04 |
k1 |
32 bits | bits [63:32] de la clé |
0x08 |
k2 |
32 bits | bits [95:64] de la clé |
0x0c |
k3 |
32 bits | bits [127:96] de la clé |
0x10 |
src |
32 bits | adresse en mémoire de la zone source |
0x14 |
dest |
32 bits | adresse en mémoire de la zone destination |
0x18 |
num |
32 bits | nombre de blocs de 64 bits à chiffrer |
0x1c |
ctrl |
32 bits | statut et commande |
en écriture | |||
- écrire 1 démarre un chiffrement | |||
- écrire 0 remet à zéro la sortie d’interruption | |||
en lecture | |||
- le bit 0 est à 1 durant un chiffrement sinon 0 |
Ce qui correspond à une structure de données de la forme:
typedef struct {
uint32_t k[4];
uint32_t src;
uint32_t dest;
uint32_t num;
uint32_t ctrl;
} DMA_t;
Nous vous proposons l’environnement disponible dans l’archive suivante. Elle contient:
avalon_accel.sv
),avalon_accel_hw.tc
),dma-validation-sim
.Le module principal implémente déjà la partie cible du module ainsi que les registres de configuration. Le testbench simule la phase d’initialisation et de démarrage du module. L’environnement de simulation contient, en plus du générateur de requêtes Avalon, un modèle de mémoire.
Méthodologie à suivre:
memcpy
par
exemple) ou à une implémentation logicielle de PRESENTPour les différentes étapes, vous pouvez, dans Quartus, obtenir les informations suivantes:
Une fois l’intégration dans Platform Designer et le test sur la maquette fait, n’hésitez pas à demander de l’aide pour identifier ces différentes informations dans les outils.
Conservez ces différents résultats dans un fichier associé à votre projet.