I.MX RT1170加密启动详解(4):OTFAD XIP加密运行代码

本节将介绍基于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。其中IEKKEK都由用户定义,当打开Key scramble功能后,还需要给NXP工具提供key scramblekey scramble align两个输入。

OTFAD key blob保存在image中,它将被KEKscrambled 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。IEKKEK都由用户定义,如果使能了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。

最后,建议使用MXUXpresso Secure Provisioning工具来实现这个加密,还可以烧录eFuse相关位,生成烧录eFuse和镜像的脚本。当然对于实际产品来说,肯定要有个BootLoader,在这种情况下,最好还是自己使用image_enc.exe来加密,如果不同固件的IEK改变的话,还需更新BootLoader中0x00~0x100处的OTFAD Key Blob。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值