镜像格式要求
BROM 在启动过程中解析专有的启动镜像,第一级引导程序的镜像格式必须符合下表的要求。
数据区域 | 数据分块 | 字段 | 字节 | 描述 |
---|---|---|---|---|
Signed Area |
Block1 (256B) |
Magic | 4 | 特征字符串,固定为 ”AIC ” |
Checksum | 4 | 32 bit 累加和校验的校验值。安全启动方案设为 0. | ||
Header version | 4 | 本文件头结构的版本号,当前版本为 v1.0: 0x00010001 | ||
Image length | 4 | 从文件开头到结束的总数据长度 | ||
Firmware version | 4 | 固件版本号,不同版本之间应单调递增 | ||
Loader length | 4 | 第一级引导程序的有效数据的长度,不包括填充数据 | ||
Load address | 4 | 镜像数据加载到内存的目标地址 | ||
Entry point | 4 | 第一级引导程序的可执行代码入口地址 | ||
Signature algorithm | 4 | 0:没有签名,仅计算 Checksum;1:RSA-2048; | ||
Encryption algorithm | 4 | 0:固件不加密;1:AES-128-CBC 加密 | ||
Signature result offset | 4 | 数字签名数据区域的偏移,从文件头开始计算 | ||
Signature result length | 4 | 数字签名的长度 | ||
Signature key offset | 4 | RSA 公钥数据区域的偏移 | ||
Signature key length | 4 | RSA 公钥数据的长度 | ||
IV data offset | 4 | AES-CBC IV 数据区域的偏移 | ||
IV data length | 4 | IV 的长度 | ||
Private data offset | 4 | 第一级引导程序私有数据区域的偏移 | ||
Private data length | 4 | 第一级引导程序私有数据区域的长度 | ||
PBP offset | 4 | PBP 数据区域的偏移 | ||
PBP length | 4 | PBP 数据的长度 | ||
Loader ext offset | 4 | 扩展的 Loader 内容的开始存放位置 | ||
Padding | 172 | 填充,使得头部刚好 256 字节 | ||
Block2 | Loader binary data | X | 第一级引导程序的保存区域 | |
Padding | X | 增加填充,使得 256 字节对齐 | ||
Block3 | Private data area | X | 存放镜像代码中可能使用的私有数据。 | |
Signature key area | X | 存放 RSA 公钥,DER 格式的密钥文件。应 4 字节对齐。 | ||
IV data area | 16 | 存放 AES IV 数据,16 字节。应 4 字节对齐。 | ||
PBP area | X | 存放 PBP 程序。应 16 字节对齐。 | ||
Padding | X | 填充,使得 256 byte 对齐,方便计算数字签名 | ||
Block4 | Signature result area | 256 | 前面所有内容的数字签名 |
这里所描述的启动镜像是 BROM 读取的第一级引导程序 (First Stage Boot Loader)。 BROM 需要启动镜像提供必要的信息,以帮助 BROM 做初始化,并且找到正确的引导代码运行。在打开安全启动的情况下, 还需要提供必要的信息以帮助 BROM 对镜像进行签名认证,甚至对相关数据段进行解密。 这里的安全镜像格式固定前面 256 字节保存相关的信息,第一级引导程序的内容固定存放在 DATA1 区域中。
-
当使用 RSA 签名时,使用的签名方案为 RSASSA-PKCS1-v1_5。具体格式参考 《RFC 3447》第 9.2 章节。
-
本芯片仅支持 AES-128-CBC/SM4-CBC 加密。
校验值的计算
- MD5 校验当 RSA 签名没有启用时,BROM 优先使用 MD5 来校验启动镜像的完整性,BROM 中使用 CE 计算 MD5 的值,以加快校验速度。
- MD5 计算区域:镜像格式的 HEAD2、DATA1、DATA2 区域
- MD5 结果的存放:
- SIGN 区域存放 16 字节的 MD5 结果
- Signature result offset 存放 MD5 的开始位置
- Signature result length 存放 MD5 结果的长度
- MD5 的校验
- BROM 计算 HEAD2、DATA1、DATA2 区域的 MD5 值
- 新计算的结果,与 SIGN 区域的 MD5 值进行比较
- Checksum
在不打开安全启动的情况下,BROM 可以使用 Checksum 对读取的固件数据进行校验,Checksum 的计算和校验方法如下:
- 计算的方法
首先将固件的 check sum 字段置为 0。
然后按照 32 bit 的方式计算整个固件的累加和。
将累加和的值按位取反,然后填写到 check sum 字段中。
- 校验的方法
将固件按照 32 bit 的方式,计算整个固件的累加和。
累加和的结果应该是 0xFFFFFFFF, 或者加 1 应该是 0。
如果不是,则校验失败。
- 计算的方法
- 非安全启动时,BROM 默认使用 MD5 进行启动镜像校验,但是也可以通过 eFuse 关闭 MD5 校验,回退到 Checksum 校验
- 如果 Checksum 与 MD5 同时提供,则主机计算校验值时,应先生成 MD5 校验值,再计算 Checksum
Load Address 和 Entry Point
制作启动镜像时,可以根据实际需要,指定 load_address。
版本号信息
固件的版本号格式为 Major.Minor.Revision,与版本号相对应的还有一个防回滚版本计数值(Anti-Rollback Version Counter)。每一次版本变更,该计数值都应该累加 1。 在使能固件防回滚功能时,BROM 会检查该值。
上述版本信息在镜像格式头(Firmware version)中的存放顺序如下:
名字 |
字节 |
说明 |
---|---|---|
Anti-Rollback Version Counter |
1 |
第一字节,防回滚版本计数值,应从 1 开始计数 |
Revision |
1 |
第二字节,修改编号 |
Minor |
1 |
第三字节,小版本号 |
Major |
1 |
第四字节,主版本号 |