本节将介绍基于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。



















