检查固件签名是否全到位
验证函数存在并不代表所有启动路径都强制调用,错误码也可能被上层吞掉。
有人这样说「这版固件签名全到位了,但测试日志里总冒异常,得赶紧查清楚。」
能替你选的都选好了。不想动,直接点下面「交给 AI 办」,点一下就开始做;想改,就点一下要的那个。
模板:已按内容配好换一套
标题、表头的配色和字体
已替你选好想改就点一下
只有你知道的不填就先空着,成品里留【待填】
还想怎么改可以不选
开工前请确认
高级选项一般不用动 · 这件事通常 1 分钟左右做好
示例成品全文按上面这组示例选项真跑出来的
先说结论:当前会话里我没收到可读的附件内容,不能假装打开 v2.3.1-secure-boot.bin 和 test_log_20240515.txt 报真实代码行号。但按你给的现象——“签名全到位、错误被吞、ARM TrustZone、ECDSA-P256”——问题大概率不是“没签名”,而是验签失败后没有停机,错误在返回路径上被吞了。
这版固件先别发。
直接可用的排查
1. 查验证入口:找所有 ECDSA-P256 验签调用点
grep -n "ecdsa_verify\|mbedtls_ecdsa_verify\|wc_ecc_verify\|verify_signature\|auth_mod_verify" -R .重点看每个调用点有没有这种“吞错误”结构:
ret = ecdsa_verify(...);
if (ret != 0) {
log_error("verify failed");
// 这里必须有:return ret; 或 panic(); 或 goto fail;
}
return AUTH_OK;如果上面没有 return ret、panic()、halt(),就是错误被吞。
TrustZone 下还有一个硬要求:验签失败必须在 Secure World 停机,不能把状态返回给 Normal World 继续跑。查一下验证代码是否真的跑在 Secure World,失败状态有没有被普通世界覆盖或忽略。
2. 查错误传播:日志里是不是“失败后继续 boot”
grep -n "ERR\|WARN\|verify\|auth\|signature\|jump\|boot\|panic\|halt" test_log_20240515.txt如果日志里出现类似:
[ERR] ecdsa verify failed
[INFO] boot continue
[INFO] jump to app那基本实锤:验签失败被记录,但没有阻断启动。
ECDSA-P256 额外注意
- 签名格式是
raw r||s还是DER,必须和验证代码一致。 - P256 常见验签失败点:
raw 64 字节被当DER解析,或反过来的格式混用。 - 公钥必须来自 OTP/eFuse 或不可变安全存储,不能从待验证镜像里读出来;否则签名全到位也没意义。
可以用 OpenSSL 先验证签名本身是否有效:
openssl dgst -sha256 -verify pubkey.pem -signature sig.bin payload.bin- 如果这步失败:签名数据本身有问题。
- 如果这步通过:问题集中在验签调用点的返回值处理。
负面测试:确认安全启动是否失效
cp v2.3.1-secure-boot.bin bad.bin
dd if=/dev/zero of=bad.bin bs=1 seek=0x1000 count=1 conv=notrunc
# 刷入 bad.bin预期:设备立即停机,日志记录验签失败。
如果设备仍然正常启动:验签失败没有被阻断,安全启动形同虚设。
修复要求
失败处理要满足你给的策略“立即停机、记录不阻断”,代码应类似:
if (ret != 0) {
sec_log(ret); /* 非阻塞记录 */
sec_halt(); /* 立即停机 */
}
return ret;不要出现这种:
if (ret != 0) {
sec_log(ret);
}
return 0;要真实行号,需要你补两个输出
把这两个命令的结果贴出来,我就能继续给你定位到具体文件和行号:
grep -n "ecdsa_verify\|mbedtls_ecdsa_verify\|verify_signature\|auth_mod_verify" -R .grep -n "ERR\|WARN\|verify\|auth\|signature\|jump\|boot\|panic\|halt" test_log_20240515.txt如果你愿意把相关源码片断或日志第一处异常前后 30 行贴出来,我可以继续给出带真实代码行号的定位报告。