请注意,这些细节/脚本目前仅供NXP内部参考。请不要和顾客分享。
基于上述,部分字段返回的步骤如下:
$ cd ../crts/ $ ../linux64/bin/srktool -a -s sha384 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin -f 1 -c SRK1_sha384_secp384r1_v3_ca_crt.pem,SRK2_sha384_secp384r1_v3_ca_crt.pem,SRK3_sha384_secp384r1_v3_ca_crt.pem,SRK4_sha384_secp384r1_v3_ca_crt.pem
SRK_1_2_3_4_table.bin和SRK_1_2_3_4_fuse.bin文件还可用于后续步骤。
在iMX8/8X设备上,启动设备并在SCU终端输入并运行命令“seco info”。下列输出将显示在SCU终端上。保存此信息,以备后用。
修改 message_header.json
{"container": {"message": {"permission": "0x10", "cert version": "0", "UID": "0C13380E82895B2C", "flags": "0", "monotonic counter": "0x0"}, "header": {"fuse version": "0", "SW version": "0", "version": "0"}}}
从下图中修改message_content.json,要改为部分返回,生命周期需要改为0x20
{"Id": "0xa0", "lifecycle": "0x20", "nb words": "1"}
然后通过以下命令行生成消息。
$python gen-msg-json.py message_header.json message_content.json -o message.bin
如下所示,将权限修改为 Fuse1:SCU 版本。生命周期,即 0x10。
[标题] 目标 = AHAB 版本 = 1.0 [安装SRK] # srktool生成SRK表格 文件 = "../crts/SRK_1_2_3_4_table.bin" # PEM格式的公钥证书 来源 = "../crts/SRK1_sha384_secp384r1_v3_usr_crt.pem" # SRK表中公钥证书的索引(0 .. 3) 源索引 = 0 # SRK集类型(NXP或OEM) 源集 = OEM # 撤销SRK的位掩码 撤销 = 0x0 # ******* 可选命令 ***** [安装证书] # PEM格式的公钥证书 File = "../crts/SGK1_1_sha384_secp384r1_v3_usr_crt.pem" # 权限的位掩码权限 = 0x10# ******************************[验证数据]# mkimage生成的待签名二进制文件文件 = "message.bin"# 偏移量 = 容器标题 签名块(由mkimage打印) 偏移量 = 0x0 0x48
然后执行命令: ../linux64/bin/cst -i message.csf -o message_signed.bin 并且可以获取message_signed.bin
第一种方法是使用 message_signed.bin 重新生成已签名的 flash.bin。
$cp message_signed.bin到imx-mkimage/iMX8QX/
转到imx_mkimage仓库并编辑./iMX8QX/scripts/misc.mak中的flash_msg_block规则。
-./$(MKIMG) -soc QX -rev B0 -append mx8qx-ahab-container.img -c -scfw scfw_tcm.bin -msg_blk test_block.bin field 0x83000000 -out flash.bin
+./$(MKIMG) -soc QX -rev B0 -append mx8qx-ahab-container.img -c -scfw scfw_tcm.bin -msg_blk message_signed.bin field 0x83000000 -out flash.bin
然后运行:
$ make SOC=iMX8QX flash_msg_block
它将生成新的flash.bin,因为板处于OEM关闭状态,所以需要重新生成flash-signed.bin。
创建 csf_boot_image_csf.csf 文件,如下所示:
[标题] 目标 = AHAB 版本 = 1.0 [安装SRK] # srktool生成SRK表格 文件 = "../crts/SRK_1_2_3_4_table.bin" # PEM格式的公钥证书 来源 = "../crts/SRK1_sha384_secp384r1_v3_usr_crt.pem" # SRK表中公钥证书的索引(0 .. 3) 源索引 = 0 # SRK集合类型(NXP或OEM) 源集合 = OEM # 已撤销SRK的位掩码 撤销 = 0x0 # ******* 可选命令 ***** #[安装证书] # PEM格式的公钥证书 # 文件 = "../crts/SGK1_1_sha384_secp384r1_v3_usr_crt.pem"# 权限的位掩码 # 权限 = 0x10 # ****************************** [认证数据] # mkimage生成的待签名二进制文件 文件 = "flash.bin" # 偏移量 = 容器标题 签名块(由mkimage打印) 偏移量 = 0x400 0x590
然后运行命令: ../linux64/bin/cst -i csf_boot_image_csf.csf -o flash_signed.bin 即可获得flash_signed.bin
最后,将生成flash-signed.bin文件,并使用dd命令将其写入SD卡。生命周期预计将变为0x100。
第二种方法是在uboot中写一个新命令,然后通过该命令在uboot中手动添加message-signed.bin。
$ git am 0002-add_ahab_return_lifecycle_disable_cache.patch $ source$ unset LDFLAGS $ make -j8
重新生成u-boot.bin。
$ cp u-boot.bin$ cd imx-mkimage/ $ make SOC=iMX8QX flash $ cp iMX8QX/flash.bin
$ cd$ ../linux64/bin/cst -i csf_boot_image.txt -o flash-signed.bin $ sudo dd if=flash-signed.bin of=/dev/sdX bs=1k seek=32 ; sync
然后使用这个新的u-boot.bin生成flash-signed.bin。将第五步生成的message-signed.bin复制到SD卡。
给板上电,并停止uboot。
$ fatload mmc 1:1 0x80280000 message_signed.bin
$ ahab_status
$ ahab_return_lifecycle 0x80280000
$ ahab_status
请注意,该地址与您在第一步中输入的地址一致。
然后您可以在SCU串口输入$seco info,看看生命周期预期会变成0x100。
你好@Tia_Lan
您能提供 Lauterbach 脚本将 SECO 日志转储到 Ankit 吗?
顺祝商祺!
弗兰克
这是不可能的,因为客户从 Linux 内核 sysfs 驱动程序将 LC 返回 OEM 现场操作,然后重启设备电源。
以下是客户在执行 OEM Field Return 返回 LC 后检查 ahab_status 时观察到的日志
# dd if=signed_msg_512.bin of=/sys/kernel/seco/field_return bs=816
[ 548.708086] imx_scu_call_rpc(...) 失败,错误 -13!
[ 548.708097] imx_sc_seco_return_lifecycle(...) 失败,错误 -130+0 中的 1+0 条记录复制了
0 字节 (0B),0.066212 秒,0B/s
# cat /sys/kernel/seco/ahab_status
生命周期:0x0080,OEM 已关闭
UID_H: 0x1A10B00E
UID_L: 0x8292379B
单调性计数器:0x0000
SECO event[0] = 0x00A0AB29
CMD = AHAB_FIELD_RETURN_REQ (0xA0)
IND = 未知指示符 (0xAB)
发现 1 SECO 活动
发现 SECO 事件 - 真实性检查失败!
-安基特
嗨,安基特、
客户看到错误后,能否在 uboot 中运行 ahab_dump?我们可以查看 SECO 日志。
顺祝商祺!
弗兰克
客户以"的方式签署了" 。
他们使用 CST 工具编写并签署了"Return Lifecycle Update" 信息。
在目标上,通过 Linux 控制台将"签名信息" 发送到其 sysfs 驱动程序。而 sysfs 驱动程序会调用 SCU API: sc_seco_return_lifecycle(具有 SECO_FUNC_RETURN_LIFECYCLE)函数。
他们没有使用签名映像方式(因此签名消息是启动映像的一部分)。
-安基特
嗨,安基特、
他们使用的是签名消息方式还是签名映像方式(因此签名消息是启动映像的一部分)?
顺祝商祺!
弗兰克
是的,我做得很好。希望你那边也一切顺利。
客户已执行以下步骤:
您认为上述步骤有问题吗?
请注意,我们刚刚收到买家的最新消息,称他们在另一块板上完成了上述所有步骤 & 看到 " " 熔丝 被写入/读取锁定 " " 错误。而且 " 尽管如此,在板上进行电源循环后,LC 成功更改为 " OEM Field Return "
-安基特
嗨,安基特、
好久不见。希望你一切都好。
我不认为这是意料之中的事。但你说 LC 已经改变了。你能帮我检查一下吗?
找到所有与 LC 相关的熔丝(我记得它不只一个),看看客户之前是否对同一个单词进行了编程。
我将在下周末的电话中向 STEC 询问。请在周末提醒我。
顺祝商祺!
弗兰克
你好@frank_zhang、
我们收到了客户关于从 " OEM 已 关闭 " 向 " i.mx8QXP " 设备的退货生命周期过渡到 " OEM Field Return " 的询问 。
客户在 Linux 内核中实施了一个 sysfs 驱动程序,以调用SECO API。使用该驱动程序,他们能够将生命周期从 "NXP Closed (OEM Open)"成功过渡到"OEM Closed"。
但是,当他们尝试将生命周期状态返回到"OEM Field Return" 时,他们遇到了一个问题,希望得到一些澄清。
调用 SECO API(SC_SECO_FUNC_RETURN_LIFECYCLE)后,它们会收到以下 SECO 事件:SECO event[0] =0x00A0AB29。此事件表示 "熔丝已被写入/读取锁定"。
尽管如此,在板上执行电源循环后,生命周期似乎成功更改为 " OEM Field Return "。
这种行为是预料之中的吗?