转自:https://www.cnblogs.com/arnoldlu/p/14301334.html
前面我们跟着前辈的文章,学习了ATF的启动、镜像生成与校验、固件升级,这里来看看启动需求。
ARM TBBR定义了安全系统基本需求,ATF中实现了COT,包括FIP生成、密码库调用、镜像签名加密/解密验签等等流程。
下面主要参考ARM TBBR文档,以及《Trusted Firmware-A Documention》。
ARM文档《Trusted Board Boot Requirements (TBBR)》中定义了安全启动需求。
ARM Trusted Firmware的**《Trusted Board Boot》根据TBBR,对实现COT、TBB流程、认证、加密实现细节进行介绍。**
《Building FIP images with support for Trusted Board Boot》对如何编译支持TBB的FIP进行介绍。
以下内容来源于:《Trusted Board Boot Requirements (TBBR)》。
Trusted Boot Process是一种确保SOC复位开始,仅有正确、计划中的固件/OS/TEE被加载、初始化到SOC上的一种方案。 (按照设计的启动流程正常运行)
介绍本文所使用到的密码算法以及证书结构。
证书签名必须满足NSA suite B 128-bit安全标准,并使用如下加密算法:AES-128、SHA-256、ECC256 (ECDSA) or (legacy support of) RSA2048 (RSA-PSS) 。
PKCS #1 – Standard for RSA、FIPS 186-4 – Standard for ECDSA 。
下图是X.509 v3证书结构概览:
对TBSA所需的SOC的加密秘钥进行总结。
NV Counters用于保护设备免于版本回滚。
TBBR需要两个可信NV Counters来保证可信启动流程:可信固件NV Counter和非可信固件NV Counter。
当镜像被验证通过后,将其版本号和硬件中NV Counter值比较:
介绍可信启动流程,介绍何为Chain of Trust、可信流程图概述、SOC冷启动后安全。
可信启动流程图:
Non-Trusted Firmware Updater职责是从外部接口加载完整的SoC固件到SoC的NVM中。外部接口可能是USB/UART/SD-MMC/NAND/NOR/Ethernet等;
SOC固件包括SCP固件、AP固件、TOS、非安全世界固件等;SOC NVM包括NAND Flash等。
介绍证书结构及其内容。
证书的创建和秘钥管理。
以下内容来源于:《Trusted Board Boot》。
CoT包含一系列默认可信的组件:
CoT的其他组件还包括:
证书还可以增加附加信息来存储其他COT所需信息。证书是自签名的,所以不需要CA来进行认证。
证书分为:
公钥和哈希作为非标准扩展存在X.509 v3证书中。
实现CoT所使用的秘钥:
如下证书用于对镜像进行验证:
BL1对BL2采取的步骤:
针对SCP_BL2、BL31、BL32镜像采取的步骤:
针对BL33镜像采取的步骤:
BL2对镜像进行哈希校验:
参考文档:《Authentication Framework & Chain of Trust》
当打开GENERATE_COT=1时,作为ATF编译过程一部分,cert_create工具被编译并运行。
cert_create以镜像和PEM格式秘钥作为输入,生成DER格式证书来保证COT。生成的证书被作为fiptool输入生成FIP。
cert_create使用OpenSSL SSL库来生成X.509证书。cert_create对OpenSSL的要求是:OpenSSL >= 1.0.1。
cert_create编译和使用参考:《Building the Certificate Generation Tool》。
当DECRYPTION_SUPPORT != none时,encrypt_fw编译和运行作为ATF编译流程一部分。
encrypt_fw以原始镜像作为输入,生成加密镜像并传递给fiptool生成FIP。所以FIP是先加密再做签名。
encrypt_fw使用OpenSSL 1.0.1或更新库进行加密操作。
encrypt_fw编译和使用参考:《Building the Firmware Encryption Tool》。
参考文档:《Building FIP images with support for Trusted Board Boot》。
Trusted Board Boot主要包括两方面:镜像验证和固件更新。
编译FIP和FWU_FIP需要支持如下特性:
mbed TLS == 2.24.0。
编译FIP之前需要确保如下选项正确配置:
MBEDTLS_DIR=
TRUSTED_BOARD_BOOT=1
GENERATE_COT=1
同时还需通过ARM_ROTPK_LOCATION指定ROPTK路径:
MBEDTLS_DIR= \
make PLAT= TRUSTED_BOARD_BOOT=1 GENERATE_COT=1 \
ARM_ROTPK_LOCATION=devel_rsa \
ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem \
BL33=/ \
all fip
参考文档:《Firmware Update (FWU)》。
参考文档:《Authentication Framework & Chain of Trust》
Authentication Framework需要满足如下要求:
如下示意图展示了Authentication Framework内部细节和COT概要机制。
+---------------+---------------+------------+
| Trusted | Trusted | Trusted |
| Firmware | Firmware | Firmware |
| Generic | IO Framework | Platform |
| Code i.e. | (IO) | Port |
| BL1/BL2 (GEN) | | (PP) |
+---------------+---------------+------------+
^ ^ ^
| | |
v v v
+-----------+ +-----------+ +-----------+
| | | | | Image |
| Crypto | | Auth | | Parser |
| Module |<->| Module |<->| Module |
| (CM) | | (AM) | | (IPM) |
| | | | | |
+-----------+ +-----------+ +-----------+
^ ^
| |
v v
+----------------+ +-----------------+
| Cryptographic | | Image Parser |
| Libraries (CL) | | Libraries (IPL) |
+----------------+ +-----------------+
| |
| |
| |
v v
+-----------------+
| Misc. Libs e.g. |
| ASN.1 decoder |
| |
+-----------------+
COT是一系列从Root of Trust开始最终到一个镜像的认证镜像的过程。如下框图展示了BL31镜像如何满足COT。
Root of Trust一般指的是ROTPK,其往往固化在芯片内部并不可修改。
+------------------+ +-------------------+
| ROTPK/ROTPK Hash |------>| Trusted Key |
+------------------+ | Certificate |
| (Auth Image) |
/+-------------------+
/ |
/ |
/ |
/ |
L v
+------------------+ +-------------------+
| Trusted World |------>| BL31 Key |
| Public Key | | Certificate |
+------------------+ | (Auth Image) |
+-------------------+
/ |
/ |
/ |
/ |
/ v
+------------------+ L +-------------------+
| BL31 Content |------>| BL31 Content |
| Certificate PK | | Certificate |
+------------------+ | (Auth Image) |
+-------------------+
/ |
/ |
/ |
/ |
/ v
+------------------+ L +-------------------+
| BL31 Hash |------>| BL31 Image |
| | | (Data Image) |
+------------------+ | |
+-------------------+
COT中镜像包括认证镜像和数据镜像。认证镜像包含认证数据镜像所需信息;数据镜像包含二进制启动文件,或任何其他数据。
对于每一个COT中的镜像,需要执行如下操作来认证它:
GEN/IO用于初始化BL1/BL2开始的认证流程。对于任何一个需要认证的镜像,GEN/IO通过认证模块递归向上查找父镜像,知道找到认证过的镜像或者ROT。
GEN/IO使用IO框架加载镜像,使用认证模块参照COT要求从ROT到镜像进行认证。
一个COT可以被一系列连接在一起的特殊排序的镜像描述符。他们排列顺序决定了他们认证顺序。
每个镜像包含一系列AM认证所需属性。
X.509 是密码学里公钥证书的格式标准。
X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Internet协议里。同时它也用在很多非在线应用场景里,比如电子签名服务。
X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名。
另外除了证书本身功能,X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。
DER - Distinguished Encoding Rules
PEM - Privacy Enhanced Mail
DER是常见的编码规则,PEM是由DER衍生出的秘钥文件格式。
DER 是典型的 Tag-Length-Value(TLV) 编码方式,是 PKCS 密钥体系常用的编码。
DER 是 BER 的子集,编码规则几乎一样,不过去掉了 BER 的一些灵活性,多了几个限制:
PEM(Privacy Enhanced Mail): 因为 DER 编码是二进制数据,早期的 Email 不能发送附件,也不方便直接传输二进制数据([原因]),因此密钥文件通常会在 DER 编码基础上进行 Base64 编码,这就是经常看到的密钥文件格式 PEM。PEM 最早是用来增强邮件安全性的,不过没有被广泛接受,最后却是在密码学中得到了发扬光大,如 openssl 和 ssh-keygen 工具生成的公私钥文件默认都采用 PEM 格式。需要注意的是,PEM 本身不是 ASN.1 的编码规则,它只是 Base64-encoded DER。
《密码学基础1:RSA算法原理全面解析》
《密码学基础2:椭圆曲线密码学原理分析》
《密码学基础3:密钥文件格式完全解析》