目录
1. 镜像签名机制概述
TF-A的安全启动流程依赖于严格的镜像签名验证机制,确保只有经过授权的固件镜像能够在系统中执行。该机制基于非对称加密技术,主要包含以下关键组件:
- PKI体系:采用分层证书结构(Root Key → Trusted Key → Content Certificate)
- 签名算法:支持RSA-PSS、ECDSA等标准算法
- 哈希算法:SHA-256、SHA-384等
- 抗重放保护:通过镜像版本号实现
// 典型签名数据结构示例
typedef struct {
uint32_t version; // 格式版本号
uint8_t hash_algo; // 哈希算法标识
uint8_t sig_algo; // 签名算法标识
uint8_t pub_key[64]; // 公钥信息
uint8_t signature[]; // 实际签名值
} tb_fw_sig_t;
2. 签名流程实现
2.1 镜像签名过程
-
镜像准备阶段:
- 计算原始镜像的哈希值
- 添加镜像元数据(版本号、加载地址等)
- 生成证书链结构
-
签名生成阶段:
# 典型签名命令示例
openssl dgst -sha256 -sign priv_key.pem \
-out signature.bin bl2.bin
- 镜像打包阶段:
- 将签名与证书链附加到镜像尾部
- 生成最终的FIP(Firmware Image Package)格式
2.2 关键数据结构
TF-A中签名验证相关的核心数据结构:
// include/tools_share/firmware_image_package.h
typedef struct {
fip_toc_header_t toc_header; // 镜像表头
fip_toc_entry_t toc_entries; // 镜像条目数组
uint8_t cert_data[]; // 证书数据
} fip_t;
3. 验证流程详解
3.1 启动时验证流程
-
BL1验证BL2:
- 从ROM加载BL2镜像和签名
- 验证证书链有效性
- 检查签名与镜像哈希匹配
-
BL2验证后续镜像:
- 通过Trusted Boot Firmware验证BL31/BL32/BL33
- 支持多级证书链验证
3.2 关键验证函数
TF-A中的核心验证函数位于drivers/auth
目录:
// drivers/auth/auth_mod.c
int auth_verify_img(unsigned int img_id,
const void *img_ptr,
size_t img_len) {
// 1. 获取对应镜像的证书
// 2. 验证证书链
// 3. 验证镜像签名
// 4. 检查版本号防回滚
}
4. 密钥管理方案
4.1 默认密钥配置
TF-A提供以下默认密钥文件:
root-RSA-key.pem
:根密钥tf_key.pem
:TF-A镜像签名密钥ntfw_key.pem
:非可信世界镜像密钥
4.2 密钥更新流程
安全密钥更新的关键步骤:
- 生成新的密钥对
- 将公钥编译进BL1/BL2
- 使用新旧双密钥过渡
- 验证通过后移除旧密钥
# 密钥生成示例
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
-out new_key.pem
5. 高级安全特性
5.1 抗量子计算签名
支持基于哈希的签名方案(如XMSS):
// 启用实验性抗量子签名
#define TF_MBEDTLS_USE_XMSS 1
5.2 动态验证策略
可通过编译选项配置的验证策略:
TRUSTED_BOARD_BOOT
:启用完整验证链MEASURED_BOOT
:增加启动度量值COT_DESC
:自定义证书链描述
6. 调试与问题排查
常见问题及解决方法:
-
签名验证失败:
- 检查镜像工具链版本一致性
- 确认密钥路径正确性
- 验证证书链完整性
-
性能优化建议:
- 使用硬件加速的加密引擎
- 优化证书缓存机制
- 选择适当的密钥长度
# 调试输出示例
NOTICE: BL1: Booting BL2
VERBOSE: BL1: Loading image id 5
ERROR: BL1: Failed to load image (-3)
7. 平台移植注意事项
移植时需要实现的平台特定接口:
// 平台密钥存储接口
int plat_get_rotpk_info(void *cookie, void **key_ptr,
unsigned int *key_len);
// 抗回滚计数器接口
int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
8. 未来演进方向
- ARMv9-CCA支持:引入领域管理扩展
- 动态验证策略:基于运行时策略的验证
- 后量子密码学:NIST标准化算法集成
- TEE协同验证:与TrustZone协同验证机制
安全建议:生产环境应定期轮换签名密钥,建议每12-24个月更新一次根密钥,并确保旧镜像能够通过安全方式淘汰。