43. DLM——内部Flash读写保护实验¶
- 本章参考资料:
- 本章实验软件:
43.1. 瑞萨内部Flash读写保护¶
在实际发布的产品中,瑞萨RA系列芯片的内部FLASH存储了对于产品的控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来, 得到bin或hex文件格式的代码拷贝,再加上PCB抄版技术,别有用心的厂商即可轻易山寨产品,严重侵犯原开发厂商的产品利益。 为此,瑞萨RA系列提供了多种方式保护内部FLASH的程序不被非法读取。
更改器件生命周期管理系统(Device lifecycle management DLM)状态。
使用 Trustzone 将代码放在安全内存区域中。
Flash块保护(RA系列Flash仅支持保护编程与擦除)。
ID 代码保护(Arm Cortex-M4才具有此功能)。
为方便操作,在本章我们采用更改 DLM 的状态的方法来实现对于Flash读写保护功能。
43.2. 器件生命周期管理系统(DLM)¶
在本套教程的 第3章 初识瑞萨RA系列芯片 中我们已经初步介绍了 DLM 状态转换的基本情况,在这里我们再继续深入了解一下。
器件生命周期管理不同状态的转换:

图1 器件生命周期管理不同状态的转换
有三种不同的调试访问级别,它们视生命周期的状态而变化:
DBG2:允许调试器连接,访问存储器和外设没有任何限制。
DBG1:允许调试器连接,但访问只限于非安全内存区域和外设。
DBG0:不允许进行调试连接。
当器件处于引导模式时,串行编程接口可以与器件的工厂引导加载程序通信。用户可以使用瑞萨闪存编程 (RFP) 应用程序通过串行编程接口与工厂引导加载程序通信,以更新器件生命周期状态。 下表列出了各个器件生命周期状态的定义和相应的调试级别,以及串行编程接口的功能。
生命周期状态 |
定义和状态特性 |
调试级别 |
串行编程 |
瑞萨测试模式 |
---|---|---|---|---|
CM 芯片制造 |
|
DBG2 |
|
不可用 |
SSD 安全软件开发 |
|
DBG2 |
|
不可用 |
NSECSD 非安全软件开发 |
|
DBG1 |
|
不可用 |
DPL 已部署 |
|
DBG0 |
|
不可用 |
LCK_DBG 锁定调试 |
调试接口已永久关闭 |
DBG0 |
|
不可用 |
LCK_BOOT 锁定引导接口 |
调试接口和串行编程接口已永久禁用 |
DBG0 |
|
不可用 |
RMA_REQ 申请退货授权 |
|
DBG0 |
|
不可用 |
RMA_ACK 退货授权已确认 |
|
DBG2 |
|
可用 |
43.2.1. ALL Erase(全部擦除)¶
成功执行“All erase”(全部擦除)命令会将器件生命周期状态更改回 SSD。
如果闪存块锁定是临时的而非永久的,则“All erase”(全部擦除)命令将擦除整个闪存。
可以通过 RFP 中的 “ Initialize ” (初始化)命令执行 “ All erase ” (全部擦除),除非“Initialize”(初始化)命令本身已被禁用。任何人均可使用“Initialize”(初始化)命令,因此闪存中的内容很容易被擦除,如图2所示。
如果开发人员已强制执行永久块保护,则不会执行“Initialize”(初始化)命令。
如果开发人员不想使用此功能,可以使用 RFP 永久禁用“Initialize”(初始化)命令,如图3所示。但是, 一旦禁用“Initialize”(初始化)命令,则永远无法恢复。
制造商可以在生产期间根据需要禁用“Initialize”(初始化)命令。

图2 Initialize(初始化)

