175 lines
5.9 KiB
ReStructuredText
175 lines
5.9 KiB
ReStructuredText
.. _tfm_integration-samples:
|
|
|
|
TFM Integration Samples
|
|
#######################
|
|
|
|
.. toctree::
|
|
:maxdepth: 1
|
|
:glob:
|
|
|
|
*/*
|
|
|
|
Trusted Firmware-M (TF-M)
|
|
#########################
|
|
|
|
Overview
|
|
********
|
|
These TF-M integration examples can be used with a supported Armv8-M board, and
|
|
demonstrate how the TF-M APIs can be used with Zephyr.
|
|
|
|
Trusted Firmware Platform Security Architecture (PSA) APIs are used for the
|
|
secure processing environment (S), with Zephyr running in the non-secure
|
|
processing environment (NS).
|
|
|
|
As part of the standard build process, the secure bootloader (BL2) is normally
|
|
built, in addition to the TF-M S and Zephyr NS binary images. The S and NS
|
|
images are then merged and signed using the private signing keys, whose public
|
|
key values are stored in the secure bootloader. This allows the application
|
|
images to be verified and either accepted or rejected during the image
|
|
verification process at startup, based on a pair of private keys that you
|
|
control.
|
|
|
|
What is Trusted Firmware-M (TF-M)?
|
|
**********************************
|
|
|
|
Trusted Firmware-M (TF-M) is the reference implementation of `Platform Security
|
|
Architecture (PSA) <https://pages.arm.com/psa-resources.html>`_.
|
|
|
|
TF-M provides a highly configurable set of software components to create a
|
|
Trusted Execution Environment. This is achieved by a set of secure run time
|
|
services such as Secure Storage, Cryptography, Audit Logs and Attestation.
|
|
Additionally, secure boot in TF-M ensures integrity of run time software and
|
|
supports firmware upgrade.
|
|
|
|
The current TF-M implementation specifically targets TrustZone for ARMv8-M.
|
|
|
|
Trusted Firmware M source code is available at
|
|
`git.trustedfirmware.org <https://git.trustedfirmware.org>`_, although a fork
|
|
of this source code is maintained by the Zephyr Project as a module for
|
|
convenience sake at
|
|
`<https://github.com/zephyrproject-rtos/trusted-firmware-m>`_.
|
|
|
|
For further information consult the official `TF-M documentation`_
|
|
|
|
.. _TF-M documentation:
|
|
https://ci.trustedfirmware.org/job/tf-m-build-test-nightly/lastSuccessfulBuild/artifact/build-docs/tf-m_documents/install/doc/user_guide/html/index.html
|
|
|
|
TF-M Requirements
|
|
*****************
|
|
|
|
The following Python modules are required when building TF-M binaries:
|
|
|
|
* cryptography
|
|
* pyasn1
|
|
* pyyaml
|
|
* cbor>=1.0.0
|
|
* imgtool>=1.6.0
|
|
* jinja2
|
|
* click
|
|
|
|
You can install them via:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ pip3 install --user cryptography pyasn1 pyyaml cbor>=1.0.0 imgtool>=1.6.0 jinja2 click
|
|
|
|
They are used by TF-M's signing utility to prepare firmware images for
|
|
validation by the bootloader.
|
|
|
|
Part of the process of generating binaries for QEMU and merging signed
|
|
secure and non-secure binaries on certain platforms also requires the use of
|
|
the ``srec_cat`` utility.
|
|
|
|
This can be installed on Linux via:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ sudo apt-get install srecord
|
|
|
|
And on OS X via:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ brew install srecord
|
|
|
|
For Windows-based systems, please make sure you have a copy of the utility
|
|
available on your system path. See, for example:
|
|
`SRecord for Windows <http://srecord.sourceforge.net/windows.html>`_
|
|
|
|
Images Created by the TF-M Build
|
|
================================
|
|
|
|
The TF-M build system creates executable files:
|
|
|
|
* tfm_s - the secure firmware
|
|
* tfm_ns - a nonsecure app which is discarded in favor of the Zephyr app
|
|
* bl2 - mcuboot, if enabled
|
|
|
|
For each of these, it creates .bin, .hex, .elf, and .axf files.
|
|
|
|
The TF-M build system also creates signed variants of tfm_s and tfm_ns, and a file which combines them:
|
|
|
|
* tfm_s_signed
|
|
* tfm_ns_signed
|
|
* tfm_s_ns_signed
|
|
|
|
For each of these, only .bin files are created.
|
|
The Zephyr build system usually signs both tfm_s and the Zephyr app itself, see below.
|
|
|
|
The 'tfm' target contains properties for all these paths.
|
|
For example, the following will resolve to ``<path>/tfm_s.hex``:
|
|
|
|
.. code-block::
|
|
|
|
$<TARGET_PROPERTY:tfm,TFM_S_HEX_FILE>
|
|
|
|
See the top level CMakeLists.txt file in the tfm module for an overview of all the properties.
|
|
|
|
Signing Images
|
|
==============
|
|
|
|
TF-M uses a secure bootloader (BL2) and firmware images must be signed with a
|
|
private key. The firmware image is validated by the bootloader at startup using
|
|
the corresponding public key, which is stored inside the secure bootloader
|
|
firmware image.
|
|
|
|
By default, ``tfm/bl2/ext/mcuboot/root-rsa-3072.pem`` is used to sign secure
|
|
images, and ``tfm/bl2/ext/mcuboot/root-rsa-3072_1.pem`` is used to sign
|
|
non-secure images. Theses default .pem keys keys can be overridden using the
|
|
``CONFIG_TFM_KEY_FILE_S`` and ``CONFIG_TFM_KEY_FILE_NS`` values.
|
|
|
|
The ``wrapper.py`` script from TF-M signs the TF-M + Zephyr binary using the
|
|
.pem private key..
|
|
|
|
To satisfy `PSA Certified Level 1`_ requirements, **You MUST replace
|
|
the default .pem file with a new key pair!**
|
|
|
|
To generate a new public/private key pair, run the following commands:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ cd $ZEPHYR_BASE/../modules/tee/tfm/trusted-firmware-m/bl2/ext/mcuboot/scripts
|
|
$ chmod +x imgtool.py
|
|
$ ./imgtool.py keygen -k root-rsa-3072.pem -t rsa-3072
|
|
$ ./imgtool.py keygen -k root-rsa-3072_1.pem -t rsa-3072
|
|
|
|
You can then replace the .pem file in ``[TF-M_PATH]/bl2/ext/mcuboot/`` with
|
|
the newly generated .pem files, and rebuild the bootloader so that it uses the
|
|
public key extracted from this new key file when validating firmware images.
|
|
|
|
Alternatively, place the new .pem files in an alternate location, such as your
|
|
Zephyr application folder, and reference them in the ``prj.conf`` file via the
|
|
``CONFIG_TFM_KEY_FILE_S`` and ``CONFIG_TFM_KEY_FILE_NS`` config values.
|
|
|
|
.. warning::
|
|
|
|
Be sure to keep your private key file in a safe, reliable location! If you
|
|
lose this key file, you will be unable to sign any future firmware images,
|
|
and it will no longer be possible to update your devices in the field!
|
|
|
|
After the built-in signing code has run, it creates a tfm_merged.hex file that
|
|
contains all the binaries, bl2, tfm_s, and the zephyr app.
|
|
|
|
.. _PSA Certified Level 1:
|
|
https://www.psacertified.org/security-certification/psa-certified-level-1/
|