Skip to content

Howto Enable TPM Support on a Raspberry PI (0, 0W, 1, 2, 3, 3b+) and make it work with the LetsTrust TPM

UPDATE: Works for Pi 3b+, too!

Due to the recent inclusion of the TPM_TIS_SPI patches to the mainline kernel
and the consequent backports to v4.9.x and 4.11.x it's now much easier to get
the support for the LetsTrust TPM up and running.
No more patching necessary!

tldr: Enable CONFIG_TCG_TIS_SPI in your Kernel Config, and modify your
device tree accordingly.

This tutorial will show you how to perform these steps for your Raspberry PI
(0, 0W, 1, 2, 3).

It is assumed that you are cross-compiling from your desktop PC (i.e. not
building the kernel on the raspberry itself) and create everything in your home directory (~).

For more details please also read the excellent guide from the Raspberry Pi
Foundation on howto compile your kernel.
https://www.raspberrypi.org/documentation/linux/kernel/building.md
https://www.raspberrypi.org/documentation/linux/kernel/configuring.md

On a Ubuntu system you should install the following packages
gcc-arm-linux-gnueabihf
gddrescue
git
libncurses5-dev
bc


First download the toolchain you need for cross compilation
$ git clone https://github.com/raspberrypi/tools
and add the tools to your executable search path
$ export PATH=$PATH:~/tools

Then grab the kernel sources
$ git clone --depth=1 https://github.com/raspberrypi/linux
and enter the directory
$ cd linux

Next step is to get the default kernel configuration:

For Pi 1, Pi 0, Pi 0 W, or Compute Module:
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig


For Pi 2, Pi 3, or Compute Module 3:
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig


Then we have to enable the TPM Support in the Kernel via make menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
In this gui navigate to
Device Drivers
---> Character devices
---> TPM Hardware Support

and press M (for Module) or Y (for build-in support)
Then press enter to get into the subdirectory and select
---> TPM Interface Specification 1.3 Interface / TPM 2.0 FIFO Interface - (SPI)
also again either via M or Y

If you want to use the TPM's HardwareNumberGenerator feature, please select
---> Hardware Random Number Generator Core support
---> TPM HW Random Number Generator support

Save and exit the menuconfig.

If this is too much hassle for you, you can also edit your .config file and
add these 5 lines to it.
CONFIG_HW_RANDOM_TPM=m
CONFIG_TCG_TPM=m
CONFIG_TCG_TIS_CORE=m
CONFIG_TCG_TIS_SPI=m
CONFIG_SECURITYFS=y


Next step is to add our DeviceTree Overlay to our kernel sources.
Simply download letstrust-tpm-overlay.dts and copy it to arch/arm/boot/dts/overlays/letstrust-tpm-overlay.dts
$ wget http://letstrust.de/uploads/letstrust-tpm-overlay.dts -O arch/arm/boot/dts/overlays/letstrust-tpm-overlay.dts

Now build your kernel and device tree blob
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs overlays/letstrust-tpm.dtbo -j8
please note the additional overlays/letstrust-tpm.dtbo

Now deploy your kernel and modules (standard rpi way, see howto above)
$ mkdir mnt/fat32
$ mkdir mnt/ext4
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
$ sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/


Before you unmount your RPI SD Card, open mnt/fat32/config.txt
and ensure the line dtparam=spi=on isn't commented out (so no # at the beginning of the line)
and add
dtoverlay=letstrust-tpm
just beneath it.

More Details:
https://www.raspberrypi.org/documentation/configuration/device-tree.md
https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md
Of course we uploaded a reference config.txt for you

Unmount your SD card,
$ sudo umount mnt/fat32
$ sudo umount mnt/ext4

Put it into your PI and boot your raspberry pi.

After booting, on a shell do
sudo modprobe tpm_tis_spi and /dev/tpm0 should be visible.
(We are looking into it why it does not autoload)

You can tryout the functionality of your TPM with
https://github.com/Infineon/eltt2


Happy Hacking



p.s.: If you just want to try it out without compiling:
Download boot-v4.9.33.tpm.tar.bz2 (kernel, dtb, overlays) + modules-v4.9.33.tpm.tar.bz2

Extract the boot-v4.9.33.tpm.tar.bz2 into the boot partition of your rpi (e.g. sdb1) and the modules-v4.9.33.tpm.tar.bz2 into the second partition.(e.g. sdb2)

$ wget http://www.letstrust.de/uploads/boot-v4.9.33.tpm.tar.bz2 -O /tmp/boot-v4.9.33.tpm.tar.bz2
$ wget http://www.letstrust.de/uploads/modules-v4.9.33.tpm.tar.bz2 -O /tmp/modules-v4.9.33.tpm.tar.bz2
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4
$ cd mnt/fat32
$ sudo tar -xvf /tmp/boot-v4.9.33.tpm.tar.bz2
$ cd ../ext4
$ sudo tar -xvf /tmp/modules-v4.9.33.tpm.tar.bz2
$ cd ..
$ sudo umount /dev/sdb1
$ sudo umount /dev/sdb2


was lange währt wird endlich gut.

Neues Plug&Play Image und diesmal: Eines für alle RaspberryPi´s!

Es handelt sich hierbei um ein frisches "Jessie" Image vom 21.06.2017 mit dem Kernel 4.9.33.
Der Pinguin hat freundlicherweise ein ungestartetes Jessie wie in diesem Post beschrieben modifiziert.

Lade dir das Image herunter.
Entpacke es und spiele das Image auf eine SD-Karte.
(Hierbei wird alles auf der SD-Karte vernichtet!)

