summaryrefslogtreecommitdiff
path: root/docs/design_documents/measured_boot_poc.rst
blob: 7f73d7e9bc07d63f1a7180d0f7651e10413f653b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
Interaction between Measured Boot and an fTPM (PoC)
===================================================

Measured Boot is the process of cryptographically measuring the code and
critical data used at boot time, for example using a TPM, so that the
security state can be attested later.

The current implementation of the driver included in Trusted Firmware-A
(TF-A) stores the measurements into a `TCG event log`_ in secure
memory. No other means of recording measurements (such as a discrete TPM) is
supported right now.

The driver also provides mechanisms to pass the Event Log to normal world if
needed.

This manual provides instructions to build a proof of concept (PoC) with the
sole intention of showing how Measured Boot can be used in conjunction with
a firmware TPM (fTPM) service implemented on top of OP-TEE.

.. note::
   The instructions given in this document are meant to be used to build
   a PoC to show how Measured Boot on TF-A can interact with a third
   party (f)TPM service and they try to be as general as possible. Different
   platforms might have different needs and configurations (e.g. different
   SHA algorithms) and they might also use different types of TPM services
   (or even a different type of service to provide the attestation)
   and therefore the instructions given here might not apply in such scenarios.

Components
~~~~~~~~~~

The PoC is built on top of the `OP-TEE Toolkit`_, which has support to build
TF-A with support for Measured Boot enabled (and run it on a Foundation Model)
since commit cf56848.

The aforementioned toolkit builds a set of images that contain all the components
needed to test that the Event Log was properly created. One of these images will
contain a third party fTPM service which in turn will be used to process the
Event Log.

The reason to choose OP-TEE Toolkit to build our PoC around it is mostly
for convenience. As the fTPM service used is an OP-TEE TA, it was easy to add
build support for it to the toolkit and then build the PoC around it.

The most relevant components installed in the image that are closely related to
Measured Boot/fTPM functionality are:

   - **OP-TEE**: As stated earlier, the fTPM service used in this PoC is built as an
     OP-TEE TA and therefore we need to include the OP-TEE OS image.
     Support to interfacing with Measured Boot was added to version 3.9.0 of
     OP-TEE by implementing the ``PTA_SYSTEM_GET_TPM_EVENT_LOG`` syscall, which
     allows the former to pass a copy of the Event Log to any TA requesting it.
     OP-TEE knows the location of the Event Log by reading the DTB bindings
     received from TF-A. Visit :ref:`DTB binding for Event Log properties`
     for more details on this.

   - **fTPM Service**: We use a third party fTPM service in order to validate
     the Measured Boot functionality. The chosen fTPM service is a sample
     implementation for Aarch32 architecture included on the `ms-tpm-20-ref`_
     reference implementation from Microsoft. The service was updated in order
     to extend the Measured Boot Event Log at boot up and it uses the
     aforementioned ``PTA_SYSTEM_GET_TPM_EVENT_LOG`` call to retrieve a copy
     of the former.

   .. note::
      Arm does not provide an fTPM implementation. The fTPM service used here
      is a third party one which has been updated to support Measured Boot
      service as provided by TF-A. As such, it is beyond the scope of this
      manual to test and verify the correctness of the output generated by the
      fTPM service.

   - **TPM Kernel module**: In order to interact with the fTPM service, we need
     a kernel module to forward the request from user space to the secure world.

   - `tpm2-tools`_: This is a set of tools that allow to interact with the
     fTPM service. We use this in order to read the PCRs with the measurements.

Building the PoC for the Arm FVP platform
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

As mentioned before, this PoC is based on the OP-TEE Toolkit with some
extensions to enable Measured Boot and an fTPM service. Therefore, we can rely
on the instructions to build the original OP-TEE Toolkit. As a general rule,
the following steps should suffice:

(1) Start by following the `Get and build the solution`_ instructions to build
    the OP-TEE toolkit. On step 3, you need to get the manifest for FVP
    platform from the main branch:

    .. code:: shell

       $ repo init -u https://github.com/OP-TEE/manifest.git -m fvp.xml

    Then proceed synching the repos as stated in step 3. Continue following
    the instructions and stop before step 5.

