上一节使用对镜像进行签名认证,这可以防止镜像被篡改。但我们还是希望Flash中的程序不会被别人看到,所以这就需要加密启动了。
文章目录
- 1 HAB加密启动流程
- 2 扩展知识: DCP和SNVS
1 HAB加密启动流程
如下图所示就是HAB加密启动的整个流程:
- HAB加密启动仅适用于non-XIP的情况

NXP提供了一个CST(Code Signing Tool)工具,它可以生成一个称为DEK(Data Encryption Key)的随机密钥,实际上DEK就是一个基于AES-CCM 128/192/256bit的对称密钥,它用来加密和解密镜像。
- CST下载地址:i.MX High Assurance Boot Reference Code Signing Tool
如何保存DEK?
DEK用于对镜像进行加解密,所以我们需要将它保存下来供MCU获取,但也不能随便被用户得到。NXP将OTPMK(eFuse中出厂预烧录的每个芯片都唯一的密钥)作为SNVS,DEK通过SNVS密钥加密为DEK Blob保存在image镜像最后的DEK blob字段。如下图所示

在上电之后,BootROM通过SNVS解密DEK Blob来得到DEK,然后通过DEK解密镜像获得原始bin文件,然后拷贝到RAM中运行。所以这种方法仅适用于non-XIP的方案。
2 扩展知识: DCP和SNVS
- 参考链接:https://www.cnblogs.com/henjay724/p/13327060.html
DCP(Data Co-Processor)即通用数据协处理器,它可以完成CRC32、SHA、AES等算法。对于AES算法来说,实现了明文数据到密文数据的转化,中间的数据迁移由DCP内部集成的memcopy功能实现。
对于加解密而言,一个重要的特性就是密钥管理,DCP的AES-128密钥的来源有四种:
1、SRAM-baser keys:用户自定义的存放于SRAM中的密钥,最终写入DCP的KEY_DATA寄存器中,最多4组
2、Payload key:用户自定义的跟加解密数据放在一起的密钥,操作时由DCP解析
3、eFuse SW_GP2 key:烧录到eFuse SW_GP2区域的密钥
4、SNVS Master Key:芯片出厂时预订的唯一密钥,密钥值无法获知,DCP可以通过内置途径获得
SNVS(Secure Non-Volatile Storage)提供一个独特的Master Key给DCP模块,这个Master key的一种产生方式为
OTPMK,即eFuse里出厂预烧录的且每个芯片唯一的OTPMK(256bit),它不可以被软件访问。
DCP模块的驱动在SDK_2_12_1_MIMXRT1170-EVK\middleware\mcu-boot\src\drivers\dcp,分为两个函数:
DCP_AES_EncryptEcb()用于加密、DCP_AES_DecryptEcb()用于解密。
OTFAD加密使用SNVS Master Key的前提条件是设置eFuse SEC_CONFIG[1:0]设为2’b10(Hab Close),且在调试状态下无法获取。

















