实用指南:NXP S32K3xx之HSE使用方法(三)
目录
1. 系统架构
通过NXP S32K3xx系列芯片能够分为:
- 应用域:即主机Host部分
- 安全域:即HSE,献出硬件安全引擎

从上图可以看出,应用域含有以下的系统资源:
- 一个或多个CPU子系统
- 片上内存资源(RAM, NVM)
- 若干外设资源如通信接口,定时器,编码/解码器
- 与片外内存的接口
- 系统总线,所有系统资源相互连接
安全域即HSE系统,具有专属的系统资源,利用专用接口连接到主机部分,具体请参考1.2章节。
1.1 主机Host
1.1.1 CPU子系统
主机的CPU子系统具备一个CPU核和专用的CPU资源(cache,中断控制器、浮点单元等)。它可以处理如可执行文件,配置数据和应用信息等内容,同时利用控制系统资源来实现ECU的功能。
主机可以包含多个CPU子系统,即多核系统。
1.1.2 内存资源
1. Application RAM: CPU子系统能够访问的片上和外部RAM区域
2. Application NVM: 包括以下几种
- One-time-programmable内存: 可参考S32K3xx Reference Manual手册的附件DCF配置
- 片上的Code和Data Flash
- Device memory configuration:配置UTEST相关参数,如下表所示:
| 配置参数 | UTEST地址 | 大小 | 说明 |
| HSE Firmware Usage feature flag | 0x1B000000 | 8 bytes | 使能安装HSE固件 |
| Reserved | 0x1B000048 | 8 bytes | 预留 |
| FXOSC configuration | 0x1B000050 | 8 bytes | 在安全启动阶段使能PLL |
| Partial AB_Swap | 0x1B000058 | 8 bytes | 使能部分AB SWAP调整,拥护的芯片为S32K358和S32K388 |
| JDC clock disable | 0x1B000060 | 8 bytes | 禁止JDC时钟,降低功耗 |
1.1.3 设备标识符UID
NXP提供64bit的唯一设备标识符,凭借UID可以识别设备。详细信息可参考S32K3xx Reference Manual手册的附件DCF配置
1.1.4 主机系统镜像
嵌入式Flash中包括以下的主机系统镜像:
- IVT: Image Vector Table,是复位后系统执行的入口
- Apps:应用程序镜像,如可执行文件,数据等
- AppBL: 经过认证的应用程序镜像,在HSE认证成功后才可以运行
1.1.5 系统总线和XRDC
CPU子系统与系统资源如RAM和内部Flash通信的桥梁,而XRDC(eXtended Resource Domain Controller)可以控制CPU子系统就是系统总线访问系统资源的权限。应用程序可以通过XRDC配置去定义CPU子系统对系统资源的访问权限。
1.2 HSE子系统
HSE是一个安全的子系统,首要目标是为具有严格的保密性和真实性要求的应用程序给出相关的安全功能,如以下的应用场景:
- 为应用程序(主机)保存安全敏感的信息(例如,密钥值)
- 依据专用处理器来进行加密等处理
- 在运行时和系统启动期间实施安全措施
1.2.1 HSE子系统类型
HSE子系统包括3中类型,不同类型及适用的芯片系列如下所示:
- HSE_H (High) : 支持的芯片系列为S32G2, S32G3, S32ZSE和S32R45
- HSE_M (Medium):支持的芯片系列为S32R41和SAF85
- HSE_B (Base):支持的芯片系列为S32K3XX,本文介绍的即为HSE_B类型
1.2.2 HSE子系统特性
1. CPU子系统
HSE的CPU子系统通过调用系统资源来为主机提供安全的服务,服务的API信息,可参考<HSE Service API Reference Manual>
2. 加密加速器
HSE子系统提供了以下的加密算法的加速器:
- AES引擎:支持所有key的大小(128,192,256bits)和多种复杂的模式(CBC,CTR,GCM等)
- Hash引擎:支持标准SHA1和SHA2哈希,最高可达256位摘要的哈希。对于SHA-384和SHA-512,软件支持可用
- 公钥引擎:加速RSA和ECC操作
3. 真随机数生成器
HSE子系统支持真随机数发生器(TRNG)
4. 系统定时器
HSE子系统配备系统定时器,允许自动运行功能,如运行时内存验证检查,以及一个看门狗定时器,在发生意外运行时故障时重置HSE子系统
1.2.3 HSE内存资源
- Secure RAM: 由HSE子系统独占访问的RAM资源,用来运行hse和存储拷贝的加密密钥。
- Secure NVM: 由HSE子系统独占访问的NVM资源,包括如代码,内容和部署的flash区域
1.2.4 HSE的镜像
HSE的镜像包括:
- FW-IMG:HSE固件的可执行文件,存储在HSE的code flash区域
- SYS-IMG:包含公/私钥,monotonic计数器和配置数据(即HSE框架属性),存储在HSE的data flash区域
1.2.5 生命周期
通过生命周期是内部设备的状态,由HSE子系统进行管理,LC的状态可以读取,也可能通过HSE的平台属性服务进行修改(注意只能向下一阶段演进,不能回退),LC也能够借助IVT的LCW进行演进。
不同LC状态的描述如下表所示:

以上LC的状态为FA lifecycle和PRE_FA life cycle只能由NXP来演进。
1.2.6 软件组件
HSE子系统包含如下两个软件组件:
1. SBAF
Secure Boot Assist Flash (即SBAF)是在生产阶段由NXP写入的,该软件组件存储在HSE的code flash区域,主要包括如下特性:
- 安全启动模式和非安全启动模式
- 应用程序启动核心选择
- HSE固件安装
- HSE固件恢复
- HSE固件启动
- 设备OTA功能启用
- 芯片生命周期演进
- 调试Debug认证
- 部分分区切换启用
- XRDC配置
- 承受固件更新
- 安全和基于JTAG的恢复模式
- HSE固件握手
- 支持HSE固件更新
- ECC错误检测/处理
2. HSE固件
HSE固件重要提供以下服务:
- Administration Service:用于安装、配置和测试HSE
- Key management Service: 用于管理不同的密钥
- Cryptographic Service: 为应用提供密码学原语,用于实现应用层的加密协议栈
- Random Number Service: 生成可用于各种安全协议的随机数
- Memory verification Service: 允许应用程序在启动时(复位后)和运行时验证不同的内存区域
- Monotonic counter Service: 为应用程序提供一组可读取的单调计数器,且只能逐渐增加
HSE 固件在出厂后没有激活,得用户进行HSE 固件安装,HSE安装方法请参考NXP S32K3xx之HSE使用途径(一)
2. 启动流程
启动阶段,HSE系统最终会运行normal boot或者Installation boot,取决于以下内容:
- 否存在就是IVT
- 否存在就是FW-IMG
- 是否需要安全FW-IMG
从系统复位开始,这里暂时不考虑standby模式,如果为Power on reset,对复位次数进行计数清0,特性复位则跳过该步骤。随后使能晶振,判断IVT是否有效以及是否需要进行IVT认证(IVT_AUTH),如果IVT无效且认证失败,进入Normal boot;否则判断在Secure NVM中是否存在高效的FW-IMG,如果没有有效的FW-IMG或者存在FW-IMG安装请求,则进入Installation boot。

2.1 IVT介绍
IVT全称为Image Vector Table, 也可称为boot header,是复位后系统主要的执行入口,具备Apps的存储位置,BCW调整(包含启动时的行为),LCW设置(允许进行生命周期的演进),接下来对IVT进行详细的介绍。
2.1.1 IVT start Address
IVT的起始地址从下表中提供的地址中进行选择,复位后HSE从低地址开始,查找第一个管用的IVT header tag进行运行。下表只列举了部分芯片的IVT起始地址,更多内容请参考REF02文档。
| Device | Start addresses (FULL_ MEM) | Start addresses (AB_ SWAP) | Start addresses (Partial AB_SWAP) |
| S32K310 | 0x00400000, 0x10000000 | 0x00400000, 0x10000000 | NA |
| S32K311 | 0x00400000, 0x00480000, 0x10000000 | 0x00400000, 0x10000000 | NA |
| S32K341 | 0x00400000, 0x10000000 | 0x00400000, 0x10000000 | NA |
| S32K312 S32K342 S32K322 | 0x00400000, 0x00500000, 0x10000000 | 0x00400000, 0x10000000 | NA |
| S32K344 S32K324 S32K314 | 0x00400000, 0x00500000, 0x00600000, 0x00700000, 0x10000000 | 0x00400000, 0x00500000, 0x10000000 | NA |
2.1.2 IVT Structure
IVT的结构如下表所示,需要注意的是:
- Apps的地址指针需与VTOR相匹配
- 所有其他的地址指针必须32字节边界对齐
- 预留的区域填充0xFF
| Offset | Byte size | Category | Description | Value/Value type |
| 0x00 | 4 | Tag | IVT header tag | Magic number(0x5AA55AA5) |
| 0x04 | 4 | Configuration | BCW | Bit field |
| 0x08 | 4 | Reserved | ||
| 0x0C | 4 | Executable | Apps for BOOT_TARGET bit #0 | Pointer |
| 0x10 | 4 | Reserved | ||
| 0x14 | 4 | Executable | Apps for BOOT_TARGET bit #1 | Pointer |
| 0x18 | 4 | Reserved | ||
| 0x1C | 4 | Executable | Apps for BOOT_TARGET bit #2 | Pointer |
| 0x20 | 4 | Reserved | ||
| 0x24 | 4 | Configuration | LCW | Pointer |
| 0x28 | 4 | Executable | Apps for BOOT_TARGET bit #8 | Pointer |
| 0x2C | 4 | Executable | FW_IMG | Pointeronly, only valid for FULL_MEM configuration |
| 0x30 | 4 | Executable | AppBL | Pointer |
| 0x34 | 12 | Reserved | ||
| 0x40 | 4 | Executable | Start Address of Application Core for Secure Recovery mode. | Pointer |
| 0x44 | 4 | Length | Length of Recovery Application | 32-bits data |
| 0x48 | 156 | Reserved | ||
| 0xE4 | 12 | 12-byte random vector (IV) | Initialization vector value to be used in the calculation of GMAC.IV value is also included in GMAC calculation. | Byte array, The IV must be randomly generated every time the GMAC is calculated |
| 0xF0 | 16 | TAG | Authentication tag (GMAC) | Byte array |
如果IVT未提供,能够将FW-IMG放在0x00400000开始进行HSE的固件安装。
1. Boot Configuration Word (BCW)
BCW的详细定义请参考REF02文档,现只针对常用的配置进行说明:
- BOOT_TARGET:使能应用核
- BOOT_SEQ:安全启动是否使能
- PLL_ENABLE:用于在安全启动期间使能PLL,只有BOOT_SEQ == 1时配置
- SWT0_ENABLE:用于在应用核ungating之前启用Application SWT0
2. Lifecycle Configuration Word (LCW)
LCW为32bit值,定义了LC演进状态:
- LCW = 0xDADADADA将LC演进至OEM_PROD
- LCW = 0xBABABABA将LC演进至IN_FIELD
当没有安装HSE固件时,可以采用LCW进行生命周期的演进,如果安装了HSE,可以使用HSE的系统属性管理服务进行生命周期状态的管理。
3. AppBL Structure
| Offset | Byte size | Category | Description | Value / Value type |
| 0x00 | 1 | Tag | AppBL header tag | Magic number (0xD5) |
| 0x01 | 2 | Reserved | ||
| 0x03 | 1 | Tag | AppBL version | Magic number (0x60) |
| 0x04 | 4 | Reserved | ||
| 0x08 | 4 | Configuration | Start address (in Flash) | Pointer |
| 0x0C | 4 | Configuration | AppBL size (N) | 32-bit integer |
| 0x10 | 1 | Configuration | Core identifier | Value |
| 0x11 | 47 | Reserved | ||
| 0x40 | N | Executable | AppBL content (in plain) | Executable |
| N +0x40 | 12 | IV | 12-byte random vector | Byte array |
| N +0x4C | 16 | Tag | Authentication tag (GMAC) | Byte array |
2.2 Installation Boot
在Installation boot阶段,HSE从Applicaiton NVM中读取加密的FW-IMG,进行解密并且存储在受保护的系统RAM中。如果该解密的文件经过了真实性验证,HSE系统将其写入code flash中,同时将RAM中的内容删除。
FW-IMG的地址通过IVT提供(参考2.1节的IVT structure),或者将FW-IMG放置在IVT的起始位置即IVT_START中。

