固件验签、拆包解析定制要求及使用指导
更新时间: 2026/04/16
在Gitcode上查看源码1. 固件验签、拆包解析定制要求
定制固件验签、拆包解析需要配置CSR,需要在FirmwareCustomConfig对象中配置CustomVerifyEnabled、CustomVerifyLibraryName、CustomParseEnabled、CustomParseLibraryName属性。属性说明见下表:
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| CustomVerifyEnabled | Boolean | 客户验签流程定制使能,true:使能;false:禁用,默认值为false |
| CustomVerifyLibraryName | String | 客户验签流程定制库名称,默认值为"hpm_parser" |
| CustomParseEnabled | Boolean | 客户拆包解析流程定制使能,true:使能;false:禁用,默认值为false |
| CustomParseLibraryName | String | 客户拆包解析流程定制库名称,默认值为"hpm_parser",字符串长度约束1~32 |
2. 流程
固件验签
- 客户新增
/opt/bmc/luaclib/xxx.so,作为定制hpm解析的接口库(xxx为定制so名称,下同) - 客户自行实现
xxx.so内容,需要提供方法parse_hpm_file供lua接口调用,入参file_path为hpm包路径;响应为状态码,通过约定返回的状态码标识,确定解析状态。当前实现返回状态码如下:
- 正数表示解析成功,负数表示失败,返回负数则直接退出升级流程;
- 返回状态码为1:解析验证固件成功,需要继续openUBMC的验签+解析+升级;
- 返回状态码为2:解析验证固件成功,需要继续openUBMC的解析+升级;
- 返回状态码为3:解析验证固件成功,直接结束固件解析,跳到后续升级
拆包解析
- 客户新增
/opt/bmc/luaclib/xxx.so,作为定制hpm解析的接口库(xxx为定制so名称,下同) - 客户自行实现
xxx.so内容,需要提供方法custom_parse_pkg供lua接口调用,入参file_path为hpm包路径,output_dir为拆包解析后数据存放目录;响应为true(解析成功)/false(解析失败),且在output_dir下存放必带文件。
3. 配置示例:
固件验签
json
"FirmwareCustomConfig": {
"CustomVerifyEnabled": true, //客户签名定制使能
"CustomVerifyLibraryName": "sign_verify" //客户签名定制库为sign_verify.so
}拆包解析
json
"FirmwareCustomConfig": {
"CustomParseEnabled": true, //客户拆包解析定制使能
"CustomParseLibraryName": "hpm_parser" //客户拆包解析定制库为hpm_parser.so
}4. 客户定制仓自行实现要求
固件验签定制库内容流程图
拆包解析定制库输入输出要求
固件管理标准流程调用客户定制库时,会传入file_path(hpm包路径),output_dir(拆包解析后数据存放目录),定制库自行对hpm包进行拆包解析,并将解析内容存放在output_dir下,output_dir必带数据如下:
- beforeaction.sh(升级前自定义动作,内容可为空)
- afteraction.sh(升级后自定义动作,内容可为空)
- update.cfg(参考update.cfg规范)
- 解压后的各个固件镜像的二进制数据(命名为FirmwareX,X为固件索引,起始值为1,随着固件数量递增,如Firmware1、Firmware2...,Firmware0用于将update.cfg这个文件作为固件进行描述)
5. update.cfg 规范
Basic 基础信息域
| 字段名称 | 说明 | 必选(M/O) | 约束 | 样例 |
|---|---|---|---|---|
| Version | 固件的内部版本号 | M | 按照各个不同的固件的版本规范进行定义。比如:BMC固件内部采用4段式版本号 | [Basic]Version=X.XX.XX.XX |
| Revision | 固件的防回退登记号 | O | 当前固件配置了Revision并且是大于0的则生效。每个固件都可以定义自己的Revision,分为两种: - RevisionNumber:硬件确定的防回退标记 - RevisionNumber4User:软件确定的防回退标记当固件配置的任何一个Revision小于待升级固件的Revision则不允许升级 | [Basic]Revision=20 |
Firmware 固件描述域
| 字段名称 | 说明 | 必选(M/O) | 约束 | 样例 |
|---|---|---|---|---|
| FileNum | 固件由多少个部分的子固件组成 | M | 最大32个 | [Firmware]FileNum=2 |
| FirmwareMode | 固件升级模式 | O | 取值:Multiple/Single 表示多firmware升级/单firmware升级 | [Firmware]FirmwareMode=Multiple |
FirmwareX 固件描述详细域
当前域会分为多个域进行描述。
| 字段名称 | 说明 | 必选(M/O) | 约束 | 样例 | 补充说明 |
|---|---|---|---|---|---|
| ProductID | 固件适用的产品标识 | M | 2字节的数字,配置必须是10进制,默认是65535。如果不为默认值并且和当前product的低字节不匹配或者完全不匹配则阻止升级 | [Firmware1]ProductID=65535 | |
| BoardID | 固件适用的单板标识 | M | 2字节的数字,配置必须是10进制,默认是65535。如果不为默认值并且和当前product的低字节不匹配或者完全不匹配则阻止升级 | [Firmware1]BoardID=65535 | |
| Model | 固件适用的硬盘型号列表 | O | 字符串,用英文逗号(,)分隔的多个硬盘型号元素,每个元素是具体的硬盘型号 | [Firmware1]Model=XXX,YYY,ZZZ | |
| ComponentID | 固件适用的固件类型标识 | M | 1字节的数字,配置必须是10进制,通配是255。根据 ComponentID 和 ComponentIDEx 共同确认一个具体的固件类型。具体参考《IPMI接口说明》附录《固件ID管理》 | [Firmware1]ComponentID=0 | IPMI接口说明 |
| ComponentIDEx | 固件适用的固件扩展标识 | O | 4字节的数字,配置必须是10进制,通配是4,294,967,295(0xFFFFFFFF)。根据 ComponentID 和 ComponentIDEx 共同确认一个具体的固件类型。如果 ComponentIDEx 是通配则仅由 ComponentID 确认具体的固件类型。具体参考《IPMI接口说明》附录《固件ID管理》 | [Firmware1]ComponentIDEx=0 | IPMI接口说明 |
| Uid | 固件适用的UID | O | 24字节的字符串,由 Vendor(8) + Type(2) + ComponentID(14) 组成。仅天池机型固件使用 | ||
| UID | DPU固件的UID | O | 仅DPU使用 | ||
| ProductUIDList | 固件适用的产品UID列表 | O | 字符串,用英文逗号(,)分隔的多个 ProductUID 元素,每个元素是4字节的16进制数字,默认为空。如果产品 Product 配置中 ProductVendorID 不为 0xFFFFFFFF 则联合 ProductUniqueID 判定固件的匹配;否则单独采用ProductUniqueID 判定固件的匹配,不匹配则阻止升级。和下文中的 BoardIDList 作用同样,优先判定 ProductUIDList | [Firmware1]ProductUIDList=0xXXXXXXXX,0xXXXXXXXX,... | |
| BoardIDList | 固件适用的单板UID列表 | O | 字符串,用英文逗号(,)分隔的多个 BoardID 元素,每个元素是2字节的数字,配置为10进制。如果上文中 BoardID 配置不为 65535 则优先匹配FRU0的 BoardId,不匹配则阻止升级。然后遍历当前 BoardIDList,如果元素不为65535 则匹配FRU0的 BoardId,不匹配则阻止升级 | [Firmware1]BoardIDList=XXX,XXX | |
| Version | 当前固件包此Firmware的内部版本号 | O | 按照各个不同的固件的版本规范进行定义。比如:BMC固件内部采用4段式版本号 | [Firmware1]Version=X.XX.XX.XX | 2026/1/8新增,用于版本一致则跳过升级的特性 |
| SubComponentNum | 当前固件下对应的Firmware适用的子固件 | O | 仅openUBMC升级使用,compute和bios使用 | ||
| CPLDChipNummbers | 多供应商模式下的CPLD芯片数量 | O | 仅cpld升级使用,和MultipleSuppliersMode配套使用 | ||
| ColdValidList | 固件适用的冷升级片选标识 | O | 仅cpld升级使用 | ||
| HotValidList | 固件适用的热升级片选标识 | O | 仅cpld升级使用 | ||
| MultipleSuppliersMode | 多供应商模式 | O | 仅cpld升级使用 | ||
| UpdateLink | CPLD升级的链路 | O | 仅cpld升级使用 | ||
| UpdateFileType | CPLD升级的格式 | O | 仅cpld升级使用 |
Custom 自定义域
可选域,对于固件的自定义描述,如果固件不涉及自定义可不写。
| 字段名称 | 说明 | 必选(M/O) | 约束 | 样例 |
|---|---|---|---|---|
| VersionXXX | 自定义对外版本号,其中 XXX 是具体的客户标识,不同的客户可以有多个 | 1、Version之后的描述产品包构建时根据不同的客户动态写入,必须和定制化客户保持一致 2、该属性如果没有则认为不需要自定义对外版本号,默认采用BMC的内部版本号,取自Basic域的Version属性 | [Custom]VersionCustomerA=X.X.XVersionCustomerB=X.XX |
BMC固件升级update.cfg示例
升级时默认从Firmware1开始读取除update.cfg文件之外的固件相关信息
ini
[Basic]
Version=X.XX.XX.XX
Revision=31
[Firmware]
FileNum=2
[Firmware0]
ProductID=0 # 天池机型的productId为0
ComponentID=0
BoardID=255
ProductUIDList=0xXXXXXXXX,0xXXXXXXXX
[Firmware1]
ProductID=0
ComponentID=25
BoardID=255
ProductUIDList=0xXXXXXXXX,0xXXXXXXXX
[Custom]
VersionCustomerA=X.XX.XX
VersionCustomerB=X.XX.XXXXXXXX