1a125c556SJavier Almansa SobrinoInteraction between Measured Boot and an fTPM (PoC) 2a125c556SJavier Almansa Sobrino=================================================== 3a125c556SJavier Almansa Sobrino 4a125c556SJavier Almansa SobrinoMeasured Boot is the process of cryptographically measuring the code and 5a125c556SJavier Almansa Sobrinocritical data used at boot time, for example using a TPM, so that the 6a125c556SJavier Almansa Sobrinosecurity state can be attested later. 7a125c556SJavier Almansa Sobrino 8a125c556SJavier Almansa SobrinoThe current implementation of the driver included in Trusted Firmware-A 9cca91b7aSManish V Badarkhe(TF-A) stores the measurements into a `TCG event log`_ in secure 10a125c556SJavier Almansa Sobrinomemory. No other means of recording measurements (such as a discrete TPM) is 11a125c556SJavier Almansa Sobrinosupported right now. 12a125c556SJavier Almansa Sobrino 13a125c556SJavier Almansa SobrinoThe driver also provides mechanisms to pass the Event Log to normal world if 14a125c556SJavier Almansa Sobrinoneeded. 15a125c556SJavier Almansa Sobrino 16a125c556SJavier Almansa SobrinoThis manual provides instructions to build a proof of concept (PoC) with the 17a125c556SJavier Almansa Sobrinosole intention of showing how Measured Boot can be used in conjunction with 18a125c556SJavier Almansa Sobrinoa firmware TPM (fTPM) service implemented on top of OP-TEE. 19a125c556SJavier Almansa Sobrino 20a125c556SJavier Almansa Sobrino.. note:: 21a125c556SJavier Almansa Sobrino The instructions given in this document are meant to be used to build 22a125c556SJavier Almansa Sobrino a PoC to show how Measured Boot on TF-A can interact with a third 23a125c556SJavier Almansa Sobrino party (f)TPM service and they try to be as general as possible. Different 24a125c556SJavier Almansa Sobrino platforms might have different needs and configurations (e.g. different 25a125c556SJavier Almansa Sobrino SHA algorithms) and they might also use different types of TPM services 26a125c556SJavier Almansa Sobrino (or even a different type of service to provide the attestation) 27cca91b7aSManish V Badarkhe and therefore the instructions given here might not apply in such scenarios. 28a125c556SJavier Almansa Sobrino 29a125c556SJavier Almansa SobrinoComponents 30a125c556SJavier Almansa Sobrino~~~~~~~~~~ 31a125c556SJavier Almansa Sobrino 32a125c556SJavier Almansa SobrinoThe PoC is built on top of the `OP-TEE Toolkit`_, which has support to build 33a125c556SJavier Almansa SobrinoTF-A with support for Measured Boot enabled (and run it on a Foundation Model) 34a125c556SJavier Almansa Sobrinosince commit cf56848. 35a125c556SJavier Almansa Sobrino 36a125c556SJavier Almansa SobrinoThe aforementioned toolkit builds a set of images that contain all the components 37a125c556SJavier Almansa Sobrinoneeded to test that the Event Log was properly created. One of these images will 38a125c556SJavier Almansa Sobrinocontain a third party fTPM service which in turn will be used to process the 39a125c556SJavier Almansa SobrinoEvent Log. 40a125c556SJavier Almansa Sobrino 41a125c556SJavier Almansa SobrinoThe reason to choose OP-TEE Toolkit to build our PoC around it is mostly 42a125c556SJavier Almansa Sobrinofor convenience. As the fTPM service used is an OP-TEE TA, it was easy to add 43a125c556SJavier Almansa Sobrinobuild support for it to the toolkit and then build the PoC around it. 44a125c556SJavier Almansa Sobrino 45a125c556SJavier Almansa SobrinoThe most relevant components installed in the image that are closely related to 46a125c556SJavier Almansa SobrinoMeasured Boot/fTPM functionality are: 47a125c556SJavier Almansa Sobrino 48a125c556SJavier Almansa Sobrino - **OP-TEE**: As stated earlier, the fTPM service used in this PoC is built as an 49a125c556SJavier Almansa Sobrino OP-TEE TA and therefore we need to include the OP-TEE OS image. 50a125c556SJavier Almansa Sobrino Support to interfacing with Measured Boot was added to version 3.9.0 of 51a125c556SJavier Almansa Sobrino OP-TEE by implementing the ``PTA_SYSTEM_GET_TPM_EVENT_LOG`` syscall, which 52a125c556SJavier Almansa Sobrino allows the former to pass a copy of the Event Log to any TA requesting it. 53a125c556SJavier Almansa Sobrino OP-TEE knows the location of the Event Log by reading the DTB bindings 54a125c556SJavier Almansa Sobrino received from TF-A. Visit :ref:`DTB binding for Event Log properties` 55a125c556SJavier Almansa Sobrino for more details on this. 56a125c556SJavier Almansa Sobrino 57a125c556SJavier Almansa Sobrino - **fTPM Service**: We use a third party fTPM service in order to validate 58a125c556SJavier Almansa Sobrino the Measured Boot functionality. The chosen fTPM service is a sample 59a125c556SJavier Almansa Sobrino implementation for Aarch32 architecture included on the `ms-tpm-20-ref`_ 60a125c556SJavier Almansa Sobrino reference implementation from Microsoft. The service was updated in order 61a125c556SJavier Almansa Sobrino to extend the Measured Boot Event Log at boot up and it uses the 62a125c556SJavier Almansa Sobrino aforementioned ``PTA_SYSTEM_GET_TPM_EVENT_LOG`` call to retrieve a copy 63a125c556SJavier Almansa Sobrino of the former. 64a125c556SJavier Almansa Sobrino 65a125c556SJavier Almansa Sobrino .. note:: 66a125c556SJavier Almansa Sobrino Arm does not provide an fTPM implementation. The fTPM service used here 67a125c556SJavier Almansa Sobrino is a third party one which has been updated to support Measured Boot 68a125c556SJavier Almansa Sobrino service as provided by TF-A. As such, it is beyond the scope of this 69a125c556SJavier Almansa Sobrino manual to test and verify the correctness of the output generated by the 70a125c556SJavier Almansa Sobrino fTPM service. 71a125c556SJavier Almansa Sobrino 72a125c556SJavier Almansa Sobrino - **TPM Kernel module**: In order to interact with the fTPM service, we need 73a125c556SJavier Almansa Sobrino a kernel module to forward the request from user space to the secure world. 74a125c556SJavier Almansa Sobrino 75a125c556SJavier Almansa Sobrino - `tpm2-tools`_: This is a set of tools that allow to interact with the 76a125c556SJavier Almansa Sobrino fTPM service. We use this in order to read the PCRs with the measurements. 77a125c556SJavier Almansa Sobrino 78a125c556SJavier Almansa SobrinoBuilding the PoC for the Arm FVP platform 79a125c556SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80a125c556SJavier Almansa Sobrino 81a125c556SJavier Almansa SobrinoAs mentioned before, this PoC is based on the OP-TEE Toolkit with some 82a125c556SJavier Almansa Sobrinoextensions to enable Measured Boot and an fTPM service. Therefore, we can rely 83a125c556SJavier Almansa Sobrinoon the instructions to build the original OP-TEE Toolkit. As a general rule, 84a125c556SJavier Almansa Sobrinothe following steps should suffice: 85a125c556SJavier Almansa Sobrino 86a125c556SJavier Almansa Sobrino(1) Start by following the `Get and build the solution`_ instructions to build 87a125c556SJavier Almansa Sobrino the OP-TEE toolkit. On step 3, you need to get the manifest for FVP 88a125c556SJavier Almansa Sobrino platform from the main branch: 89a125c556SJavier Almansa Sobrino 90a125c556SJavier Almansa Sobrino .. code:: shell 91a125c556SJavier Almansa Sobrino 92a125c556SJavier Almansa Sobrino $ repo init -u https://github.com/OP-TEE/manifest.git -m fvp.xml 93a125c556SJavier Almansa Sobrino 94a125c556SJavier Almansa Sobrino Then proceed synching the repos as stated in step 3. Continue following 95a125c556SJavier Almansa Sobrino the instructions and stop before step 5. 96a125c556SJavier Almansa Sobrino 97a125c556SJavier Almansa Sobrino(2) Next you should obtain the `Armv8-A Foundation Platform (For Linux Hosts Only)`_. 98a125c556SJavier Almansa Sobrino The binary should be untar'ed to the root of the repo tree, i.e., like 99a125c556SJavier Almansa Sobrino this: ``<fvp-project>/Foundation_Platformpkg``. In the end, after cloning 100a125c556SJavier Almansa Sobrino all source code, getting the toolchains and "installing" 101a125c556SJavier Almansa Sobrino Foundation_Platformpkg, you should have a folder structure that looks like 102a125c556SJavier Almansa Sobrino this: 103a125c556SJavier Almansa Sobrino 104a125c556SJavier Almansa Sobrino .. code:: shell 105a125c556SJavier Almansa Sobrino 106a125c556SJavier Almansa Sobrino $ ls -la 107a125c556SJavier Almansa Sobrino total 80 108a125c556SJavier Almansa Sobrino drwxrwxr-x 20 tf-a_user tf-a_user 4096 Jul 1 12:16 . 109a125c556SJavier Almansa Sobrino drwxr-xr-x 23 tf-a_user tf-a_user 4096 Jul 1 10:40 .. 110a125c556SJavier Almansa Sobrino drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul 1 10:45 build 111a125c556SJavier Almansa Sobrino drwxrwxr-x 16 tf-a_user tf-a_user 4096 Jul 1 12:16 buildroot 112a125c556SJavier Almansa Sobrino drwxrwxr-x 51 tf-a_user tf-a_user 4096 Jul 1 10:45 edk2 113a125c556SJavier Almansa Sobrino drwxrwxr-x 6 tf-a_user tf-a_user 4096 Jul 1 12:14 edk2-platforms 114a125c556SJavier Almansa Sobrino drwxr-xr-x 7 tf-a_user tf-a_user 4096 Jul 1 10:52 Foundation_Platformpkg 115a125c556SJavier Almansa Sobrino drwxrwxr-x 17 tf-a_user tf-a_user 4096 Jul 2 10:40 grub 116a125c556SJavier Almansa Sobrino drwxrwxr-x 25 tf-a_user tf-a_user 4096 Jul 2 10:39 linux 117a125c556SJavier Almansa Sobrino drwxrwxr-x 15 tf-a_user tf-a_user 4096 Jul 1 10:45 mbedtls 118a125c556SJavier Almansa Sobrino drwxrwxr-x 6 tf-a_user tf-a_user 4096 Jul 1 10:45 ms-tpm-20-ref 119a125c556SJavier Almansa Sobrino drwxrwxr-x 8 tf-a_user tf-a_user 4096 Jul 1 10:45 optee_client 120a125c556SJavier Almansa Sobrino drwxrwxr-x 10 tf-a_user tf-a_user 4096 Jul 1 10:45 optee_examples 121a125c556SJavier Almansa Sobrino drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul 1 12:13 optee_os 122a125c556SJavier Almansa Sobrino drwxrwxr-x 8 tf-a_user tf-a_user 4096 Jul 1 10:45 optee_test 123a125c556SJavier Almansa Sobrino drwxrwxr-x 7 tf-a_user tf-a_user 4096 Jul 1 10:45 .repo 124a125c556SJavier Almansa Sobrino drwxrwxr-x 4 tf-a_user tf-a_user 4096 Jul 1 12:12 toolchains 125a125c556SJavier Almansa Sobrino drwxrwxr-x 21 tf-a_user tf-a_user 4096 Jul 1 12:15 trusted-firmware-a 126a125c556SJavier Almansa Sobrino 127a125c556SJavier Almansa Sobrino(3) Now enter into ``ms-tpm-20-ref`` and get its dependencies: 128a125c556SJavier Almansa Sobrino 129a125c556SJavier Almansa Sobrino .. code:: shell 130a125c556SJavier Almansa Sobrino 131a125c556SJavier Almansa Sobrino $ cd ms-tpm-20-ref 132a125c556SJavier Almansa Sobrino $ git submodule init 133a125c556SJavier Almansa Sobrino $ git submodule update 134a125c556SJavier Almansa Sobrino Submodule path 'external/wolfssl': checked out '9c87f979a7f1d3a6d786b260653d566c1d31a1c4' 135a125c556SJavier Almansa Sobrino 136a125c556SJavier Almansa Sobrino(4) Now, you should be able to continue with step 5 in "`Get and build the solution`_" 137a125c556SJavier Almansa Sobrino instructions. In order to enable support for Measured Boot, you need to 138*bb5b2632SManish V Badarkhe set the following build options: 139a125c556SJavier Almansa Sobrino 140a125c556SJavier Almansa Sobrino .. code:: shell 141a125c556SJavier Almansa Sobrino 142*bb5b2632SManish V Badarkhe $ MEASURED_BOOT=y MEASURED_BOOT_FTPM=y make -j `nproc` 143a125c556SJavier Almansa Sobrino 144a125c556SJavier Almansa Sobrino .. note:: 145a125c556SJavier Almansa Sobrino The build process will likely take a long time. It is strongly recommended to 146a125c556SJavier Almansa Sobrino pass the ``-j`` option to make to run the process faster. 147a125c556SJavier Almansa Sobrino 148a125c556SJavier Almansa Sobrino After this step, you should be ready to run the image. 149a125c556SJavier Almansa Sobrino 150a125c556SJavier Almansa SobrinoRunning and using the PoC on the Armv8-A Foundation AEM FVP 151a125c556SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152a125c556SJavier Almansa Sobrino 153a125c556SJavier Almansa SobrinoWith everything built, you can now run the image: 154a125c556SJavier Almansa Sobrino 155a125c556SJavier Almansa Sobrino.. code:: shell 156a125c556SJavier Almansa Sobrino 157a125c556SJavier Almansa Sobrino $ make run-only 158a125c556SJavier Almansa Sobrino 159a125c556SJavier Almansa Sobrino.. note:: 160a125c556SJavier Almansa Sobrino Using ``make run`` will build and run the image and it can be used instead 161a125c556SJavier Almansa Sobrino of simply ``make``. However, once the image is built, it is recommended to 162a125c556SJavier Almansa Sobrino use ``make run-only`` to avoid re-running all the building rules, which 163a125c556SJavier Almansa Sobrino would take time. 164a125c556SJavier Almansa Sobrino 165a125c556SJavier Almansa SobrinoWhen FVP is launched, two terminal windows will appear. ``FVP terminal_0`` 166a125c556SJavier Almansa Sobrinois the userspace terminal whereas ``FVP terminal_1`` is the counterpart for 167a125c556SJavier Almansa Sobrinothe secure world (where TAs will print their logs, for instance). 168a125c556SJavier Almansa Sobrino 169a125c556SJavier Almansa SobrinoLog into the image shell with user ``root``, no password will be required. 170a125c556SJavier Almansa SobrinoThen we can issue the ``ftpm`` command, which is an alias that 171a125c556SJavier Almansa Sobrino 172a125c556SJavier Almansa Sobrino(1) loads the ftpm kernel module and 173a125c556SJavier Almansa Sobrino 174a125c556SJavier Almansa Sobrino(2) calls ``tpm2_pcrread``, which will access the fTPM service to read the 175a125c556SJavier Almansa Sobrino PCRs. 176a125c556SJavier Almansa Sobrino 177a125c556SJavier Almansa SobrinoWhen loading the ftpm kernel module, the fTPM TA is loaded into the secure 178a125c556SJavier Almansa Sobrinoworld. This TA then requests a copy of the Event Log generated during the 179a125c556SJavier Almansa Sobrinobooting process so it can retrieve all the entries on the log and record them 180a125c556SJavier Almansa Sobrinofirst thing. 181a125c556SJavier Almansa Sobrino 182a125c556SJavier Almansa Sobrino.. note:: 183a125c556SJavier Almansa Sobrino For this PoC, nothing loaded after BL33 and NT_FW_CONFIG is recorded 184a125c556SJavier Almansa Sobrino in the Event Log. 185a125c556SJavier Almansa Sobrino 186a125c556SJavier Almansa SobrinoThe secure world terminal should show the debug logs for the fTPM service, 187a125c556SJavier Almansa Sobrinoincluding all the measurements available in the Event Log as they are being 188a125c556SJavier Almansa Sobrinoprocessed: 189a125c556SJavier Almansa Sobrino 190a125c556SJavier Almansa Sobrino.. code:: shell 191a125c556SJavier Almansa Sobrino 192a125c556SJavier Almansa Sobrino M/TA: Preparing to extend the following TPM Event Log: 193a125c556SJavier Almansa Sobrino M/TA: TCG_EfiSpecIDEvent: 194a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 195a125c556SJavier Almansa Sobrino M/TA: EventType : 3 196a125c556SJavier Almansa Sobrino M/TA: Digest : 00 197a125c556SJavier Almansa Sobrino M/TA: : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 198a125c556SJavier Almansa Sobrino M/TA: : 00 00 00 199a125c556SJavier Almansa Sobrino M/TA: EventSize : 33 200a125c556SJavier Almansa Sobrino M/TA: Signature : Spec ID Event03 201a125c556SJavier Almansa Sobrino M/TA: PlatformClass : 0 202a125c556SJavier Almansa Sobrino M/TA: SpecVersion : 2.0.2 203a125c556SJavier Almansa Sobrino M/TA: UintnSize : 1 204a125c556SJavier Almansa Sobrino M/TA: NumberOfAlgorithms : 1 205a125c556SJavier Almansa Sobrino M/TA: DigestSizes : 206a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 207a125c556SJavier Almansa Sobrino M/TA: DigestSize : 32 208a125c556SJavier Almansa Sobrino M/TA: VendorInfoSize : 0 209a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 210a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 211a125c556SJavier Almansa Sobrino M/TA: EventType : 3 212a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 213a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 214a125c556SJavier Almansa Sobrino M/TA: Digest : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 215a125c556SJavier Almansa Sobrino M/TA: : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 216a125c556SJavier Almansa Sobrino M/TA: EventSize : 17 217a125c556SJavier Almansa Sobrino M/TA: Signature : StartupLocality 218a125c556SJavier Almansa Sobrino M/TA: StartupLocality : 0 219a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 220a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 221a125c556SJavier Almansa Sobrino M/TA: EventType : 1 222a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 223a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 224a125c556SJavier Almansa Sobrino M/TA: Digest : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63 225a125c556SJavier Almansa Sobrino M/TA: : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5 226a125c556SJavier Almansa Sobrino M/TA: EventSize : 5 227a125c556SJavier Almansa Sobrino M/TA: Event : BL_2 228a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 229a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 230a125c556SJavier Almansa Sobrino M/TA: EventType : 1 231a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 232a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 233a125c556SJavier Almansa Sobrino M/TA: Digest : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5 234a125c556SJavier Almansa Sobrino M/TA: : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c 235a125c556SJavier Almansa Sobrino M/TA: EventSize : 6 236a125c556SJavier Almansa Sobrino M/TA: Event : BL_31 237a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 238a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 239a125c556SJavier Almansa Sobrino M/TA: EventType : 1 240a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 241a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 242a125c556SJavier Almansa Sobrino M/TA: Digest : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2 243a125c556SJavier Almansa Sobrino M/TA: : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0 244a125c556SJavier Almansa Sobrino M/TA: EventSize : 10 245a125c556SJavier Almansa Sobrino M/TA: Event : HW_CONFIG 246a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 247a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 248a125c556SJavier Almansa Sobrino M/TA: EventType : 1 249a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 250a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 251a125c556SJavier Almansa Sobrino M/TA: Digest : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a 252a125c556SJavier Almansa Sobrino M/TA: : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0 253a125c556SJavier Almansa Sobrino M/TA: EventSize : 14 254a125c556SJavier Almansa Sobrino M/TA: Event : SOC_FW_CONFIG 255a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 256a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 257a125c556SJavier Almansa Sobrino M/TA: EventType : 1 258a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 259a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 260a125c556SJavier Almansa Sobrino M/TA: Digest : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22 261a125c556SJavier Almansa Sobrino M/TA: : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75 262a125c556SJavier Almansa Sobrino M/TA: EventSize : 6 263a125c556SJavier Almansa Sobrino M/TA: Event : BL_32 264a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 265a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 266a125c556SJavier Almansa Sobrino M/TA: EventType : 1 267a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 268a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 269a125c556SJavier Almansa Sobrino M/TA: Digest : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e 270a125c556SJavier Almansa Sobrino M/TA: : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63 271a125c556SJavier Almansa Sobrino M/TA: EventSize : 18 272a125c556SJavier Almansa Sobrino M/TA: Event : BL32_EXTRA1_IMAGE 273a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 274a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 275a125c556SJavier Almansa Sobrino M/TA: EventType : 1 276a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 277a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 278a125c556SJavier Almansa Sobrino M/TA: Digest : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25 279a125c556SJavier Almansa Sobrino M/TA: : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2 280a125c556SJavier Almansa Sobrino M/TA: EventSize : 6 281a125c556SJavier Almansa Sobrino M/TA: Event : BL_33 282a125c556SJavier Almansa Sobrino M/TA: PCR_Event2: 283a125c556SJavier Almansa Sobrino M/TA: PCRIndex : 0 284a125c556SJavier Almansa Sobrino M/TA: EventType : 1 285a125c556SJavier Almansa Sobrino M/TA: Digests Count : 1 286a125c556SJavier Almansa Sobrino M/TA: #0 AlgorithmId : SHA256 287a125c556SJavier Almansa Sobrino M/TA: Digest : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6 288a125c556SJavier Almansa Sobrino M/TA: : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a 289a125c556SJavier Almansa Sobrino M/TA: EventSize : 13 290a125c556SJavier Almansa Sobrino M/TA: Event : NT_FW_CONFIG 291a125c556SJavier Almansa Sobrino 292a125c556SJavier Almansa SobrinoThese logs correspond to the measurements stored by TF-A during the measured 293a125c556SJavier Almansa Sobrinoboot process and therefore, they should match the logs dumped by the former 294a125c556SJavier Almansa Sobrinoduring the boot up process. These can be seen on the terminal_0: 295a125c556SJavier Almansa Sobrino 296a125c556SJavier Almansa Sobrino.. code:: shell 297a125c556SJavier Almansa Sobrino 298a125c556SJavier Almansa Sobrino NOTICE: Booting Trusted Firmware 299a125c556SJavier Almansa Sobrino NOTICE: BL1: v2.5(release):v2.5 300a125c556SJavier Almansa Sobrino NOTICE: BL1: Built : 10:41:20, Jul 2 2021 301a125c556SJavier Almansa Sobrino NOTICE: BL1: Booting BL2 302a125c556SJavier Almansa Sobrino NOTICE: BL2: v2.5(release):v2.5 303a125c556SJavier Almansa Sobrino NOTICE: BL2: Built : 10:41:20, Jul 2 2021 304a125c556SJavier Almansa Sobrino NOTICE: TCG_EfiSpecIDEvent: 305a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 306a125c556SJavier Almansa Sobrino NOTICE: EventType : 3 307a125c556SJavier Almansa Sobrino NOTICE: Digest : 00 308a125c556SJavier Almansa Sobrino NOTICE: : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 309a125c556SJavier Almansa Sobrino NOTICE: : 00 00 00 310a125c556SJavier Almansa Sobrino NOTICE: EventSize : 33 311a125c556SJavier Almansa Sobrino NOTICE: Signature : Spec ID Event03 312a125c556SJavier Almansa Sobrino NOTICE: PlatformClass : 0 313a125c556SJavier Almansa Sobrino NOTICE: SpecVersion : 2.0.2 314a125c556SJavier Almansa Sobrino NOTICE: UintnSize : 1 315a125c556SJavier Almansa Sobrino NOTICE: NumberOfAlgorithms : 1 316a125c556SJavier Almansa Sobrino NOTICE: DigestSizes : 317a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 318a125c556SJavier Almansa Sobrino NOTICE: DigestSize : 32 319a125c556SJavier Almansa Sobrino NOTICE: VendorInfoSize : 0 320a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 321a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 322a125c556SJavier Almansa Sobrino NOTICE: EventType : 3 323a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 324a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 325a125c556SJavier Almansa Sobrino NOTICE: Digest : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 326a125c556SJavier Almansa Sobrino NOTICE: : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 327a125c556SJavier Almansa Sobrino NOTICE: EventSize : 17 328a125c556SJavier Almansa Sobrino NOTICE: Signature : StartupLocality 329a125c556SJavier Almansa Sobrino NOTICE: StartupLocality : 0 330a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 331a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 332a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 333a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 334a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 335a125c556SJavier Almansa Sobrino NOTICE: Digest : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63 336a125c556SJavier Almansa Sobrino NOTICE: : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5 337a125c556SJavier Almansa Sobrino NOTICE: EventSize : 5 338a125c556SJavier Almansa Sobrino NOTICE: Event : BL_2 339a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 340a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 341a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 342a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 343a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 344a125c556SJavier Almansa Sobrino NOTICE: Digest : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5 345a125c556SJavier Almansa Sobrino NOTICE: : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c 346a125c556SJavier Almansa Sobrino NOTICE: EventSize : 6 347a125c556SJavier Almansa Sobrino NOTICE: Event : BL_31 348a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 349a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 350a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 351a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 352a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 353a125c556SJavier Almansa Sobrino NOTICE: Digest : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2 354a125c556SJavier Almansa Sobrino NOTICE: : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0 355a125c556SJavier Almansa Sobrino NOTICE: EventSize : 10 356a125c556SJavier Almansa Sobrino NOTICE: Event : HW_CONFIG 357a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 358a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 359a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 360a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 361a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 362a125c556SJavier Almansa Sobrino NOTICE: Digest : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a 363a125c556SJavier Almansa Sobrino NOTICE: : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0 364a125c556SJavier Almansa Sobrino NOTICE: EventSize : 14 365a125c556SJavier Almansa Sobrino NOTICE: Event : SOC_FW_CONFIG 366a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 367a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 368a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 369a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 370a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 371a125c556SJavier Almansa Sobrino NOTICE: Digest : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22 372a125c556SJavier Almansa Sobrino NOTICE: : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75 373a125c556SJavier Almansa Sobrino NOTICE: EventSize : 6 374a125c556SJavier Almansa Sobrino NOTICE: Event : BL_32 375a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 376a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 377a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 378a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 379a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 380a125c556SJavier Almansa Sobrino NOTICE: Digest : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e 381a125c556SJavier Almansa Sobrino NOTICE: : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63 382a125c556SJavier Almansa Sobrino NOTICE: EventSize : 18 383a125c556SJavier Almansa Sobrino NOTICE: Event : BL32_EXTRA1_IMAGE 384a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 385a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 386a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 387a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 388a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 389a125c556SJavier Almansa Sobrino NOTICE: Digest : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25 390a125c556SJavier Almansa Sobrino NOTICE: : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2 391a125c556SJavier Almansa Sobrino NOTICE: EventSize : 6 392a125c556SJavier Almansa Sobrino NOTICE: Event : BL_33 393a125c556SJavier Almansa Sobrino NOTICE: PCR_Event2: 394a125c556SJavier Almansa Sobrino NOTICE: PCRIndex : 0 395a125c556SJavier Almansa Sobrino NOTICE: EventType : 1 396a125c556SJavier Almansa Sobrino NOTICE: Digests Count : 1 397a125c556SJavier Almansa Sobrino NOTICE: #0 AlgorithmId : SHA256 398a125c556SJavier Almansa Sobrino NOTICE: Digest : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6 399a125c556SJavier Almansa Sobrino NOTICE: : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a 400a125c556SJavier Almansa Sobrino NOTICE: EventSize : 13 401a125c556SJavier Almansa Sobrino NOTICE: Event : NT_FW_CONFIG 402a125c556SJavier Almansa Sobrino NOTICE: BL1: Booting BL31 403a125c556SJavier Almansa Sobrino NOTICE: BL31: v2.5(release):v2.5 404a125c556SJavier Almansa Sobrino NOTICE: BL31: Built : 10:41:20, Jul 2 2021 405a125c556SJavier Almansa Sobrino 406a125c556SJavier Almansa SobrinoFollowing up with the fTPM startup process, we can see that all the 407a125c556SJavier Almansa Sobrinomeasurements in the Event Log are extended and recorded in the appropriate PCR: 408a125c556SJavier Almansa Sobrino 409a125c556SJavier Almansa Sobrino.. code:: shell 410a125c556SJavier Almansa Sobrino 411a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 412a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 413a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 414a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 415a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 416a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 417a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 418a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 419a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 420a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 421a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 422a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 423a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 424a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 425a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 426a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 427a125c556SJavier Almansa Sobrino M/TA: TPM2_PCR_EXTEND_COMMAND returned value: 428a125c556SJavier Almansa Sobrino M/TA: ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000 429a125c556SJavier Almansa Sobrino M/TA: 9 Event logs processed 430a125c556SJavier Almansa Sobrino 431a125c556SJavier Almansa SobrinoAfter the fTPM TA is loaded, the call to ``insmod`` issued by the ``ftpm`` 432a125c556SJavier Almansa Sobrinoalias to load the ftpm kernel module returns, and then the TPM PCRs are read 433a125c556SJavier Almansa Sobrinoby means of ``tpm_pcrread`` command. Note that we are only interested in the 434a125c556SJavier Almansa SobrinoSHA256 logs here, as this is the algorithm we used on TF-A for the measurements 435a125c556SJavier Almansa Sobrino(see the field ``AlgorithmId`` on the logs above): 436a125c556SJavier Almansa Sobrino 437a125c556SJavier Almansa Sobrino.. code:: shell 438a125c556SJavier Almansa Sobrino 439a125c556SJavier Almansa Sobrino sha256: 440a125c556SJavier Almansa Sobrino 0 : 0xA6EB3A7417B8CFA9EBA2E7C22AD5A4C03CDB8F3FBDD7667F9C3EF2EA285A8C9F 441a125c556SJavier Almansa Sobrino 1 : 0x0000000000000000000000000000000000000000000000000000000000000000 442a125c556SJavier Almansa Sobrino 2 : 0x0000000000000000000000000000000000000000000000000000000000000000 443a125c556SJavier Almansa Sobrino 3 : 0x0000000000000000000000000000000000000000000000000000000000000000 444a125c556SJavier Almansa Sobrino 4 : 0x0000000000000000000000000000000000000000000000000000000000000000 445a125c556SJavier Almansa Sobrino 5 : 0x0000000000000000000000000000000000000000000000000000000000000000 446a125c556SJavier Almansa Sobrino 6 : 0x0000000000000000000000000000000000000000000000000000000000000000 447a125c556SJavier Almansa Sobrino 7 : 0x0000000000000000000000000000000000000000000000000000000000000000 448a125c556SJavier Almansa Sobrino 8 : 0x0000000000000000000000000000000000000000000000000000000000000000 449a125c556SJavier Almansa Sobrino 9 : 0x0000000000000000000000000000000000000000000000000000000000000000 450a125c556SJavier Almansa Sobrino 10: 0x0000000000000000000000000000000000000000000000000000000000000000 451a125c556SJavier Almansa Sobrino 11: 0x0000000000000000000000000000000000000000000000000000000000000000 452a125c556SJavier Almansa Sobrino 12: 0x0000000000000000000000000000000000000000000000000000000000000000 453a125c556SJavier Almansa Sobrino 13: 0x0000000000000000000000000000000000000000000000000000000000000000 454a125c556SJavier Almansa Sobrino 14: 0x0000000000000000000000000000000000000000000000000000000000000000 455a125c556SJavier Almansa Sobrino 15: 0x0000000000000000000000000000000000000000000000000000000000000000 456a125c556SJavier Almansa Sobrino 16: 0x0000000000000000000000000000000000000000000000000000000000000000 457a125c556SJavier Almansa Sobrino 17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 458a125c556SJavier Almansa Sobrino 18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 459a125c556SJavier Almansa Sobrino 19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 460a125c556SJavier Almansa Sobrino 20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 461a125c556SJavier Almansa Sobrino 21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 462a125c556SJavier Almansa Sobrino 22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 463a125c556SJavier Almansa Sobrino 23: 0x0000000000000000000000000000000000000000000000000000000000000000 464a125c556SJavier Almansa Sobrino 465a125c556SJavier Almansa SobrinoIn this PoC we are only interested in PCR0, which must be non-null. This is 466a125c556SJavier Almansa Sobrinobecause the boot process records all the images in this PCR (see field ``PCRIndex`` 467a125c556SJavier Almansa Sobrinoon the Event Log above). The rest of the records must be 0 at this point. 468a125c556SJavier Almansa Sobrino 469a125c556SJavier Almansa Sobrino.. note:: 470a125c556SJavier Almansa Sobrino The fTPM service used has support only for 16 PCRs, therefore the content 471a125c556SJavier Almansa Sobrino of PCRs above 15 can be ignored. 472a125c556SJavier Almansa Sobrino 473a125c556SJavier Almansa Sobrino.. note:: 474a125c556SJavier Almansa Sobrino As stated earlier, Arm does not provide an fTPM implementation and therefore 475a125c556SJavier Almansa Sobrino we do not validate here if the content of PCR0 is correct or not. For this 476a125c556SJavier Almansa Sobrino PoC, we are only focused on the fact that the event log could be passed to a third 477a125c556SJavier Almansa Sobrino party fTPM and its records were properly extended. 478a125c556SJavier Almansa Sobrino 479a125c556SJavier Almansa SobrinoFine-tuning the fTPM TA 480a125c556SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~ 481a125c556SJavier Almansa Sobrino 482a125c556SJavier Almansa SobrinoAs stated earlier, the OP-TEE Toolkit includes support to build a third party fTPM 483a125c556SJavier Almansa Sobrinoservice. The build options for this service are tailored for the PoC and defined in 484a125c556SJavier Almansa Sobrinothe build environment variable ``FTPM_FLAGS`` (see ``<toolkit_home>/build/common.mk``) 485a125c556SJavier Almansa Sobrinobut they can be modified if needed to better adapt it to a specific scenario. 486a125c556SJavier Almansa Sobrino 487a125c556SJavier Almansa SobrinoThe most relevant options for Measured Boot support are: 488a125c556SJavier Almansa Sobrino 489a125c556SJavier Almansa Sobrino - **CFG_TA_DEBUG**: Enables debug logs in the Terminal_1 console. 490a125c556SJavier Almansa Sobrino - **CFG_TEE_TA_LOG_LEVEL**: Defines the log level used for the debug messages. 491a125c556SJavier Almansa Sobrino - **CFG_TA_MEASURED_BOOT**: Enables support for measured boot on the fTPM. 492a125c556SJavier Almansa Sobrino - **CFG_TA_EVENT_LOG_SIZE**: Defines the size, in bytes, of the larger event log that 493a125c556SJavier Almansa Sobrino the fTPM is able to store, as this buffer is allocated at build time. This must be at 494a125c556SJavier Almansa Sobrino least the same as the size of the event log generated by TF-A. If this build option 495a125c556SJavier Almansa Sobrino is not defined, the fTPM falls back to a default value of 1024 bytes, which is enough 496a125c556SJavier Almansa Sobrino for this PoC, so this variable is not defined in FTPM_FLAGS. 497a125c556SJavier Almansa Sobrino 498a125c556SJavier Almansa Sobrino-------------- 499a125c556SJavier Almansa Sobrino 500cca91b7aSManish V Badarkhe*Copyright (c) 2021-2023, Arm Limited. All rights reserved.* 501a125c556SJavier Almansa Sobrino 502a125c556SJavier Almansa Sobrino.. _OP-TEE Toolkit: https://github.com/OP-TEE/build 503a125c556SJavier Almansa Sobrino.. _ms-tpm-20-ref: https://github.com/microsoft/ms-tpm-20-ref 504a125c556SJavier Almansa Sobrino.. _Get and build the solution: https://optee.readthedocs.io/en/latest/building/gits/build.html#get-and-build-the-solution 505a125c556SJavier Almansa Sobrino.. _Armv8-A Foundation Platform (For Linux Hosts Only): https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms/arm-ecosystem-models 506a125c556SJavier Almansa Sobrino.. _tpm2-tools: https://github.com/tpm2-software/tpm2-tools 507cca91b7aSManish V Badarkhe.. _TCG event log: https://trustedcomputinggroup.org/resource/tcg-efi-platform-specification/ 508