目录
4.3.1 TF-A镜像格式规范
基本镜像结构
TF-A采用分层的镜像格式设计,主要包含以下组成部分:
typedef struct {
uint32_t header_size; // 头部信息大小
uint32_t payload_size; // 有效载荷大小
uint64_t load_address; // 加载地址
uint64_t entry_point; // 入口地址
image_desc_t attributes; // 镜像属性描述
cert_chain_t certificates; // 证书链(可选)
} image_header_t;
镜像类型分类
镜像类型 | 文件后缀 | 典型用途 |
---|---|---|
BL1镜像 | .bin | ROM阶段执行代码 |
BL2镜像 | .bin | 可信引导固件 |
BL31镜像 | .bin | EL3运行时固件 |
BL32镜像 | .bin | 可信执行环境(TEE) |
FIP容器 | .fip | 多镜像聚合容器 |
证书包 | .pem | 签名验证证书 |
FIP(Firmware Image Package)容器
# FIP打包工具使用示例
tools/fiptool/fiptool create \
--tb-fw bl2.bin \
--soc-fw bl31.bin \
--tos-fw bl32.bin \
--nt-fw bl33.bin \
fip.bin
4.3.2 安全签名机制
签名流程架构
密钥管理层次
-
ROTPK(Root of Trust Public Key)
- 烧录在芯片OTP区域的不可变公钥
- 典型长度:RSA-2048/3072 或 ECC-256/384
-
平台密钥
# Makefile密钥配置示例 KEY_ALG := rsa KEY_SIZE := 2048 HASH_ALG := sha256
-
内容密钥
- 用于签名具体镜像内容
- 通过平台密钥进行证书链验证
4.3.3 证书链验证机制
典型证书链结构
┌────────────────┐
│ 根证书 │
│ (ROTPK签名) │
└────────┬───────┘
│
┌────────▼───────┐
│ 平台证书 │
│ (信任链证书) │
└────────┬───────┘
│
┌────────▼───────┐
│ 内容证书 │
│ (镜像签名) │
└────────────────┘
验证过程代码逻辑
// 简化验证流程
int verify_image(uintptr_t image_base) {
// 1. 检查镜像魔数
if (*(uint32_t*)image_base != IMAGE_MAGIC)
return AUTH_FAIL;
// 2. 提取证书链
cert_chain_t *chain = get_cert_chain(image_base);
// 3. 逐级验证证书
for (int i = 0; i < chain->cert_count; i++) {
if (!verify_cert(chain->certs[i],
(i == 0) ? ROTPK : chain->certs[i-1]))
return AUTH_FAIL;
}
// 4. 验证镜像内容签名
return verify_signature(image_data,
chain->certs[chain->cert_count-1]);
}
4.3.4 抗回滚保护机制
版本计数器实现
// 版本计数器存储结构
typedef struct {
uint32_t version;
uint32_t backup_version;
uint32_t flags;
} version_counter_t;
// 版本验证逻辑
int check_version(uint32_t new_version) {
version_counter_t *cnt = get_version_counter();
if (new_version <= cnt->version) {
// 检测到回滚攻击
security_log(ROLLBACK_ATTEMPT);
return AUTH_FAIL;
}
return AUTH_SUCCESS;
}
安全计数器类型
计数器类型 | 存储位置 | 更新频率 |
---|---|---|
固件版本计数器 | eMMC RPMB分区 | 固件更新时 |
安全配置计数器 | OTP存储器 | 安全策略变更时 |
引导次数计数器 | 安全NVRAM | 每次冷启动 |
4.3.5 平台移植注意事项
-
硬件加速集成
// 密码加速器驱动接口示例 const crypto_ops_t crypto_ops = { .hash = platform_sha256, .verify = platform_rsa_verify, .get_nvctr= platform_get_counter, .set_nvctr= platform_set_counter };
-
存储设备支持矩阵
存储类型 XIP支持 加密支持 典型延迟 NOR Flash 是 可选 <100us eMMC 否 是 1-10ms SPI NAND 否 部分 100-500us -
调试配置选项
# 调试签名验证的编译选项 DEBUG := 1 LOG_LEVEL := 40 # VERBOSE CRYPTO_LIB := mbedtls
4.3.6 安全最佳实践
-
密钥管理原则
- 生产环境必须使用硬件安全模块(HSM)管理私钥
- 开发测试密钥不得用于生产环境
- 定期执行密钥轮换策略
-
签名策略建议
# 分级签名示例 fiptool sign \ --key-alg ecdsa \ --key-size 384 \ --hash-alg sha384 \ --rot-key rot_priv.pem \ --plat-key plat_priv.pem \ fip.bin
-
审计要求
- 记录所有镜像签名事件
- 保存至少两个版本的可验证镜像
- 实现双人复核机制