目录
[一、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-256
、sha-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 生成的熵值。