2.3 Normal Boot
在Normal boot流程中,HSE系统进行IVT的加载和解析,根据BOOT_SEQ和BOOT_ TARGET配置参数进行处理,具体流程如下图所示:

如果secure NVM中存在HSE固件,那么最终会运行HSE,其他情况则进入wait-for-interrupt模式(WFI)
以下异常情况会导致主核进入Recovery Mode,详细内容请参考文档REF02
- IVT不存在或者被损坏
- 连续超过8次的复位(functional or destructive复位)
- 应用软件的安全启动认证失败
3. 安全启动
3.1 安全启动类型
1. Basic Secure Boot(IVT based secure boot)
- 只支撑一个目标核(AppBL)
- 只有SMR/CR不可用时才许可使用(没有配置CR)
- 所有的参数定义在IVT中,如入口地址和大小,在AppBL的header中定义,不需要更行HSE SYS_IMG
- AppBL镜像可以使用GMAC进行认证,使用ADKP派生的key。GMAC的tag启用相关服务生成或者利用离线工具,如果使用离线工具,random IV和tag都必须添加在AppBL的最后。
2. Advanced secure boot(SMR-based secure boot)
- 支撑单核或多核(定义在Core Reset Table)
- 基于SMR(Secure Memory Region) 和CR (Core Reset) 配置
- 支持对称加密认证(AES-CMAC, GMAC, HMAC等)
- 支持RSA,ECDSA和EDDSA签名验证
3. SHE Based Secure Boot
- 模拟基于SHE协议的安全启动
- 只有一个应用程序的核在复位后执行
- SHE仅支持基于CMAC的认证方案,应用BOOT_MAC_KEY的密钥
- 它是SMR安全启动的变种方案,使用SMR的第一个入口(索引为0)。HSE固件通过读取SMR#0的key handle来识别是SHE安全启动。如果SMR#0的key handle是SHE BOOT_MAC_KEY,HSE固件会启动SHE安全启动。
如果SMR与Basic Secure Boot(已配置AppBL)一起设置,并且在启动时,SYS_IMG
加载失败(SMR不可用)或没有CR入口表时,应用核心仍可以应用AppBL的镜像,所以AppBL镜像可以看作恢复镜像。
如果应该验证IVT,那么需设置IVT_AUTH属性,通过HSE_ENABLE_BOOT_AUTH_ATTR_ID,认证的tag使用离线应用或者使用服务生成
3.2 Basic安全启动
Application Bootloader有两种方式加载,一种是通过BootROM(Non-Secure boot)或HSE FW(Secure boot)通过。App Bootloader能够借助HSE的hseBootDataImageSignSrv_t的服务生成GMAC值,将生成的随机的IV和tag值存储在App Bootloader文件的结果,如下图所示:

