1.1身份识别
•Unique ID芯片唯一标识 STM32众多列产品都带有UID,出厂时已经烧写在STM32芯片的系统Flash区域,UID的长度为96bit,作为芯片的唯一标识号。 UID的常见用途 •基于UID通过某种算法生成搭载该芯片的产品的唯一序列号 •基于UID进行密钥派生 芯片的参考手册有专门章节描述,请参考Device electronic signature章节 •OTP一次性写入区域 STM32 MCU的多数系列都带有OTP区域,例如F2,F4,L4,F7,G0,G4,WB,L5,U5等等(OTP区域的支持以及大小要看具体产品型号)。 OTP的常见用途 •一次性写入产品标识信息,写入后无法变更 •一次性写入不可变更数据,例如安全启动用于验证应用合法性的公钥信息 OTP的操作方式请参考芯片的参考手册Embedded Flash memory (FLASH)章节的相关描述
1.2存储保护、软件IP保护
•WRP 内部Flash写保护 WRP能够保护片内Flash指定区域的内容不被意外或恶意地修改或擦除,STM32全系列产品都带有写保护功能。 根据产品系列的不同,WRP的配置方式略有不同,L4、G0、G4、WB、L5、U5等系列可以设置受保护的起始和末尾Page,其它一些系列可以独立设置需要保护的Page/Sector。
WRP结合RDP2可以使得一段片上Flash成为相当于ROM的区域,该区域代码或数据将具有不可改变的特性。 STM32U5的WRP还增加了LOCK功能,一旦WRP LOCK被设置,WRP的区域设置无法随意修改,WRP LOCK的撤销必须伴随RDP降级,可以达到将部分FLASH ROM化的效果。
•RDP读保护 RDP读保护所保护的对象包括内部Flash,选项字节,内部SRAM(如SRAM2),OTP区域,Backup后备域RAM及寄存器等。在STM32L5和STM32U5这些新系列中,RDP的保护对象还扩展到OTFDEC区域密钥等。
RDP具有0、1、2三个级别(注:F1系列的RDP功能不支持RDP2),支持TrustZone的L5和U5还增加了一个0. 5级别。出厂时芯片的RDP级别缺省为0,即完全开放、没有保护;RDP设置为级别1时,调试端口虽然可以连接,但是受保护的各个区域(Flash,RAM,Backup RAM/register)无法通过调试端口访问,即使从system bootloader启动或者从RAM运行的代码也无法访问那些区域;RDP1状态下选项字节仍旧可以修改,因而可以回退到RDP0,但是该操作会触发全片Flash擦除;RDP2状态则会完全关闭调试端口,并且无法回到RDP1或者RDP0。STM32U5的RDP增加了OEM Key机制。设置OEM2Key可以允许使用OEM2Key从RDP2回退到RDP1,同时RDP1到RDP0.5的回退也受到OEM2Key的控制;设置OEM1Key,将使得RDP1到0的回退受到OEM1Key的控制,不能随意进行RDP降级。
L5和U5是基于CM33内核带有TrustZone的产品系列,对应也增加了一个RDP0. 5级别。RDP0.5状态能够禁止调试端口对Secure资源的访问,但依旧允许Non-Secure区域的调试,给TrustZone环境下的开发带来更多灵活性。同时RDP0.5级别时,上电缺省调试端口就处于关闭状态,只有当CPU运行至非安全状态时,调试端口才能再次被打开,因而可以基于此在L5和U5上实现安全调试机制,相关更多内容请参考实战经验**:使用STM32L5的TrustZone特性控制调试端口访问,保护片上代码安全 RDP1、RDP2可以提供基本的代码和IP保护功能,防止设备出厂后片内代码和数据从调试端口被任意获取获取。
•PCROP私有代码保护 PCROP提供了一个额外层次的代码保护,PCROP可以设置内部Flash的指定区域只能进行取指令操作,而无法进行数据读访问,也不能修改或擦除,也就是说无论是通过调试器还是芯片运行的代码(包括运行在PCROP区域内部的代码本身)都无法以数据访问的形式读取PCROP保护区域的内容(包括里面的指令和数据)。 PCROP的常见用途是防止恶意软件窃取MCU内部的代码,PCROP保护区域的代码无法被任何软件读取,但是可以执行(以指令访问的形式被取指),其中的函数API可以被调用。PCROP同时也可以成为对数据进行保护的变通手段,这时候,需要将被保护的数据转换成一段指令,只有执行该段指令之后,数据才会被恢复到寄存器或者RAM当中。 PCROP相关资料: 应用笔记/软件包 应用笔记/软件包 | | Proprietary code read-out protection on microcontrollers of the STM32F4 Series 《STM32F4系列微控制器的专有代码读取保护》 | | | Proprietary code read-out protection on STM32L4, STM32L4+ and STM32G4 Series microcontrollers 《STM32L4和STM32L4plus以及STM32G4微控制器上的专有代码读保护》 | | | Proprietary code read out protection (PCROP) on STM32F72xxx and STM32F73xxx microcontrollers 《STM32F72x、F73x的PCROP使用说明》 | | | Proprietary Code Read Out Protection on STM32L1 microcontrollers 《STM32L1 微控制器的专有代码读取保护》 | | | Proprietary code read-out protection (PCROP) software expansion for STM32Cube (AN4701, AN4758 and AN4968) 《专有代码保护 (PCROP) STM32Cube软件扩展包》 | | | Proprietary code read-out protection (PCROP), software expansion for STM32Cube 《STM32Cube的专有代码读保护(PCROP)软件扩展》 | | PCROP区域函数无法被调用的问题与解决 STM32F4xx PCROP应用 代码实现PCROP清除 | |
WRP,RDP,PCROP的操作方式请参考芯片的参考手册FLASH memory protection章节的相关描述。(对应示例程序包含在各个STM32 MCU系列的STM32Cubexxx固件包里)
WRP,RDP,PCROP能够对代码、数据提供基本的保护,如果希望这种保护具有更多的灵活性,包括考虑芯片内运行的软件本身对敏感数据、代码的访问控制等,则可以进一步使用代码和系统隔离机制,参见代码/系统隔离部分的介绍。
•OTFDEC(On-The-Fly Decryption)实时解密 OTFDEC功能用于保护放置于外部OSPI Flash上的代码和数据的机密性。代码和数据可以事先经过AES加密后以密文的形式存储于外部OSPI Flash,从而防止由于数据、代码明文存放于外部Flash而带来的安全风险。系统运行时,外部Flash上的密文代码和数据经由OTFDEC模块实时解密,该解密过程对CPU透明,无需额外软件参与。支持OTFDEC的STM32系列包括L5,U5,H73x/Bx
OTFDEC相关例程包含在相关STM32MCU固件包里。详细的使用方法详见芯片参考手册OTFDEC章节的相关描述,也可以参考AN5281。 应用笔记 | | How to use OTFDEC for encryption/decryption in trusted environment on STM32H7Bxxx and STM32H73xx microcontrollers 《如何使用STM32H7Bxxx和STM32H73xxx微控制器上的OTFDEC进行加解密操作》 | | | 使用STM32L5的OTFDEC和ICACHE功能实时高效运行片外Flash中的加密代码 OTFDEC_Efficiency_基于STM32H735G-DK板的验证 | |
|