This document contains step-by-step instructions on how to setup the Open Source TPM Software Stack 2.0 (TSS 2.0) in combination with the tpm2-pkcs11 provider and related software on a Raspberry Pi® 3 Linux environment to use the Trusted Platform Module OPTIGA™ TPM SLx 9670 TPM2.0 from Infineon Technologies as a Hardware Security Module (HSM) for AWS IoT Greengrass using the PKCS#11 Hardware Security Integration (HSI).
The OPTIGA™ TPM SLx 9670 TPM2.0 product family with SPI interface consists of 3 different products:
We refer with "OPTIGA™ TPM SLx TPM2.0" to all of the above 3 variants of the OPTIGA™ TPM2.0 product family with SPI interface.
The described steps to use an OPTIGA™ TPM as a an Hardware Security Module for AWS IoT Greengrass on an Raspberry Pi® 3 Linux Environment can be performed with one of the Infineon Iridium SLx 9670 TPM2.0 SPI Boards, listed in the Table below:
Supported TPM | Order Type | Order number | FW Version |
---|---|---|---|
OPTIGA™ TPM SLB 9670 TPM2.0 | IRIDIUM 9670 TPM2.0 | SP001596592 | 7.85 |
OPTIGA™ TPM SLI 9670 TPM2.0 | IRIDIUM SLI 9670 TPM2.0 | SP004232000 | 13.11 |
OPTIGA™ TPM SLM 9670 TPM2.0 | IRIDIUM SLM 9670 TPM2.0 | SP004232004 | 13.11 |
The 3 Infineon Iridium Boards are referred in the following as "Infineon Iridium SLx 9670 TPM2.0 SPI Board".
The Software has been tested with Infineon TPMs implementing TCG Revision 1.38 or higher.
Iridium Boards with OPTIGA™ TPM SLB 9670 might have a lower firmware (7.40 or 7.63) and may need to be upgraded first. Iridium Boards with OPTIGA™ TPM SLI 9670 and OPTIGA™ TPM SLM 9670 should have FW 13.11.
Please refer to eltt2 section below on how to check the version of your TPM.
This document is intended for customers who want to increase the security level of their AWS IoT Greengrass deployments using an OPTIGA™ TPM SLx9670 TPM2.0 from Infineon as a Hardware Security Module, leveraging the capabilities of the AWS Greengrass Hardware Security Intergration (HSI) via the tpm2-pkcs11 provider library.
In case you are not yet familiar with AWS IoT Greengrass please have a look at:
For more details on AWS IoT Greengrass HSI please refer to https://docs.aws.amazon.com/greengrass/latest/developerguide/hardware-security.html.
It is strongly recommended to follow the AWS IoT Greengrass tutorial before using this guide to support the use of OPTIGA™ TPM with HSI
The PKCS11 Library (tpm2-pkcs11) and the underlying TPM2 Software Stack (tpm2-tss) are part of the Open Source Project http://tpm2-software.github.io which is supported, developed and sponsored by Infineon and many others.
The software:
Only RSA 2K Keys and ECC_NIST_P256 keys are supported.
sudo apt update && sudo apt upgrade
.sudo rpi-update
.Edit /boot/config.txt and add the following line:
dtoverlay=tpm-slb9670
(this tpm-slb9670 overlay applies to SLB 9670, SLI 9670 and SLM 9670).
eltt2 is a small test utility provided by Infineon Technologies AG and is available on github:
git clone https://github.com/infineon/eltt2
cd eltt2
make
sudo ./eltt2 -g
cd ..
The output should look similar to this:
TPM capability information of fixed properties:
=========================================================
TPM_PT_FAMILY_INDICATOR: 2.0
TPM_PT_LEVEL: 0
TPM_PT_REVISION: 138
TPM_PT_DAY_OF_YEAR: 8
TPM_PT_YEAR: 2018
TPM_PT_MANUFACTURER: IFX
TPM_PT_VENDOR_STRING: SLM9670
TPM_PT_VENDOR_TPM_TYPE: 0
TPM_PT_FIRMWARE_VERSION: 13.11.4555.0
This means your OPTIGA™ TPM works as expected. It also shows the Firmware Version of the TPM.
sudo apt update && sudo apt upgrade
sudo apt -y install autoconf automake libtool pkg-config gcc libssl-dev \
libcurl4-gnutls-dev libdbus-1-dev libglib2.0-dev autoconf-archive libcmocka0 \
libcmocka-dev net-tools build-essential git pkg-config gcc g++ m4 libtool \
automake libgcrypt20-dev libssl-dev uthash-dev autoconf doxygen pandoc \
libsqlite3-dev python-yaml p11-kit opensc gnutls-bin libp11-kit-dev \
python3-yaml cscope libp11-3 libp11-dev libjson-c-dev libyaml-dev
git clone https://github.com/tpm2-software/tpm2-tss
git clone https://github.com/tpm2-software/tpm2-tools
git clone https://github.com/tpm2-software/tpm2-abrmd
git clone https://github.com/tpm2-software/tpm2-pkcs11
cd tpm2-tss
git checkout 2.4.x
./bootstrap -I m4
./configure --with-udevrulesdir=/etc/udev/rules.d --with-udevrulesprefix=70- --sysconfdir=/etc --localstatedir=/var --runstatedir=/run
make -j4
sudo make install
sudo useradd --system --user-group tss
sudo udevadm control --reload-rules && sudo udevadm trigger
sudo ldconfig
mkdir -p ~/.local/share/tpm2-tss/user/keystore
cd ..
cd tpm2-abrmd
git checkout 2.3.2
./bootstrap -I m4
./configure --with-dbuspolicydir=/etc/dbus-1/system.d \
--with-systemdsystemunitdir=/lib/systemd/system \
--with-systemdpresetdir=/lib/systemd/system-preset \
--datarootdir=/usr/share
make -j4
sudo make install
sudo ldconfig
sudo pkill -HUP dbus-daemon
sudo systemctl daemon-reload
sudo systemctl enable tpm2-abrmd.service
sudo systemctl start tpm2-abrmd.service
dbus-send --system --dest=org.freedesktop.DBus --type=method_call \
--print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames \
| grep "com.intel.tss2.Tabrmd" || echo "ERROR: abrmd was not installed correctly!"
cd ..
cd tpm2-tools
git checkout 4.2.X
./bootstrap
./configure
make -j4
sudo make install
cd ..
sudo mkdir -p /opt/tpm2-pkcs11
sudo chmod 777 /opt/tpm2-pkcs11
cd tpm2-pkcs11/
git checkout 1.2.0
./bootstrap
./configure --enable-esapi-session-manage-flags --with-storedir=/opt/tpm2-pkcs11
make -j4
sudo make install
cd ..
In this example, the keystore is created under /opt/tpm2-pkcs11. It is assumed, that the location is read-/writeable to the user. It is advisable to set the location using the environment variable
export TPM2_PKCS11_STORE='/opt/tpm2-pkcs11/'
cd tpm2-pkcs11/tools/
./tpm2_ptool init --path=/opt/tpm2-pkcs11/
The used options are: --path PATH The location of the store directory.
./tpm2_ptool.py addtoken --pid=1 --sopin=123456 --userpin=123456 --label=greengrass --path=/opt/tpm2-pkcs11/
The used options are:
--pid PID The primary object id to associate with this token.
--sopin SOPIN The Administrator pin. This pin is used for object recovery.
--userpin USERPIN The user pin. This pin is used for authentication for object use.
--label LABEL A unique label to identify the profile in use, must be unique.
--path PATH The location of the store directory
./tpm2_ptool.py addkey --algorithm=rsa2048 --label=greengrass --userpin=123456 --key-label=greenkey --path=/opt/tpm2-pkcs11/
The used options are
--id ID The key id. Defaults to a random 8 bytes of hex.
--sopin SOPIN The Administrator pin.
--userpin USERPIN The User pin.
--label LABEL The tokens label to add a key too.
--algorithm {rsa2048,ecc256} The type of the key. Only RSA 2048 and ECC 256 are supported.
--key-label KEY_LABEL The key label to identify the key. Defaults to an integer value.
--path PATH The location of the store directory.
Greengrass and other tools use a pkcs11 url to find the token/key object.
This URL can be determined using p11tool
:
p11tool --list-token-urls
This will yield a result similar to:
pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust
pkcs11:model=SLM9670;manufacturer=Infineon;serial=0000000000000000;token=greengrass
pkcs11:model=SLM9670;manufacturer=Infineon;serial=0000000000000000;token=
The URL for the private key can then be determined using:
p11tool --login --list-privkeys 'pkcs11:manufacturer=Infineon;token=greengrass'
Token 'greengrass' with URL 'pkcs11:model=SLM9670;manufacturer=Infineon;serial=0000000000000000;token=greengrass' requires user PIN
Enter PIN:
Object 0:
URL: pkcs11:model=SLM9670;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%38%30%32%36%36%33%33%61%37%61%61%34%65%63%34%39;object=greenkey;type=private
Type: Private key (RSA-2048)
Label: greenkey
Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE;
ID: 38:30:32:36:36:33:33:61:37:61:61:34:65:63:34:39
If you receive error messages like
WARNING:esys:src/tss2-esys/api/Esys_TestParms.c:269:Esys_TestParms_Finish() Received TPM Error
ERROR:esys:src/tss2-esys/api/Esys_TestParms.c:95:Esys_TestParms() Esys Finish ErrorCode (0x000001c4)
they can be safely ignored. The TPM2TestParms command is used to determine whether something is supported by the tpm (e.g. an algorithm) and returns the same error code as the original TPM command called with the same arguments, e.g. unsupported algorithm. Future versions of the tpm2-tss suppress these false positive error messages.
The URL can be trimmed of certain components, as long as it remains unique, e.g.
pkcs11:model=SLM9670;manufacturer=Infineon;token=greengrass;object=greenkey;type=private
The Pin can be appended to the URL:
pkcs11:model=SLM9670;manufacturer=Infineon;token=greengrass;object=greenkey;type=private;pin-value=123456
This will be the URL we will use for the Greengrass configuration.
openssl req -engine pkcs11 -new -key "pkcs11:token=greengrass;object=greenkey;type=private;pin-value=123456" -keyform engine -out /tmp/req.csr
Please answer the questions OpenSSL is asking you for the Certificate Signing Request - these information will be incorporated into the certificate.
Once completed, login to AWS and navigate to the AWS IoT Section.
Under the Security -> Certificates
tab on the left menu, create a new certificate (Right upper corner create
).
In the menu chose Create with CSR
and select the .csr
file you created using openssl. (e.g. /tmp/req.csr
)
Download the root.ca.crt
and the resulting xxxxxx-certificate.pem.crt
, where xxxxxx stands for a unique id, and copy both to /greengrass/certs/
Before closing the window, please be sure to activate the certificate and attach it to an object/policy in the dialogue on the AWS Greengrass Security Page.
To enable and use the TPM as HSI, we need to enable it in the greengrass config.
For this we need to edit /greengrass/config/config.json
and replace the configuration with the following content:
{
"crypto": {
"caPath": "file:///greengrass/certs/root.ca.crt",
"PKCS11": {
"OpenSSLEngine": "/usr/lib/arm-linux-gnueabihf/engines-1.1/pkcs11.so",
"P11Provider": "/usr/lib/arm-linux-gnueabihf/pkcs11/libtpm2_pkcs11.so",
"SlotLabel": "greengrass",
"SlotUserPin": "123456"
},
"principals": {
"IoTCertificate": {
"certificatePath": "file:///greengrass/certs/_xxxxxx_-certificate.pem.crt",
"privateKeyPath": "pkcs11:model=SLM9670;manufacturer=Infineon;token=greengrass;object=greenkey;type=private;pin-value=123456"
},
"MQTTServerCertificate": {
"certificatePath": "file:///greengrass/certs/_xxxxxx_-certificate.pem.crt",
"privateKeyPath": "pkcs11:model=SLM9670;manufacturer=Infineon;token=greengrass;object=greenkey;type=private;pin-value=123456"
}
}
},
"coreThing" : {
"thingArn" : "arn:aws:iot:eu-central-1:ZZZZZZZZZZZZZZZ:thing/Greengrass-Test_Core",
"iotHost" : "YYYYYYYYYYYYYYY.iot.eu-central-1.amazonaws.com",
"ggHost" : "greengrass.iot.eu-central-1.amazonaws.com",
"keepAlive" : 600
},
"runtime" : {
"cgroup" : {
"useSystemd" : "yes"
}
},
"managedRespawn" : false
}
Please adjust the certificatePath
, privateKeyPath
, thingArn
and iotHost
accordingly.
For more Information please have a look at https://docs.aws.amazon.com/greengrass/latest/developerguide/gg-core.html#config-json
After this you can start your greengrass daemon as usual:
cd /greengrass/ggc/core
sudo ./greengrassd start
Please validate that your environment is prepared for Greengrass (especially memory cgroups are on), by following the regular greengrass tutorials without hsi.
Please also validate that the permissions and user groups are set up correctly.
Please make sure that you are running the latest kernel from rpi-update
, that the SPI support is turned on using raspi-setup
and that the overlay is enabled in /boot/config.txt
Please also ensure that the Iridium board is plugged in correctly.
In order to enable more verbose logging an environment variable can be set:
export TPM2_PKCS11_LOG_LEVEL=2
Also the pkcs11-spy from libp11 can be used to get a deeper understanding of the PKCS#11 calls.
The setup has been tested on a Raspberry Pi 3B+, with Rasbian Buster (2020-02-13) - please re-test on this exact platform first. Older Raspbian versions might not work.
If you receive error messages like
WARNING:esys:src/tss2-esys/api/Esys_TestParms.c:269:Esys_TestParms_Finish() Received TPM Error
ERROR:esys:src/tss2-esys/api/Esys_TestParms.c:95:Esys_TestParms() Esys Finish ErrorCode (0x000001c4)
they can be safely ignored. The TPM2TestParms command is used to determine whether something is supported by the tpm (e.g. an algorithm) and returns the same error code as the original TPM command called with the same arguments, e.g. unsupported algorithm. Future versions of the tpm2-tss suppress these false positive error messages.
All references product or service names and trademarks are the property of their respective owners.
The information contained in this application note is given as a hint for the implementation of the product only and shall in no event be regarded as a description or warranty of a certain functionality, condition or quality of the product. Before implementation of the product, the recipient of this application note must verify any function and other technical information given herein in the real application. Infineon Technologies hereby disclaims any and all warranties and liabilities of any kind (including without limitation warranties of non-infringement of intellectual property rights of any third party) with respect to any and all information given in this application note.
The data contained in this document is exclusively intended for technically trained staff. It is the responsibility of customer’s technical departments to evaluate the suitability of the product for the intended application and the completeness of the product information given in this document with respect to such application.
For further information on the product, technology, delivery terms and conditions and prices please contact your nearest Infineon Technologies office (www.infineon.com).
Due to technical requirements products may contain dangerous substances. For information on the types in question please contact your nearest Infineon Technologies office.
Except as otherwise explicitly approved by Infineon Technologies in a written document signed by authorized representatives of Infineon Technologies, Infineon Technologies’ products may not be used in any applications where a failure of the product or any consequences of the use thereof can reasonably be expected to result in personal injury.