JTAG 解锁
在安全方案中,芯片使能安全启动之后,可通过 eFuse 关闭 JTAG, 防止攻击者通过 JTAG 控制芯片和窃取芯片中的敏感信息。在实际需要使用 JTAG 调试的场景中,需要先关闭 JTAG,在重新打开。
JTAG 安全解锁让合法用户重新打开芯片的 JTAG 接口,而不影响芯片的安全等级。
JTAG 关闭和打开
JTAG 信号包括:
-
TMS
-
TRST
-
TDI
-
TDO
- TDO 关闭时,可以关闭外部调试器的 JTAG 调试功能。本芯片通过烧录 eFuse 的安全配置区域 JTAG_DIS 位进行关闭
TDO 信号。
-
如需重新打开 JTAG,可通过另外一个来自寄存器的设置信号来重新使能 TDO 信号。具体如重新打开 TDO 信号 所示。
当设置 JTAG_UNLOCK 为 1 时,即保证 TDO 有效,此时 eFuse 中 JTAG DIS 的值不会影响 TDO。
- TDO 关闭时,可以关闭外部调试器的 JTAG 调试功能。本芯片通过烧录 eFuse 的安全配置区域 JTAG_DIS 位进行关闭
TDO 信号。
开关的安全性
设置 eFuse JTAG DIS 为 1 后,JTAG 立刻关闭。此时 eFuse 比特无法被重新设置为 0,JTAG_DIS 信号一直生效,即每次重新上电,JTAG 总是默认关闭。
如需重新打开 JTAG,需要设置 JTAG_UNLOCK 信号控制。JTAG_UNLOCK 信号由 SID 模块的 JTAG_UNLOCK 寄存器比特位控制。因此重新打开 JTAG 的安全性,取决于 JTAG_UNLOCK 比特位的安全性。
- JTAG_UNLOCK 设置为 1,且 SID 模块寄存器中 BROM_PRIV_LOCK 设置为 0,可以解锁 JTAG。
- JTAG_UNLOCK 设置为 1,但 SID 模块寄存器中 BROM_PRIV_LOCK 设置为 1,无法解锁 JTAG。
BROM_PRIV_LOCK 设置为 1 时,无法清零,只有执行系统复位才能清零。 系统复位时,会运行 BROM。在 BROM 跳出之前,系统会主动设置 BROM_PRIV_LOCK=1,来保证只有 BROM 程序可以设置 BROM_PRIV_LOCK 和 JTAG_UNLOCK 位。在升级模式下,BROM 通过 USB 命令, 对外部的解锁 JTAG 命令进行安全性校验。如校验通过,则设置 JTAG_UNLOCK 对 JTAG 进行解锁。
使能安全启动,BROM 会采取以下行为,保证 BROM 阶段其他程序无法打开 JTAG:
-
不能通过 USB READ/ WRITE 命令读写寄存器。
-
所有 BROM 执行的程序,都需要经过安全校验,包括 PBP 程序。如果使能了安全启动,PBP 必须加密。
-
BROM 在跳转到任何其他程序之前,必须先设置 BROM_PRIV_LOCK 特权位。
解锁的安全验证
在 USB 升级模式下,BROM 通过 USB 命令执行 JTAG 解锁。JTAG 解锁的具体流程如下:
-
BROM 通过 USB 命令读取芯片中包含 CHIP ID 等信息的 CHIP DATA,并将其保存为二进制文件。
-
主机端使用 RSA 私钥,对读取的 CHIP DATA 二进制文件进行签名,并生成签名后的 JTAG 解锁文件。文件格式如图所示。
-
通过 USB JTAG_UNLOCK 命令,发送 JTAG 解锁文件给 BROM。
-
BROM 验证通过后,执行 JTAG 解锁。