391 lines
16 KiB
ReStructuredText
391 lines
16 KiB
ReStructuredText
.. zephyr:code-sample:: tfm_psa_crypto
|
|
:name: TF-M PSA crypto
|
|
|
|
Use the PSA Crypto API for cryptography and device certificate signing requests.
|
|
|
|
Overview
|
|
********
|
|
This TF-M integration example demonstrates how to use the PSA crypto API in
|
|
Zephyr for cryptography and device certificate signing request. In addition,
|
|
this example also demonstrates certain TF-M features that are covered as part
|
|
of the RTOS vendor requirements for a `PSA Certified Level 1`_ product, such
|
|
as secure storage for config data, initial attestation for device
|
|
verification.
|
|
|
|
Trusted Firmware (TF-M) Platform Security Architecture (PSA) APIs
|
|
are used for the secure processing environment, with Zephyr running in the
|
|
non-secure processing environment.
|
|
|
|
It uses **IPC Mode** for communication, where an IPC mechanism is inserted to
|
|
handle secure TF-M API calls and responses.
|
|
|
|
The sample prints test info to the console either as a single-thread or
|
|
multi-thread application.
|
|
|
|
.. _PSA Certified Level 1:
|
|
https://www.psacertified.org/security-certification/psa-certified-level-1/
|
|
|
|
Key Files
|
|
*********
|
|
|
|
``psa_crypto.c``
|
|
================
|
|
|
|
Demonstrates hash, sign/verify workflow:
|
|
|
|
- Generate/import a persistent key: secp256r1 (usage: ecdsa-with-SHA256)
|
|
- Display the public key based on the private key data above
|
|
- Calculate the SHA256 hash of a payload
|
|
- Sign the hash with the persistent key
|
|
- Verify the signature using the public key
|
|
- Destroy the key
|
|
|
|
Also demonstrates device certificate signing request (CSR) workflow:
|
|
|
|
- Generate/import a persistent key: secp256r1 (usage: ecdsa-with-SHA256)
|
|
- Set subject name in device CSR
|
|
- Generate device CSR in PEM format
|
|
- Encode device CSR as JSON
|
|
|
|
Importing/generating the persistent key is based on config option
|
|
``PSA_IMPORT_KEY``. When ``PSA_IMPORT_KEY`` is enabled,
|
|
the key data can be static if ``PRIVATE_KEY_STATIC`` is set or key data
|
|
is generated using ``psa_generate_random`` if ``PRIVATE_KEY_RANDOM``
|
|
is set.
|
|
|
|
``psa_attestation.c``
|
|
=====================
|
|
|
|
Demonstrates how to request an initial attestation token (IAT) from the TF-M
|
|
secure processing environment (SPE).
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
This project outputs startup status and info to the console. It can be built and
|
|
executed on an ARM Cortex M33 target board or QEMU.
|
|
|
|
This sample will only build on a Linux or macOS development system
|
|
(not Windows), and has been tested on the following setups:
|
|
|
|
- macOS Mojave using QEMU 4.2.0 with gcc-arm-none-eabi-7-2018-q2-update
|
|
- macOS Mojave with gcc-arm-none-eabi-7-2018-q2-update
|
|
- Ubuntu 18.04 using Zephyr SDK 0.11.2
|
|
|
|
TF-M BL2 logs
|
|
=============
|
|
|
|
Add the following to ``prj.conf`` to see the logs from TF-M BL2:
|
|
|
|
.. code-block:: cfg
|
|
|
|
CONFIG_TFM_BL2=y
|
|
CONFIG_TFM_CMAKE_BUILD_TYPE_DEBUG=y
|
|
|
|
On MPS2+ AN521:
|
|
===============
|
|
|
|
1. Build Zephyr with a non-secure configuration
|
|
(``-DBOARD=mps2/an521/cpu0/ns``).
|
|
|
|
Using ``west``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>
|
|
west build -p -b mps2/an521/cpu0/ns samples/tfm_integration/psa_crypto
|
|
|
|
Using ``cmake`` and ``ninja``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -GNinja -DBOARD=mps2/an521/cpu0/ns ..
|
|
ninja
|
|
|
|
Using ``cmake`` and ``make``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -DBOARD=mps2/an521/cpu0/ns ..
|
|
make
|
|
|
|
2. Copy application binary files (mcuboot.bin and tfm_sign.bin) to
|
|
``<MPS2 device name>/SOFTWARE/``.
|
|
|
|
3. Edit (e.g., with vim) the ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``
|
|
file, and update it as shown below:
|
|
|
|
.. code-block:: bash
|
|
|
|
TITLE: Versatile Express Images Configuration File
|
|
|
|
[IMAGES]
|
|
TOTALIMAGES: 2 ;Number of Images (Max: 32)
|
|
|
|
IMAGE0ADDRESS: 0x10000000
|
|
IMAGE0FILE: \SOFTWARE\mcuboot.bin ; BL2 bootloader
|
|
|
|
IMAGE1ADDRESS: 0x10080000
|
|
IMAGE1FILE: \SOFTWARE\tfm_sign.bin ; TF-M with application binary blob
|
|
|
|
4. Save the file, exit the editor, and reset the MPS2+ board.
|
|
|
|
On QEMU:
|
|
========
|
|
|
|
Build Zephyr with a non-secure configuration (``-DBOARD=mps2/an521/cpu0/ns``)
|
|
and run it in qemu via the ``run`` command.
|
|
|
|
Using ``west``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>
|
|
west build -p -b mps2/an521/cpu0/ns samples/tfm_integration/psa_crypto -t run
|
|
|
|
Using ``cmake`` and ``ninja``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -GNinja -DBOARD=mps2/an521/cpu0/ns ..
|
|
ninja run
|
|
|
|
Using ``cmake`` and ``make``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -DBOARD=mps2/an521/cpu0/ns ..
|
|
make run
|
|
|
|
On LPCxpresso55S69:
|
|
======================
|
|
|
|
Build Zephyr with a non-secure configuration:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ west build -p -b lpcxpresso55s69_ns samples/tfm_integration/psa_crypto/ --
|
|
|
|
Make sure your board is set up with :ref:`lpclink2-jlink-onboard-debug-probe`,
|
|
since this isn't the debug interface boards ship with from the factory;
|
|
|
|
Next we need to manually flash the resulting image (``tfm_merged.bin``) with a
|
|
J-Link as follows:
|
|
|
|
.. code-block:: console
|
|
|
|
JLinkExe -device lpc55s69 -if swd -speed 2000 -autoconnect 1
|
|
J-Link>r
|
|
J-Link>erase
|
|
J-Link>loadfile build/tfm_merged.bin
|
|
|
|
Resetting the board and erasing it will unlock the board, this is useful in case
|
|
it's in an unknown state and can't be flashed.
|
|
|
|
We need to reset the board manually after flashing the image to run this code.
|
|
|
|
On nRF5340 and nRF9160:
|
|
=======================
|
|
|
|
Build Zephyr with a non-secure configuration
|
|
(``-DBOARD=nrf5340dk/nrf5340/cpuapp/ns`` or ``-DBOARD=nrf9160dk/nrf9160/ns``).
|
|
|
|
Example, for nRF9160, using ``cmake`` and ``ninja``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -GNinja -DBOARD=nrf9160dk/nrf9160/ns ..
|
|
|
|
If building with BL2 (MCUboot bootloader) enabled, manually flash
|
|
the MCUboot bootloader image binary (``bl2.hex``).
|
|
|
|
Example, using ``nrfjprog`` on nRF9160:
|
|
|
|
.. code-block:: bash
|
|
|
|
nrfjprog -f NRF91 --program tfm/bin/bl2.hex --sectorerase
|
|
|
|
Finally, flash the concatenated TF-M + Zephyr binary.
|
|
|
|
Example, for nRF9160, using ``cmake`` and ``ninja``
|
|
|
|
.. code-block:: bash
|
|
|
|
ninja flash
|
|
|
|
On BL5340:
|
|
==========
|
|
|
|
Build Zephyr with a non-secure configuration
|
|
(``-DBOARD=bl5340_dvk/nrf5340/cpuapp/ns``).
|
|
|
|
Example using ``cmake`` and ``ninja``
|
|
|
|
.. code-block:: bash
|
|
|
|
cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/
|
|
rm -rf build
|
|
mkdir build && cd build
|
|
cmake -GNinja -DBOARD=bl5340_dvk/nrf5340/cpuapp/ns ..
|
|
|
|
Flash the concatenated TF-M + Zephyr binary.
|
|
|
|
Example using ``west``
|
|
|
|
.. code-block:: bash
|
|
|
|
west flash --hex-file tfm_merged.hex
|
|
|
|
Sample Output
|
|
=============
|
|
|
|
.. code-block:: console
|
|
|
|
[Sec Thread] Secure image initializing!
|
|
Booting TFM v1.4.1
|
|
[Crypto] Dummy Entropy NV Seed is not suitable for production!
|
|
*** Booting Zephyr OS build v2.7.99-1102-gf503ba9f1ab3 ***
|
|
[00:00:00.014,000] <inf> app: app_cfg: Creating new config file with UID 0x1055CFDA7A
|
|
[00:00:01.215,000] <inf> app: att: System IAT size is: 545 bytes.
|
|
[00:00:01.215,000] <inf> app: att: Requesting IAT with 64 byte challenge.
|
|
[00:00:01.836,000] <inf> app: att: IAT data received: 545 bytes.
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 D2 84 43 A1 01 26 A0 59 01 D5 AA 3A 00 01 24 FF ..C..&.Y...:..$.
|
|
00000010 58 40 00 11 22 33 44 55 66 77 88 99 AA BB CC DD X@.."3DUfw......
|
|
00000020 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw......
|
|
00000030 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw......
|
|
00000040 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw......
|
|
00000050 EE FF 3A 00 01 24 FB 58 20 A0 A1 A2 A3 A4 A5 A6 ..:..$.X .......
|
|
00000060 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 ................
|
|
00000070 B7 B8 B9 BA BB BC BD BE BF 3A 00 01 25 00 58 21 .........:..%.X!
|
|
00000080 01 FA 58 75 5F 65 86 27 CE 54 60 F2 9B 75 29 67 ..Xu_e.'.T`..u)g
|
|
00000090 13 24 8C AE 7A D9 E2 98 4B 90 28 0E FC BC B5 02 .$..z...K.(.....
|
|
000000A0 48 3A 00 01 24 FA 58 20 AA AA AA AA AA AA AA AA H:..$.X ........
|
|
000000B0 BB BB BB BB BB BB BB BB CC CC CC CC CC CC CC CC ................
|
|
000000C0 DD DD DD DD DD DD DD DD 3A 00 01 24 F8 20 3A 00 ........:..$. :.
|
|
000000D0 01 24 F9 19 30 00 3A 00 01 24 FD 82 A5 01 63 53 .$..0.:..$....cS
|
|
000000E0 50 45 04 65 30 2E 30 2E 30 05 58 20 BF E6 D8 6F PE.e0.0.0.X ...o
|
|
000000F0 88 26 F4 FF 97 FB 96 C4 E6 FB C4 99 3E 46 19 FC .&..........>F..
|
|
00000100 56 5D A2 6A DF 34 C3 29 48 9A DC 38 06 66 53 48 V].j.4.)H..8.fSH
|
|
00000110 41 32 35 36 02 58 20 6D E1 0F 82 E0 CF FC 84 5A A256.X m.......Z
|
|
00000120 24 25 2B EB 70 D7 2C 6B FC 92 CD BE 5B 65 9E C7 $%+.p.,k....[e..
|
|
00000130 34 1E 1C D2 80 5D A3 A5 01 64 4E 53 50 45 04 65 4....]...dNSPE.e
|
|
00000140 30 2E 30 2E 30 05 58 20 B3 60 CA F5 C9 8C 6B 94 0.0.0.X .`....k.
|
|
00000150 2A 48 82 FA 9D 48 23 EF B1 66 A9 EF 6A 6E 4A A3 *H...H#..f..jnJ.
|
|
00000160 7C 19 19 ED 1F CC C0 49 06 66 53 48 41 32 35 36 |......I.fSHA256
|
|
00000170 02 58 20 01 4C F2 64 0D 49 F8 23 69 57 FE F3 73 .X .L.d.I.#iW..s
|
|
00000180 97 7E 73 C2 2C 4F D2 95 25 D8 BE 29 32 14 23 5D .~s.,O..%..)2.#]
|
|
00000190 A9 22 AD 3A 00 01 25 01 77 77 77 77 2E 74 72 75 .".:..%.wwww.tru
|
|
000001A0 73 74 65 64 66 69 72 6D 77 61 72 65 2E 6F 72 67 stedfirmware.org
|
|
000001B0 3A 00 01 24 F7 71 50 53 41 5F 49 4F 54 5F 50 52 :..$.qPSA_IOT_PR
|
|
000001C0 4F 46 49 4C 45 5F 31 3A 00 01 24 FC 72 30 36 30 OFILE_1:..$.r060
|
|
000001D0 34 35 36 35 32 37 32 38 32 39 31 30 30 31 30 58 456527282910010X
|
|
000001E0 40 59 23 3E 80 5E E0 9F FA E3 F4 14 62 D3 15 A5 @Y#>.^......b...
|
|
000001F0 B0 95 B5 E5 CB 79 92 F8 F1 A0 FE 14 0C 6C 84 2A .....y.......l.*
|
|
00000200 41 97 BC 6F C6 7D 9C A5 21 BB 4C 2C D1 2C F3 66 A..o.}..!.L,.,.f
|
|
00000210 4E D4 85 D2 57 15 72 11 E8 9E 06 4F C4 46 D0 58 N...W.r....O.F.X
|
|
00000220 26 &
|
|
|
|
[00:00:01.905,000] <inf> app: Persisting SECP256R1 key as #1
|
|
[00:00:02.458,000] <inf> app: Retrieving public key for key #1
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 04 07 93 39 CD 42 53 7B 18 8C 8A F1 05 7F 49 D1 ...9.BS{......I.
|
|
00000010 6B 30 D5 39 0D 1A 6E 95 BA 0C CD FE DB 59 A3 03 k0.9..n......Y..
|
|
00000020 02 61 B4 CF 13 CC 70 15 67 30 83 FE A0 D4 2A 19 .a....p.g0....*.
|
|
00000030 72 82 3E 3F 90 00 91 C6 5E 43 DC E9 B4 C4 0E F3 r.>?....^C......
|
|
00000040 79 y
|
|
|
|
[00:00:03.020,000] <inf> app: Calculating SHA-256 hash of value
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 50 6C 65 61 73 65 20 68 61 73 68 20 61 6E 64 20 Please hash and
|
|
00000010 73 69 67 6E 20 74 68 69 73 20 6D 65 73 73 61 67 sign this messag
|
|
00000020 65 2E e.
|
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 9D 08 E3 E6 DB 1C 12 39 C0 9B 9A 83 84 83 72 7A .......9......rz
|
|
00000010 EA 96 9E 1D 13 72 1E 4D 35 75 CC D4 C8 01 41 9C .....r.M5u....A.
|
|
|
|
[00:00:03.032,000] <inf> app: Signing SHA-256 hash
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 EE F1 FE A6 A8 41 5F CC A6 3A 73 A7 C1 33 B4 78 .....A_..:s..3.x
|
|
00000010 BF B7 38 78 2A 91 C8 82 32 F8 73 85 56 08 D2 A0 ..8x*...2.s.V...
|
|
00000020 A6 22 2C 64 7A C7 E4 0A FB 99 D1 8B 67 37 F7 13 .",dz.......g7..
|
|
00000030 E6 6C 54 7B 29 1D 3B A2 D8 E3 C4 79 17 BA 34 A8 .lT{).;....y..4.
|
|
|
|
[00:00:03.658,000] <inf> app: Verifying signature for SHA-256 hash
|
|
[00:00:06.339,000] <inf> app: Signature verified.
|
|
[00:00:06.349,000] <inf> app: Destroyed persistent key #1
|
|
[00:00:06.354,000] <inf> app: Generating 256 bytes of random data.
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 24 5C B3 EB 88 D2 80 76 23 B3 07 CA 16 92 8F 3D $\.....v#......=
|
|
00000010 27 AC C2 42 59 15 5E 3C EB 11 20 3C 14 A6 EB 60 '..BY.^<.. <...`
|
|
00000020 C0 92 12 97 4D D7 62 BC A0 0A 34 A7 CE A8 78 18 ....M.b...4...x.
|
|
00000030 1B 30 6E 3C DA 80 F2 55 F7 FA 10 8B F5 78 CE 92 .0n<...U.....x..
|
|
00000040 92 FF F2 A3 22 4D 2D F6 62 39 6D A5 DD E1 E1 C4 ...."M-.b9m.....
|
|
00000050 67 67 30 19 98 D7 E4 AD A2 6A 27 1C A4 C2 A2 C6 gg0......j'.....
|
|
00000060 8A B5 98 26 D3 1A 84 75 55 52 4F E1 6D 4B 84 99 ...&...uURO.mK..
|
|
00000070 0F C2 5E 88 D5 8B E6 AA 2F 61 DC 63 79 5B 69 3F ..^...../a.cy[i?
|
|
00000080 19 79 5A 78 49 29 22 92 9D F5 F3 FD 16 60 E2 72 .yZxI)"......`.r
|
|
00000090 EA F8 8E 32 7D 81 A0 21 0C 82 4A A8 4C EE 9C 0E ...2}..!..J.L...
|
|
000000A0 D7 BF 50 60 6C 65 8A 7C A6 CD C5 98 8B 15 EA F0 ..P`le.|........
|
|
000000B0 26 D0 15 F4 EB DE A0 FD 88 2F 72 8B ED 07 44 5C &......../r...D\
|
|
000000C0 91 46 17 8C 26 46 F2 7C BF 6B 45 63 B6 71 E7 51 .F..&F.|.kEc.q.Q
|
|
000000D0 E4 34 A2 5A 01 F4 6E FF A2 67 82 7B F3 36 34 54 .4.Z..n..g.{.64T
|
|
000000E0 80 ED 7E 9D 0A 21 09 9C 9C 55 A9 14 AF A2 66 65 ..~..!...U....fe
|
|
000000F0 DE 8D BE C2 8B 31 B8 ED 06 AE A9 0B 7E 62 75 87 .....1......~bu.
|
|
|
|
[00:00:06.385,000] <inf> app: Initialising PSA crypto
|
|
[00:00:06.386,000] <inf> app: PSA crypto init completed
|
|
[00:00:06.387,000] <inf> app: Persisting SECP256R1 key as #1
|
|
[00:00:06.938,000] <inf> app: Retrieving public key for key #1
|
|
|
|
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
00000000 04 34 B7 2F D5 EC 41 71 B1 04 D9 BE 1C E7 DD F7 .4./..Aq........
|
|
00000010 C4 C0 B1 E9 64 CB 45 1F E3 4A 95 52 A8 75 B2 8C ....d.E..J.R.u..
|
|
00000020 4D F1 CB 4F C2 26 2C 90 C9 05 B2 E4 4C 2A E9 9D M..O.&,.....L*..
|
|
00000030 11 DF 35 1B 0E 86 D5 9C A1 1F FC FA ED 21 9A B5 ..5..........!..
|
|
00000040 28 (
|
|
|
|
[00:00:07.495,000] <inf> app: Adding subject name to CSR
|
|
[00:00:07.496,000] <inf> app: Adding subject name to CSR completed
|
|
[00:00:07.497,000] <inf> app: Adding EC key to PK container
|
|
[00:00:07.499,000] <inf> app: Adding EC key to PK container completed
|
|
[00:00:07.500,000] <inf> app: Create device Certificate Signing Request
|
|
[00:00:08.692,000] <inf> app: Create device Certificate Signing Request completed
|
|
[00:00:08.693,000] <inf> app: Certificate Signing Request:
|
|
|
|
-----BEGIN CERTIFICATE REQUEST-----
|
|
MIHrMIGQAgEAMC4xDzANBgNVBAoMBkxpbmFybzEbMBkGA1UEAwwSRGV2aWNlIENl
|
|
cnRpZmljYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENLcv1exBcbEE2b4c
|
|
5933xMCx6WTLRR/jSpVSqHWyjE3xy0/CJiyQyQWy5Ewq6Z0R3zUbDobVnKEf/Prt
|
|
IZq1KKAAMAwGCCqGSM49BAMCBQADSAAwRQIgaAlTPmrIaRO7myM2Qr+LNk9sagdO
|
|
jPGUqbz4oUWhUsICIQCuHADW6F2l4czv78BO5Nf+FHZEpjbI1+fA2aLzglOaiA==
|
|
-----END CERTIFICATE REQUEST-----
|
|
|
|
[00:00:08.696,000] <inf> app: Encoding CSR as json
|
|
[00:00:08.699,000] <inf> app: Encoding CSR as json completed
|
|
[00:00:08.700,000] <inf> app: Certificate Signing Request in JSON:
|
|
|
|
{"CSR":"-----BEGIN CERTIFICATE REQUEST-----\nMIHrMIGQAgEAMC4xDzANBgNVBAoMBkxpbmFybzEbMBkGA1UEAwwSRGV2aWNlIENl\ncnRpZmljYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENLcv1exBcbEE2b4c\n5933xMCx6WTLRR/jSpVSqHWyjE3xy0/CJiyQyQWy5Ewq6Z0R3zUbDobVnKEf/Prt\nIZq1KKAAMAwGCCqGSM49BAMCBQADSAAwRQIgaAlTPmrIaRO7myM2Qr+LNk9sagdO\njPGUqbz4oUWhUsICIQCuHADW6F2l4czv78BO5Nf+FHZEpjbI1+fA2aLzglOaiA==\n-----END CERTIFICATE REQUEST-----\n"}
|