图3 Disable Initialize(禁用初始化)
43.2.2. 需要经过身份验证的转换¶
通常我们在开发期间和部署之后的故障分析时,需要经过身份验证的转换。 需要 DLM 密钥来使生命周期状态回退,无需擦除 MCU 闪存的内容即可进行故障分析。 DLM 密 钥包括 RMA_KEY、 SECDBG_KEY 和 NONSECDBG_KEY。 故障分析通常需要使器件生命周期状态退回到之前的开发状态或前进到申请退货授权状态
以下生命周期状态转换中, 无需擦除闪存内容 就可以退回到之前的开发状态:
转换1:使用SECDBG_KEY,从安全开发 (SSD) 转换到非安全开发 (NSECSD)
转换2:使用NONSECDBG_KEY,从原型已部署 (DPL) 状态转换到非安全开发 (NSECSD)
以下生命周期状态转换中, 需要擦除闪存内容 才可以退回到之前的开发状态,Flash已永久锁定的情况除外:
转换3:使用RMA_KEY,从原型已部署 (DPL) 状态转换到申请退货授权 (RMA_REQ)
转换4:使用RMA_KEY 或 MCU 唯一 ID,从安全开发 (SSD) 状态转换到申请退货授权 (RMA_REQ)
转换 5 需要执行瑞萨的专有操作。本应用笔记中不提供有关此转换的详细信息。 如需相关信息,请联系瑞 萨销售代表。
警告
对于无需身份验证的转换,需要小心进入 LCK_DBG 与 LCK_BOOT 状态,否则器件将永久锁定!
43.3. DLM 密钥创建步骤¶
43.3.1. 获取用户工厂编程密钥UFPK¶
打开Security Key Management Tool,选择MPU/MCU以及加密引擎:

图4 选择MPU/MCU以及加密引擎为RA系列的SCE9保护模式
2. 点击 生成UFPK选项卡 ,接着在用户工厂烧录密钥(UFPK)这里我们选择随机生成即可,想自己设定也是可以的,然后选择密钥文件输出路径, 最后点击生成UFPK密钥文件即可,生成UFPK密钥文件成功后可以在下面状态栏观察到相关生成信息。

图5 生成UFPK密钥文件
43.3.2. 获取W-UFPK¶
获取封装后的用户工厂烧录密钥,需要通过瑞萨密钥封装服务获取封装版本 (W-UFPK) 的密钥

图6 获取W-UFPK
所以我们需要建立与瑞萨密钥封装服务之间的链接,这种链接是通过密钥配对的方式实现的
43.3.2.1. 建立客户 PGP 密钥对¶
1、打开 Kleopatra,单击“文件 > 新建OpenPGP密钥对”(File > New OpenPGP Key Pair)。

图7 新建OpenPGP密钥对
2、在创建OpenPGP 证书的窗口中,你可以设置你的电子邮件地址,也可以添加密码来保护你创建的密钥, 这里我们方便演示,就不过多操作,接下来我们选择高级设置 -> 选择密钥类型为RSA,设置大小为2048bit -> OK -> OK。

图8 OpenPGP 密钥对的高级设置
3、使用 Kleopatra 导出客户公钥,如下图所示

图9 导出客户公钥
4、将客户公钥保存到一个扩展名为 *.asc 的文件中,例如“public_key.asc”

图10 保存客户公钥
43.3.2.2. DLM 服务器注册¶
1、在浏览器中打开 URL https://dlm.renesas.com/,然后单击“New registration”(新用户注册)。
2、注册登录后,点击 “I agree” 同意密钥封装协议。

图11 同意密钥封装协议
3、选择PGP key exchange -> Reference -> PGP key exchange,如图12 13。

图12 PGP 密钥交换申请
添加选择上一步 “建立客户 PGP 密钥对” 导出的 .asc 文件

图13 向 DLM 服务器提供客户 PGP 公钥
4、过一段时间,注册邮箱将收到一封电子邮件,查看邮件后下载保存该邮件附件,如下图:

图14 接收瑞萨 PGP 公钥
注解
PGP 公钥可以注册任意次数。如果多次注册密钥,则会使用最新注册成功的 PGP 公钥进行加密,同时会丢弃所有先前注册的 PGP 公钥
5、再次打开 Kleopatra ,选择导入证书,找到下载保存的文件 “keywrap-pub.key” ,确定,如下图:

图15 将瑞萨公钥导入 Kleopatra
43.3.2.3. 瑞萨 PGP 公钥加密 UFPK¶
1、从 Kleopatra 中选择“签名/加密”(Sign/Encrypt),然后选择使用瑞萨的 PGP 公钥加密此密钥,并使用客 户 PGP 密钥签名。

