上一节使用对镜像进行签名认证,这可以防止镜像被篡改。但我们还是希望Flash中的程序不会被别人看到,所以这就需要加密启动了。
1 HAB加密启动流程
如下图所示就是HAB加密启动的整个流程:
- HAB加密启动仅适用于non-XIP的情况
NXP提供了一个CST(Code Signing Tool
)工具,它可以生成一个称为DEK
(Data Encryption Key
)的随机密钥,实际上DEK
就是一个基于AES-CCM 128/192/256bit
的对称密钥,它用来加密和解密镜像。
如何保存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
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),且在调试状态下无法获取。