一、STM32MP15从bootrom到FSBL安全启动原理 1、两个概念 Product Life Cycle 主要针对于支持安全启动的devices;需要使能。 有四种状态: 1)secured_unlocked;解锁状态。所有功能都能正常运行; 2)Under_provisioning; 与安全烧录、SSP有关;使用这功能才有这个状态 3)secured_locked;上锁状态,强制安全启动,带有正确签名的image才能启动和执行;默认关闭了调试功能 4)RMA状态;主要用于芯片回厂调试、失效分析使用。使用时,需要使用unlock密码进行unlock.解锁有3次限制。与OTP配置相关。 注意:STM32MPU15X/25X Product Life Cycle 是一样的,STM32MP13X相比15X多了带boundary scan disabled和JTAG disabled的状态。 Device Life Cycle Rom code的行为与整个产品生命周期中设备状态强相关。 设备状态有以下三种: 1)Open state:设备默认状态;所有功能正常运行,不强制验证,但是会进行校验,不通过image也能正常启动。 2)Closed state: 通过烧写相关的OTP进入close state;此时强制校验,校验不通过,不能正常启动;对应于secure locked状态 3)RMA state:closed state下的设备可以进入这个状态。与产品生命周期的RMA状态一样使用。 注意:STM32MPU13X/15X/25X device state是一样的 。 2、Secure bootrom如何对FSBL校验 1)使用ECDSA校验算法;另外secure bootrom还带有一个带有防回滚的机制 2)还Rom code使用硬件加速器进行SHA256的哈希运算 具体图示如下 前提:正常情况下,TF-A image带有一个header,不包含签名信息;当使能secure boot功能后,就需要对TF-A image进行签名;同时将签名密钥队里面公钥部分HASH值写入OTP(这个过程称为provisioning)。 流程:设备上电复位后,执行FSBL之前,secure boot rom会使用OTP中的数据对TF-A header中的签名、公钥进行校验,校验通过就会跳转到FSBL 3、上位机产生密钥和设备校验全流程 图示如下: 详细描述如下: 1)用户使用签名工具产生密钥队(公钥和私钥),接下来进行两步走: ① 将产生公钥的HASH值(PKH)写入BESC中的OTP,用于后续校验FSBL镜像;注:PKH是存储在OTP WORD的24-31的位置 ② 利用签名工具(ECDSA算法:支持P-256 NIST和Brainpool 256t T1),将产生私钥的HASH进行签名,并存储在FSBL的HEADER中。 Header bin文件信息说明 注: 1、签名从header中Header Vesion的位置到FSBL镜像的最后的位置进行的, 2、产生密钥的过程也是使能安全启动的过程。 2)Secure boot rom如何校验FSBL 在上电复位后,执行FSBL之前,boot rom对FSBL做以下校验 ① 验证公钥 a. 计算签名文件中公钥的HASH值; b. 与存储在OTP WORD的24-31公钥的HASH校验; 校验通过则去校验镜像。 ② 验证镜像 a. 计算FSBL payload、公钥、header的HASH值; b. 与验证通过的公钥来验证header签名中的HASH值。 校验通过才会进行正常启动流程。 ③ 防回滚检查 a. ROM code检查FSBL Header中FSBL的版本是否大于等于存储在OTP WORD 4 中FSBL 最小版本。如果不是,则验证失败。如果是,则ROM code继续正常启动 4、MP15安全启动如何使能 使能MP15X安全启动功能有以下步骤: 1) 产生校验密钥 a.使用STM32 KeyGen tool或者使用STM32CubeProgrammer 内置的 STM32MP_KeyGen_CLI命令行工具 b.产生3个文件,公钥和私钥PEM文件,公钥SHA-256哈希的二进制文件 2) 将信任根的HASH值烧录到OTP中。 烧录方式 a.STM32CubeProgrammer的GUI或者CLI命令行 b.Uboot的stm32 key 命令或者fuse 命令 c.使用ssp(安全加密烧录) 3) 将要加载的固件签名 使用STM32CubeProgrammer工具进行签名。 4) 将文件烧录到设备中 5) 将设备的device state设置成close状态(强制性进行secure boot rom校验) a.设置device state 为close状态 在最终的产品中,需要将OTP_CFG0[6] 设置为1 b.为了使能对close状态的设备进行调试,需要在设备为open状态时烧录RMA密码。 二、STM32MP13或MP25从bootrom到FSBL安全启动原理 MP13X和MP25X安全启动原理是一致的,唯一的区别就是MP25带有M33核,生成密钥时需要生成FSBL-M相关的密钥。 1、MP13X 或MP25XSecure bootrom如何对FSBL校验有如下机制 1)使用ECDSA校验算法;另外secure bootrom还带有防回滚的机制; 2)支持FSBL认证密钥撤销的机制 MP13/MP25均支持8个密钥,当其中的一个密钥泄露时,可以取消该密钥的有效性; 3)支持FSBL使用AES进行解密 在STM32MP13X系列secure boot rom 校验FSBL使用HASH、PKA、CRYP、SAES解密加速器; HASH执行SHA256哈希运算;PKA执行ECDSA签名校验;CRYP或者AES进行FSBL的解密。 具体流程如图示 前提:正常情况下,TF-A image带有一个header,不包含签名信息;当使能secure boot功能后,就需要对TF-A image进行签名;同时将8个签名密钥队里面公钥部分HASH值写入OTP(这个过程称为provisioning),还需要对FSBL进行加密 流程:设备上电复位后,执行FSBL之前,secure boot rom会使用OTP中的数据对TF-A header中公钥、签名进行校验,校验后,解密后就会跳转到FSBL。 2、上位机产生密钥和设备校验全流程 图示如下: 详细描述如下: 1)用户使用签名工具产生密钥队(公钥和私钥)和EDMK: ① 将产生包含8组公钥HASH表的HASH(PKHTH)写入BESC中的OTP,用于后续校验FSBL镜像;注:PKHTH是存储在OTP WORD的24-31的位置 ② 如果还想加密功能,则密钥工具还需要产生加解密主钥(EDMK),EDMK是被写入OTP WORD的92-95位置 2)利用签名工具(ECDSA算法:支持P-256 NIST和Brainpool 256t T1),将激活状态的私钥HASH值对FSBL进行签名,这个时候需要存储激活密钥的索引在HEADER中。 Header bin文件信息说明。相比MP15,MP13增加了一个Authentication header extension。 注: 1、签名从header中Header Vesion的位置到FSBL镜像的最后的位置进行的, 3)PC上加密FSBL 前提条件:是需要给FSBL进行加密 ① PC使用签名工具计算FSBL镜像文件的HASH值,并存储在HEADER中; ② PC使用派生常数计算加密解密主密钥(EDMK)的 PRF CMAC 派生,以生成加密密钥,派生常数也是存储在Header中。 ③ PC使用AES加密算法对FSBL二进制文件进行加密。 注意:上述加密相关信息存储在Decryption header extension 4)Secure boot rom如何校验FSBL 在上电复位后,执行FSBL之前,boot rom对FSBL做以下校验 ① 验证公钥 a. rom code读到HEADER,如果带校验,就会计算FSBL HEADER中哈希表的HASH值; b. 与存储在OTP WORD的24-31位PKHTH的HASH比对,通过则说明头里面的HASH表有效,表里HASH值可以校验公钥; c. 计算HEADER中的公钥的HASH值; d. 检查公钥的有效性;
注意:如果key index大于OTP中的key index则会更新OTP中的key index,说明之前的key index是失效了。 ② 验证镜像 a. 使用公钥来验证FSBL的签名; b. 与验证通过的公钥来验证header签名中的HASH值。 校验通过才会进行正常启动流程。 ③ 防回滚检查 a. ROM code检查FSBL Header中FSBL的版本是否大于等于存储在OTP WORD 4 中FSBL 最小版本。如果不是,则验证失败。如果是,则ROM code继续正常启动 ④ 解密 a. 使用HEADER中的派生常数与存储在OTP的EDMK进行派生解密密钥; b. Rom code使用产生的派生KEY,对FSBL payload进行AES解密; c. ROM code对解密后的FSBL payload进行HASH计算; d. Rom code将上述计算的HASH值与header中的HASH值进行比对。比对通过则跳转到FSBL运行。 3、MP13X/MP25X安全启动如何使能 使能MP13X/MP25X安全启动功能有以下步骤: 1) 产生校验和解密密钥 a.使用STM32 KeyGen tool或者使用STM32CubeProgrammer 内置的 STM32MP_KeyGen_CLI命令行工具 b. 产生8组对,包含8组密钥对的哈希表,对哈希表的HASH(PKHTH),还会产生EDMK(使能加密) 2) 将PKHTH和EDMK烧录到OTP中。 烧录方式 a.STM32CubeProgrammer的GUI或者CLI命令行 b.Uboot的stm32 key 命令或者fuse 命令 c.使用ssp(安全加密烧录) 3) 将要加载的固件签名或者加密(若需要加密) 使用STM32CubeProgrammer工具进行签名。 4) 将文件烧录到设备中 启动时,secure boot rom会打印校验状态如: Bootrom authentication succeeded or Bootrom authentication failed 5) 将设备的device state设置成close状态(强制性进行secure boot rom校验) a.设置device state 为close状态 在最终的产品中,需要将OTP_CFG0[6] 设置为1;开发阶段这一步可以跳过。 三、MPU13X/15X/25X在secure boot rom到FSBL有什么异同 1、相同点: -- 都使用ECDSA算法; -- 都支持防回滚; -- 校验流程都是根据OTP中HASH值对公钥校验,进而验证FSBL的有效性。 2、不同点 -- MPU13X/25X支持签名外还支持对FSBL的加密; -- MPU13X/25X支持8组密钥队,保存OTP中的是哈希表的哈希,而不是MPU15X 公钥的HASH -- MPU13X/25X FSBL 镜像的HEADER包含的信息比MPU15X多(包含8组密钥对,加解密信息等) 注意MPU13X/25X的不同在于MPU25X带Cortex-M33核,生成密钥时还包含FSBL-M的密钥 |