图16 选择要加密的 UFPK 密钥
2、选择“为他人加密”(Encrypt for others),点击右边的加号,并选择添加我们上一步成功导入的瑞萨 PGP 公钥证书。

图17 使用瑞萨公钥加密 UFPK
3、接着会出现自加密警告对话框,选择继续,就能在所选的文件夹中生成使用瑞萨公钥加密的 UFPK,并添加 .gpg 作为密钥的扩展名,将生成 ufpk.key.pgp,最后选择“Finish”。

图18 使用瑞萨公钥加密 UFPK
43.3.2.4. 向瑞萨 DLM 服务器发送 UFPK 密钥¶
现在,我们可以将使用瑞萨公钥加密的 UFPK 发送到瑞萨 DLM 服务器,然后在此由瑞萨私钥解密并由瑞萨 DLM 服务器生成封装的 UFPK (W-UFPK)。
1、从 DLM 服务器用户界面中,选择 RA 产品家族系列,然后选择“RA6M4 Encryption of customer’s data > Encryption service for products”(RA6M4 客户数据加密 > 产品加密服务),如下图所示。

图19 选择 RA 器件
2、接下来,单击“Reference”(引用),然后选择根据上一节生成的 *.pgp 文件,最后点击“Settle”(确定)。

图20 将加密的 UFPK 发送到 DLM 服务器
3、过一段时间,注册邮箱将收到一封电子邮件,查看邮件后下载保存该邮件附件,如下图:

图21 接收由瑞萨 PGP 私钥加密的封装 DLM 密钥
43.3.2.5. 使用客户的 PGP 私钥解密加密的封装 UFPK 密钥获得 W-UFPK¶
1、打开 Kleopatra 程序,单击“解密/验证”(Decrypt/Verify),然后选择在上一节收到的封装 UFPK。

图22 使用客户 PGP 私钥解密
2、最后,我们终于得到了W-UFPK密钥文件。

图23 W-UFPK密钥文件
43.3.3. 创建由 UFPK 和 W-UFPK 加密的 DLM 密钥¶
为创建封装 DLM 密钥, DLM 密钥需要由 UFPK 加密,并且加密的 DLM 密钥和 W-UFPK 均需 要通过串行编程接口发送到 MCU 以创建封装 DLM 密钥,然后存储在非易失性存储器中。

图24 创建封装 DLM 密钥并发送到MCU
43.3.3.1. 生成 SECDBG 密钥文件¶
1、再次打开Security Key Management Tool,选择好MPU/MCU以及加密引擎后,选择“封装密钥”选项卡,选择 “密钥类型” 为AES

图25 选择密钥类型
2、选择密钥数据文件为明文密钥,旁边文本框中输入的 “000102030405060708090A0B0C0D0E0F” 就是用于使 MCU 器件生命周期状态从 NSECSD 退回到 SSD 的 明文 DLM 密钥数据,也可以自行设置不同的数据,不过最好都记录保存一下,防止遗忘,并且必须确保此信息安全,不得泄露。

图26 选择密钥数据文件
3、添加 UFPK 与 W-UFPK 的文件路径,并且选择好 RFP 文件的输出路径,最后点击“生成文件”之后,我们可以在底下状态栏观察到输出信息。

图27 输出 SECDBG.rkey
43.3.3.2. 生成 NONSECDBG 密钥文件¶
与生成 SECDBG 密钥文件类似,我们只需要更改明文 DLM 密钥数据与RFP文件输出即可,这里为了方便演示, 统一使用 “000102030405060708090A0B0C0D0E0F” 作为 MCU 器件生命周期状态从 DPL 退回到 NSECSD 的 明文 DLM 密钥数据。

图27 输出 NONSECDBG.rkey
43.3.3.3. 生成 RMA 密钥文件¶
生成方式与上相同,生成的 RMA_KEY 将作为 MCU 器件生命周期状态从 SSD/DPL 前进到 RMA_REQ 的明文 DLM 密钥数据。

