一. 概述
安全调试(Secure Debug)顾名思义就是调试接口可以被安全管理,可以通过管理,实现只允许合法调试者调试。
二、Secure Debug 理论
E3 的 Secure Debug 根据控制强度,基本分三种控制形式:
① 对于生命周期处于开发模式的芯片,默认使能调试接口;
② 对于生命周期处于量产模式的芯片,根据权限验证开放调试接口,分为 BootROM 控制方式、JTAG Challenge/Response 机制;
③ 强制关闭调试:通过烧写 efuse 的 JTAG_DISABLE bit 永久关闭调试口。
2.1 BootROM 控制方式
芯片上电默认先启动 BootROM 程序(芯片启动代码,固化在芯片中),BootROM 根据 boot pin 的设置从 XSPI/eMMC/SD/UART/USB 等介质中获取下级启动镜像,启动镜像的格式必须满足 Boot Package 格式,然后根据 efuse 的配置情况对启动镜像进行安全启动验证,如果启动镜像合法验证,系统将成功启动镜像,表现为程序可以正常启动,具体安全启动流程如下:
- 计算 BPT 中公钥的 HASH(SHA256)并与 ROTPK1 中保存的 HASH 对比,如果两者不一致,则启动失败;
- 使用 BPT 中的公钥验证 BPT 中存储的签名,如果签名验证失败,则启动失败;
- 计算每个 core 镜像 HASH,与保存在 BPT 中的 HASH 对比,如果不一致则启动失败;
- 上述都成功,则启动 BPT 中所指定的 core 镜像。
上述过程为常规 BootROM 验证流程,虽然镜像可以正常启动,但在 Secure Debug 时,不代表可以正常打开调试口;若要开启 Debug 调试口,需要将 .json 文件 ctrl 控制字段设置成 0xffffffffffffffff,将 uuid 字段设置成与 efuse DID 字段一致(此字段由用户烧写,注意大小端格式),此过程在 Secure Debug 中非必要过程,Secure Debug 可以不开启 BootROM 验证机制仅采用 JTAG Challenge/Response 机制,对 JTAG 口进行安全调试,详细流程见下图。
2.2 JTAG Challenge/Response 机制
通过烧写 efuse SDBG_MODE 使能 JTAG Challenge/Response机制,将debugkey 烧写至efuse“e3/SEC_DBG_CFG/0-63bit”, 同时烧写相应的 Lock bit(Lock后软件无法读取该密钥),如果使能了SecureJTAG,只有使用JTAG Challenge/Response机制通过 JTAG 工具提供该密钥,验证成功后打开调试接口,详细流程见下图。
2.3 Fuse Disable 机制
通过烧写 efuse 中 JTAG_DISABLE bit 位实现,烧写完之后将无法逆转,并且 JTAG_DISABLE 的控制位拥有最高优先级,disable 后将永久无法开启 JTAG 调试口。
三 、Secure Debug 验证过程
3.1 烧写 efuse 验证
3.1.1 生成PAC包
更改 json 脚本,ctrl 字段为:0xffffffffffffffff,uuid 字段对应 efuse DID 一致,通过 CMD 命令行打包成 PAC 包,并将 PAC 包烧写进 Flash,烧写完固件之后,拨码到 0000 断电重启,确认固件是否正常启动。
3.1.2 烧写 efuse
① 烧写公钥 Hash,执行打包指令时,在 log 区会输出 HASH of Root Cert dump 为公钥 hash,保存并烧写到 efuse -> ROTPK1,具体见下图;
② 烧写 DID,需要与生成 PAC 的 JSON 脚本中的 uuid 字段对应,注意大小端对应关系
③ 烧写 PROD位,将开启 production 模式,在这个模式下,芯片将无法再被随意烧写,也无法随意连接调试器(只能通过 USB 口进行 PAC 烧写,烧写/读取 efuse)
④ 烧写 DebugKey
⑤ 烧写 SDBG_MODE 位,开启 Secure Debug 后,板卡上的 JTAG 口被保护,只能通过输入密码的方式重新打开 JTAG 口,(此时虽然 JTAG 口被保护,使用 SDFuseTool 工具以无法通过JTAG 链路链接,仅能通过 USB 链路方式可以读取或烧写efuse)
⑥ Lock密钥
- Bank 后面的序号用于与 LockBank 的序号相对应,即 BankX 的锁对应 SafeLockBankX 及APLockBankX;
- Bank 中标识含 [D] 的 fuse 项支持单 bit 从 0 到 1 的修改,没包含此标志的表示的是 ECC 保护功能,仅支持以 WORD 为单位的一次性写入,不支持单 bit 改写
- LockBank 中的 HLock、OLock、RLock、Plock 含义
- PLock:置 1 后将不能无法烧写对应 Bank 的 Fuse 内容;
- RLock:置 1 后软件将无法读取对应 Bank 的 Fuse 内容;
- OLock:置 1 后无法修改对应 Bank 的 Fuse 的 shadow register 内容;
- HLock:置 1 后硬件读取对应 Bank 的 Fuse 内容均为 0;
3.2 写寄存器模拟验证
参考secure debug - 函数方式验证(敬请期待)。
四、Secure Debug 解锁
参见Secure Debug - 解锁方式(敬请期待)。
五、参考文档
《AppNote_E3_Boot_and_OTA_Rev01.06》
《E3 secure debug V1.0》
《Semidrive_E3信息安全_Rev1.0》
《AppNote_E3_烧录流程_Rev2.0》
《SDToolBox_User_Guide》
欢迎在博文下方留言评论,我们会及时回复您的问题。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:娜就这么嘀