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

news/2024/7/5 3:31:08

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


http://lihuaxi.xjx100.cn/news/1202214.html

相关文章

centos8安装部署Oracle Database Free

前言 centos8安装部署Oracle Database Free 安装部署 服务器安装 下载centos8镜像(选择镜像:CentOS-Stream-8-20230523.0-x86_64-dvd1.iso)并安装系统,具体细节不再赘述关闭centos8服务器的防火墙与selinux,并配置ip 部署oracle 注&…

用于ECharts的全国省市区县乡镇街道级的行政区划边界数据(GeoJSON格式)

https://map.vanbyte.com 提供了免费的省市县3级行政边界数据(GeoJSON格式)、省市县乡4级联动数据。 至于行政区划边界数据的来源,网络上有各种教程。授人以鱼不如授人以渔,下面记录一下各类方法的具体步骤。 来源1:阿里云的数据可视化平台…

编程的未来 - 还有未来么?

缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》,要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题,上周,在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候,大家也稍微谈了一下这个话题,但是谈…

华为OD机试 - 数据最节约的备份方法(Java JS Python)

题目描述 有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求使用光盘最少的文件分布方式 所有文件的大小都是整数的MB,且不超过500MB;文件不能分割、分卷打包 输入描述 一组文件大小的数据 输出描述 使用光盘的数量 备注 不用考虑输入数据不合法…

bat脚本代码,一键修改网卡的dns地址和恢复为DHCP获取的方式

echo off REM 指定为 Unicode 编码(65001)来解决中文乱码的问题 chcp 65001 >nul REM 脚本以管理员身份运行 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","&quo…

Gradio的web界面演示与交互机器学习模型,Blocks的事件侦听《7》

在第一篇文章我们就熟悉了Blocks的用法,使用Blocks比Interface更加灵活,这节重点关注Blocks里面的相关操作。 1、Blocks标准例子 import gradio as grdef greet(name):return "你好 " name "!"with gr.Blocks() as demo:name g…

竞赛中常用的Python 标准库

对竞赛中常用得标准库进行解析和给出代码模板 目录 1.functools 1.1 cmp_to_key 1.2 lru_cache(记忆化存储,加快递归速度) 2.collections 2.1 deque 2.1.1 单调对列实现 2.1.2 BFS广搜 3.sys 3.1 sys.maxsize 3.2 sys.exit() 3.…

基于Hive的数据应用实践总结

百分位数(percentile)计算 百分位数含义:统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如&#x…