Chiffrement matériel sur Olinuxino A20

Le processeur Allwinner A20 est capable d’accélérer matériellement un certain nombre d’algorithmes de cryptographie. J’ai voulu tester s’il était possible d’en tirer parti sur Olinuxino A20, avec Debian Jessie.

Sommaire

Etat des lieux

D’après les spécifications du matériel (voir page 9), il supporte notamment l’AES-CBC en 128 à 256 bits.

Cette accélération matérielle n’est pas disponible dans le kernel 3.4.x fourni par Olimex, mais l’est depuis peu dans un noyau linux récent (à partir de la version 4.3) : http://sunxi.montjoie.ovh/

Après avoir contacté l’auteur de ce patch (il y a plusieurs mois déjà), j’ai eu confirmation que son code ne peut pas s’appliquer facilement sur la branche 3.4 du noyau.

Mise à jour du noyau Linux

Je n’ai pas trouvé de meilleur moyen que de compiler moi-même le noyau.

En soi, ce n’est pas très compliqué, mais il faut avoir la possibilité de se brancher en mode « console » sur la machine pour comprendre ce qu’il se passe s’il y a un problème au démarrage (chargement du noyau linux par u-boot, avant que le serveur SSH soit démarré).

Mode console sur Olinuxino A20

Il faut brancher physiquement son ordinateur sur l’appareil, avec un câble USB.

Sur l’ordinateur, on peut y accéder ensuite avec Putty. Il faut lui demander de se connecter en mode série sur /dev/ttyUSB0, à 115200 bps (vous pouvez enregistrer ces paramètres de session pour les retrouver plus tard). Mais, sur Ubuntu en tous cas, un user standard n’a pas le droit d’accéder à /dev/ttyUSB0 : il faut donc soit lancer putty en tant que root (via sudo), soit donner au user courant le groupe « dialout ».

PuTTY configuration Olinuxino A20

Compilation du noyau Linux

Pour compiler le noyau pour cette machine, tout est expliqué sur le site linux-sunxi.org : http://linux-sunxi.org/Mainline_Kernel_Howto.

J’ai pris la version 4.4.1 depuis https://www.kernel.org/

Sur Ubuntu, il faut installer quelques paquets pour la compilation :

apt-get install gcc-arm-linux-gnueabihf ncurses-dev u-boot-tools build-essential

A noter que, sur Ubuntu 14.04, j’ai eu un message d’erreur « error Your compiler is too buggy; it is known to miscompile kernels ». J’ai donc fait la compilation avec une version plus récente (la 15.04 : probablement que d’autres conviennent aussi)

make ARCH=arm sunxi_defconfig
make ARCH=arm menuconfig

Dans les menus, il faut activer « User-space interface for symmetric key cipher algorithms » dans la section « Cryptographic API » (cocher plutôt avec une étoile, pour qu’il soit intégré dans le noyau au lieu d’être un module à part)

Option kernel chiffrement matériel A20

Ensuite on est prêt à lancer la compilation :

make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs

Une fois la compilation terminée :

  • Copier les fichiers arch/arm/boot/zImage et arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dtb dans la partition de boot
  • Créer un fichier boot.cmd dans la partition de boot, avec le contenu suivant :
    fatload mmc 0 0x46000000 zImage || ext2load mmc 0 0x46000000 zImage
    fatload mmc 0 0x49000000 sun7i-a20-olinuxino-micro.dtb || ext2load mmc 0 0x49000000 sun7i-a20-olinuxino-micro.dtb 
    setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait panic=10
    bootm 0x46000000 - 0x49000000
  • Créer le fichier boot.scr à partir de ce fichier :
  • mkimage -C none -A arm -T script -d boot.cmd boot.scr

Au départ, j’avais également compilé et upgradé u-boot sur une nouvelle carte SD, mais ce n’est finalement pas nécessaire. Le u-boot livré par Olimex suffit (U-Boot 2014.04 ou 2015.10)

Il faut donc dans la partition de boot les fichiers suivants :

  • zImage
  • sun7i-a20-olinuxino-micro.dtb
  • boot.scr
  • boot.cmd (facultatif : c’est la source qui a permis de générer boot.scr)
  • uEnv.txt (facultatif : pour passer des paramètres au noyau)

Attention, si vous utilisez l’image actuellement fournie par Olimex (A20-OLinuXino-MICRO Debian Jessie with kernel 3.4.103+ release 11), il y a un petit piège : sur une machine allumée, la partition de boot n’est pas montée sur /boot (qui contient pourtant des données de démarrage), mais dans /media/olimex/6B4C-FFFD : c’est bien là qu’il faut déposer le nouveau noyau. Autre solution : déposer les fichiers directement dans la partition de boot de la carte SD, en la mettant dans un ordinateur.

NB : je n’ai pas encore testé de faire ces mêmes manipulations en partant d’un filesystem installé avec l’installeur de Debian Jessie (et non issu de l’image fournie par Olimex). A priori ça devrait être la même chose.

En cas de noyau qui ne démarre pas

Pour comprendre pourquoi, il est possible de compiler le noyau en ajoutant des options de debug : https://linux-sunxi.org/Mainline_Kernel_Howto#Early_printk

Nécessité d’un patch sur les versions 4.3.x et 4.4.x

En l’état, il y a hélas un bug qu’il faut patcher manuellement : https://lkml.org/lkml/2015/11/16/46

Deux lignes de code à ajouter manuellement. Merci à plaes, apritzel et montjoie pour leur aide au diagnostic sur IRC (#linux-sunxi).

Ce correctif devrait être intégré dans la version 4.5 du noyau Linux.

Comment vérifier si l’accélération matérielle est disponible?

cat /proc/crypto | grep sun4i devrait renvoyer :

 driver : ecb-des3-sun4i-ss
 driver : cbc-des3-sun4i-ss
 driver : ecb-des-sun4i-ss
 driver : cbc-des-sun4i-ss
 driver : ecb-aes-sun4i-ss
 driver : cbc-aes-sun4i-ss
 driver : sha1-sun4i-ss
 driver : md5-sun4i-ss

Parmi les applications qui savent en tirer parti, il y a dm-crypt :

cryptsetup benchmark –cipher aes-cbc devrait donner des valeurs de plus de 25 Mo/s (au lieu de 12 à 15Mo/s avec le noyau 3.4 fourni par Olimex, qui ne supporte pas d’accélération matérielle) :

# Algorithm | Key | Encryption | Decryption
    aes-cbc   256b  25.4 MiB/s   25.5 MiB/s

Si cette commande vous renvoie une erreur « Required kernel crypto interface not available. Ensure you have algif_skcipher kernel module loaded. », c’est que vous n’avez pas activé l’option « User-space interface for symmetric key cipher algorithms » mentionnée plus haut dans la configuration du noyau linux.

Édité le 09/03/2016 : si le cryptsetup benchmark fonctionne bien et donne effectivement de bons résultats, je n’ai pas encore réussi à utiliser dm-crypt sur une partition chiffrée. Probablement parce qu’il me manque d’autres options à la compilation du kernel?

Une réflexion sur « Chiffrement matériel sur Olinuxino A20 »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *