[optee] ATF--Trusted Board Boot

4/7/2021 armopteetrustzone

Trusted Board Boot(简写 TBB)特性验证从启动直至常规世界引导器在内的固件镜像(TEE OS 是其中固件之一),防止平台运行恶意固件。具体是通过建立 PKCS 形式的信任链实现的。

本文介绍 Trusted Firmware-A(TF-A)的 TBB。这是 Arm DEN0006D 的 Trusted Board Boot Requirements (TBBR) (opens new window) 规格文档的一个实现。本文应与实现 TBBR 指定部分的 Firmware Update (FWU) (opens new window) 设计文档一起使用。

# 1. 信任链

信任链(Chain of Trust,简写为 CoT)起源于隐式的可信组件。对于 Arm 开发平台,这些组件如下

  • 可信根公钥(Root of Trust Public Key,简写为 ROTPK)的 SHA-256 哈希。这个公钥存储再可信的根密钥寄存器。另外,也可以使用开发版的 ROTPK,将其哈希嵌入到 BL1 和 BL2 镜像(只适用于开发用途)。
  • 假设 BL1 镜像存在于 ROM,无法被篡改。

CoT 的其余组件是证书和引导器镜像。证书遵循 X.509 v3 (opens new window) 标准。本文的标准往证书添加自定义的拓展字段,用于存储建立 CoT 的必要信息。

TBB CoT 的所有证书都自签名的。因为 CoT 借助证书拓展字段的内容而不是验证证书颁发者的合法性建立起来的,所以不需要证书颁发机构(CA)。证书的签发支持多种签名方案。

证书具体分为密钥内容证书两类。密钥证书用于验证签发内容证书的公钥。内容证书用于存储引导程序镜像的哈希。镜像的鉴权要求其哈希与内容证书注明的哈希匹配。平台支持多种哈希算法。公钥和哈希包含在 X.509 v3 (opens new window) 证书的非标准拓展字段。

建立 CoT 的密钥如下

密钥 说明
可信根密钥对 私钥签发 BL2 的内容证书和可信密钥证书。其公钥为 ROTPK
可信世界密钥对 私钥签发验证安全世界镜像(SCP_BL2、BL31 和 BL32)的密钥证书。公钥存在可信世界证书的某个拓展字段
非可信世界密钥对 私钥签发验证非安全世界镜像(BL33)的密钥证书。公钥存在可信世界证书的某个拓展字段
BL3X 密钥对 对于 SCP_BL2、BL31、BL32 和 BL33,私钥用于签发 BL3X 镜像的内容证书。公钥存在对应密钥证书的拓展字段

CoT 涉及的镜像如下

  • BL1
  • BL2
  • SCP_BL2(可选)
  • BL31
  • BL33
  • BL32(可选)

验证镜像的相关证书如下

证书 说明
BL2 内容证书 用 ROT 私钥自签名的证书,包含 BL2 镜像的哈希
可信密钥证书 用 ROT 私钥自签名的证书,包含可信世界和非可信世界密钥对的公钥部分
SCP_BL2 密钥证书 用可信世界私钥自签名的证书,包含 SCP_BL2 密钥对的公钥部分
SCP_BL2 内容证书 用 SCP_BL2 密钥证书的私钥自签名的证书,包含 SCP_BL2 镜像的哈希
BL31 密钥证书 用可信世界私钥自签名的证书,包含 BL31 密钥对的公钥部分
BL31 内容证书 用 BL31 密钥证书的私钥自签名的证书,包含 BL31 镜像的哈希
BL32 密钥证书 用可信世界私钥自签名的证书,包含 BL32 密钥对的公钥部分
BL32 内容证书 用 BL32 密钥证书的私钥自签名的证书,包含 BL32 镜像的哈希
BL33 密钥证书 用非可信世界私钥自签名的证书,包含 BL33 密钥对的公钥部分
BL33 内容证书 用 BL33 密钥证书的私钥自签名的证书,包含 BL33 镜像的哈希

SCP_BL2 和 BL32 证书是非必须的,但对应的 SCP_BL2 或 BL32 存在时必须存在。

信任链结构关系大致如下

                                        +-------+
                    +-------------------+ ROTPK +--------------------+
                    |                   +-------+                    |
                    |                                                |
                    |                                                |
                    v                                                v
          +---------+--------+                            +----------+-------+
          | BL2 Content Cert |         +------------------+ Trusted Key Cert +----------------------+
          +------------------+         |                  +------------------+                      |
                                       |                                                            |
                                       |                                                            |
                                       v                                                            v
                        +--------------+---------+                                    +-------------+--------------+
            +-----------+ Trusted World Key Cert +------------+                       | Non|trusted World Key Cert |
            |           +------------+-----------+            |                       +-------------+--------------+
            |                        |                        |                                     |
            |                        |                        |                                     |
            v                        v                        v                                     v
+-----------+----------+   +---------+----------+   +---------+---------+                  +--------+----------+
| SCP_BL2 Content Cert |   | BL31 Content Cert  |   | BL32 Content Cert |                  | BL33 Content Cert |
+----------------------+   +--------------------+   +-------------------+                  +-------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 2. TBB 启动流程

CoT 按照以下流程验证。其中任何步骤失败都会触发系统异常。

  • BL1 加载并验证 BL2 的内容证书。颁发者的公钥从已验证的密钥证书读取,其哈希和可信根密钥寄存器的值比对。如果匹配,则从证书读取 BL2 的哈希。

    比对操作依平台而定,目前在 Arm 开发平台上没有实现。

  • BL1 加载 BL2 镜像。计算镜像哈希,并和证书读取的哈希比对。配对成功后,控制权转移到 BL2 镜像。
  • BL2 加载并验证可信密钥证书。颁发者的公钥从已验证的密钥证书读取,其哈希和可信根密钥寄存器的值比对。如果配对成功,BL2 读取并保存已验证证书注明的可信和非可信世界公钥。

以下两步会为 SCP_BL2、BL31 和 BL32 镜像执行。如果 SCP_BL2 或 BL32 镜像不存在,则跳过响应的执行流程。

  • BL2 加载并验证 BL3x 的密钥证书。证书的签名用可信世界公钥验证。如果签名验证成功,BL2 读取并保存证书注明的 BL3x 公钥。
  • BL2 加载并验证 BL3x 的内容证书。证书的签名用可信世界公钥验证。如果签名验证成功,BL2 读取并保存证书注明的 BL3x 镜像哈希。

以下两步只对 BL33 镜像执行。

  • BL2 加载并验证 BL33 的密钥证书。证书的签名用非可信世界公钥验证。如果签名验证成功,BL2 读取并保存证书注明的 BL3x 公钥。
  • BL2 加载并验证 BL33 的内容证书。证书的签名用非可信世界公钥验证。如果签名验证成功,BL2 读取并保存证书注明的 BL33 镜像哈希。

以下步骤适用于所有引导程序镜像。

  • BL2 计算每个镜像的哈希,将其与内容证书注明的哈希比对。哈希匹配说明镜像验证成功。

# 参考文献