实战经验 | STM32H5_DA之初体验(带TrustZone)

cathy的头像
cathy 发布于:周四, 02/01/2024 - 09:34 ,关键词:

一、前言

STM32H5 是 ST 2023 年新推出的产品系列,与以往 MCU 不同的是, STM32H5 推出新的 product state 功能特性以替代以往的 RDP 功能。

1.png

如上图所示,product state 有如下状态 : 

  • Open(0xED) : 完全 open 状态,相当于以前的 RDP0。 

  • Provisioning(0x17) : 此状态是专门用来做预配置的。 

  • iROT-Provisioned(0x2E) : 用于 STiROT 或 OEMiROT。 

  • TZ-Closed(0xC6): Secure 区域关闭, 相当于 RDP0.5(仅在 TZEN=0xB4 时有效)。 

  • Closed(0x72): S 和 NS 区域均受到保护,这点有些类似于 RDP1,此时调试口没法对其直接访问,但可通 过 DA 打开调试口或回退,这一点有点类似于 STM32U5 上的可带密码回退的 RDP2。 

  • Locked(0x5C): 完全关闭芯片的外部访问,相当于以往 STM32 芯片的 RDP2 保护等级。

整体如下图所示:

2.png

其状态切换如下图所示 :

3.png

如上图所示,product state 从 open->provisioning->iROT-Provisioned->TZ-Closed->Closed 如此从左到右是可切换的,但是,要从右到左如此回退,则必须要经过 DA[Debug Authentication]过程。如上图所示,经过 DA 后,要么完全回退到 Open 状态,要么部分回退到 TZ-Closed 状态。

所谓的 DA,就是通过向芯片提供证书(STM32H503 是提供密码),通过芯片的身份认证后,允许向 芯片发起 product state 状态回退,或者重新打开调试口请求(仅当 TZEN=0xB4 时)。

由于新的 product state 和 DA 的引入,所有 STM32H5 开发者都必须掌握 DA 的用法。因此,本 文档针对 STM32H5 初学者,演示当 TZEN=0xB4 时, 使用证书来完成 DA 过程。

二、准备工作

开发板 : NUCLEO-H563ZI 4.jpg

软件包 : STM32Cube_FW_H5_V1.1.0

工具:

  • STM32CubeProgrammer v2.14.0 

  • Tera Term 串口终端显示 

  • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)
IDE: STM32CubeIDE v1.13.0 

STM32CubeH5 包我们需要将其放到一个没有空格没有中文的路径下,在本动手实验中,我们 默认将其放在路径 C:\workspace\目录下。

三、生成 OBK 并测试

在 STM32CubeH5 包下的路径 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\DA,在此目录下,已经包含了自带的默认 obk,密钥以及证书。其实 我们可以直接使用这些 obk 以及对应的证书和密钥,这里我们将重新生成一套,并测试它是否 OK。

3.1. 重新生成密钥对打开 TPC(TrustedPackageCreator)工具 

5.png
在 xml file 处,导入 DA_Config.xml 文件 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Config/DA_Config.xml
如上图,在导入 DA_Config.xml 文件后,点击 Regenerate 按键后,将在 Keys 目录下重新生成公钥私钥对 :

6.png

这组密钥对就是接下来需要使用到的密钥对了。

其中 :

Key_1_root.pem 为私钥

Key_1_root_pub.pem 为公钥

3.2. 生成 DA OBK 文件

接下我们将创建 DA 的 obk 文件 :

7.png

如上图所示,继续在 TPC 工具中,在 Permission Mask 下,激活允许的操作许可,被激活的就是 DA 认证通过后,允许的操作. 然后在 Output File 处选择输出文件。我们使用默认即可。然后点击 Generate OBKey 按键,则在 Binary 目录下生成 DA_Config.obk 文件 :

8.png

这个 obk 文件就是我们后续将来做 DA 预配置(provisioning)的 obk 文件了。

3.3. 生成证书

接下来我们继续用 TPC 工具生成证书。

9.png

如上图所示,在 Microcontroller 处选择 STM32H5-2M,在 Root Private Key 处我们选择之前生成的私钥文件 : C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root.pem