(2) Next you should obtain the `Armv8-A Foundation Platform (For Linux Hosts Only)`_.
    The binary should be untar'ed to the root of the repo tree, i.e., like
    this: ``<fvp-project>/Foundation_Platformpkg``. In the end, after cloning
    all source code, getting the toolchains and "installing"
    Foundation_Platformpkg, you should have a folder structure that looks like
    this:

    .. code:: shell

       $ ls -la
       total 80
       drwxrwxr-x 20 tf-a_user tf-a_user 4096 Jul  1 12:16 .
       drwxr-xr-x 23 tf-a_user tf-a_user 4096 Jul  1 10:40 ..
       drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul  1 10:45 build
       drwxrwxr-x 16 tf-a_user tf-a_user 4096 Jul  1 12:16 buildroot
       drwxrwxr-x 51 tf-a_user tf-a_user 4096 Jul  1 10:45 edk2
       drwxrwxr-x  6 tf-a_user tf-a_user 4096 Jul  1 12:14 edk2-platforms
       drwxr-xr-x  7 tf-a_user tf-a_user 4096 Jul  1 10:52 Foundation_Platformpkg
       drwxrwxr-x 17 tf-a_user tf-a_user 4096 Jul  2 10:40 grub
       drwxrwxr-x 25 tf-a_user tf-a_user 4096 Jul  2 10:39 linux
       drwxrwxr-x 15 tf-a_user tf-a_user 4096 Jul  1 10:45 mbedtls
       drwxrwxr-x  6 tf-a_user tf-a_user 4096 Jul  1 10:45 ms-tpm-20-ref
       drwxrwxr-x  8 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_client
       drwxrwxr-x 10 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_examples
       drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul  1 12:13 optee_os
       drwxrwxr-x  8 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_test
       drwxrwxr-x  7 tf-a_user tf-a_user 4096 Jul  1 10:45 .repo
       drwxrwxr-x  4 tf-a_user tf-a_user 4096 Jul  1 12:12 toolchains
       drwxrwxr-x 21 tf-a_user tf-a_user 4096 Jul  1 12:15 trusted-firmware-a

(3) Now enter into ``ms-tpm-20-ref`` and get its dependencies:

   .. code:: shell

      $ cd ms-tpm-20-ref
      $ git submodule init
      $ git submodule update
      Submodule path 'external/wolfssl': checked out '9c87f979a7f1d3a6d786b260653d566c1d31a1c4'

(4) Now, you should be able to continue with step 5 in "`Get and build the solution`_"
    instructions. In order to enable support for Measured Boot, you need to
    set the following build options:

    .. code:: shell

       $ MEASURED_BOOT=y MEASURED_BOOT_FTPM=y make -j `nproc`

    .. note::
       The build process will likely take a long time. It is strongly recommended to
       pass the ``-j`` option to make to run the process faster.

   After this step, you should be ready to run the image.

Running and using the PoC on the Armv8-A Foundation AEM FVP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

With everything built, you can now run the image:

.. code:: shell

   $ make run-only

.. note::
   Using ``make run`` will build and run the image and it can be used instead
   of simply ``make``. However, once the image is built, it is recommended to
   use ``make run-only`` to avoid re-running all the building rules, which
   would take time.

When FVP is launched, two terminal windows will appear. ``FVP terminal_0``
is the userspace terminal whereas ``FVP terminal_1`` is the counterpart for
the secure world (where TAs will print their logs, for instance).

Log into the image shell with user ``root``, no password will be required.
Then we can issue the ``ftpm`` command, which is an alias that

(1) loads the ftpm kernel module and

(2) calls ``tpm2_pcrread``, which will access the fTPM service to read the
    PCRs.

When loading the ftpm kernel module, the fTPM TA is loaded into the secure
world. This TA then requests a copy of the Event Log generated during the
booting process so it can retrieve all the entries on the log and record them
first thing.

.. note::
   For this PoC, nothing loaded after BL33 and NT_FW_CONFIG is recorded
   in the Event Log.

The secure world terminal should show the debug logs for the fTPM service,
including all the measurements available in the Event Log as they are being
processed:

.. code:: shell

	M/TA: Preparing to extend the following TPM Event Log:
	M/TA: TCG_EfiSpecIDEvent:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 3
	M/TA:   Digest             : 00
	M/TA: 			   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	M/TA: 			   : 00 00 00
	M/TA:   EventSize          : 33
	M/TA:   Signature          : Spec ID Event03
	M/TA:   PlatformClass      : 0
	M/TA:   SpecVersion        : 2.0.2
	M/TA:   UintnSize          : 1
	M/TA:   NumberOfAlgorithms : 1
	M/TA:   DigestSizes        :
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        DigestSize    : 32
	M/TA:   VendorInfoSize     : 0
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 3
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	M/TA: 			   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	M/TA:   EventSize          : 17
	M/TA:   Signature          : StartupLocality
	M/TA:   StartupLocality    : 0
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63
	M/TA: 			   : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5
	M/TA:   EventSize          : 5
	M/TA:   Event              : BL_2
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5
	M/TA: 			   : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c
	M/TA:   EventSize          : 6
	M/TA:   Event              : BL_31
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2
	M/TA: 			   : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0
	M/TA:   EventSize          : 10
	M/TA:   Event              : HW_CONFIG
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a
	M/TA: 			   : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0
	M/TA:   EventSize          : 14
	M/TA:   Event              : SOC_FW_CONFIG
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22
	M/TA: 			   : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75
	M/TA:   EventSize          : 6
	M/TA:   Event              : BL_32
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e
	M/TA: 			   : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63
	M/TA:   EventSize          : 18
	M/TA:   Event              : BL32_EXTRA1_IMAGE
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25
	M/TA: 			   : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2
	M/TA:   EventSize          : 6
	M/TA:   Event              : BL_33
	M/TA: PCR_Event2:
	M/TA:   PCRIndex           : 0
	M/TA:   EventType          : 1
	M/TA:   Digests Count      : 1
	M/TA:     #0 AlgorithmId   : SHA256
	M/TA:        Digest        : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6
	M/TA: 			   : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a
	M/TA:   EventSize          : 13
	M/TA:   Event              : NT_FW_CONFIG

These logs correspond to the measurements stored by TF-A during the measured
boot process and therefore, they should match the logs dumped by the former
during the boot up process. These can be seen on the terminal_0:

.. code:: shell

	NOTICE:  Booting Trusted Firmware
	NOTICE:  BL1: v2.5(release):v2.5
	NOTICE:  BL1: Built : 10:41:20, Jul  2 2021
	NOTICE:  BL1: Booting BL2
	NOTICE:  BL2: v2.5(release):v2.5
	NOTICE:  BL2: Built : 10:41:20, Jul  2 2021
	NOTICE:  TCG_EfiSpecIDEvent:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 3
	NOTICE:    Digest             : 00
	NOTICE:  		      : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	NOTICE:  		      : 00 00 00
	NOTICE:    EventSize          : 33
	NOTICE:    Signature          : Spec ID Event03
	NOTICE:    PlatformClass      : 0
	NOTICE:    SpecVersion        : 2.0.2
	NOTICE:    UintnSize          : 1
	NOTICE:    NumberOfAlgorithms : 1
	NOTICE:    DigestSizes        :
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         DigestSize    : 32
	NOTICE:    VendorInfoSize     : 0
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 3
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	NOTICE:  		      : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	NOTICE:    EventSize          : 17
	NOTICE:    Signature          : StartupLocality
	NOTICE:    StartupLocality    : 0
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63
	NOTICE:  		      : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5
	NOTICE:    EventSize          : 5
	NOTICE:    Event              : BL_2
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5
	NOTICE:  		      : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c
	NOTICE:    EventSize          : 6
	NOTICE:    Event              : BL_31
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2
	NOTICE:  		      : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0
	NOTICE:    EventSize          : 10
	NOTICE:    Event              : HW_CONFIG
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a
	NOTICE:  		      : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0
	NOTICE:    EventSize          : 14
	NOTICE:    Event              : SOC_FW_CONFIG
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22
	NOTICE:  		      : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75
	NOTICE:    EventSize          : 6
	NOTICE:    Event              : BL_32
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e
	NOTICE:  		      : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63
	NOTICE:    EventSize          : 18
	NOTICE:    Event              : BL32_EXTRA1_IMAGE
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25
	NOTICE:  		      : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2
	NOTICE:    EventSize          : 6
	NOTICE:    Event              : BL_33
	NOTICE:  PCR_Event2:
	NOTICE:    PCRIndex           : 0
	NOTICE:    EventType          : 1
	NOTICE:    Digests Count      : 1
	NOTICE:      #0 AlgorithmId   : SHA256
	NOTICE:         Digest        : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6
	NOTICE:  		      : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a
	NOTICE:    EventSize          : 13
	NOTICE:    Event              : NT_FW_CONFIG
	NOTICE:  BL1: Booting BL31
	NOTICE:  BL31: v2.5(release):v2.5
	NOTICE:  BL31: Built : 10:41:20, Jul  2 2021

