前言STM32H5提供的Debug Authentication(DA)功能主要用于控制产品的生命周期管理,用于进行Product State的状态前进,回退,锁定,为了产品的三个生命周期:1、开发阶段,2、生产阶段,3、设备回厂分析。进行了全面的适配。之前没有使能TrustZone直接采用了密码的形式对芯片进行了加锁,禁止了调试功能,看起来很简单并没有体现出DA对产品周期的全面管理。这次使能TrustZone可以支持通过数字证书来进行Product State的状态变更。 理论基础STM32H5系统提供一种新的Flash多级隐藏保护机制称为Hide Protection(HDP),保护层次Hide Protection Level(HDPL)分为多个层次,用于保护片上Flash,进行时域隔离保护,保护不同阶段的代码和数据,具体如下: 设备在Reset之后只能线性运行代码,当HDPL1代码运行完成到达HDPL2代码区域时,HDPL1区域就完全不可见了。于是当代码运行到HDPL3之后,HDPL1与HDPL2在设备reset之前都不可见,根据不同层次保护了不同的代码。 STM32H533RE提供了与STM32H56x/57x一致的专用安全存储区称为Option bytes key area(OBKey)区域,该区域是独立于User Flash之外的8Kb存储空间,具体定义如下: 既然还是片上Flash的空间,那就会收到HDP的保护,为了不同阶段的代码在OBKey区域也根据HDPL划分为4个区域:OB-Key-level0(256 Bytes)受到HDPL0保护,OB-Key-level1(2048 Bytes)受到HDPL1保护,OB-Key-level2(768 Bytes)受到HDPL2保护以及OB-Key-S-level3(3072 Bytes)与OB-Key-NS-level3(2032 Bytes)受到HDPL3保护。 在使能了TrustZone的H5设备上想要进行Product State的状态调整就需要通过DA数字证书进行调整,当证书验证通过之后才能进行Product State的调整,DA数字证书大致如下: 不同证书的用途如下: 根据以上资料,启用TrustZone之后的产品生命周期管理通过DA协议与数字证书进行不同团队管理,最终得到一个互不干扰且固件安全的产品。简单来说就是不同的团队负责不同的方向并且给下一级团队创建不同的证书,用于当前团队的开发与维护。符合当前社会分工合作,各司其职的同时保证了代码的安全性。 动手实验1、烧录工程首先为了方便,直接采用了en.stm32cubeh5-v1-2-0\STM32Cube_FW_H5_V1.2.0\Projects\NUCLEO-H533RE\Examples\GTZC的GTZC官方例子作为TrustZone例子工程,TrustZone工程分为安全侧与非安全侧代码,对应keil是两个不同的工程,选中之后编译下载即可。 下载完成之后,根据Readme指示,还需要指定一下安全侧与非安全侧的区域。 与上一次设置Option bytes选项相同,使用STM32CubeProgrammer进行设备就好,不过需要将STLINK的模式选择为normal模式。 连接之后,点击左侧的OB选项卡,翻到User Configuration2中使能TrustZone。然后设定安全与非安全的区域。 根据readme将Bank2的安全区域设置为0x1到0x0,从地址上看,是将整个bank2设置为了非安全区,bank1保持默认不变。点击应用即可将设置写入设备中。跳出成功提示之后,断开上位机连接。转到设备上,点击User Button即可发现LD2亮,代表工程例子已经顺利按照我们的计划运行。 2、生成DA obk文件首先需要来生成一个DA obk文件,不过在hal库中已经提供了示例文件DA_Config.xml,具体文件地址位于...\en.stm32cubeh5-v1-2-0\STM32Cube_FW_H5_V1.2.0\Projects\NUCLEO-H533RE\ROT_Provisioning\DA\Config 文件内容大致可以看看: 为之后生产属于自己的DA obk文件提供了参考。 接下来还是打开STM32TrustedPackageCreator,进行DA obk文件生成,如下图: 第一步,选择这个盾牌项目卡,然后点击OBKey二级菜单 第二步,选择这个示例文件DA_Config.xml 第三步,可以选择是否生成root key,这里就不进行生成了,直接使用官方的密钥 第四步,点击右下角就生成了我们需要的DA obk文件了 3、进行DA obk文件烧写与之前的烧写DA with password的步骤差不多,我们首先需要调整芯片的Product State到Provisioning状态。 首先打开STM32CubeProgrammer,连接上开发版之后,选择OB选项卡,然后在Product state 选择Value"17",最后点击Apply即可 接下来将STLINK切换到Hotplug模式再次连接开发板,选择左侧选项卡的小盾牌,选择PROV二级菜单。 之后选择我们刚才生成的DA obk文件,点击start Provisioning进行烧写DA obk文件。 4、验证DA obk文件是否烧录成功这一步骤很重要,因为如果在DA obk文件没有烧录成功的情况下,调整了Product State就相当于建立了门但是没有加入门锁,就算拥有钥匙也是无济于事,所以必须先对DA obk文件的烧录进行验证 首先断开STM32CubeProgrammer与STLINK的连接,接下来还是在小盾牌项目卡处点击DA二级菜单 然后点击Discover按钮,会发现在下面的logs里面有一条熟悉的代码 discovery: ST provisioning integrity status:0xeaeaeaea 此时说明DA obk文件已经烧录到了芯片中,有了钥匙孔就可以放心进行锁的选型了。 5、调整Product State连接上开发版之后,选择OB选项卡,然后在Product state 选择Value"72"进入Closed,最后点击Apply即可,最后会无法进行连接,说明芯片状态已经变更 6、进行数字证书生成现在门与锁我们都已经安装完毕了,于是需要生成不同的钥匙用来区别不同的开发人员访问,所以我们开始生成数字证书进行控制。首先生成根证书,打开STM32TrustedPackageCreator,选择Security,然后选中Debug Auth...最后选中Debug Authentication-Certificate Generation 此时选择好芯片STM32H533/523就可以开始选择根密钥,因为只是作为一个例子进行了解,并且暂时也不知道如何进行根密钥生成,这里直接采用固件库里面提供的根密钥en.stm32cubeh5-v1-2-0\STM32Cube_FW_H5_V1.2.0\Projects\NUCLEO-H533RE\ROT_Provisioning\DA\Keys\key_1_root.pem与同目录下的Public key key_1_root_pub.pem,但是我们换一个名称,保证不重复就可以验证是否达到了调整Product State的目的。 这里,本人使用了一个新的文件夹root key用来存放生成的user_root_full证书,可以看到生成了两个同名的不同文件,其中.b64文件能够进行Product State的调整,安全调试与生成下一级的证书。 然后生成下一级的证书,中间证书,和生成根证书的方式差不多,不过证书类型选择生成中间证书 还是采用固件库所提供的密匙en.stm32cubeh5-v1-2-0\STM32Cube_FW_H5_V1.2.0\Projects\NUCLEO-H533RE\ROT_Provisioning\DA\Keys\key_1_root.pem与同目录下的key_2_intermediate_pub.pem作为实验。然后设置Permissions Mask使得中间证书签发的叶子证书不能进行安全侧的代码调试。最后生成中间证书即可。 这次生成的文件有所不同,会多生成一个证书链文件。该文件用于chaining并且生成下一级叶子证书链的文件。 最后来生成最底层的叶子证书,同样的流程,证书选择为叶子证书即可 采用中间证书生成的chain证书链文件来生成叶子证书。 7、控制芯片现在拥有了证书文件,相当于拥有钥匙,可以用来开门了,首先我们打开STM32CubeProgrammer在小盾牌的二级菜单DA中进行操作,按下Discover,我们首先试试用叶子证书是否能够调试安全侧,按照我们的设定,应该是不能够调试的,测试如下: 选择我们之前生成的叶子证书chain文件,然后点击continue,选择level1debug调试 直接被拒绝访问 现在知道能够分辨不同的证书了,之前学习的理论可知,现在的状态使用证书之后可以进行临时调试,于是我们先进行最高级的钥匙证书认证,开启调试之后再对开发板进行断电。 选择之前生成的证书与hal库给于的root key进行debug。 成功通信 然后STLINK也能够连接到芯片并且读取安全侧的数据。 由于我们是进行的临时调试,所以按理说对开发板断电之后,STLINK又不能进行连接,断开STLINK,对开发板断电。 重新插上USB上电开发板,之后再使用STLINK进行连接 说明现在芯片还在处于Closed状态,并没有因为进行过临时调试出现其他问题。重新插电并测试开发板工程现象,依然是点按user之后LD2亮起,固件还是一致。 最后将开发板的状态重新退回到OPEN状态,依然是使用根证书与根钥匙进行操作,不过设置改为Full Regression。 通信成功之后,STLINK自动连接了开发板,此时开发板的固件数据已经被清空 总结使能TrustZone之后,相比于之前的直接采用密码的形式引入新的证书机制,更加灵活的同时,也保护了不同开发团队的代码安全。现在只是在学习的基础上复刻官方的例子,灵活运用之后比起之前的RDP实际上是提升了开发团队之间的协作方便程度。接下来还需要进行安全固件的升级。继续学习。 |
谢谢分享 |
实战经验 | STM32H5 USBD Classic驱动 CDC移植
NUCLEO-H563ZI刷入Micropython固件并点亮LED灯
基于STM32H5的DA之初体验经验分享(带 Trust Zone)
【免费申请】高性能和低成本双Buff加持的NUCLEO H533RE,等你来!
【NUCLEO-H533RE评测】使用双存储区Flash 在不关闭系统的状态下,实现OTA
【NUCLEO-H533RE评测】高性能-全频,硬件加速在电机控制相关应用的速度对比。
【NUCLEO-H533RE评测】HASH对比测试
【NUCLEO H533RE评测分享】高性能和低成本双Buff加持的NUCLEO H533RE
【NUCLEO-H533RE评测】+加载OLED显示部件
【NUCLEO-H533RE评测】+Coremark跑分测试