而在Root Public Key处则选择之前生成的公钥文件:C:/workspace/STM32Cube_FW_H5 _V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root_pub.pem
然后在 Permission Mask 处选择此证书所允许的操作许可。我们将 Full 回退 to TZ,以及Secure/Non Secure 下的 Level 1~3 的 Debug 权限许可全部打开。
在 Certificate file 处选择输出文件,我们选择C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b64
即在 Certificates 目录下生成 cert_root.b64 文件,最后再点击右下角的 Generate Certificate 按键,最终在 Certificates 生成了 cert_root.b64 文件。

10.png

如上图所示,在 Certificates 目录下将同时生成两个文件 : cert_root.b64, cert_root.cert。

其中 cert_root.b64 就是我们需要的证书文件了,它就是根证书。它将在后续步骤中进行 DA 时将会用到。而另一个生成的文件 cert_root.cert,我们并未用到它。

3.4. DA 预配置 (provisioning)

接下来我们将做 DA 预配置,在此之前我们确保使能 Trust Zone 功能,即 TZEN=0xB4。

11.png

如上图所示,使用 STM32CubeProgrammer 连接芯片,并将 TrustZone 打开。

然后将 Product State 切换到 Provisioning 状态 :

12.png
接下来正式做 DA 预配置…
13.png
如上图所示,在 STM32CubeProgrammer 左边选择盾牌图标,然后在上方选项卡处选择PROV,接着在 OBKey file path 处选择之前生成的 DA_Config.obk 文件 :
C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary\ DA_Config.obk
最后点击 Start Provisioning 按键…
14.png
成功时,将弹出消息提示成功。此时表示,DA obk 文件已经预配置到芯片内部并且已经成功了。然后断开 STM32CubeProgrammer 的连接…
15.png

如上图所示,点击 Disconnect 按键,确保 STM32CubeProgrammer 已经断开连接。接下来我们将尝试用证书做 DA 回退… 

3.5. DA 回退

16.png

如上图所示,在确保 STM32CubeProgrammer 断开连接的情况下,左边还是选择盾牌图标,上方选项卡处选择 DA,然后在界面中点击 Discover 按键… 

17.png

如上图所示,在接下来的界面中,在 Key File Path 处选择之前生成的私钥文件 key_1_root.pem:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pe

如上图所示,在接下来的界面中,在 Key File Path 处选择之前生成的私钥文件 key_1_root.pem:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pe

在 Certificate File Path 处选择之前生成的证书 cert_root.b64:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b6

然后点击右边的 Continue 按键… 

18.png

如上图所示,在下方新显示出来的界面内容中,在左边选择 Full Regression, 即你想要的操作,然后点击右边的 Execte 按键…

19.png

如上图所示,弹出界面显示 DA 成功。

这也就表示,之前生成的私钥文件 key_1_root.pem + 证书文件 cert_root.b64 正是匹配之前生成的 obk 文件 DA_Config.obk 的。

其中 DA_Config.obk 文件和固件 hex 文件是要给工厂烧录芯片用的。而私钥文件 key_1_root.pem + 证书文件 cert_root.b64 则是需要保留,将来工程师需要它们来做 DA 回退和 DA 调试用的。

这里需要注意地是,如果上述 DA 回退未成功,则表示证书+私钥与之前预配置的 DA obk 不匹配,需要重新执行 3.1~3.5 节。直到 DA 回退成功为止,否则切记不要进入到下一步骤,不然很可能会由于证书不对无法回退导致芯片废掉(除非用户代码可以执行回退)。

四、运行一个程序并 DA 调试

4.1. 在 Open 状态下运行一个示例程序

使用 STM32CubeProgrammer,确保 product state =Open, TZEN=0xB4:

20.png

并确保:SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F, SECWM2_PSTRT=0x7F SECWM2_PEND=0x0:

21.png


然后使用 STM32CubeIDE 编译 STM32CubeH5 包下的示例工程:STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\STM32CubeIDE 分别先后编译 S 和 NS 工程并烧录对应程序,并复位运行。正常情况下,可以看到板子上 LD5(橙色), LD6(绿色)两盏灯在来回闪动。即表示测试程序运行 OK。

4.2. DA 预配置

接下来我们参照之前的 3.4 节,将 product state 切换到 provisioning 状态, 然后进行 DA 预配置。 
22.png

如上图,切换到 provisioning 状态。 

23.png

如上图所示,导入之前生成的 DA_Config.obk 文件,然后点击 Start Provisioning 按键,进行预配置。

