安全之安全(security²)博客目录导读
目录
一、RSE 通信层
1.1 消息结构
1.2 源代码文件
1.3 MHU 通信的 API
二、RSE 提供的运行时服务
2.1 运行时服务 API
2.2 软件与 API 层次结构
三、基于 RSE 的 Measured Boot(度量启动)
3.1 Measured Boot API
3.2 Measured Boot 元数据
3.3 Signer-ID API
3.4 构建时配置选项
3.5 Measured Boot 流程
3.6. 控制台日志样例
四、委托认证(Delegated Attestation)
4.1. 委托认证 API
4.2. 认证流程
4.3. 证明令牌示例
五、基于 RSE 的 DICE 保护环境(DPE)
5.1. DPE API
5.2. 构建时配置选项
5.3. 示例证书链
六、RSE OTP 资产管理
6.1. 非易失性计数器 API
6.2. 公钥 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)”语义。即度量值不会被直接存储,而是参与生成当前度量槽的新值。其扩展逻辑如下(||
表示连接):
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
函数原型如下:
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 在加载并度量固件时更新。
元数据结构定义如下:
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
函数原型如下:
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. 控制台日志样例
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 原型如下:
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. 证明令牌示例
二进制格式:
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格式:
{"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 原型如下:
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
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
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
psa_status_t rse_platform_get_entropy(uint8_t *data, size_t data_size)
该服务允许读取由 RSE 生成的熵值。