i.MX8 Secure Boot说明文档
一、缩略词解释
本文中使用的术语和首字母缩略词的定义如下:
- CA:Certificate Authority,证书颁发机构,用于验证公钥的私钥的持有者。
- CAAM:Cryptographic Acceleration and Assurance Module,加密加速和保证模块,加密,流密码和散列算法的加速器,具有随机数生成器和运行时完整性检查器。
- CMS:Cryptographic Message Syntax,加密消息语法,可以对其应用加密的数据的一般格式,例如数字签名和数字包络。 HAB使用CMS作为持有PKCS#1签名的容器。
- CSF: Command Sequence File,命令序列文件,由HAB解释以指导身份验证操作的二进制数据结构。
- CST:Code Signing Tool, ,代码签名工具,在构建主机上运行的应用程序,用于生成CSF和关联的数字签名。
- DCD:Device Configuration Data,ROM代码用于在早期启动阶段配置设备的二进制表。
- DCP:Data co-processor,数据协处理器,AES加密和SHA哈希算法的加速器。
- HAB:High Assurance Boot,在启动时在飞思卡尔处理器的内部ROM中执行的软件库,其中,通过根据CSF验证数字签名来验证外部存储器中的软件。 本文档严格限于运行HABv4的处理器。
- IVT:Image Vector Table.,图像矢量表。
- OS:Operating System,操作系统。
- OTP:One-Time Programmable,一次性可编程。OTP硬件包括屏蔽ROM和电可编程熔断器(eFuses)
- PKCS#1:标准指定使用RSA算法。
- PKI:Public Key Infrastructure,公钥基础结构,公钥证书的层次结构,其中每个证书(根证书除外)都可以使用其上方的公钥进行验证。
- RTIC:Run-Time Integrity Checker,运行时完整性检查程序,SHA256哈希加速器,可确保运行时的软件完整性。
- RSA:Public key cryptography algorithm developed by Rivest, Shamir, and Adleman,由Rivest,Shamir和Adleman开发的公钥加密算法。
- SA:Signature Authority,签名机构,用于签署软件组件的私钥的持有者。
- SAHARA:Symmetric / Asymmetric Hashing and Random Accelerator,在某些处理器上找到的加密加速器(包括散列加速)。
- SDP:Serial Download Protocol,串行下载协议,也称为UART / USB串行下载模式。 这允许在生产和开发阶段通过UART或USB进行代码配置。
- SRK:Super Root Key,超级根密钥,一个RSA密钥对,它构成了启动时认证链的起点。 SRK公钥的散列使用OTP硬件嵌入在处理器中。 SRK私钥由CA持有。 除非明确说明,否则本文档中的SRK仅指公钥。
- UID:Unique Identifier,唯一标识符,在制造期间分配给每个处理器的唯一值(例如序列号)。
- XIP:Execute-In-Place,就地执行,是指直接从其非易失性存储位置执行而不是先复制到易失性存储器的软件映像。
二、架构设计
1. SECO概述
SECO:Security Controller(安全控制器)
CAAM和其他NXP安全子系统的管理者
主要特性:
- 支持133MHz的节能M0+核心
- 中断控制器,最多32个IRQ
- 通过认证调试模块(ADM)进行安全控制
- 专用80KB ROM,80KB RAM,带错误纠正码(ECC)
- 专用的一次性可编程(OTP)密钥
- 结构切换到共享外设,本地外设和专用加密密钥总线接口到DTCP和IEE
SECO安全子系统
示意图:
SECO ROM功能
- ADM处理(锁定,定时器,生命周期……)
- SNVS状态机处理
- CAAM初始化
- 秘钥安装
- SECO固件验证:
- 容器签名验证
- SECO 固件的哈希计算
- 认证
- 名誉ROM完整性检查
SECO 固件(名誉ROM)功能
- 通过消息协议向AP和SCU / M4提供一些服务
- SNVS状态机处理(安全)
- 容器认证
- 图片验证码
- CAAM JR分配/配置
- 安全的内存分配/配置
- SNVS资源处理(RTC,Btn,篡改配置,……)
- 调试启用
- 电源管理
- 移动生命周期
- 写保险丝
- 二进制处理
2. 生命周期
芯片生命周期控制有助于确保芯片在一个阶段中提供的秘钥无法被另一个阶段访问,比如从一个域前进到下一个域以及退回到OEM和芯片制造商时。
SECO提供两个独立的API(MU消息):
- 更新生命周期
- 返回生命周期(签名消息)
生命周期管理示意图:
推动生命周期前进
SC FW选项:
- ERP的API:sc_misc_seco_forward_lifecycle
- 监控命令:
seco lifecycle <lc target>
- 例如从”NXP closed”变成”OEM closed”
seco lifecycle 16
首先需要写OEM SRK保险丝,这样才会没有警告
- 在SECO状态寄存器中读取SECO日志中出现的生命周期
- 向后移动生命周期需要签名消息
生命周期状态切换寄存器:
NXP i.MX8 B0安全通用启动流程图
i.MX8 B0签名引导流程 - 用户操作
3. 高级高可靠性启动
i.MX8 boot image布局
- 包含两个容器
- 数据头首先出现
- 第一个容器只包含SECO固件镜像
- 第2个容器数据头与1k对齐
- 第二个灵活的图像放置
- 容器可以包含一个或多个镜像
- 没有CSF
- 整个容器必须驻留在相同的引导介质上
- 容器数据头独立于镜像位置 - 相对位置通过数据头中的签名部分确定
- 整个容器/所有包含镜像的单个键
- 引导过程没有处理CSF
容器构成分析
镜像描述数组
- 支持加载不连续块
- 支持多核的镜像
- 容器标头中的所有数据,包括大部分签名块(除签名本身和blob之外的所有内容)都已签名。
- 加载和验证容器可以在多个(可并行化的)步骤中执行:
- 可以加载标头,并且可以在加载整个容器之前启动签名验证。
- 数据块可以独立加载,散列和验证
PKI树
- 精简驱动以增强安全性
- HAB中包含的特定和精益证书格式
- SRK + IMG关键标准支持型号
与传统的i.MX相比,快速启动不适用于AHAB。
SGK:如果SRK密钥没有设置CA标志,则为可选镜像密钥(证书)。
算法与密钥
- 最多支持4个超级根密钥(SRK)
- 任何SRK都可能被撤销
- SRK的hash存储在保险丝中
- 公钥包含在容器中
- 2个信任根(恩智浦和OEM)
4. 代码签名工具(CST)
代码签名工具(CST)已更新,以支持i.MX8QXP和i.MX8QM支持高级高可靠性启动(AHAB)。
CST工具包包括3个支持签名的服务:
- 开发密钥对生成(PKI树脚本)
- SRK表生成(srktool可执行文件)
- 签名生成(cst可执行文件)
请注意,要签名的二进制文件是由名为mkimage的其他工具生成的。
CST更新细节
- 从加密输入的角度来看,CST利用OpenSSL支持的行业标准来获得密钥,证书和哈希。
- CST利用名为“CSF”(命令序列文件)的文件来获取输入(要签名的文件,要使用的密钥以及如何执行操作)。
- 在旧版i.MX上,CSF不仅用于指示CST如何对引镜像进行签名,还将其复制到最终引导镜像中并由ROM / HAB进行解释,以便对镜像进行身份验证。
- 引导镜像中的AHAB(B0安全引导)上下文中不再存在CSF,所需信息通过容器头传递。
在为B0添加CST支持的过程中,我们仍将使用CSF将必要的信息传递给CST以生成签名和可选证书。
与CSF中的传统CST相比会有什么变化:
- [标题]:
- 删除引擎选择/配置。
- 签名格式现在是NXP专有而非标准格式。
- [安装SRK]:
- 将在容器标题中添加有关哪些键被撤销的信息。
- [验证CSF]:
- 不再需要,支持将被删除。
- [安装密钥]
- 可用于支持由SRK签名的镜像密钥。如果存在,则容器由可选的“镜像密钥”签名。
- 可能不再需要支持“目标指数”。
- [验证数据]:
- 这是指向要签名的数据的命令,我们可能会放弃对“验证索引”的支持。
镜像签名流程概述
AHAB容器概述
CST负责处理Signature块。
安装说明
1 |
|
目录说明:
1 |
|
PKI树脚本
PKI树脚本根据用户输入生成密钥对
输入:
- 对于HAB4:
- 密钥类型:RSA 1k / 2k / 3k / 4k(EC支持正在进行中)
- 要生成的SRK密钥数
-CSF和IMG密钥生成请求
- 对于AHAB:
- 钥匙类型:RSA 2k / 3k / 4k,EC P256 / P384 / P521
- 摘要算法:SHA256,SHA384,SHA512
- 证书密钥生成请求
输出:
srktool
srktool生成SRK表及其hash保险丝。
输入:
- 生成的SRK
- 每个字的保险丝位数(每个字8或32个)
- 对于HAB 4,将用于生成熔丝的摘要算法
- 对于AHAB,将用于签名的摘要算法(此信息被编码到输出中)
输出:
- SRK表。 它包括NXP格式的SRK公共信息。
- SRK表的hash保险丝。该值是完整SRK表的SHA512。该值将融合到SoC中。
mkimage
mkimage生成将要签名的完整启动镜像。
下面是一个在命令行中运行的例子:
1 |
|
参数说明:
1 |
|
在生成镜像时,mkimage会打印出一些信息。
2个特定日志对于cst使用很重要。
1 |
|
请确保将打印的偏移量报告到cst配置文件中。
cst
cst基于配置文件生成签名镜像。
输入对应于配置文件,该配置文件包含用于生成签名的指令。
配置文件输入:
- SRK表
- 将用于签名的SRK证书
- 可选的证书(和权限)
- 由mkimage生成的要签名的二进制文件(和偏移信息)
输出:包含签名的二进制文件。
签名生成
下面是生成签名的步骤:
- 进入bin目录。
$ cd release/linux64/bin/
2. 将配置文件bootimg.csf的示例和要签名的二进制文件复制到二进制文件目录中,文件bootimg.csf将在下面描述。
3. 使用这些选项执行cst。$ ./cst –i bootimg.csf –o flash.bin.signed
4. 对于HAB 4,必须将输出二进制数附加到镜像中。对于AHAB,输出二进制对应于可存储的带符号二进制本身。
bootimg.csf示例
记得修改为实际使用环境的路径。
1 |
|