运行时安全引擎RSE

安全之安全(security²)博客目录导读

目录

[一、RSE 通信层](#一、RSE 通信层)

[1.1 消息结构](#1.1 消息结构)

[1.2 源代码文件](#1.2 源代码文件)

[1.3 MHU 通信的 API](#1.3 MHU 通信的 API)

[二、RSE 提供的运行时服务](#二、RSE 提供的运行时服务)

[2.1 运行时服务 API](#2.1 运行时服务 API)

[2.2 软件与 API 层次结构](#2.2 软件与 API 层次结构)

[三、基于 RSE 的 Measured Boot(度量启动)](#三、基于 RSE 的 Measured Boot(度量启动))

[3.1 Measured Boot API](#3.1 Measured Boot API)

[3.2 Measured Boot 元数据](#3.2 Measured Boot 元数据)

[3.3 Signer-ID API](#3.3 Signer-ID API)

[3.4 构建时配置选项](#3.4 构建时配置选项)

[3.5 Measured Boot 流程](#3.5 Measured Boot 流程)

[3.6. 控制台日志样例](#3.6. 控制台日志样例)

[四、委托认证(Delegated Attestation)](#四、委托认证(Delegated Attestation))

[4.1. 委托认证 API](#4.1. 委托认证 API)

[4.2. 认证流程](#4.2. 认证流程)

[4.3. 证明令牌示例](#4.3. 证明令牌示例)

[五、基于 RSE 的 DICE 保护环境(DPE)](#五、基于 RSE 的 DICE 保护环境(DPE))

[5.1. DPE API](#5.1. DPE API)

[5.2. 构建时配置选项](#5.2. 构建时配置选项)

[5.3. 示例证书链](#5.3. 示例证书链)

[六、RSE OTP 资产管理](#六、RSE OTP 资产管理)

[6.1. 非易失性计数器 API](#6.1. 非易失性计数器 API)

[6.2. 公钥 API](#6.2. 公钥 API)

[6.3. 获取熵的 API](#6.3. 获取熵的 API)


该博客重点介绍了运行时安全引擎(Runtime Security Engine,简称 RSE)与应用处理器(Application Processor,简称 AP)之间的关系。

根据 ARM 的参考设计,RSE 是位于同一芯片(die)上的一个独立核心,与 AP 和系统控制处理器(System Control Processor,简称 SCP)并列存在。RSE 为整个系统提供基本的安全保障和运行时服务,例如:可信启动(trusted boot)、度量启动(measured boot)、平台认证(platform attestation)、密钥管理与派生(key management and key derivation)等。

在系统上电时,RSE 首先从其私有的 ROM 代码启动。它会验证并加载自身的镜像文件以及 SCP 和 AP 的初始镜像。当 AP 和 SCP 被解复位,且其初始代码被加载后,它们将继续各自的启动流程,这一流程与没有 RSE 的系统相同。关于 RSE 启动流程的更多细节,请参见 RSE 文档 。

RSE 固件的最后阶段是一个常驻的运行时组件。类似于 AP 的 BL31,它是一个被动实体,没有周期性任务,仅在收到其他子系统的外部请求时才进行响应。RSE 与其他子系统之间通过消息交换进行通信。RSE 在空闲状态下等待传入请求,处理请求后发送响应,然后再次进入空闲状态。


一、RSE 通信层

RSE 与其他子系统之间的通信主要依赖于消息处理单元(Message Handling Unit,简称 MHU)模块。

不过,也可以使用不同于 MHU 的邮箱(mailbox)来实现该通信协议,只需将编译标志 PLAT_MHU=NO_MHU 设置为不使用 MHU,并实现 include/drivers/arm/rse_comms.h 文件中提供的 API。

RSE 与其他核心之间的 MHU 接口数量由实现定义(IMPDEF)。除 MHU 外,其他模块也可以参与通信。RSE 能够将 AP 的内存映射到自身的地址空间,因此无论是 RSE 核心自身,还是(如果存在的话)DMA 引擎,都可以在 RSE 与 AP 所属内存之间传输数据。这种方式可以在较短时间内传输大量数据。

MHU 成对出现,包括一个发送端和一个接收端,它们相互连接。一个 MHU 接口包含两个 MHU 对:在两端各有一个发送端和一个接收端。一个接口支持双向通信,一对用于从 AP 向 RSE 发送消息,另一对用于从 RSE 向 AP 发送消息。发送器和接收器通过通道连接,一个发送器与一个接收器之间有若干通道(例如:4--16 个通道,具体数量由实现定义)。

RSE 通信层提供两种消息交换方式:


嵌入式消息(Embedded messaging)

完整消息(包括头部和负载)通过 MHU 通道交换。一个通道只能传输一个字(word)。发送方将数据写入自己一侧的通道寄存器,接收方从对侧通道读取数据。有一个专用通道用于信号通知,它本身不传输任何有效负载,仅用于表示发送方已将数据写入通道寄存器,接收方即可读取;接收方也通过同一个通道返回信号表示数据已读取。信号传递通过中断(IRQ)完成。如果消息长度超过通道寄存器的容量,则消息需要分多轮传输。发送方和接收方都会为消息分配本地缓冲区,数据将在缓冲区与通道寄存器之间进行拷贝。


指针访问消息(Pointer-access messaging)

消息头与负载分离,并通过不同方式传输。头部通过通道发送,类似于嵌入式消息,而负载部分则由 RSE 核心(或 DMA)在发送方和接收方之间拷贝。这种方式适用于长消息,因为相比嵌入式方式,事务处理时间更短。小型负载一般由 RSE 核心处理,因为设置 DMA 所需的 CPU 周期更多。负载可以被拷贝到内部缓冲区,或者被 RSE 直接读写,具体行为取决于 RSE 配置,以及分区是否支持内存映射的 iovec。因此,发送方必须同时处理这两种情况,并在 RSE 处理请求期间防止访问负载数据所在的内存区域。


RSE 通信层支持两种消息方式并行使用。具体采用哪种方式,会根据消息大小在运行时决定。

【注意】 RSE 通信层不支持并发执行 。当前的使用场景仅要求在启动阶段进行消息交换。在启动阶段,仅有一个核心在运行,其余核心仍处于复位状态。


1.1 消息结构

有关消息格式的说明,请参见《RSE 通信设计》文档 。


1.2 源代码文件

  • RSE 通信模块:drivers/arm/rse

  • MHU 驱动模块:drivers/arm/mhu


1.3 MHU 通信的 API

相关 API 定义在以下头文件中:

  • include/drivers/arm/rse_comms.h

  • include/drivers/arm/mhu.h


二、RSE 提供的运行时服务

RSE 提供以下运行时服务:

  • 度量启动(Measured Boot):安全存储在启动过程中计算出的固件度量值及相关元数据(如镜像描述、度量算法等)。有关此服务的更多信息,请参见《measured_boot_integration_guide》文档 。

  • 委托认证(Delegated Attestation):查询平台认证令牌,并派生出委托认证密钥。相关细节可参考《delegated_attestation_integration_guide》文档 。

  • OTP 资产管理(OTP Assets Management) :AP 在可信启动过程中使用的公钥可以从 RSE 请求获取。此外,AP 还可请求 RSE 增加一个非易失性计数器。详情请参考《RSE Key Management》文档 。

  • DICE 安全环境(DICE Protection Environment):安全存储启动过程中计算的固件度量值及元数据,还能以证书链的形式表示启动度量结果,并支持外部查询。详见《DICE Protection Environment(DPE)》文档 。


2.1 运行时服务 API

RSE 提供的运行时服务实现了与 PSA(Platform Security Architecture)对齐的 API。参数编码遵循《Firmware Framework for M》文档第 4.4 章中描述的 PSA 客户端协议。

该实现限定为**静态句柄(static handle)**的使用场景,因此仅实现了 psa_call API。


2.2 软件与 API 层次结构

三、基于 RSE 的 Measured Boot(度量启动)

Measured Boot 是一种在启动过程中对代码和关键数据进行加密度量(即计算其哈希值)的机制。这些度量值必须以防篡改的方式进行存储,以便设备在之后能向外部方证明其安全状态。RSE 提供了一个运行时服务,用于存储这些度量值及其相关元数据。

数据被存储在 RSE 内部的 SRAM 中,仅能由 RSE 的安全运行时固件访问。这些数据存储在所谓的"度量槽(measurement slots)"中。每个平台具有平台自定义(IMPDEF)数量的度量槽。

度量存储采用"扩展(extend)"语义。即度量值不会被直接存储,而是参与生成当前度量槽的新值。其扩展逻辑如下(|| 表示连接):

cpp 复制代码
new_value_of_measurement_slot = Hash(old_value_of_measurement_slot || measurement)

支持的哈希算法包括:sha-256sha-512


3.1 Measured Boot API

定义在:

include/lib/psa/measured_boot.h

函数原型如下:

cpp 复制代码
psa_status_t
rse_measured_boot_extend_measurement(uint8_t        index,
                                     const uint8_t *signer_id,
                                     size_t         signer_id_size,
                                     const uint8_t *version,
                                     size_t         version_size,
                                     uint32_t       measurement_algo,
                                     const uint8_t *sw_type,
                                     size_t         sw_type_size,
                                     const uint8_t *measurement_value,
                                     size_t         measurement_value_size,
                                     bool           lock_measurement);

3.2 Measured Boot 元数据

可与度量值一同存储的元数据包括:

  • Signer-id(签名者ID):必选项。为固件镜像签名公钥的哈希值。

  • Measurement algorithm(度量算法):可选项。用于计算度量值的哈希算法(例如:sha-256)。

  • Version info(版本信息):可选项,例如 "2.7"。

  • SW type(软件类型):可选项,简要文本描述(例如:BL1、BL2、BL31)。

注意:TF-A 当前尚未实现版本信息字段的支持。

调用者必须指定在哪个度量槽中扩展度量值及其元数据。一个槽位可以被多次扩展。所有度量槽在复位时清空,不能手动清空。在参考实现中,槽初始值为 0,第一次调用 extend 操作时使用默认值,后续操作继续基于前值进行扩展。

当对同一个槽位多次扩展时,遵循以下规则:

  • Signer-id 必须与之前一致,否则返回 PSA_ERROR_NOT_PERMITTED

  • Measurement algorithm 也必须一致,否则也会返回相同错误码。

  • 出现错误时不会采取进一步操作(槽不会被锁定)。如果后续调用中数据合法,则仍可继续扩展该槽。

  • 对于其他元数据处理:

    • SW type 会被清除。

    • Version info 也会被清除。

注意:在同一槽内扩展多个度量值会导致元数据信息丢失。由于 RSE 在存储方面不受专用硬件限制,因此建议为每个度量值分配独立槽位。但请注意,每个独立的度量值都将被包含在平台认证令牌中,因此度量项的数量会影响认证令牌的体积。

度量槽在 RSE、Root 和 Realm 世界之间的分配由平台决定,且需在构建时配置。示例参考:

tf-a/plat/arm/board/tc/tc_bl1_measured_boot.c

此外,存储元数据的内存也在 RSE 内部静态分配。部分字段为静态值(如算法),而如度量值等字段为动态值,由 Bootloader 在加载并度量固件时更新。

元数据结构定义如下:

cpp 复制代码
struct rse_mboot_metadata {
        unsigned int id;
        uint8_t slot;
        uint8_t signer_id[SIGNER_ID_MAX_SIZE];
        size_t  signer_id_size;
        uint8_t version[VERSION_MAX_SIZE];
        size_t  version_size;
        uint8_t sw_type[SW_TYPE_MAX_SIZE];
        size_t  sw_type_size;
        void    *pk_oid;
        bool    lock_measurement;
};

3.3 Signer-ID API

此函数使用指定度量算法对公钥(即签名者ID)进行哈希运算,并将结果存储在 rse_mboot_metadata 结构中的 signer_id 字段中。调用该函数前,必须确保 signer_id 字段所指向的缓冲区被清零。

定义于:

include/drivers/measured_boot/rse/rse_measured_boot.h

函数原型如下:

cpp 复制代码
int rse_mboot_set_signer_id(struct rse_mboot_metadata *metadata_ptr,
                            const void *pk_oid,
                            const void *pk_ptr,
                            size_t pk_len)
  • 第一个参数:指向 rse_mboot_metadata 结构的指针;

  • 第二个参数:公钥的 key-OID 指针;

  • 第三个参数:公钥缓冲区指针;

  • 第四个参数:公钥缓冲区长度。

  • 返回值:成功返回 0,失败返回负整数错误码。


3.4 构建时配置选项

  • MEASURED_BOOT:启用度量启动功能;

  • MBOOT_RSE_HASH_ALG:指定用于度量镜像的哈希算法。默认值为 sha-256


3.5 Measured Boot 流程

3.6. 控制台日志样例

cpp 复制代码
INFO:    Measured boot extend measurement:
INFO:     - slot        : 6
INFO:     - signer_id   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
INFO:                   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
INFO:     - version     :
INFO:     - version_size: 0
INFO:     - sw_type     : FW_CONFIG
INFO:     - sw_type_size: 10
INFO:     - algorithm   : 2000009
INFO:     - measurement : aa ea d3 a7 a8 e2 ab 7d 13 a6 cb 34 99 10 b9 a1
INFO:                   : 1b 9f a0 52 c5 a8 b1 d7 76 f2 c1 c1 ef ca 1a df
INFO:     - locking     : true
INFO:    FCONF: Config file with image ID:31 loaded at address = 0x4001010
INFO:    Loading image id=24 at address 0x4001300
INFO:    Image id=24 loaded: 0x4001300 - 0x400153a
INFO:    Measured boot extend measurement:
INFO:     - slot        : 7
INFO:     - signer_id   : b0 f3 82 09 12 97 d8 3a 37 7a 72 47 1b ec 32 73
INFO:                   : e9 92 32 e2 49 59 f6 5e 8b 4a 4a 46 d8 22 9a da
INFO:     - version     :
INFO:     - version_size: 0
INFO:     - sw_type     : TB_FW_CONFIG
INFO:     - sw_type_size: 13
INFO:     - algorithm   : 2000009
INFO:     - measurement : 05 b9 dc 98 62 26 a7 1c 2d e5 bb af f0 90 52 28
INFO:                   : f2 24 15 8a 3a 56 60 95 d6 51 3a 7a 1a 50 9b b7
INFO:     - locking     : true
INFO:    FCONF: Config file with image ID:24 loaded at address = 0x4001300
INFO:    BL1: Loading BL2
INFO:    Loading image id=1 at address 0x404d000
INFO:    Image id=1 loaded: 0x404d000 - 0x406412a
INFO:    Measured boot extend measurement:
INFO:     - slot        : 8
INFO:     - signer_id   : b0 f3 82 09 12 97 d8 3a 37 7a 72 47 1b ec 32 73
INFO:                   : e9 92 32 e2 49 59 f6 5e 8b 4a 4a 46 d8 22 9a da
INFO:     - version     :
INFO:     - version_size: 0
INFO:     - sw_type     : BL_2
INFO:     - sw_type_size: 5
INFO:     - algorithm   : 2000009
INFO:     - measurement : 53 a1 51 75 25 90 fb a1 d9 b8 c8 34 32 3a 01 16
INFO:                   : c9 9e 74 91 7d 28 02 56 3f 5c 40 94 37 58 50 68
INFO:     - locking     : true

四、委托认证(Delegated Attestation)

委托认证服务 主要是为支持 ARM 机密计算架构(ARM CCA) 中的认证流程而开发的。关于该服务的详细描述可参见《Delegated Attestation Service Integration Guide》文档。

在 CCA 的使用场景中,Realm 管理监控器(RMM) 依赖 RSE 的委托认证服务 来获取 Realm 认证密钥CCA 平台认证令牌(Platform Token)BL31 本身不使用该服务,只是代表 RMM 发起调用。 MHU 接口(也即 RSE 的访问)仅限 BL31 访问。因此,RMM 无法直接访问 RSE,所有请求都必须通过 BL31 进行中转。BL31 中的 RMM 分发模块(dispatcher module) 负责在 RMM 和 RSE 之间传递这些调用。


4.1. 委托认证 API

定义于:

include/lib/psa/delegated_attestation.h

API 原型如下:

cpp 复制代码
psa_status_t
rse_delegated_attest_get_delegated_key(uint8_t   ecc_curve,
                                       uint32_t  key_bits,
                                       uint8_t  *key_buf,
                                       size_t    key_buf_size,
                                       size_t   *key_size,
                                       uint32_t  hash_algo);

psa_status_t
rse_delegated_attest_get_token(const uint8_t *dak_pub_hash,
                               size_t         dak_pub_hash_size,
                               uint8_t       *token_buf,
                               size_t         token_buf_size,
                               size_t        *token_size);

功能:从 RSE 获取 委托认证密钥(Delegated Attestation Key, DAK)

  • ecc_curve:椭圆曲线类型

  • key_bits:密钥位数

  • key_buf:用于存储返回密钥的缓冲区

  • key_buf_size:缓冲区大小

  • key_size:实际返回密钥的大小

  • hash_algo:使用的哈希算法

功能:从 RSE 获取 平台认证令牌(Platform Token)

  • dak_pub_hash:委托认证公钥的哈希值

  • dak_pub_hash_size:公钥哈希值的长度

  • token_buf:用于存储返回令牌的缓冲区

  • token_buf_size:缓冲区大小

  • token_size:实际返回令牌的大小


4.2. 认证流程

4.3. 证明令牌示例

二进制格式:

cpp 复制代码
INFO:    DELEGATED ATTEST TEST START
INFO:    Get delegated attestation key start
INFO:    Get delegated attest key succeeds, len: 48
INFO:    Delegated attest key:
INFO:            0d 2a 66 61 d4 89 17 e1 70 c6 73 56 df f4 11 fd
INFO:            7d 1f 3b 8a a3 30 3d 70 4c d9 06 c3 c7 ef 29 43
INFO:            0f ee b5 e7 56 e0 71 74 1b c4 39 39 fd 85 f6 7b
INFO:    Get platform token start
INFO:    Get platform token succeeds, len: 1086
INFO:    Platform attestation token:
INFO:            d2 84 44 a1 01 38 22 a0 59 05 81 a9 19 01 09 78
INFO:            23 74 61 67 3a 61 72 6d 2e 63 6f 6d 2c 32 30 32
INFO:            33 3a 63 63 61 5f 70 6c 61 74 66 6f 72 6d 23 31
INFO:            2e 30 2e 30 0a 58 20 0d 22 e0 8a 98 46 90 58 48
INFO:            63 18 28 34 89 bd b3 6f 09 db ef eb 18 64 df 43
INFO:            3f a6 e5 4e a2 d7 11 19 09 5c 58 20 7f 45 4c 46
INFO:            02 01 01 00 00 00 00 00 00 00 00 00 03 00 3e 00
INFO:            01 00 00 00 50 58 00 00 00 00 00 00 19 01 00 58
INFO:            21 01 07 06 05 04 03 02 01 00 0f 0e 0d 0c 0b 0a
INFO:            09 08 17 16 15 14 13 12 11 10 1f 1e 1d 1c 1b 1a
INFO:            19 18 19 09 61 44 cf cf cf cf 19 09 5b 19 30 03
INFO:            19 09 62 67 73 68 61 2d 32 35 36 19 09 60 78 3a
INFO:            68 74 74 70 73 3a 2f 2f 76 65 72 61 69 73 6f 6e
INFO:            2e 65 78 61 6d 70 6c 65 2f 2e 77 65 6c 6c 2d 6b
INFO:            6e 6f 77 6e 2f 76 65 72 61 69 73 6f 6e 2f 76 65
INFO:            72 69 66 69 63 61 74 69 6f 6e 19 09 5f 8d a4 01
INFO:            69 52 53 45 5f 42 4c 31 5f 32 05 58 20 53 78 79
INFO:            63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO:            3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO:            9a 27 1f 2a 91 6b 0b 6e e6 ce cb 24 26 f0 b3 20
INFO:            6e f0 74 57 8b e5 5d 9b c9 4f 6f 3f e3 ab 86 aa
INFO:            06 67 73 68 61 2d 32 35 36 a4 01 67 52 53 45 5f
INFO:            42 4c 32 05 58 20 53 78 79 63 07 53 5d f3 ec 8d
INFO:            8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38
INFO:            c0 fa 97 3f 7a a3 02 58 20 53 c2 34 e5 e8 47 2b
INFO:            6a c5 1c 1a e1 ca b3 fe 06 fa d0 53 be b8 eb fd
INFO:            89 77 b0 10 65 5b fd d3 c3 06 67 73 68 61 2d 32
INFO:            35 36 a4 01 65 52 53 45 5f 53 05 58 20 53 78 79
INFO:            63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO:            3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO:            11 21 cf cc d5 91 3f 0a 63 fe c4 0a 6f fd 44 ea
INFO:            64 f9 dc 13 5c 66 63 4b a0 01 d1 0b cf 43 02 a2
INFO:            06 67 73 68 61 2d 32 35 36 a4 01 66 41 50 5f 42
INFO:            4c 31 05 58 20 53 78 79 63 07 53 5d f3 ec 8d 8b
INFO:            15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38 c0
INFO:            fa 97 3f 7a a3 02 58 20 15 71 b5 ec 78 bd 68 51
INFO:            2b f7 83 0b b6 a2 a4 4b 20 47 c7 df 57 bc e7 9e
INFO:            b8 a1 c0 e5 be a0 a5 01 06 67 73 68 61 2d 32 35
INFO:            36 a4 01 66 41 50 5f 42 4c 32 05 58 20 53 78 79
INFO:            63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO:            3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO:            10 15 9b af 26 2b 43 a9 2d 95 db 59 da e1 f7 2c
INFO:            64 51 27 30 16 61 e0 a3 ce 4e 38 b2 95 a9 7c 58
INFO:            06 67 73 68 61 2d 32 35 36 a4 01 67 53 43 50 5f
INFO:            42 4c 31 05 58 20 53 78 79 63 07 53 5d f3 ec 8d
INFO:            8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38
INFO:            c0 fa 97 3f 7a a3 02 58 20 10 12 2e 85 6b 3f cd
INFO:            49 f0 63 63 63 17 47 61 49 cb 73 0a 1a a1 cf aa
INFO:            d8 18 55 2b 72 f5 6d 6f 68 06 67 73 68 61 2d 32
INFO:            35 36 a4 01 67 53 43 50 5f 42 4c 32 05 58 20 f1
INFO:            4b 49 87 90 4b cb 58 14 e4 45 9a 05 7e d4 d2 0f
INFO:            58 a6 33 15 22 88 a7 61 21 4d cd 28 78 0b 56 02
INFO:            58 20 aa 67 a1 69 b0 bb a2 17 aa 0a a8 8a 65 34
INFO:            69 20 c8 4c 42 44 7c 36 ba 5f 7e a6 5f 42 2c 1f
INFO:            e5 d8 06 67 73 68 61 2d 32 35 36 a4 01 67 41 50
INFO:            5f 42 4c 33 31 05 58 20 53 78 79 63 07 53 5d f3
INFO:            ec 8d 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3
INFO:            22 38 c0 fa 97 3f 7a a3 02 58 20 2e 6d 31 a5 98
INFO:            3a 91 25 1b fa e5 ae fa 1c 0a 19 d8 ba 3c f6 01
INFO:            d0 e8 a7 06 b4 cf a9 66 1a 6b 8a 06 67 73 68 61
INFO:            2d 32 35 36 a4 01 63 52 4d 4d 05 58 20 53 78 79
INFO:            63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO:            3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO:            a1 fb 50 e6 c8 6f ae 16 79 ef 33 51 29 6f d6 71
INFO:            34 11 a0 8c f8 dd 17 90 a4 fd 05 fa e8 68 81 64
INFO:            06 67 73 68 61 2d 32 35 36 a4 01 69 48 57 5f 43
INFO:            4f 4e 46 49 47 05 58 20 53 78 79 63 07 53 5d f3
INFO:            ec 8d 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3
INFO:            22 38 c0 fa 97 3f 7a a3 02 58 20 1a 25 24 02 97
INFO:            2f 60 57 fa 53 cc 17 2b 52 b9 ff ca 69 8e 18 31
INFO:            1f ac d0 f3 b0 6e ca ae f7 9e 17 06 67 73 68 61
INFO:            2d 32 35 36 a4 01 69 46 57 5f 43 4f 4e 46 49 47
INFO:            05 58 20 53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2
INFO:            e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97
INFO:            3f 7a a3 02 58 20 9a 92 ad bc 0c ee 38 ef 65 8c
INFO:            71 ce 1b 1b f8 c6 56 68 f1 66 bf b2 13 64 4c 89
INFO:            5c cb 1a d0 7a 25 06 67 73 68 61 2d 32 35 36 a4
INFO:            01 6c 54 42 5f 46 57 5f 43 4f 4e 46 49 47 05 58
INFO:            20 53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc
INFO:            56 41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a
INFO:            a3 02 58 20 23 89 03 18 0c c1 04 ec 2c 5d 8b 3f
INFO:            20 c5 bc 61 b3 89 ec 0a 96 7d f8 cc 20 8c dc 7c
INFO:            d4 54 17 4f 06 67 73 68 61 2d 32 35 36 a4 01 6d
INFO:            53 4f 43 5f 46 57 5f 43 4f 4e 46 49 47 05 58 20
INFO:            53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56
INFO:            41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3
INFO:            02 58 20 e6 c2 1e 8d 26 0f e7 18 82 de bd b3 39
INFO:            d2 40 2a 2c a7 64 85 29 bc 23 03 f4 86 49 bc e0
INFO:            38 00 17 06 67 73 68 61 2d 32 35 36 58 60 31 d0
INFO:            4d 52 cc de 95 2c 1e 32 cb a1 81 88 5a 40 b8 cc
INFO:            38 e0 52 8c 1e 89 58 98 07 64 2a a5 e3 f2 bc 37
INFO:            f9 53 74 50 6b ff 4d 2e 4b e7 06 3c 4d 72 41 92
INFO:            70 c7 22 e8 d4 d9 3e e8 b6 c9 fa ce 3b 43 c9 76
INFO:            1a 49 94 1a b6 f3 8f fd ff 49 6a d4 63 b4 cb fa
INFO:            11 d8 3e 23 e3 1f 7f 62 32 9d e3 0c 1c c8
INFO:    DELEGATED ATTEST TEST END

JSON格式:

cpp 复制代码
{
    "CCA_ATTESTATION_PROFILE": "tag:arm.com,2023:cca_platform#1.0.0",
    "CCA_PLATFORM_CHALLENGE": "b'0D22E08A98469058486318283489BDB36F09DBEFEB1864DF433FA6E54EA2D711'",
    "CCA_PLATFORM_IMPLEMENTATION_ID": "b'7F454C4602010100000000000000000003003E00010000005058000000000000'",
    "CCA_PLATFORM_INSTANCE_ID": "b'0107060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A1918'",
    "CCA_PLATFORM_CONFIG": "b'CFCFCFCF'",
    "CCA_PLATFORM_LIFECYCLE": "secured_3003",
    "CCA_PLATFORM_HASH_ALGO_ID": "sha-256",
    "CCA_PLATFORM_VERIFICATION_SERVICE": "https://veraison.example/.well-known/veraison/verification",
    "CCA_PLATFORM_SW_COMPONENTS": [
        {
            "SW_COMPONENT_TYPE": "RSE_BL1_2",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'9A271F2A916B0B6EE6CECB2426F0B3206EF074578BE55D9BC94F6F3FE3AB86AA'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "RSE_BL2",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'53C234E5E8472B6AC51C1AE1CAB3FE06FAD053BEB8EBFD8977B010655BFDD3C3'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "RSE_S",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'1121CFCCD5913F0A63FEC40A6FFD44EA64F9DC135C66634BA001D10BCF4302A2'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "AP_BL1",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'1571B5EC78BD68512BF7830BB6A2A44B2047C7DF57BCE79EB8A1C0E5BEA0A501'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "AP_BL2",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'10159BAF262B43A92D95DB59DAE1F72C645127301661E0A3CE4E38B295A97C58'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "SCP_BL1",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'10122E856B3FCD49F063636317476149CB730A1AA1CFAAD818552B72F56D6F68'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "SCP_BL2",
            "SIGNER_ID": "b'F14B4987904BCB5814E4459A057ED4D20F58A633152288A761214DCD28780B56'",
            "MEASUREMENT_VALUE": "b'AA67A169B0BBA217AA0AA88A65346920C84C42447C36BA5F7EA65F422C1FE5D8'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "AP_BL31",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'2E6D31A5983A91251BFAE5AEFA1C0A19D8BA3CF601D0E8A706B4CFA9661A6B8A'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "RMM",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'A1FB50E6C86FAE1679EF3351296FD6713411A08CF8DD1790A4FD05FAE8688164'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "HW_CONFIG",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'1A252402972F6057FA53CC172B52B9FFCA698E18311FACD0F3B06ECAAEF79E17'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "FW_CONFIG",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'9A92ADBC0CEE38EF658C71CE1B1BF8C65668F166BFB213644C895CCB1AD07A25'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "TB_FW_CONFIG",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'238903180CC104EC2C5D8B3F20C5BC61B389EC0A967DF8CC208CDC7CD454174F'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        },
        {
            "SW_COMPONENT_TYPE": "SOC_FW_CONFIG",
            "SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'",
            "MEASUREMENT_VALUE": "b'E6C21E8D260FE71882DEBDB339D2402A2CA7648529BC2303F48649BCE0380017'",
            "CCA_SW_COMPONENT_HASH_ID": "sha-256"
        }
    ]
}

五、基于 RSE 的 DICE 保护环境(DPE)

DICE Protection Environment(DPE) 服务使得能够在隔离的执行环境中执行 DICE 指令。

它向客户端提供一个接口,以 CBOR 对象编码的方式发送 DICE 指令,作用于不透明的上下文句柄。

DPE 服务在其内部上下文上执行 DICE 派生和认证,而不会将 DICE 机密(私钥和 CDI)暴露在隔离环境之外。


5.1. DPE API

定义位置:

include/lib/psa/dice_protection_environment.h

API 原型如下:

cpp 复制代码
dpe_error_t
dpe_derive_context(int      context_handle,
                   uint32_t cert_id,
                   bool     retain_parent_context,
                   bool     allow_new_context_to_derive,
                   bool     create_certificate,
                   const DiceInputValues *dice_inputs,
                   int32_t  target_locality,
                   bool     return_certificate,
                   bool     allow_new_context_to_export,
                   bool     export_cdi,
                   int     *new_context_handle,
                   int     *new_parent_context_handle,
                   uint8_t *new_certificate_buf,
                   size_t   new_certificate_buf_size,
                   size_t  *new_certificate_actual_size,
                   uint8_t *exported_cdi_buf,
                   size_t   exported_cdi_buf_size,
                   size_t  *exported_cdi_actual_size);

5.2. 构建时配置选项

  • MEASURED_BOOT:启用可信启动功能。

  • DICE_PROTECTION_ENVIRONMENT:布尔值标志,用于在启用 RSE 可信启动时,指定是否使用 DPE 作为后端。默认值为 0。若设置为 1,则可信启动过程中收集的度量值及其元数据将发送至 DPE 进行存储和处理。

  • DPE_ALG_ID:指定测量镜像所使用的哈希算法,默认值为 sha-256。


5.3. 示例证书链

参见:

plat/arm/board/tc/tc_dpe.h


六、RSE OTP 资产管理

RSE 为 AP 提供对 OTP 中资产的访问权限,包括用于镜像签名验证的密钥,以及用于回滚保护的非易失性计数器。


6.1. 非易失性计数器 API

AP 与 RSE 之间用于获取和递增非易失性计数器的接口如下:

定义位置:

include/lib/psa/rse_platform_api.h

cpp 复制代码
psa_status_t rse_platform_nv_counter_increment(uint32_t counter_id)

psa_status_t rse_platform_nv_counter_read(uint32_t counter_id,
        uint32_t size, uint8_t *val)

该服务允许读取/递增 ARM CCA 平台上使用的以下三种非易失性计数器:

  • 用于 CCA 固件(BL2、BL31、RMM)的计数器;

  • 用于安全固件的计数器;

  • 用于非安全固件的计数器。


6.2. 公钥 API

AP 与 RSE 之间用于读取 ROTPK(Root of Trust Public Key)的接口如下:

定义位置:

include/lib/psa/rse_platform_api.h

cpp 复制代码
psa_status_t rse_platform_key_read(enum rse_key_id_builtin_t key,
        uint8_t *data, size_t data_size, size_t *data_length)

该服务允许读取 ARM CCA 平台上使用的以下三种 ROTPK:

  • 用于 CCA 固件(BL2、BL31、RMM)的 ROTPK;

  • 用于安全固件的 ROTPK;

  • 用于非安全固件的 ROTPK。


6.3. 获取熵的 API

AP 与 RSE 之间用于读取熵值的接口如下:

定义位置:

include/lib/psa/rse_platform_api.h

cpp 复制代码
psa_status_t rse_platform_get_entropy(uint8_t *data, size_t data_size)

该服务允许读取由 RSE 生成的熵值。

相关推荐
安全二次方security²3 个月前
SCP-Firmware安全通告:CVE-2024-11863和CVE-2024-11864
安全通告·arm安全架构·scp-firmware·scmi·cve-2024-11863·cve-2024-11864·dos拒绝服务攻击
安全二次方security²3 个月前
【CVE-2024-7881】ARM CPU漏洞安全通告
arm安全架构·prefetch·arm安全中心·cve-2024-7881·cpuactlr6_el1·kpti·arm安全通告
安全二次方security²6 个月前
ARM CCA机密计算安全模型之固件更新
arm安全架构·realm·cca·机密计算·rme·机密计算安全模型·固件更新
安全二次方security²7 个月前
SMMU软件指南SMMU编程之虚拟机结构和缓存
缓存·cache·smmu·arm安全架构·系统mmu·虚拟机结构·vms
安全二次方security²7 个月前
SMMU软件指南SMMU编程之事件队列
smmu·arm安全架构·事件队列·系统mmu·event queue·smmu编程·smmu软件指南
微小冷1 年前
【文献阅读】基于高阶矩的波形分类方法
人工智能·分类·数据挖掘·svm·文献阅读·高阶矩·rse
安全二次方security²1 年前
ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的RAS
arm安全架构·cca·机密计算·ras·领域管理扩展·rme·系统安全能力
安全二次方security²1 年前
ARM-V9 RME(Realm Management Extension)系统架构之系统能力的设备隔离和保护
系统架构·arm安全架构·cca·机密计算·领域管理扩展·rme·设备隔离和防护
安全二次方security²1 年前
ARM架构安全特性之防御执行技术
分支目标识别·侧信道攻击·栈溢出攻击·arm安全架构·指针认证·内存标记扩展·推测屏障指令