龙空技术网

代码保护(1)使用STM32H7新特性保护片上代码的机密性

AI电堂 347

前言:

眼前各位老铁们对“stm32压缩算法”都比较注意,小伙伴们都需要剖析一些“stm32压缩算法”的相关资讯。那么小编同时在网上汇集了一些有关“stm32压缩算法””的相关资讯,希望咱们能喜欢,你们快快来了解一下吧!

谈到STM32的高性能家族产品,大家已经对STM32F2/F4/F7耳熟能详。之后的STM32H7系列继承和发展了高性能产品家族的特性。然鹅,如何使用STM32H7进行安全存储、代码保护?你造吗?

使用STM32H7 安全用户存储区控制调试端口访问、保护片上代码安全

使用STM32H7新特性保护片上代码的机密性包括:

调试端口连接可控:在RDP0条件下也可实现对调试端口的保护,上电调试接口即不可连接(具有类似RDP2的效果);比RDP2更灵活,可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的 可能性用户片上Flash进一步隔离-保护敏感代码不被木马程序攻击安全STM32H7可以实现以下功能:安全启动、安全用户存储区、安全调试

STM32H7 硬件安全特性与机制主要包括:

安全STM32H7的启动路径安全STM32H7的 “安全用户存储区”安全STM32H7的安全调试

安全STM32H7 启动流程

安全STM32H7新增选项字节:SECURITY、SEC_AREA系统复位,装载选项字节的过程中,如果SECURITY置位,则无论BOOT引脚电平以及 BOOTADDR选项字节的内容,一定从位于片上系统Flash的RSS启动RSS会检查SEC_AREA的内容,是否已经有指定的有效区域(有效区域是指起始地址小于 结束地址)。如果区域有效,则跳转到它所指向的用户Flash上的“安全用户存储区”执行。如果区域无效,则按照常规启动流程,根据BOOT引脚电平,选择从BOOTADDR0或 BOOTADDR1指向的地址启动BOOTADDR0和BOOTADDR1可以填写[0x0,0x3FFF 0000]范围内的任意地址。RDP2情况 下,系统只能从片上用户Flash启动。如果BOOTADDR0或者BOOTADDR1指向的不是片上 用户Flash,系统会强制从0x0800 0000启动SECURITY=1时,系统复位时调试端口关闭运行在RSS和安全用户存储区时,调试端口关闭

安全用户闪存区

上电复位状态:

只要使能Security并设置了安全用户闪存区的有效范围,则总是跳转到该区域的首地址运行在这个区域(region A)内执行的时候,无法通过Debug连接芯片(即使RDP0状态下)复位和运行在region A的时候,芯片处于“安全访问模式”

从安全用户闪存区,不使能对它的保护,直接跳转到普通UserFlash区(region B)

处于region B的PC依旧可以访问安全用户闪存区(region A)内容在region B内执行的时候,仍然无法通过Debug连接芯片(即使RDP0状态下)运行在region B的时候,虽然不在安全用户闪存区范围内,仍然处于“安全访问模式”

从安全用户闪存区,开启对它保护后,再跳转到普通UserFlash区(region B)

处于region B的PC无法访问安全用户闪存区(region A)内容,直到下一次复位后PC在region A执行在region B内执行时,调试连接是可能的 (取决于跳转之前应用代码是否人为关闭了调试端口)运行在region B的时候,不再处于“安全访问模式”

安全用户闪存区的设置和撤销

芯片出厂时选项字节的缺省设置:SECURITY=0,“安全用户闪存区”是无效区域设置 “安全用户闪存区”必须在SECURITY置位之后;否则设置无效“安全用户闪存区”有效的情况下,或者PCROP区域有效的情况下, SECURITY的清 零无法成功;需要先把这两种区域都设置成无效,再对SECRUITY清零“安全用户闪存区”的撤销,只需要运行在RSS或“安全用户闪存区” 的代码,把选项字节在Flash接口中对应的寄存器,其起始地址设置成大于结束地址,并让选项字节生效即可PCROP区域的撤销,需要通过RDP降级和PCROP区域无效,同时进行才能完成

安全STM32H7 代码保护示例

安全调试例程简介

解压缩软件包,使用熟悉的IDE分别打开Boot和App两个工程,编译后下载打开串口调试助手:115200波特率,8bit数据位,1bit停止位;无校验位,无流控STM32H753-Nucleo板:按下复位键,松开,程序运行;松开复位键时保持用户按键按下;根据屏幕菜单显示操作使用STM32CubeProgramer 的”hotplug”和”under reset”方式尝试连接目标芯片,以验证调试端口的保护效果;以及对隔离区内容的保护

▲ Boot工程 菜单

▲ App工程

▲ 带身份认证的调试使能控制

▲ 安全调试例程:安全用户闪存区的设置和撤销

注意事项

SEC_AREA 没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改 SEC_AREA ;STM32CubeProgrammer 是无法操作SEC_AREA 成功的SECURITY=1,IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式

小结

STM32H7通过以下两方面对片上代码施加保护:

保护Bootloader里的敏感操作和数据:Bootloader运行时,调试不可连接;执行普通代码时,打开调试端口;普通代码 无法访问Bootloader区域内容保护片上代码不被普通用户调试,仅开放给持有密钥的特定用户:安全用户区里内容可以被其他区域代码访问;打开调试后,安全区代码无法被调试访问

标签: #stm32压缩算法 #stm32 压缩算法