15038f1f9SManish V BadarkheMeasured Boot Design 25038f1f9SManish V Badarkhe==================== 35038f1f9SManish V Badarkhe 45038f1f9SManish V BadarkheThis document briefly explains the Measured-Boot design implementation 55038f1f9SManish V Badarkhein |TF-A|. 65038f1f9SManish V Badarkhe 75038f1f9SManish V BadarkheIntroduction 85038f1f9SManish V Badarkhe------------ 95038f1f9SManish V Badarkhe 105038f1f9SManish V BadarkheMeasured Boot is the process of computing and securely recording hashes of code 115038f1f9SManish V Badarkheand critical data at each stage in the boot chain before the code/data is used. 125038f1f9SManish V Badarkhe 135038f1f9SManish V BadarkheThese measurements can be leveraged by other components in the system to 145038f1f9SManish V Badarkheimplement a complete attestation system. For example, they could be used to 155038f1f9SManish V Badarkheenforce local attestation policies (such as releasing certain platform keys or 165038f1f9SManish V Badarkhenot), or they could be securely sent to a remote challenger a.k.a. `verifier` 175038f1f9SManish V Badarkheafter boot to attest to the state of the code and critical-data. 185038f1f9SManish V Badarkhe 195038f1f9SManish V BadarkheMeasured Boot does not authenticate the code or critical-data, but simply 205038f1f9SManish V Badarkherecords what code/critical-data was present on the system during boot. 215038f1f9SManish V Badarkhe 225038f1f9SManish V BadarkheIt is assumed that BL1 is implicitly trusted (by virtue of immutability) and 235038f1f9SManish V Badarkheacts as the root of trust for measurement hence it is not measured. 245038f1f9SManish V Badarkhe 255038f1f9SManish V BadarkheThe Measured Boot implementation in TF-A supports multiple backends to securely 265038f1f9SManish V Badarkhestore measurements mentioned below in the :ref:`Measured Boot Backends` section. 275038f1f9SManish V Badarkhe 285038f1f9SManish V BadarkheCritical data 295038f1f9SManish V Badarkhe------------- 305038f1f9SManish V Badarkhe 315038f1f9SManish V BadarkheAll firmware images - i.e. BLx images and their corresponding configuration 325038f1f9SManish V Badarkhefiles, if any - must be measured. In addition to that, there might be specific 335038f1f9SManish V Badarkhepieces of data which needs to be measured as well. These are typically different 345038f1f9SManish V Badarkheon each platform. They are referred to as *critical data*. 355038f1f9SManish V Badarkhe 365038f1f9SManish V BadarkheCritical data for the platform can be determined using the following criteria: 375038f1f9SManish V Badarkhe 385038f1f9SManish V Badarkhe#. Data that influence boot flow behaviour such as - 395038f1f9SManish V Badarkhe 405038f1f9SManish V Badarkhe - Configuration parameters that alter the boot flow path. 415038f1f9SManish V Badarkhe - Parameters that determine which firmware to load from NV-Storage to 425038f1f9SManish V Badarkhe SRAM/DRAM to pass the boot process successfully. 435038f1f9SManish V Badarkhe 445038f1f9SManish V Badarkhe#. Hardware configurations settings, debug settings and security policies 455038f1f9SManish V Badarkhe that need to be in a valid state for a device to maintain its security 465038f1f9SManish V Badarkhe posture during boot and runtime. 475038f1f9SManish V Badarkhe#. Security-sensitive data that is being updated by hardware. 485038f1f9SManish V Badarkhe 495038f1f9SManish V BadarkheExamples of Critical data: 505038f1f9SManish V Badarkhe 515038f1f9SManish V Badarkhe#. The list of errata workarounds being applied at reset. 525038f1f9SManish V Badarkhe#. State of fuses such as whether an SoC is in secure mode. 535038f1f9SManish V Badarkhe#. NV counters that determine whether firmware is up-to-date and secure. 545038f1f9SManish V Badarkhe 555038f1f9SManish V BadarkheMeasurement slot 565038f1f9SManish V Badarkhe---------------- 575038f1f9SManish V Badarkhe 585038f1f9SManish V BadarkheThe measurement slot resides in a Trusted Module and can be either a secure 595038f1f9SManish V Badarkheregister or memory. 605038f1f9SManish V BadarkheThe measurement slot is used to provide a method to cryptographically record 615038f1f9SManish V Badarkhe(measure) images and critical data on a platform. 625038f1f9SManish V BadarkheThe measurement slot update calculation, called an **extend** operation, is 635038f1f9SManish V Badarkhea one-way hash of all the previous measurements and the new measurement. It 645038f1f9SManish V Badarkheis the only way to change the slot value, thus no measurements can ever be 655038f1f9SManish V Badarkheremoved or overwritten. 665038f1f9SManish V Badarkhe 675038f1f9SManish V Badarkhe.. _Measured Boot Backends: 685038f1f9SManish V Badarkhe 695038f1f9SManish V BadarkheMeasured Boot Backends 705038f1f9SManish V Badarkhe---------------------- 715038f1f9SManish V Badarkhe 725038f1f9SManish V BadarkheThe Measured Boot implementation in TF-A supports: 735038f1f9SManish V Badarkhe 745038f1f9SManish V Badarkhe#. Event Log 755038f1f9SManish V Badarkhe 765038f1f9SManish V Badarkhe The TCG Event Log holds a record of measurements made into the Measurement 775038f1f9SManish V Badarkhe Slot aka PCR (Platform Configuration Register). 785038f1f9SManish V Badarkhe 795038f1f9SManish V Badarkhe The `TCG EFI Protocol Specification`_ provides details on how to measure 805038f1f9SManish V Badarkhe components. The Arm document 815038f1f9SManish V Badarkhe `Arm® Server Base Security Guide`_ provides specific guidance for 825038f1f9SManish V Badarkhe measurements on an SBSA/SBBR server system. By considering these 835038f1f9SManish V Badarkhe specifications it is decided that - 845038f1f9SManish V Badarkhe 855038f1f9SManish V Badarkhe #. Use PCR0 for images measurements. 865038f1f9SManish V Badarkhe #. Use PCR1 for Critical data measurements. 875038f1f9SManish V Badarkhe 885038f1f9SManish V Badarkhe TCG has specified the architecture for the structure of this log in the 895038f1f9SManish V Badarkhe `TCG EFI Protocol Specification`_. The specification describes two event 905038f1f9SManish V Badarkhe log event records—the legacy, fixed size SHA1 structure called TCG_PCR_EVENT 915038f1f9SManish V Badarkhe and the variable length crypto agile structure called TCG_PCR_EVENT2. Event 925038f1f9SManish V Badarkhe Log driver implemented in TF-A covers later part. 935038f1f9SManish V Badarkhe 94*e4582e42STamas Ban#. |RSE| 955038f1f9SManish V Badarkhe 96*e4582e42STamas Ban It is one of the physical backends to extend the measurements. Please refer 97*e4582e42STamas Ban this document :ref:`Runtime Security Engine (RSE)` for more details. 985038f1f9SManish V Badarkhe 995038f1f9SManish V BadarkhePlatform Interface 1005038f1f9SManish V Badarkhe------------------ 1015038f1f9SManish V Badarkhe 1025038f1f9SManish V BadarkheEvery image which gets successfully loaded in memory (and authenticated, if 1035038f1f9SManish V Badarkhetrusted boot is enabled) then gets measured. In addition to that, platforms 1045038f1f9SManish V Badarkhecan measure any relevant piece of critical data at any point during the boot. 1055038f1f9SManish V BadarkheThe following diagram outlines the call sequence for Measured Boot platform 1065038f1f9SManish V Badarkheinterfaces invoked from generic code: 1075038f1f9SManish V Badarkhe 1085038f1f9SManish V Badarkhe.. image:: ../resources/diagrams/measured_boot_design.png 1095038f1f9SManish V Badarkhe 1105038f1f9SManish V BadarkheThese platform interfaces are used by BL1 and BL2 only, and are declared in 1115038f1f9SManish V Badarkhe``include/plat/common/platform.h``. 1125038f1f9SManish V BadarkheBL31 does not load and thus does not measure any image. 1135038f1f9SManish V Badarkhe 1145038f1f9SManish V BadarkheResponsibilities of these platform interfaces are - 1155038f1f9SManish V Badarkhe 1165038f1f9SManish V Badarkhe#. **Function : blx_plat_mboot_init()** 1175038f1f9SManish V Badarkhe 1185038f1f9SManish V Badarkhe .. code-block:: c 1195038f1f9SManish V Badarkhe 1205038f1f9SManish V Badarkhe void bl1_plat_mboot_init(void); 1215038f1f9SManish V Badarkhe void bl2_plat_mboot_init(void); 1225038f1f9SManish V Badarkhe 1235038f1f9SManish V Badarkhe Initialise all Measured Boot backends supported by the platform 124*e4582e42STamas Ban (e.g. Event Log buffer, |RSE|). As these functions do not return any value, 1255038f1f9SManish V Badarkhe the platform should deal with error management, such as logging the error 1265038f1f9SManish V Badarkhe somewhere, or panicking the system if this is considered a fatal error. 1275038f1f9SManish V Badarkhe 1285038f1f9SManish V Badarkhe - On the Arm FVP port - 1295038f1f9SManish V Badarkhe 1305038f1f9SManish V Badarkhe - In BL1, this function is used to initialize the Event Log backend 1315038f1f9SManish V Badarkhe driver, and also to write header information in the Event Log 1325038f1f9SManish V Badarkhe buffer. 1335038f1f9SManish V Badarkhe - In BL2, this function is used to initialize the Event Log buffer with 1345038f1f9SManish V Badarkhe the information received from the BL1. It results in panic on 1355038f1f9SManish V Badarkhe error. 1365038f1f9SManish V Badarkhe 1375038f1f9SManish V Badarkhe#. **Function : plat_mboot_measure_image()** 1385038f1f9SManish V Badarkhe 1395038f1f9SManish V Badarkhe .. code-block:: c 1405038f1f9SManish V Badarkhe 1415038f1f9SManish V Badarkhe int plat_mboot_measure_image(unsigned int image_id, 1425038f1f9SManish V Badarkhe image_info_t *image_data); 1435038f1f9SManish V Badarkhe 1445038f1f9SManish V Badarkhe - Measure the image using a hash function of the crypto module. 1455038f1f9SManish V Badarkhe 1465038f1f9SManish V Badarkhe - Record the measurement in the corresponding backend - 1475038f1f9SManish V Badarkhe 1485038f1f9SManish V Badarkhe - If it is Event Log backend, then record the measurement in TCG Event Log 1495038f1f9SManish V Badarkhe format. 150*e4582e42STamas Ban - If it is a secure crypto-processor (like |RSE|), then extend the 151*e4582e42STamas Ban designated PCR (or store it in secure on-chip memory) with the given 152*e4582e42STamas Ban measurement. 1535038f1f9SManish V Badarkhe - This function must return 0 on success, a signed integer error code 1545038f1f9SManish V Badarkhe otherwise. 1555038f1f9SManish V Badarkhe - On the Arm FVP port, this function measures the given image and then 1565038f1f9SManish V Badarkhe records that measurement in the Event Log buffer. 1575038f1f9SManish V Badarkhe The passed id is used to retrieve information about on how to measure 1585038f1f9SManish V Badarkhe the image (e.g. PCR number). 1595038f1f9SManish V Badarkhe 1605038f1f9SManish V Badarkhe#. **Function : blx_plat_mboot_finish()** 1615038f1f9SManish V Badarkhe 1625038f1f9SManish V Badarkhe .. code-block:: c 1635038f1f9SManish V Badarkhe 1645038f1f9SManish V Badarkhe void bl1_plat_mboot_finish(void); 1655038f1f9SManish V Badarkhe void bl2_plat_mboot_finish(void); 1665038f1f9SManish V Badarkhe 1675038f1f9SManish V Badarkhe - Do all teardown operations with respect to initialised Measured Boot backends. 1685038f1f9SManish V Badarkhe This could be - 1695038f1f9SManish V Badarkhe 1705038f1f9SManish V Badarkhe - Pass the Event Log details (start address and size) to Normal world or to 1715038f1f9SManish V Badarkhe Secure World using any platform implementation way. 1725038f1f9SManish V Badarkhe - Measure all critical data if any. 1735038f1f9SManish V Badarkhe - As these functions do not return any value, the platform should deal with 1745038f1f9SManish V Badarkhe error management, such as logging the error somewhere, or panicking the 1755038f1f9SManish V Badarkhe system if this is considered a fatal error. 1765038f1f9SManish V Badarkhe 1775038f1f9SManish V Badarkhe - On the Arm FVP port - 1785038f1f9SManish V Badarkhe 1795038f1f9SManish V Badarkhe - In BL1, this function is used to pass the base address of 1805038f1f9SManish V Badarkhe the Event Log buffer and its size to BL2 via tb_fw_config to extend the 1815038f1f9SManish V Badarkhe Event Log buffer with the measurement of various images loaded by BL2. 1825038f1f9SManish V Badarkhe It results in panic on error. 1835038f1f9SManish V Badarkhe - In BL2, this function is used to pass the Event Log buffer information 1845038f1f9SManish V Badarkhe (base address and size) to non-secure(BL33) and trusted OS(BL32) via 1855038f1f9SManish V Badarkhe nt_fw and tos_fw config respectively. 1865038f1f9SManish V Badarkhe See :ref:`DTB binding for Event Log properties` for a description of the 1875038f1f9SManish V Badarkhe bindings used for Event Log properties. 1885038f1f9SManish V Badarkhe 1895038f1f9SManish V Badarkhe#. **Function : plat_mboot_measure_critical_data()** 1905038f1f9SManish V Badarkhe 1915038f1f9SManish V Badarkhe .. code-block:: c 1925038f1f9SManish V Badarkhe 1935038f1f9SManish V Badarkhe int plat_mboot_measure_critical_data(unsigned int critical_data_id, 1945038f1f9SManish V Badarkhe const void *base, 1955038f1f9SManish V Badarkhe size_t size); 1965038f1f9SManish V Badarkhe 1975038f1f9SManish V Badarkhe This interface is not invoked by the generic code and it is up to the 1985038f1f9SManish V Badarkhe platform layer to call it where appropriate. 1995038f1f9SManish V Badarkhe 2005038f1f9SManish V Badarkhe This function measures the given critical data structure and records its 2015038f1f9SManish V Badarkhe measurement using the Measured Boot backend driver. 2025038f1f9SManish V Badarkhe This function must return 0 on success, a signed integer error code 2035038f1f9SManish V Badarkhe otherwise. 2045038f1f9SManish V Badarkhe 2055038f1f9SManish V Badarkhe In FVP, Non volatile counters get measured and recorded as Critical data 2065038f1f9SManish V Badarkhe using the backend via this interface. 2075038f1f9SManish V Badarkhe 20897653189SManish V Badarkhe#. **Function : plat_mboot_measure_key()** 20997653189SManish V Badarkhe 21097653189SManish V Badarkhe .. code-block:: c 21197653189SManish V Badarkhe 21297653189SManish V Badarkhe int plat_mboot_measure_key(const void *pk_oid, const void *pk_ptr, 21397653189SManish V Badarkhe size_t pk_len); 21497653189SManish V Badarkhe 21597653189SManish V Badarkhe - This function is used by the platform to measure the passed key and 21697653189SManish V Badarkhe publicise it using any of the supported backends. 21797653189SManish V Badarkhe - The authentication module within the trusted boot framework calls this 21897653189SManish V Badarkhe function for every ROTPK involved in verifying the signature of a root 21997653189SManish V Badarkhe certificate and for every subsidiary key that gets extracted from a key 22097653189SManish V Badarkhe certificate for later authentication of a content certificate. 22197653189SManish V Badarkhe - A cookie, passed as the first argument, serves as a key-OID pointer 22297653189SManish V Badarkhe associated with the public key data, passed as the second argument. 22397653189SManish V Badarkhe - Public key data size is passed as the third argument to this function. 22497653189SManish V Badarkhe - This function must return 0 on success, a signed integer error code 22597653189SManish V Badarkhe otherwise. 226dea307fdSManish V Badarkhe - In TC2 platform, this function is used to calculate the hash of the given 227*e4582e42STamas Ban key and forward this hash to |RSE| alongside the measurement of the image 22897653189SManish V Badarkhe which the key signs. 22997653189SManish V Badarkhe 2305038f1f9SManish V Badarkhe-------------- 2315038f1f9SManish V Badarkhe 2325038f1f9SManish V Badarkhe*Copyright (c) 2023, Arm Limited. All rights reserved.* 2335038f1f9SManish V Badarkhe 2345038f1f9SManish V Badarkhe.. _Arm® Server Base Security Guide: https://developer.arm.com/documentation/den0086/latest 2355038f1f9SManish V Badarkhe.. _TCG EFI Protocol Specification: https://trustedcomputinggroup.org/wp-content/uploads/EFI-Protocol-Specification-rev13-160330final.pdf 236