SWD 保护
概述
串行调试(SWD)是一种嵌入式设备常用的调试接口,可以直接访问和调试处理器内核。
为防止处理器及系统状态被未经授权访问,系统支持 SWD 调试接口的安全保护机制。通过认证手段对调试接口访问进行严格控制,该机制可满足产品在不同生命周期阶段的安全管理需求,有效提升整体安全性。
功能特性
分级访问控制
支持侵入式、非侵入式、安全侵入式和安全非侵入式的多种调试权限。
支持关闭 SWD 接口,彻底禁止调试访问。
密钥认证机制
调试权限通过与 OTP 写入的密钥绑定,实现身份认证,保障调试接口安全。
灵活的安全激活
默认开放,便于开发调试。
量产阶段可通过 OTP 加密配置,激活保护,未通过校验前无法访问系统资源。
SWD 分级访问
本芯片在安全区与非安全区均支持两种调试模式:
侵入式调试(Invasive,能中断 CPU)
非侵入式调试(Noninvasive,仅采样 PC,不中断 CPU)
下表介绍了配置 SWD 调试权限级别的 OTP 字段:
名称 |
OTP 地址 (物理) |
长度 (比特) |
描述 |
|---|---|---|---|
SWD_DBGEN |
0x364 bit[1] |
1 |
侵入式调试(中断 CPU)控制 1:允许非安全区侵入式调试(可中断 CPU) 0:禁止非安全区侵入式调试 |
SWD_NIDEN |
0x364 bit[2] |
1 |
非侵入式调试(Trace)控制 1:允许非安全区非侵入式调试(Trace, 采样 PC, 不中断 CPU) 0:禁止非安全区非侵入式调试 |
SWD_SPIDEN |
0x364 bit[3] |
1 |
安全区侵入式调试控制 1:允许安全区侵入式调试(可中断安全区 CPU) 0:禁止安全区侵入式调试 |
SWD_SPNIDEN |
0x364 bit[4] |
1 |
安全区非侵入式调试控制 1:允许安全区非侵入式调试(Trace, 采样 PC, 不中断 CPU) 0:禁止安全区非侵入式调试 |
默认情况下,上表中所有栏位均未编程,表示设备支持 SWD 全部调试功能。
如果希望 禁止 SWD 进行任何调试操作,只需将表中四个 bit 全部编程为 0 即可 。
用户可根据实际安全需求, 选择性编程部分栏位 ,以灵活控制 SWD 访问权限。
备注
控制 SWD 调试权限级别的 OTP 选项 优先级高于 控制 SWD 保护的 OTP 选项 。
这意味着即使 SWD 保护的 OTP 配置已开放 SWD 接口,但只要本表将所有调试功能禁用,设备依然无法进行 SWD 调试操作。
SWD 密钥认证
工作原理
量产阶段
密钥存储 : 将密钥写入设备的 OTP 区域中,以确保设备唯一性和安全性。
调试阶段
密钥录入:在指定的配置文件或自动化工具参数中填入密钥。认证触发:通过执行自动化工具,对密钥进行一致性验证。
关于配置文件及路径详见 密钥认证使用步骤。
访问授权
仅当录入的密钥与 OTP 存储的 密钥完全匹配 时,系统才授予设备访问和调试权限。
认证方案
系统支持为每台设备烧录唯一的 SWD 密钥("一机一密")以提升安全性。
该功能为可选项,用户可根据项目需求来选择是否启用一机一密机制。
一机一密机制
烧录环节 :为每台设备编程唯一的
SWD_ID和SWD_PASSWORD,实现密钥的唯一性和不可复用性。后台数据库管理 :系统后台建立
SWD_ID与SWD_PASSWORD的一一映射关系,用于后续的身份认证。设备调试或认证 :通过读取到的
SWD_ID查询数据库,获取对应的SWD_PASSWORD,实现单设备的精确认证操作。
使用该方案,单台设备密钥泄漏不会影响其他设备,显著提升系统整体安全防护能力。
备注
SWD_ID获取方式,详见 SWD 密钥认证使用步骤 中的swdpwd_password.log文件。如采用每台设备独立密钥方案,请妥善维护设备
SWD_ID与对应的SWD_PASSWORD。
非一机一密机制
如无需区分单台设备权限,则所有设备可共用同一 SWD_PASSWORD ,无需烧录 SWD_ID 。
使用该方案,设备量产流程简化,但整体安全性相对降低。
密钥管理
OTP 密钥信息说明
OTP 包含的密钥信息如下:
名称 |
OTP 地址 (物理) |
长度 (比特) |
描述 |
|---|---|---|---|
SWD_PASSWORD |
0x300 ~ 0x30F |
128 |
SWD 访问密钥,用于调试访问身份验证 |
SWD_ID |
0x360 |
32 |
SWD 唯一标识字段,用于关联 SWD 访问密钥 |
SWD_PWD_EN |
0x364 bit[0] |
1 |
使能 SWD 保护功能控制: 0:启用 SWD 访问保护 1:禁用 SWD 访问保护 |
SWD_PWD_R_Protection_EN |
0x364 bit[5] |
1 |
使能 SWD 密钥的读取保护控制: 0:启用读取保护,防止被读出 1:禁用读取保护 |
SWD_PWD_W_Protection_EN |
0x364 bit[6] |
1 |
使能 SWD 密钥的写入保护控制: 0:启用写入保护,防止被黑客全写0 1:禁用写入保护 |
OTP 密钥编程(烧录)指南
本节介绍如何通过 AT 指令编程 OTP 密钥信息。
备注
编程 OTP 指定地址的某个位时,需 先读回 该字节当前值, 按位修改 后再写回,防止其他位数据被意外修改。
编程 OTP 指定地址的数据后,请 读回确认 ,以确保写入内容正确。
请根据表 OTP 密钥信息 字段含义,按如下步骤编程 OTP 密钥信息:
写入并读回确认
SWD_PASSWORD例如,密钥为
0x4433221188776655ccbbaa9900ffeedd,则编程 OTP 指令为:efuse wraw 300 16 4433221188776655ccbbaa9900ffeedd
读回 OTP 的指令为:
efuse rraw 300 16
预期读回输出:
... addr : 0x300, size: 16 44 33 22 11 88 77 66 55 cc bb aa 99 00 ff ee dd ...
写入并读回确认
SWD_ID(如采用 非一机一密认证方案, 可跳过该步骤)例如,
SWD_ID为0x3412,则编程 OTP 指令为:efuse wraw 360 2 3412
读回 OTP 的指令为(后续步骤的读操作命令均一致,不再赘述):
efuse rraw 360 2
预期读回输出:
... addr : 0x360, size: 2 34 12 ...
写入 SWD 保护功能使能位
SWD_PWD_ENefuse wraw 364 1 fe
写入 SWD 密钥读写保护位
SWD_PWD_R_Protection_EN和SWD_PWD_W_Protection_EN,防止密钥泄漏或被篡改efuse wraw 364 1 9e
备注
一旦烧写
SWD_PWD_R_Protection_EN,SWD_PASSWORD将无法再被读取,因此请务必妥善保存这些密钥。OTP 的数据修改仅在 系统重启后生效。
密钥认证使用步骤
请根据 SWD 密钥编程指南 介绍,在编程 SWD 保护的 OTP 配置项后,按照如下步骤使用 SWD 保护机制:
重启设备以重新加载 OTP 数值。
连接 J-Link 到板卡 SWD 引脚。
双击
{SDK}\sources\firmware\amebadxxx_gcc_project\utils\jlink_script目录下的swdpwd_User.bat。如未正确输入 SWD 密钥,连接会失败,界面如下:
Connecting to J-Link... J-Link is connected. Firmware: J-Link V11 compiled Apr 27 2041 16:36:21 Hardware: V11.00 S/N: 50120677 Feature(s): GDB, JFlash, FlashDL, RDI, FlashBP Checking target voltage... Target voltage: 3.33 V Listening on TCP/IP port 2340 Connecting to target...ERROR: Could not find core in Coresight setup ERROR: Could not connect to target. Target connection failed. GDBServer will be closed...
打开
{SDK}\sources\firmware\amebadxxx_gcc_project\utils\jlink_script目录下的swdpwd_password.log文件,查找设备的SWD_ID:*************************************************************** J-Link script: ResetTarget() ******************** SWD ID ******************** J-Link script: SWD_READ_ID SWD ID:0xFFFF1234
备注
swdpwd_password.log文件会在执行第 3 步时自动生成。根据获得的
SWD_ID,在数据库中查找对应的SWD_PASSWORD。在
{SDK}\sources\firmware\amebadxxx_gcc_project\utils\jlink_script路径下的APx_SWDPWD_User.JLinkScript文件中,将 步骤 5 的SWD_PASSWORD写入PASSWORD_0/1/2/3变量。例如,假设 OTP 中已编程 SWD 密钥编程指南 小节示例密钥,请将脚本文件修改如下:
U32 PASSWORD_0 = 0x11223344; U32 PASSWORD_1 = 0x55667788; U32 PASSWORD_2 = 0x99AABBCC; U32 PASSWORD_3 = 0xDDEEFF00;
备注
注意:请确保脚本输入的密钥顺序与 OTP 中存储顺序一致,否则会验证失败。
再次双击
swdpwd_User.bat脚本进行连接。正确输入密钥后,可以正常连接设备,界面如下:
Connecting to J-Link... J-Link is connected. Firmware: J-Link V11 compiled Apr 27 2041 16:36:21 Hardware: V11.00 S/N: 50120677 Feature(s): GDB, JFlash, FlashDL, RDI, FlashBP Checking target voltage... Target voltage: 3.33 V Listening on TCP/IP port 2340 Connecting to target...Connected to target Waiting for GDB connection...
RMA 模式 SWD 密钥认证
当芯片出现疑似故障且需要 Realtek 协助分析时,请务必在寄回芯片前将其切换至 RMA 模式, 并提供 RMA 模式的 认证密钥。
这是因为 Realtek 在没有客户协助的情况下,无法通过 SWD 连接与调试设备。
RMA 模式 SWD 密钥信息
名称 |
OTP 地址 (物理) |
长度 (比特) |
描述 |
|---|---|---|---|
RMA_SWD_PASSWORD |
0x710 ~ 0x71F |
128 |
设备进入 RMA 模式时使用的 SWD 密钥 |
RMA_SWD_PWD_R_Protection_EN |
0x702 bit[0] |
1 |
使能 RMA 模式 SWD 密钥读取保护控制: 0:启用保护,防止被读出 1:禁用该保护 |
RMA_SWD_PWD_W_Protection_EN |
0x702 bit[1] |
1 |
使能 RMA 模式 SWD 密钥写入保护控制: 0:启用保护,防止被全写0 1:禁用该保护 |
建议 RMA 模式下的密钥不要与正常工作模式的密钥一致。
RMA 模式 SWD 密钥编程(烧录)指南
本节介绍如何通过 AT 指令方式烧写 RMA 模式 SWD 保护 OTP 配置项。
编程 RMA 模式相关 OTP 内容前,请务必参考 SWD 密钥编程注意事项 ,以确保操作正确避免潜在风险。
请根据表 RMA 模式密钥信息 字段含义,按如下步骤编程 RMA 模式 OTP 密钥信息:
写入 RMA 模式 SWD 访问密钥
RMA_SWD_PASSWORD例如,RMA 模式的密钥为
0x00333231242322211413121104030201,则编程 OTP 指令为::efuse wraw 710 16 00333231242322211413121104030201
写入
RMA_SWD_PWD_R_Protection_EN和RMA_SWD_PWD_W_Protection_EN,使能 RMA 模式的 认证密钥读写保护,防止密钥泄漏或被篡改efuse wraw 702 1 fc
备注
烧写
RMA_SWD_PWD_R_Protection_EN,则RMA_SWD_PASSWORD无法再被读取,因此请务必妥善保存这些密钥。OTP 的数据修改仅在 系统重启后生效 。
RMA 模式使用 SWD 调试注意事项
进入 RMA 模式后,读取 OTP 安全区域的数据将全部返回 0xFF,这意味着:
通过 SWD_ID 获取方式 读取
SWD_ID时,始终返回0xFFFFFFFF( 即使 OTP 中已写入实际值 )建议:在 切换至 RMA 模式前,提前读取并妥善保存芯片的 SWD_ID ,以便后续在数据库中准确查询对应的(RMA)认证密钥。
SWD 分级访问控制 功能无效,即:密钥认证成功后,总是可以通过 SWD 接口访问和调试设备。