6.4. 镜像格式
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章节。
6.4.1. 校验值的计算
6.4.1.1. MD5 校验
当 RSA 签名没有启用时,BROM 优先使用 MD5 来校验启动镜像的完整性,BROM 中使用 CE 计算 MD5 的值,以加快校验速度。
MD5 计算区域
镜像格式的 HEAD2、DATA1、DATA2 区域为 MD5 的计算区域
MD5 结果的存放
SIGN 区域存放 16 字节的 MD5 结果
Signature result offset
存放 MD5 的开始位置
Signature result length
存放 MD5 结果的长度
MD5 的校验
BROM 计算 HEAD2、DATA1、DATA2 区域的 MD5 值
新计算的结果,与 SIGN 区域的 MD5 值进行比较
6.4.1.2. 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
6.4.2. load address 和 entry point
制作启动镜像时,可以根据实际需要,指定 load_address。
load_address 和 entry_point 如果设置为0,则表示当前固件应在当前位置运行,并且 entry_point 就在 DATA1 区域的开始位置。
注意
SRAM 的前 16KB 是给 BROM 使用的,指定 load address 时,需要避开相应的地址空间。
6.4.3. 版本号信息
固件的版本号格式为: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 值进行检查。
本芯片不支持防回滚版本计数。