注意: 如果配备了CR入口表,那么忽略Basic Secure Boot启动。
3.3 基于SMR安全启动
Secure memory region(SMR)定义了host内存中需要进行认证的安全内存区域,如下图中的SMR#0等,在SMR Table表中存储了SMR#n的地址addr,大小size以相关的配置config。图中authenticity proof是SMR#n区域内存数据的认证值,如MAC值或RSA/ECC签名。
执行SMR#n区域验证后需要运行的核和复位向量表,为复位之后运行的入口地址,具体细节参考3.3.2章节。就是Core Table
在SMR#n区域进行认证的过程中,需要使用key catalog NVM和key catalog RAM中的key,关于key的介绍请参考NXP S32K3xx之HSE使用方法(二)-CSDN博客

3.3.1 SMR Table
SMR表中定义了若干属性,每个属性的定义和描述如下表所示:

以如下图为例,SMR表的第一行即为SMR#0的源地址pSmrSrc: 0x00100000,大小smrSize为0x40000(256KB),第二行为SMR#1的源地址pSmrSrc: 0x00200000,大小smrSize为0x20000(128KB)。

Host可以经过请求SMR安装的服务进行安装,定义hseSmrEntryInstallSrv_t结构体,主导包括以下内容,详细的安装过程请参考文档REF02
- 定义SMR属性和SMR的入口entry
- 提供SMR内容的认证proof
- SMR内容加密后的认证proof(可选)
3.3.2 CR Table
CR表中定义了若干属性,每个属性的定义和描述如下表所示:

以上CR的属性中包含Pre-boot,Alternate Pre-boot和Post-boot的概念,在下一小节介绍。
Host行经过请求CR安装的服务进行安装,定义hseCrEntryInstallSrv_t结构体,详细的安装过程请参考文档REF02
3.3.3 Secure Boot phase
安全启动包含以下几个阶段,如下图所示:

1. Pre-boot phase
在Pre-boot阶段,HSE从CR table的第一个入口索引开始进行解析。对于每个一个CR的入口,通过pCrEntry->PreBootSmrMap链接的SMR区域被验证。若是任意SMR验证失败,那么HSE开始验证通过pCrEntry->altPreBootSmrMap链接的SMR区域。
假如pre-boot阶段的SMR区域验证成功,HSE开始启动CPU子系统,具体的启动策略参考core reset release strategies
如果至少有一个pre-boot阶段的SMR区域验证失败,HSE使用CR入口的sanction进行处理。
2. Booting phase and core reset release strategies
根据hseAttrCoreResetRelease_t属性,有以下两种处理方式:
- ALL_AT_ONCE: 首先HSE解析CR表的所有入口,验证所有相关的pre-boot SMR区域,然后启动所有通过验证的CPU子系统
- ONE_BY_ONE: 在相关的CR表入口核pre-boot SMR验证成功后,HSE逐个启动CPU子系统
两种方式的启动流程对比如下图所示:

pre-boot阶段在第一个CPU子系统启动时结束。
Pre-boot和Boot阶段结束时,所有已配置的CPU子系统都被启动,HSE通过状态标志HSE_STATUS_BOOT_OK来通知。
3. Post-boot phase
在所有设置的CPU子系统已经启动且boot阶段之后,HSE通过CR表的pCrEntry->postBootSmrMap,对链接的SMR区域进行验证。如果验证失败,根据配置的sanction进行处理。
4. Sanctions
SMR验证失败后,有以下两种惩罚方式:
- Key使用惩罚
- 设备操作惩罚

关于sanctions的详细内容请参考文档REF02
5. Example
以下是安全启动的流程图,包含各个验证阶段的HSE和CPU子系统的状态和运行。

参考文档
REF01: <an781201-Secure Boot Overview Training(0.1).pdf>
REF02: <RM758226-RM00286 HSE-B Firmware Reference Manual - V2.6(2.6).pdf>
浙公网安备 33010602011771号