1.. zephyr:code-sample:: tfm_psa_crypto 2 :name: TF-M PSA crypto 3 4 Use the PSA Crypto API for cryptography and device certificate signing requests. 5 6Overview 7******** 8This TF-M integration example demonstrates how to use the PSA crypto API in 9Zephyr for cryptography and device certificate signing request. In addition, 10this example also demonstrates certain TF-M features that are covered as part 11of the RTOS vendor requirements for a `PSA Certified Level 1`_ product, such 12as secure storage for config data, initial attestation for device 13verification. 14 15Trusted Firmware (TF-M) Platform Security Architecture (PSA) APIs 16are used for the secure processing environment, with Zephyr running in the 17non-secure processing environment. 18 19It uses **IPC Mode** for communication, where an IPC mechanism is inserted to 20handle secure TF-M API calls and responses. 21 22The sample prints test info to the console either as a single-thread or 23multi-thread application. 24 25.. _PSA Certified Level 1: 26 https://www.psacertified.org/security-certification/psa-certified-level-1/ 27 28Key Files 29********* 30 31``psa_crypto.c`` 32================ 33 34Demonstrates hash, sign/verify workflow: 35 36- Generate/import a persistent key: secp256r1 (usage: ecdsa-with-SHA256) 37- Display the public key based on the private key data above 38- Calculate the SHA256 hash of a payload 39- Sign the hash with the persistent key 40- Verify the signature using the public key 41- Destroy the key 42 43Also demonstrates device certificate signing request (CSR) workflow: 44 45- Generate/import a persistent key: secp256r1 (usage: ecdsa-with-SHA256) 46- Set subject name in device CSR 47- Generate device CSR in PEM format 48- Encode device CSR as JSON 49 50Importing/generating the persistent key is based on config option 51``PSA_IMPORT_KEY``. When ``PSA_IMPORT_KEY`` is enabled, 52the key data can be static if ``PRIVATE_KEY_STATIC`` is set or key data 53is generated using ``psa_generate_random`` if ``PRIVATE_KEY_RANDOM`` 54is set. 55 56``psa_attestation.c`` 57===================== 58 59Demonstrates how to request an initial attestation token (IAT) from the TF-M 60secure processing environment (SPE). 61 62Building and Running 63******************** 64 65This project outputs startup status and info to the console. It can be built and 66executed on an ARM Cortex M33 target board or QEMU. 67 68This sample will only build on a Linux or macOS development system 69(not Windows), and has been tested on the following setups: 70 71- macOS Mojave using QEMU 4.2.0 with gcc-arm-none-eabi-7-2018-q2-update 72- macOS Mojave with gcc-arm-none-eabi-7-2018-q2-update 73- Ubuntu 18.04 using Zephyr SDK 0.11.2 74 75TF-M BL2 logs 76============= 77 78Add the following to ``prj.conf`` to see the logs from TF-M BL2: 79 80.. code-block:: cfg 81 82 CONFIG_TFM_BL2=y 83 CONFIG_TFM_CMAKE_BUILD_TYPE_DEBUG=y 84 85On MPS2+ AN521: 86=============== 87 881. Build Zephyr with a non-secure configuration 89 (``-DBOARD=mps2/an521/cpu0/ns``). 90 91 Using ``west`` 92 93 .. code-block:: bash 94 95 cd <ZEPHYR_ROOT> 96 west build -p -b mps2/an521/cpu0/ns samples/tfm_integration/psa_crypto 97 98 Using ``cmake`` and ``ninja`` 99 100 .. code-block:: bash 101 102 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 103 rm -rf build 104 mkdir build && cd build 105 cmake -GNinja -DBOARD=mps2/an521/cpu0/ns .. 106 ninja 107 108 Using ``cmake`` and ``make`` 109 110 .. code-block:: bash 111 112 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 113 rm -rf build 114 mkdir build && cd build 115 cmake -DBOARD=mps2/an521/cpu0/ns .. 116 make 117 1182. Copy application binary files (mcuboot.bin and tfm_sign.bin) to 119 ``<MPS2 device name>/SOFTWARE/``. 120 1213. Edit (e.g., with vim) the ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt`` 122 file, and update it as shown below: 123 124 .. code-block:: bash 125 126 TITLE: Versatile Express Images Configuration File 127 128 [IMAGES] 129 TOTALIMAGES: 2 ;Number of Images (Max: 32) 130 131 IMAGE0ADDRESS: 0x10000000 132 IMAGE0FILE: \SOFTWARE\mcuboot.bin ; BL2 bootloader 133 134 IMAGE1ADDRESS: 0x10080000 135 IMAGE1FILE: \SOFTWARE\tfm_sign.bin ; TF-M with application binary blob 136 1374. Save the file, exit the editor, and reset the MPS2+ board. 138 139On QEMU: 140======== 141 142Build Zephyr with a non-secure configuration (``-DBOARD=mps2/an521/cpu0/ns``) 143and run it in qemu via the ``run`` command. 144 145 Using ``west`` 146 147 .. code-block:: bash 148 149 cd <ZEPHYR_ROOT> 150 west build -p -b mps2/an521/cpu0/ns samples/tfm_integration/psa_crypto -t run 151 152 Using ``cmake`` and ``ninja`` 153 154 .. code-block:: bash 155 156 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 157 rm -rf build 158 mkdir build && cd build 159 cmake -GNinja -DBOARD=mps2/an521/cpu0/ns .. 160 ninja run 161 162 Using ``cmake`` and ``make`` 163 164 .. code-block:: bash 165 166 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 167 rm -rf build 168 mkdir build && cd build 169 cmake -DBOARD=mps2/an521/cpu0/ns .. 170 make run 171 172On LPCxpresso55S69: 173====================== 174 175Build Zephyr with a non-secure configuration: 176 177 .. code-block:: bash 178 179 $ west build -p -b lpcxpresso55s69_ns samples/tfm_integration/psa_crypto/ -- 180 181Make sure your board is set up with :ref:`lpclink2-jlink-onboard-debug-probe`, 182since this isn't the debug interface boards ship with from the factory; 183 184Next we need to manually flash the resulting image (``tfm_merged.bin``) with a 185J-Link as follows: 186 187 .. code-block:: console 188 189 JLinkExe -device lpc55s69 -if swd -speed 2000 -autoconnect 1 190 J-Link>r 191 J-Link>erase 192 J-Link>loadfile build/tfm_merged.bin 193 194Resetting the board and erasing it will unlock the board, this is useful in case 195it's in an unknown state and can't be flashed. 196 197We need to reset the board manually after flashing the image to run this code. 198 199On nRF5340 and nRF9160: 200======================= 201 202Build Zephyr with a non-secure configuration 203(``-DBOARD=nrf5340dk/nrf5340/cpuapp/ns`` or ``-DBOARD=nrf9160dk/nrf9160/ns``). 204 205 Example, for nRF9160, using ``cmake`` and ``ninja`` 206 207 .. code-block:: bash 208 209 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 210 rm -rf build 211 mkdir build && cd build 212 cmake -GNinja -DBOARD=nrf9160dk/nrf9160/ns .. 213 214If building with BL2 (MCUboot bootloader) enabled, manually flash 215the MCUboot bootloader image binary (``bl2.hex``). 216 217 Example, using ``nrfjprog`` on nRF9160: 218 219 .. code-block:: bash 220 221 nrfjprog -f NRF91 --program tfm/bin/bl2.hex --sectorerase 222 223Finally, flash the concatenated TF-M + Zephyr binary. 224 225 Example, for nRF9160, using ``cmake`` and ``ninja`` 226 227 .. code-block:: bash 228 229 ninja flash 230 231On BL5340: 232========== 233 234Build Zephyr with a non-secure configuration 235(``-DBOARD=bl5340_dvk/nrf5340/cpuapp/ns``). 236 237 Example using ``cmake`` and ``ninja`` 238 239 .. code-block:: bash 240 241 cd <ZEPHYR_ROOT>/samples/tfm_integration/psa_crypto/ 242 rm -rf build 243 mkdir build && cd build 244 cmake -GNinja -DBOARD=bl5340_dvk/nrf5340/cpuapp/ns .. 245 246Flash the concatenated TF-M + Zephyr binary. 247 248 Example using ``west`` 249 250 .. code-block:: bash 251 252 west flash --hex-file tfm_merged.hex 253 254Sample Output 255============= 256 257 .. code-block:: console 258 259 [Sec Thread] Secure image initializing! 260 Booting TFM v1.4.1 261 [Crypto] Dummy Entropy NV Seed is not suitable for production! 262 *** Booting Zephyr OS build v2.7.99-1102-gf503ba9f1ab3 *** 263 [00:00:00.014,000] <inf> app: app_cfg: Creating new config file with UID 0x1055CFDA7A 264 [00:00:01.215,000] <inf> app: att: System IAT size is: 545 bytes. 265 [00:00:01.215,000] <inf> app: att: Requesting IAT with 64 byte challenge. 266 [00:00:01.836,000] <inf> app: att: IAT data received: 545 bytes. 267 268 0 1 2 3 4 5 6 7 8 9 A B C D E F 269 00000000 D2 84 43 A1 01 26 A0 59 01 D5 AA 3A 00 01 24 FF ..C..&.Y...:..$. 270 00000010 58 40 00 11 22 33 44 55 66 77 88 99 AA BB CC DD X@.."3DUfw...... 271 00000020 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw...... 272 00000030 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw...... 273 00000040 EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD ...."3DUfw...... 274 00000050 EE FF 3A 00 01 24 FB 58 20 A0 A1 A2 A3 A4 A5 A6 ..:..$.X ....... 275 00000060 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 ................ 276 00000070 B7 B8 B9 BA BB BC BD BE BF 3A 00 01 25 00 58 21 .........:..%.X! 277 00000080 01 FA 58 75 5F 65 86 27 CE 54 60 F2 9B 75 29 67 ..Xu_e.'.T`..u)g 278 00000090 13 24 8C AE 7A D9 E2 98 4B 90 28 0E FC BC B5 02 .$..z...K.(..... 279 000000A0 48 3A 00 01 24 FA 58 20 AA AA AA AA AA AA AA AA H:..$.X ........ 280 000000B0 BB BB BB BB BB BB BB BB CC CC CC CC CC CC CC CC ................ 281 000000C0 DD DD DD DD DD DD DD DD 3A 00 01 24 F8 20 3A 00 ........:..$. :. 282 000000D0 01 24 F9 19 30 00 3A 00 01 24 FD 82 A5 01 63 53 .$..0.:..$....cS 283 000000E0 50 45 04 65 30 2E 30 2E 30 05 58 20 BF E6 D8 6F PE.e0.0.0.X ...o 284 000000F0 88 26 F4 FF 97 FB 96 C4 E6 FB C4 99 3E 46 19 FC .&..........>F.. 285 00000100 56 5D A2 6A DF 34 C3 29 48 9A DC 38 06 66 53 48 V].j.4.)H..8.fSH 286 00000110 41 32 35 36 02 58 20 6D E1 0F 82 E0 CF FC 84 5A A256.X m.......Z 287 00000120 24 25 2B EB 70 D7 2C 6B FC 92 CD BE 5B 65 9E C7 $%+.p.,k....[e.. 288 00000130 34 1E 1C D2 80 5D A3 A5 01 64 4E 53 50 45 04 65 4....]...dNSPE.e 289 00000140 30 2E 30 2E 30 05 58 20 B3 60 CA F5 C9 8C 6B 94 0.0.0.X .`....k. 290 00000150 2A 48 82 FA 9D 48 23 EF B1 66 A9 EF 6A 6E 4A A3 *H...H#..f..jnJ. 291 00000160 7C 19 19 ED 1F CC C0 49 06 66 53 48 41 32 35 36 |......I.fSHA256 292 00000170 02 58 20 01 4C F2 64 0D 49 F8 23 69 57 FE F3 73 .X .L.d.I.#iW..s 293 00000180 97 7E 73 C2 2C 4F D2 95 25 D8 BE 29 32 14 23 5D .~s.,O..%..)2.#] 294 00000190 A9 22 AD 3A 00 01 25 01 77 77 77 77 2E 74 72 75 .".:..%.wwww.tru 295 000001A0 73 74 65 64 66 69 72 6D 77 61 72 65 2E 6F 72 67 stedfirmware.org 296 000001B0 3A 00 01 24 F7 71 50 53 41 5F 49 4F 54 5F 50 52 :..$.qPSA_IOT_PR 297 000001C0 4F 46 49 4C 45 5F 31 3A 00 01 24 FC 72 30 36 30 OFILE_1:..$.r060 298 000001D0 34 35 36 35 32 37 32 38 32 39 31 30 30 31 30 58 456527282910010X 299 000001E0 40 59 23 3E 80 5E E0 9F FA E3 F4 14 62 D3 15 A5 @Y#>.^......b... 300 000001F0 B0 95 B5 E5 CB 79 92 F8 F1 A0 FE 14 0C 6C 84 2A .....y.......l.* 301 00000200 41 97 BC 6F C6 7D 9C A5 21 BB 4C 2C D1 2C F3 66 A..o.}..!.L,.,.f 302 00000210 4E D4 85 D2 57 15 72 11 E8 9E 06 4F C4 46 D0 58 N...W.r....O.F.X 303 00000220 26 & 304 305 [00:00:01.905,000] <inf> app: Persisting SECP256R1 key as #1 306 [00:00:02.458,000] <inf> app: Retrieving public key for key #1 307 308 0 1 2 3 4 5 6 7 8 9 A B C D E F 309 00000000 04 07 93 39 CD 42 53 7B 18 8C 8A F1 05 7F 49 D1 ...9.BS{......I. 310 00000010 6B 30 D5 39 0D 1A 6E 95 BA 0C CD FE DB 59 A3 03 k0.9..n......Y.. 311 00000020 02 61 B4 CF 13 CC 70 15 67 30 83 FE A0 D4 2A 19 .a....p.g0....*. 312 00000030 72 82 3E 3F 90 00 91 C6 5E 43 DC E9 B4 C4 0E F3 r.>?....^C...... 313 00000040 79 y 314 315 [00:00:03.020,000] <inf> app: Calculating SHA-256 hash of value 316 317 0 1 2 3 4 5 6 7 8 9 A B C D E F 318 00000000 50 6C 65 61 73 65 20 68 61 73 68 20 61 6E 64 20 Please hash and 319 00000010 73 69 67 6E 20 74 68 69 73 20 6D 65 73 73 61 67 sign this messag 320 00000020 65 2E e. 321 322 323 0 1 2 3 4 5 6 7 8 9 A B C D E F 324 00000000 9D 08 E3 E6 DB 1C 12 39 C0 9B 9A 83 84 83 72 7A .......9......rz 325 00000010 EA 96 9E 1D 13 72 1E 4D 35 75 CC D4 C8 01 41 9C .....r.M5u....A. 326 327 [00:00:03.032,000] <inf> app: Signing SHA-256 hash 328 329 0 1 2 3 4 5 6 7 8 9 A B C D E F 330 00000000 EE F1 FE A6 A8 41 5F CC A6 3A 73 A7 C1 33 B4 78 .....A_..:s..3.x 331 00000010 BF B7 38 78 2A 91 C8 82 32 F8 73 85 56 08 D2 A0 ..8x*...2.s.V... 332 00000020 A6 22 2C 64 7A C7 E4 0A FB 99 D1 8B 67 37 F7 13 .",dz.......g7.. 333 00000030 E6 6C 54 7B 29 1D 3B A2 D8 E3 C4 79 17 BA 34 A8 .lT{).;....y..4. 334 335 [00:00:03.658,000] <inf> app: Verifying signature for SHA-256 hash 336 [00:00:06.339,000] <inf> app: Signature verified. 337 [00:00:06.349,000] <inf> app: Destroyed persistent key #1 338 [00:00:06.354,000] <inf> app: Generating 256 bytes of random data. 339 340 0 1 2 3 4 5 6 7 8 9 A B C D E F 341 00000000 24 5C B3 EB 88 D2 80 76 23 B3 07 CA 16 92 8F 3D $\.....v#......= 342 00000010 27 AC C2 42 59 15 5E 3C EB 11 20 3C 14 A6 EB 60 '..BY.^<.. <...` 343 00000020 C0 92 12 97 4D D7 62 BC A0 0A 34 A7 CE A8 78 18 ....M.b...4...x. 344 00000030 1B 30 6E 3C DA 80 F2 55 F7 FA 10 8B F5 78 CE 92 .0n<...U.....x.. 345 00000040 92 FF F2 A3 22 4D 2D F6 62 39 6D A5 DD E1 E1 C4 ...."M-.b9m..... 346 00000050 67 67 30 19 98 D7 E4 AD A2 6A 27 1C A4 C2 A2 C6 gg0......j'..... 347 00000060 8A B5 98 26 D3 1A 84 75 55 52 4F E1 6D 4B 84 99 ...&...uURO.mK.. 348 00000070 0F C2 5E 88 D5 8B E6 AA 2F 61 DC 63 79 5B 69 3F ..^...../a.cy[i? 349 00000080 19 79 5A 78 49 29 22 92 9D F5 F3 FD 16 60 E2 72 .yZxI)"......`.r 350 00000090 EA F8 8E 32 7D 81 A0 21 0C 82 4A A8 4C EE 9C 0E ...2}..!..J.L... 351 000000A0 D7 BF 50 60 6C 65 8A 7C A6 CD C5 98 8B 15 EA F0 ..P`le.|........ 352 000000B0 26 D0 15 F4 EB DE A0 FD 88 2F 72 8B ED 07 44 5C &......../r...D\ 353 000000C0 91 46 17 8C 26 46 F2 7C BF 6B 45 63 B6 71 E7 51 .F..&F.|.kEc.q.Q 354 000000D0 E4 34 A2 5A 01 F4 6E FF A2 67 82 7B F3 36 34 54 .4.Z..n..g.{.64T 355 000000E0 80 ED 7E 9D 0A 21 09 9C 9C 55 A9 14 AF A2 66 65 ..~..!...U....fe 356 000000F0 DE 8D BE C2 8B 31 B8 ED 06 AE A9 0B 7E 62 75 87 .....1......~bu. 357 358 [00:00:06.385,000] <inf> app: Initialising PSA crypto 359 [00:00:06.386,000] <inf> app: PSA crypto init completed 360 [00:00:06.387,000] <inf> app: Persisting SECP256R1 key as #1 361 [00:00:06.938,000] <inf> app: Retrieving public key for key #1 362 363 0 1 2 3 4 5 6 7 8 9 A B C D E F 364 00000000 04 34 B7 2F D5 EC 41 71 B1 04 D9 BE 1C E7 DD F7 .4./..Aq........ 365 00000010 C4 C0 B1 E9 64 CB 45 1F E3 4A 95 52 A8 75 B2 8C ....d.E..J.R.u.. 366 00000020 4D F1 CB 4F C2 26 2C 90 C9 05 B2 E4 4C 2A E9 9D M..O.&,.....L*.. 367 00000030 11 DF 35 1B 0E 86 D5 9C A1 1F FC FA ED 21 9A B5 ..5..........!.. 368 00000040 28 ( 369 370 [00:00:07.495,000] <inf> app: Adding subject name to CSR 371 [00:00:07.496,000] <inf> app: Adding subject name to CSR completed 372 [00:00:07.497,000] <inf> app: Adding EC key to PK container 373 [00:00:07.499,000] <inf> app: Adding EC key to PK container completed 374 [00:00:07.500,000] <inf> app: Create device Certificate Signing Request 375 [00:00:08.692,000] <inf> app: Create device Certificate Signing Request completed 376 [00:00:08.693,000] <inf> app: Certificate Signing Request: 377 378 -----BEGIN CERTIFICATE REQUEST----- 379 MIHrMIGQAgEAMC4xDzANBgNVBAoMBkxpbmFybzEbMBkGA1UEAwwSRGV2aWNlIENl 380 cnRpZmljYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENLcv1exBcbEE2b4c 381 5933xMCx6WTLRR/jSpVSqHWyjE3xy0/CJiyQyQWy5Ewq6Z0R3zUbDobVnKEf/Prt 382 IZq1KKAAMAwGCCqGSM49BAMCBQADSAAwRQIgaAlTPmrIaRO7myM2Qr+LNk9sagdO 383 jPGUqbz4oUWhUsICIQCuHADW6F2l4czv78BO5Nf+FHZEpjbI1+fA2aLzglOaiA== 384 -----END CERTIFICATE REQUEST----- 385 386 [00:00:08.696,000] <inf> app: Encoding CSR as json 387 [00:00:08.699,000] <inf> app: Encoding CSR as json completed 388 [00:00:08.700,000] <inf> app: Certificate Signing Request in JSON: 389 390 {"CSR":"-----BEGIN CERTIFICATE REQUEST-----\nMIHrMIGQAgEAMC4xDzANBgNVBAoMBkxpbmFybzEbMBkGA1UEAwwSRGV2aWNlIENl\ncnRpZmljYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENLcv1exBcbEE2b4c\n5933xMCx6WTLRR/jSpVSqHWyjE3xy0/CJiyQyQWy5Ewq6Z0R3zUbDobVnKEf/Prt\nIZq1KKAAMAwGCCqGSM49BAMCBQADSAAwRQIgaAlTPmrIaRO7myM2Qr+LNk9sagdO\njPGUqbz4oUWhUsICIQCuHADW6F2l4czv78BO5Nf+FHZEpjbI1+fA2aLzglOaiA==\n-----END CERTIFICATE REQUEST-----\n"} 391