图27 输出 RMA.rkey
警告
器件如果进入了RMA_REQ状态,则需要将器件发送给瑞萨官方或代理商才能进行处理。
43.4. DLM 密钥安装¶
43.4.1. 野火启明开发板开启Boot模式¶
首先接线。
对于 USB Boot,先通过 Type C USB 线连接到开发板上的 USB Device 接口;
对于 SCI Boot,通过 USB 转串口连接到 JTAG 调试接口上的这两个引脚,连接如下:
RXD—————P109(TDO / TXD9)
TXD—————P110(TDI / RXD9)
接着使用跳线帽将 MD 引脚由接到高电平(3V3)变为接到低电平(GND), 然后手动按一下开发板上的复位按键即可进入 Boot 模式。
注解
野火启明2L1开发板不支持进入 Boot 模式。
由于启明2L1开发板RA2L1芯片的两个引脚:P109(TDO / TXD9)和 P110(TDI / RXD9) 被复用为CAN功能接到了CAN收发器芯片上,因此对于野火启明2L1开发板来说,不支持进入 Boot 模式。
43.4.2. 创建 RFP 工程¶
打开 RFP(Renesas Flash Programmer)工具,创建一个新工程,选择器件系列型号,命名,选择好工程的保存路径,通讯连接方式选择 COM port , 点击 Tool ,这里仅以 USB Boot 连接方式为例,选择 RA USB Boot(CDC)(如果未发现,按下开发板的复位键),最后点击 OK 。

图28 创建 RFP 工程
43.4.3. 安装 SECDBG 密钥¶
1、安装 SECDBG 密钥需要器件状态是处于SSD(安全软件开发)状态,所以我们需要先查看当前设备的状态。 依次点击 Target Device -> Read Device Information,之后底部输出信息栏就会输出当前的设备信息。

图29 查看设备信息
主要输出信息:
Device: R7FA6M5BH3CFC |
器件型号为R7FA6M5BH3CFC |
Boot Firmware Version: V1.6.25 |
Boot固件版本为V1.6.25 |
Device Unique ID: 4E4B292DF1D94E36573636322D034273 |
设备的唯一ID |
Device Code: 01 |
设备代码为01 |
Current state: SSD |
当前器件状态SSD(安全软件开发) |
SECDBG Key Injection: No |
未安装SECDBG密钥 |
NONSECDBG Key Injection: No |
未安装NONSECDBG密钥 |
RMA Key Injection: No |
未安装RMA密钥 |
Disconnecting the tool |
断开RFP Tool的连接 |
注解
我们在RFP中对设备每执行一次操作后都会断开 RFP Tool 的连接,所以我们每执行一次操作前,都需要按下开发板上的复位键一次。
如果当前设备并不是处于SSD状态,则可以通过初始化器件,使得器件恢复到SSD状态。(采用初始化操作后,将会擦除器件Flash中存储的数据)

图30 初始化设备
3、设置Operation Settings ,找到 Command ,勾选上 Program Flash Options 与 Verify Flash Options 。

图31 设置Operation Settings > Command
4、接着设置Flash Options,找到 DLM Keys > SECDBG Key File,添加SECDBG密钥文件的路径。

图32 设置Flash Options > DLM Keys > SECDBG Key File
5、回到Operation,点击 Start ,之后可以看到底部状态栏出现 Operation completed。

图33 安装 SECDBG 密钥
6、依次点击 Target Device -> Read Device Information ,之后可以在底部看到SECDBG密钥安装成功。

图34 查看 SECDBG 密钥安装情况
43.4.4. 安装 NONSECDBG 密钥¶
安装 NONSECDBG 密钥需要先将器件状态进入NSECSD(非安全软件开发)状态
1、查看器件当前状态,如果不是处于NSECSD,则依次点击 Target Device -> DLM Transition,选择状态为 NSECSD 。

图35 设备状态转换
2、Operation Settings 设置与 安装 SECDBG 密钥时的设置相同,接着设置Flash Options, 找到 DLM Keys > NONSECDBG Key File, 添加NONSECDBG密钥文件的路径( 请注意,若有其他密钥处于添加状态,需要删除该密钥文件条目,再添加 NONSECDBG 密钥文件的路径)。

图36 设置Flash Options > DLM Keys > NONSECDBG Key File
3、回到 Operation ,点击 Start,即可安装 NONSECDBG 密钥

