镜像格式要求
4 Dec 2024
Read time: 4 minute(s)
BROM 在启动过程中解析专有的启动镜像,第一级引导程序的镜像格式必须符合下表的要求。
数据区域 | 数据分块 | 字段 | 字节 | 描述 |
---|---|---|---|---|
Signed Area |
HEAD1 (8B) |
Magic | 4 | 特征字符串,固定为 ”AIC ” |
Checksum | 4 | 32 bit 累加和校验的校验值。安全启动方案设为 0. | ||
HEAD2 (248B) | 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 数据的长度 | ||
Padding | 176 | 填充,使得头部刚好 256 字节 | ||
DATA1 | Loader binary data | X | 第一级引导程序的保存区域 | |
Padding | X | 增加填充,使得 256 字节对齐 | ||
DATA2 | 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 对齐,方便计算数字签名 | ||
- | SIGN | Signature result area | 256 | 前面所有内容的数字签名或 MD5 |
这里所描述的启动镜像是 BROM 读取的第一级引导程序 (First Stage Boot Loader)。 BROM 需要启动镜像提供必要的信息,以帮助 BROM 做初始化,并且找到正确的引导代码运行。在打开安全启动的情况下, 还需要提供必要的信息以帮助 BROM 对镜像进行签名认证,甚至对相关数据段进行解密。 这里的安全镜像格式固定前面 256 字节保存相关的信息,第一级引导程序的内容固定存放在 DATA1 区域中。
在安全启动的应用中,如果方案中需要对第一级引导程序进行加密,则只需要加密 DATA1 的内容。 安全启动的应用中,总是需要对 HEAD1/HEAD2/DATA1/DATA2
的数据进行签名。 在签名和加密都使能的情况下,主机工具总是先对 DATA1 进行加密,再对 HEAD1/HEAD2/DATA1/DATA2 进行签名。
注:
RSA 签名,使用的签名方案为 RSASSA-PKCS1-v1_5。具体格式参考 《RFC 3447》第 9.2 章节。
校验值的计算
- 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。
load_address 和 entry_point 如果设置为 0,则表示当前固件应在当前位置运行,并且 entry_point 就在 DATA1
区域的开始位置。
注: SRAM 的前 16KB 是给 BROM 使用的,指定 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 | 第四字节,主版本号 |
注: 固件版本号是给用户填写,用来进行固件版本管理使用的。BROM 程序不会对固件版本号的
Major.Minor.Revision 值进行检查。本芯片不支持防回滚版本计数。