Einfacher gehts nun fast nicht mehr.

Ist das LetsTrust-TPM an der richtigen Stelle und vor dem Booten gesteckt solltest du mit:
ls /dev/tpm0
dich vergewissern, dass das TPM erkannt wurde.

Nun zum ersten Kommando zum TPM
Im home Verzeichnis findet ihr im Ordner "TPM-Tools" das eltt2.

Öffnet ein Terminal:
cd /TPM-Tools/eltt2/
make
sudo ./eltt2 -G 20

Ihr habt nun 20 Byte Zufallszahlen vom LetsTrust-TPM erhalten!

Bis bald!

LetsTrust TPM und los gehts!

So, ich habe nun das Modul, und jetzt?
UPDATE:

Es gibt nun ein neues Plug&Play Image: Eines für alle Pi´s.

Hier findest du den Eintrag dazu: Link

Veraltet:

Du hast nun drei Möglichkeiten:
1.: Lade das Image für den Raspberry Pi herunter und kopiere dieses via dd auf eine SD-Karte >=4GB.
Image: plug_n_play_image.img
How to Plug and Play Image:PlugandPlayImage_en.txt

Prüfsummen des Images:
MD5: 27aeac85aa4e1ca1588808ad5b988a25
SHA-1: ceab60c4b538313a28d59b8bfce8184a7ad83f02
SHA-256: 88216ab485b93a706d229a9e95c99a0fa32291964b65c8fafb48440dc904eb9c

2.: Die vorkompilierten Module und den passenden Devicetree Eintrag im eigenen Kernel verwenden, die Anleitung und die Module sind gepackt.
Archiv: precompiled_modules_en.zip.
Prüfsummen des Archivs:
MD5: 5ea87f7068ff0603d673b017e4175097
SHA-1: 2cd863bdb67260f2eabbf73405a483e6153b5d28
SHA-256: 355b901178c39eb19398d9c352829923492a9e6987e1f3651a9a757955ad2559

3.: Oder der steinige und harte Weg: Kernel selbst bauen und patchen.
Anleitung und den Patch hierzu findest du in diesem Archiv:
compile_complete_kernel_en.zip
Prüfsummen des Archivs:
MD5: 7607cc3c35407f51fef23e44be2c32eb
SHA-1: d5a0b42ca40158ce30ef3a1ddef8f11ae383b732
SHA-256: 2eec1442315a1cd0691626bd6910ff54128d03793bf1eb2701aea4b54e8034bd


Happy Patching!



Das war´s für heute!

Bis bald!

Open Hardware Nr. 2!

Jeden Tag ein Blog-Eintrag!
Es gibt echt viel zu schreiben hierüber.

Nun aber zur Hardware von LetsTrust TPM.
Die Platine misst 12,7 auf 17,5 mm, und passt so in fast alle Gehäuse (Zero-Gehäuse nur über Umwege).
Die Elektronik:
Auf der Oberseite sind zwei von drei 0 Ohm Widerständen,
ein Widerstandsnetzwerk mit 10 kOhm und vier 100 nF Kondensatoren bestückt.
Alle sieben Bauteile sind um den Infineon SLB 9670 TPM 2.0 FW:7.40 angeordnet.

Warum nicht auch der Dritte 0 Ohm Widerstand bestückt ist?
Das ist der "Jumper" für CS0; da der "Jumper" für CS1 bestückt ist, sollte man es vermeiden, den Widerstand für CS0 zeitgleich zu bestücken.
Der zweite 0 Ohm Widerstand ist eine Brücke von einem GPIO des Pi's zum externen Reset-Pin des TPM.
Kann ich SPI noch nutzen, obwohl LetsTrust TPM auf meinem Pi steckt?
Klar, aber eben nur auf CS0, denn das TPM belegt CS1.

Wenn ich das TPM aber unter CS_0 haben möchte?
Versetzte den 0 Ohm Widerstand von Position R3 auf R2, siehe Place-Plan.
UND patche deinen Devicetree, damit er in Zukunft über CS0 mit dem TPM spricht.
PCB placement

Gibt es einen Schaltplan?
Klar!
Schematic

Da sind zwei Lötaugen, wofür sind die gedacht?
Zum Spielen, das TPM hat ein paar Pins zum Schalten und die wurden herausgeführt, es sind PIRQ und GPIO.
PIRQ geht zusätzlich noch auf Pin 22 vom Pinheader des Pi.

Spannungsversorgung und Strom?
Der LetsTrust TPM wird mit 3,3 Volt des Pi's versorgt und benötigt maximal 18mA Strom.


Wo stecke ich das Teil auf den Header?
Mit dem Chip nach unten ab Pin 17, das TPM-Modul zeigt in Richtung HDMI-Anschluss.
Dadurch werden 2x5 Pins belegt, von Pin 17 bis Pin 26.

Wozu ist die 2x8 Buchsenleiste mit in der Tüte?
Diese dient als "Zielhilfe" für das TPM und ist für den Betrieb nicht nötig.

Step 1: Buchsenleiste auf Pin 1 Stecken.
Step 2: Das Modul bündig zur Buchsenleiste in Richtung HDMI-Anschluss "schauen" lassen und aufstecken.
Step 3: Profit!






Das war's wieder für heute! Morgen gibt es die Anleitung um Kernels <4.12 fit fürs Raspberry zu bekommen.

Bis Bald!

Open Hardware!

Die Platinen sind eingetroffen!

Und es ist ein Open Hardware-Projekt!
Infos folgen in der Nacht auf den 17.05.2017.

Das war's jetzt aber wirklich!

Bis Morgen! :-)