图37 查看 NONSECDBG 密钥安装情况
43.4.5. 安装 RMA 密钥¶
安装 RMA 密钥时需要器件是处于 SSD 状态下安装,安装方式与前面两种密钥安装方式相类似,这里大家可以自行进行练习。
注意
除非要进行产品退货,否则请不要使用 RMA_KEY 将 DLM 状态转换到 RMA_REQ 状态。一旦转换到 RMA_REQ 状态,“All erase”(全部擦除)操作将会失效。MCU 将被锁定,无法进行调试或使用串行编程端口进行重新编程。
43.5. 需要经过身份验证的 DLM 状态转换¶
43.5.1. DPL->NSECSD¶
如果当前设备处于 DPL (已部署)状态,需要回退到 NSECSD (非安全开发)状态,则需要输入 NONSECDBG 密钥明文

图38 提供 NONSECDBG 的身份验证密钥
对于上图图注:
输入我们之前生成 NONSECDBG 密钥文件时设置的身份验证密钥明文。
取消勾选自动填充。
43.5.2. NSECSD->SSD¶
如果当前设备处于 NSECSD (非安全开发)状态,需要回退到 SSD (安全开发)状态,则需要输入 SECDBG 密钥明文

图39 提供 SECDBG 的身份验证密钥
43.6. Flash读写保护实验¶
43.6.1. NSECSD状态下的Flash读写保护实验¶
支持 TrustZone 技术的 RA MCU 上的代码闪存、数据闪存和 SRAM 通过 IDAU(实施定义属性单元)分为 安全 (S)、 非安全 (NS) 和非安全可调用 (NSC) 区域。当器件生命周期为安全软件开发 (SSD) 状态时,可 使用串行编程命令将这些存储器安全属性编程到非易失性存储器中

图40 IDAU 区域
由表 器件生命周期状态 我们可以得知,NSECSD状态是保护Flash安全区下的存储区域,所以在下载程序的时候,可以将需要保护的代码下载到Flash的安全区的位置, 以此达到我们对Flash安全区读写保护目的。
1、先使器件转换到 SSD 状态,可以采用初始化的方法,如果已经安装了密钥,可以通过身份验证来转换到SSD状态。

图41 转换到 SSD 状态
2、打开 e2stdio 或者 Keil ,下载需要保护的程序。
3、切换到 Flash Options 标签页下,我们将每个安全分区的大小都设置到当前器件 Flash 各个分区的最大值
如,启明RA6M5开发板可以按照下图所示来设置边界(Boundary):

图42 设置安全分区大小
4、如下图所示勾选上“Program Flash Options”,“Verify Flash Options”。

图43 设置 Operation Settings
5、切换回 Operation 标签页下,点击 Start 大按钮,执行已勾选的操作:

图44 安装分区
6、依次点击 Target Device -> DLM Transition,将器件转换到 NSECSD 状态

图45 切换状态NSECSD
保护测试
打开Keil/e2 studio,尝试下载一个程序,可以看到以下下载失败信息

图46 e2 studio下载错误信息

图47 Keil下载错误信息
43.6.2. DPL 状态下的Flash读写保护实验¶
由表 器件生命周期状态 我们可以得知,DPL状态下的器件处于无法编程/擦除/读取代码, 数据Flash区域的状态,也就是说,不论Flash中的安全区还是非安全区,都是处于保护状态的。 所以相对于 NSECSD 状态下的保护的操作比较简单。
1、打开 RFP 软件,使器件转换到 SSD 状态。
2、打开 e2stdio 或者 Keil ,下载需要保护的程序。
3、回到 RFP 软件,依次点击 Target Device -> DLM Transition,将器件转换到 NSECSD 状态
4、重复步骤3,继续转换,将器件转换到 DPL 状态。

图48 切换状态DPL
保护测试
打开Keil/e2 studio,尝试下载一个程序,可以看到以下下载失败信息

图49 e2 studio下载错误信息

图50 Keil下载错误信息
43.6.3. 解除保护¶
如果需要解除Flash保护,通过密钥进行验证转换到 SSD 状态即可解除。 如果需要更新保护程序,也是需要重新回到 SSD 状态才能更新保护程序。