本节将介绍基于AES加密的OTFAD引擎,它可以在不影响AES-128-CTR性能的情况下实时解密数据。OTFAD包括对AES密钥展开机制的完整硬件支持,它可以解密最多4个唯一的AES上下文。每个上下文都有一个用户定义的128位的Image Encryption Key
(IEK)、一个64位的计数器和1个64位的内存区域描述符(决定从哪个地址开始用IEK和计数器解密)。OTFAD key blob从image镜像中提取并被OTFAD解密,然后加载到OTFAD相应的寄存器中。
NXP提供了相关加密工具,通过AES密钥包装算法(RFC3394)将KEK
(Key Encryption Key)包装为key blob。KEK可以保存在eFuse中(USER_KEY5),也可以由PUF
(Physically Unclonable Function)保存。
密钥加密(key scrambling)
密钥加密是可选的特性,需要通过eFuse相关位使能,若没有使能,则KEK
将被直接使用。OTFAD将输入的KEK
加密,然后用于打开OTFAD key blobs
。NXP工具使用KEK
(128bit key)、Key sramble
(32bit key)和Key sramble align
(8bit key)来加密KEK
。
OTFAD XIP使能过程
在最终生产时,image需要由NXP工具进行签名,然后根据OTFAD上下文结构和KEK
加密过后的OTFAD key blob生成加密image。其中IEK
和KEK
都由用户定义,当打开Key scramble
功能后,还需要给NXP工具提供key scramble
和key scramble align
两个输入。
OTFAD key blob保存在image中,它将被KEK
或scrambled KEK
加密(基于RFC3394算法)。KEK
必须写到USER_KEY5
保险丝中,它是以大端格式保存的。
BootROM使能Encrypted XiP via OTFAD的条件:
- eFuse的
ENCRYPT_XIP_ENGINE
(0x970[12])位被置0,表示使用OTFAD引擎 BOOT_CFG_1[1]
为1 或 eFuse的The ENCRYPT_XIP_EN
(0x940[1])为1
BootROM和Key Manager通过eFuse的设置来安装KEK
以初始化OTFAD。OTFAD解析加密的OTFAD key blob
然后根据AES上下文结构来初始化解密引擎,这样CPU和eDMA等系统设备可以获得解密后的数据。
PUF
保存的方式参考AN13250 2.4.5/2.4.6
相关eFuse位
注意
- 建议在生产时将eFuse中的
USER_KEY5_RLOCK
(if used)和OTFAD1/2_KEY_SEL_LOCK
(保护OTFAD key)置位 - eFuse的0xC70地址的0x47字使用了纠错码,所以必须同时设置所有需要的位。
ENCRYPT_XIP_EN
是BOOT_CFG1 fuse
的一部分,当它被设置的时候,所有的BOOT_CFG
都必须对应设置好
总结
OTFAD可以解密包含最多4个AES上下文参数的OTFAD key blob
,每个上下文都有一个用户定义的128位的IEK
(Image Encryption Key)、一个64位的计数器和一个64位的内存区域描述符(从哪个地址开始用IEK
和计数器解密)。OTFAD key blob
会被KEK
加密,KEK
必须以大端格式写到USER_KEY5
保险丝中。OTFAD key blob
将被写入image相关字段中,然后由OTFAD解密并加载到四内存上下文编程模型寄存器中。
签名后的image还需要进行加密处理,根据OTFAD上下文结构和KEK
加密的OTFAD key blob
生成加密image。IEK
和KEK
都由用户定义,如果使能了key scramble
(KEK
变为scramble KEK
),还需提供额外的参数。
image由IEK
加密,而IEK
、计数器和内存区域描述符将被KEK
加密为OTFAD key blob
并保存在image的后面,用户需要把KEK
以大端格式烧写到eFuse的USER_KEY5
字段中。上电后,BootROM从eFuse中读取KEK
并交给OTFAD,OTFAD解密OTFAD key blob
得到IEK
后便使用IEK
边运行边解密image。