VBF(Versatile Binary Format)是一种二进制文件格式,是软件释放的一种格式,与HEX,S19文件类似,只是一种文件格式。
其主要由三部分组成:Version,Header 和 Data。
Version Number | Text | vbf_version=2.6| |
---|---|---|
Header | Text | ASCII |
Data Block 1 | Start address | 4 bytes,binary |
Length | 4 bytes,binary | |
Data | n bytes,binary | |
Checksum | 2 bytes,binary | |
Data Block 2 | Start address | 4 bytes,binary |
Length | 4 bytes,binary | |
Data | n bytes,binary | |
Checksum | 2 bytes,binary | |
… | … | … |
Data Block n | Start address | 4 bytes,binary |
Length | 4 bytes,binary | |
Data | n bytes,binary | |
Checksum | 2 bytes,binary |
- Data段
先说Data段,Data段是由多个Block组成的,Block中的Data就是有效数据,是需要被刷到Flash里面。这么多个Block中有一个Block是VBT(Verification Block Table),VBT里面存放的是其他Block的Hash数据。
VBT的Data:
0000
format identifier(SHA-256)
0002 data block的个数
00060000 start address
00000013 length
D78ECD62C62C…2262 Hash
00060100 start address
0001EF00 length
E6027B3F959F…4188 Hash
- Header段
再说Header段,Header段的格式是ascii,所以用notepad打开也可以看到。Headr段里面定义了VBF的属性。一些关键的属性:
2.1 sw_part_number
零件号
2.2 sw_version
版本号
2.3 sw_part_type
表示此VBF包的类型,SBL,EXE,或者是DATA等
2.4 ecu_address
ECU的物理目标地址,在诊断调查表里面会写明,一般由4个数字组成,后两个数字与诊断ID后两个数字一样。
2.5 erase
VBF中每个Block需要擦出的Flash起始地址和长度。
2.6 call
VBF的类型是SBL时,是必填的,就是SBL的起始地址。
2.7 verification_block_start
VBT的起始地址
2.8 verification_block_root_hash
root hash是很重要的,计算的是未压缩的VBT信息的Hash值。
Root hash = SHA-256 (VBT startAddress || VBT length || VBT data)
2.9 sw_signature_dev
后缀dev的意思是,这个值是此VBF加研发签后生成的签名值,研发签名值= RSA(root hash + dev private key)。Tier1在转换VBF的时候,使用研发私钥给VBF加签,研发私钥由OEM给出,研发私钥对应的解签用的研发公钥也是由OEM给出,研发公钥固化在MCU内部。在刷写MCU时,刷写流程中的Check Memory会附带研发签名值的明文,MCU收到签名值后,结合研发公钥 和 已经刷到Flash的数据一起,验证刷写文件的完整性和合法性。
Tier1将加了研发签的VBF释放给OEM后,OEM会再加一个生产签 sw_signature,也就是说一个VBF文件会有两个签名值,即一个研发签名值,一个生产签名值。生产签名值=RSA(root hash + private key),其中生产私钥只有OEM自己知道。在整车下线时,对应的生产公钥会通过DID写入,MCU在收到生产公钥后,将生产公钥存到受保护的区域(例如HSM的数据区等)替换掉研发公钥。在Check Memory时,MCU不再使用研发公钥验签,而使用生产公钥验证传入的签名值。这样就可以保证在整车下线后,Tier1或者其他不知道生产公私钥的相关方不能私自更新软件。