24.png

弹出上面显示模式,则表示预配置已经成功。

4.3. 修改状态到 Closed 状态 

25.png

如上图所示,接下来将 product state 修改为 Closed 状态。此时 ST-Link 连接会自动断开,表示芯片内部调试口已经自己关闭了。

此时查看板子,LD5、LD6 两灯依旧来回闪烁,说明程序在 Closed 状态下运行正常。只不过此时调试口是连接不上了。

4.4. DA 调试 

4.4.1. 使用 STM32CubeIDE 调试 NS 工程

在 STM32H563 处于 Closed 状态下时,SWD 口默认是关闭的,此时是无法调试代码的,若想调试代码,必须得通过 DA 认证重新打开调试端口,好在这一功能已经集成在 STM32CubeIDE 中了。接下来我们将使用 STM32CubeIDE 调试 NS 工程,在 NS 工程的 Debug Configuration 中, 在 Debugger 选项卡下 : 

26.png
如上图所示,在 Reset behaviour 的 Type 下,选择 software system reset, 然后在 Debug Authentication 下勾上 Enable,在 Key path 后面选择之前生成的私钥文件 : C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,在 Certification path 后面选择之前生成的证书 : C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b64, 然后 Permission 后边选择 Debug Non Secure L1,然后点击 Debug 按键… 
27.png

如上所示,程序在运行在 NS 工程的 main 函数开始处则停下来了,接下来你可以选择单步调试...

4.4.2. 使用 STM32CubeIDE 调试 S 工程

S 工程的调试配置有些许差异。

28.png

如上,Reset behaviour Type 为 None,同样在 Debug Authentication 下设置之前生成的私钥和证书,Permission 变为 Debug Secure L1。

29.png

然后拖下来将 Verify flash download 之前的勾去掉(如上图所示)。

30.png

如上图所示,在 Startup 选项卡下,在 Load Image and Symbols 列表中选择当前工程的 Image,然后点击右边的 Edit…按键,然后在弹出的对话框中将 Download 前的勾去掉。点击 OK、Apply、并 Closed、关闭当前窗口。接下来在 S 工程中的源文件中的 xxx_it.c 源文件中的 systick 中断入口处设置一个断点, 如下图所示:

31.png
32.png
33.png
如上图所示,程序运行在断点处停下来了,接下来你可以单步调试 Secure 工程了。这是一种完全没有破坏现场的调试方法,适合当出现问题后,直接去查看出现问题的代码行。当然在调试 Non Secure 工程时,你也可以按此方法来配置。也可以达到不破坏现场的效果。

4.4.3. 在其它 IDE 中进行 DA 调试

由于其它 IDE 当前最新版本还并未将 DA 过程集成到 IDE 中,因此,需要利用 STM32CubeProgrammer 进行 DA 认证通过之后,才可以用 IDE 进行调试。

接下来我们将使用 STM32CubeProgrammer 通过 DA 来重新打开调试口。

34.png
在断开连接的情况下,在 STM32CubeProgrammer 中,选择 DA 选项卡,然后点击 Discover… 
35.png
与 3.5 节类似,在上图中,选择之前生成好的私钥文件 C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,以及证书文件 C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b64,然后点击 Continue 按键… 
36.png
如上图所示,在下面新显示的内容中选择 Non-Secure Intrusive Debug(Level 1),然后点击 Execte 按键… 

37.png

如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接。

接下来就可以选择你所使用的 IDE(如 Keil、IAR)调试 NS 工程了,如下图使用 IAR 调试 :

38.png

如上图所示,选择 Attach to Running Target 可直接 attach 上去查看当前运行的代码行。当然在之前 DA 步骤中,你也可以选择调试 S 工程 …

39.png

如上图所示, 在下面新显示的内容中选择 Secure Intrusive Debug(Level 1), 然后点击 Execte 按键…

40.png

如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接,接下来就可以选择你所使用的 IDE(如 Keil、 IAR)调试 NS 工程了。

五、还原

还原的过程参考 3.5 节,步骤完全一致。最终还原成功后,全片 Flash 内容已经擦除。最后,将 TZEN 直接修改为 0xC3。

41.png
至此,芯片完全恢复成原始状态。另外,DA 回退过后,之前预配置的内容也自动清空了, 因此,后续还需要重新进行预配置 (provisioning)。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 33