Following up with the fTPM startup process, we can see that all the
measurements in the Event Log are extended and recorded in the appropriate PCR:

.. code:: shell

	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
	M/TA: 	ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
	M/TA: 9 Event logs processed

After the fTPM TA is loaded, the call to ``insmod`` issued by the ``ftpm``
alias to load the ftpm kernel module returns, and then the TPM PCRs are read
by means of ``tpm_pcrread`` command. Note that we are only interested in the
SHA256 logs here, as this is the algorithm we used on TF-A for the measurements
(see the field ``AlgorithmId`` on the logs above):

.. code:: shell

	sha256:
	0 : 0xA6EB3A7417B8CFA9EBA2E7C22AD5A4C03CDB8F3FBDD7667F9C3EF2EA285A8C9F
	1 : 0x0000000000000000000000000000000000000000000000000000000000000000
	2 : 0x0000000000000000000000000000000000000000000000000000000000000000
	3 : 0x0000000000000000000000000000000000000000000000000000000000000000
	4 : 0x0000000000000000000000000000000000000000000000000000000000000000
	5 : 0x0000000000000000000000000000000000000000000000000000000000000000
	6 : 0x0000000000000000000000000000000000000000000000000000000000000000
	7 : 0x0000000000000000000000000000000000000000000000000000000000000000
	8 : 0x0000000000000000000000000000000000000000000000000000000000000000
	9 : 0x0000000000000000000000000000000000000000000000000000000000000000
	10: 0x0000000000000000000000000000000000000000000000000000000000000000
	11: 0x0000000000000000000000000000000000000000000000000000000000000000
	12: 0x0000000000000000000000000000000000000000000000000000000000000000
	13: 0x0000000000000000000000000000000000000000000000000000000000000000
	14: 0x0000000000000000000000000000000000000000000000000000000000000000
	15: 0x0000000000000000000000000000000000000000000000000000000000000000
	16: 0x0000000000000000000000000000000000000000000000000000000000000000
	17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	23: 0x0000000000000000000000000000000000000000000000000000000000000000

In this PoC we are only interested in PCR0, which must be non-null. This is
because the boot process records all the images in this PCR (see field ``PCRIndex``
on the Event Log above). The rest of the records must be 0 at this point.

.. note::
   The fTPM service used has support only for 16 PCRs, therefore the content
   of PCRs above 15 can be ignored.

.. note::
   As stated earlier, Arm does not provide an fTPM implementation and therefore
   we do not validate here if the content of PCR0 is correct or not. For this
   PoC, we are only focused on the fact that the event log could be passed to a third
   party fTPM and its records were properly extended.

Fine-tuning the fTPM TA
~~~~~~~~~~~~~~~~~~~~~~~

As stated earlier, the OP-TEE Toolkit includes support to build a third party fTPM
service. The build options for this service are tailored for the PoC and defined in
the build environment variable ``FTPM_FLAGS`` (see ``<toolkit_home>/build/common.mk``)
but they can be modified if needed to better adapt it to a specific scenario.

The most relevant options for Measured Boot support are:

   - **CFG_TA_DEBUG**: Enables debug logs in the Terminal_1 console.
   - **CFG_TEE_TA_LOG_LEVEL**: Defines the log level used for the debug messages.
   - **CFG_TA_MEASURED_BOOT**: Enables support for measured boot on the fTPM.
   - **CFG_TA_EVENT_LOG_SIZE**: Defines the size, in bytes, of the larger event log that
     the fTPM is able to store, as this buffer is allocated at build time. This must be at
     least the same as the size of the event log generated by TF-A. If this build option
     is not defined, the fTPM falls back to a default value of 1024 bytes, which is enough
     for this PoC, so this variable is not defined in FTPM_FLAGS.

--------------

*Copyright (c) 2021-2023, Arm Limited. All rights reserved.*

.. _OP-TEE Toolkit: https://github.com/OP-TEE/build
.. _ms-tpm-20-ref: https://github.com/microsoft/ms-tpm-20-ref
.. _Get and build the solution: https://optee.readthedocs.io/en/latest/building/gits/build.html#get-and-build-the-solution
.. _Armv8-A Foundation Platform (For Linux Hosts Only): https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms/arm-ecosystem-models
.. _tpm2-tools: https://github.com/tpm2-software/tpm2-tools
.. _TCG event log: https://trustedcomputinggroup.org/resource/tcg-efi-platform-specification/