Les modifications proposées sont réparties au travers de plusieurs logiciels:

  • un support dans libvirt[1];
  • un support dans QEMU qui comprend un frontend pour l’invité avec l’émulation de la présence du TPM sur le bus LPC ainsi qu’un ou plusieurs backends pour l’hôte permettant de choisir l’implémentation du TPM;
  • un support dans SeaBIOS fournissant un pilote et les interfaces par interruptions logicielles;
  • libtpms, une bibliothèque émulant un TPM et fournissant un des backends pour QEMU.

Pour l’instant, il existe deux backends. Le premier est un émulateur avec libtpms; Le second est un driver null qui renvoie invariablement des codes d’erreur pour chaque requête. Un pilote para-virtualisé faisant usage de virtio pourrait voir le jour.

Avant de commencer, nous avons besoin de compiler libtpms. Celle-ci est déjà disponible pour Fedora Rawhide ou sur Launchpad mais pour le cas général nous allons récupérer le code source dans le SRPM de Fedora[2]. Nous extrayons l’archive puis nous suivons la procédure à partir de celle présente dans le .spec.

  • extraction de l’archive de libtpms
user@localhost:~$ rpm2cpio libtpms-0.5.1-8.src.rpm | cpio -vid
user@localhost:~$ tar zxvf libtpms-0.5.1.tgz
  • compilation de libtpms
user@localhost:~$ make -f makefile-libtpms all CRYPTO_SUBSYSTEM=openssl BUILD_TYPE=production -j$((`grep processor /proc/cpuinfo | wc -l` * 2))
user@localhost:~$ sudo make -f makefile-libtpms install

Une fois la libtpms installée, nous pouvons compiler QEMU avec libtpms comme backend pour le TPM. Dans un premier temps, nous récupérons l’ensemble des patches sur la mailing-list[3] ainsi que le snapshot du code source correspondant[4]. La compilation se fait de la manière habituelle en activant le support du TPM.

  • compilation de QEMU avec support du TPM
user@localhost:~$ ./configure --target-list=i386-softmmu --enable-tpm --disable-werror
user@localhost:~$ make -j$((`grep processor /proc/cpuinfo | wc -l` * 2))
user@localhost:~$ sudo make install

Enfin, il nous faut un nouveau BIOS qui fournisse les interfaces nécessaires. De même, nous récupérons sur la mailing-list les patches[5] ainsi que le code source dans la version correspondante[6].

  • compilation de SeaBIOS avec support du TPM
user@localhost:~$ make menuconfig
user@localhost:~$ make -j$((`grep processor /proc/cpuinfo | wc -l` * 2))

Maintenant que tout est prêt, il ne reste plus qu’à tester. Pour cela nous allons tout d’abord créer une image au format QCOW2 contenant les informations persistantes du TPM

  • création de la sauvegarde de l’état persistant du TPM
user@localhost:~$ qemu-img create -f qcow2 tpm.img 83k

Il ne reste plus qu’à lancer QEMU; Si tout s’est bien passé, vous devriez avec la touche F11 avoir accès à la configuration du TPM émulé et avec un peu de chance vous pourrez même faire tourner TrustedGRUB. ;)

  • démarrage de QEMU avec support du TPM au travers de libtpms
user@localhost:~$ qemu -curses --tpm builtin,path=./tpm.img,model=tpm-tis -bios seabios/seabios/out/bios.bin -boot menu=on -hda root.img