2. AURIX HSM硬件架构与安全子系统

AURIX TC3xx 系列把 HSM(Hardware Security Module)做成一个独立于 Host CPU 的安全子系统,而不是一颗外挂的加密芯片。理解它的硬件架构,是后续写安全固件、划分内存、配置中断与 DMA 的前提。本节围绕 HSM 内核、TRNG、AES/SHA/ECC 加速器、安全 RAM/ROM、中断与 DMA 通路,以及它与 Host CPU 的交互机制展开。

一、HSM 子系统的整体构成

HSM 在芯片内部是一个带独立总线主控能力的子系统,典型组成包括:一颗安全内核(常见为 ARM Cortex-M3 类内核,运行 HSM 固件)、专用安全 RAM 与安全 ROM、真随机数发生器 TRNG、对称/非对称密码加速器(AES、SHA、ECC,部分型号还带 RSA/ECDSA 引擎)、定时器与中断控制器,以及连接 Host 侧与内部资源的总线接口。它拥有自己的时钟、复位和电源域,Host CPU 不能直接读写 HSM 内部 RAM,只能通过受控的通信接口交互。

这种“独立内核 + 独立存储 + 硬件加速器”的结构带来两个关键特性:一是 Host 被攻破时,密钥与安全逻辑仍被隔离在 HSM 域内;二是密码运算由硬件加速器承担,Host 只负责发起请求和取回结果,避免软件实现带来的侧信道与性能问题。

AURIX HSM 安全子系统硬件架构 Host CPU 域 Host 应用 / 驱动 HSM 通信驱动 (Bridge) 共享 SRAM / 寄存器窗口 HSM Bridge 命令/响应队列 HSM 安全域(独立时钟/复位/电源) HSM 内核 Cortex-M3 类 / 安全固件 TRNG 真随机数源 AES 加速器 128/256 对称加解密 SHA 加速器 SHA-256 / HMAC ECC 加速器 ECDSA / ECDH 安全 RAM / ROM 密钥/固件/工作区 中断控制器 + DMA 通路 加速器完成事件 / 数据搬运 内部总线:内核 ↔ 加速器 ↔ 安全存储 Host 不可直接访问 请求 响应

二、HSM 内核与安全固件

HSM 内核运行的是厂商预置或用户签名的安全固件,它负责调度加速器、管理密钥、处理 Host 请求。内核本身不直接暴露给 Host,Host 只能通过 Bridge 提交命令。安全固件通常分为引导区、服务区和应用区:引导区校验固件签名,服务区提供加解密、签名、随机数等标准服务,应用区承载项目自定义逻辑(如安全启动校验、SecOC 密钥派生)。

实际开发中,HSM 固件与 Host 固件是两套独立的编译产物,通过共享内存中的命令/响应结构体通信。一个典型的命令结构包含命令 ID、输入数据指针、输出缓冲区指针、长度和状态字段。Host 写入命令后触发 Bridge 通知,HSM 内核读取并执行,完成后回写状态并触发 Host 侧中断。

三、TRNG 与密码加速器

TRNG 提供真随机数,用于生成密钥、IV、挑战值等。它通常输出原始随机比特,经后处理(如 DRBG)后供加速器或固件使用。使用时要关注熵源就绪状态和健康测试,若 TRNG 未就绪就取数,可能得到低质量随机数。

AES 加速器支持 128/256 位密钥的 ECB/CBC/CTR 等模式,常用于 SecOC 报文认证、数据加密。SHA 加速器支持 SHA-256 及 HMAC,用于完整性校验和密钥派生。ECC 加速器支持 ECDSA 签名/验签和 ECDH 密钥协商,用于安全启动签名验证和会话密钥建立。三者都通过寄存器或描述符方式配置,运算完成后置位状态位并可触发中断。

四、安全 RAM/ROM 与访问隔离

安全 RAM 存放运行时的密钥、会话上下文和中间数据,安全 ROM 存放固件和不可变常量。它们位于 HSM 域内,Host 无法直接寻址。Host 与 HSM 之间共享的只有一块受控的共享 SRAM 或寄存器窗口,用于传递命令和结果。这种隔离是 HSM 安全性的基础:即使 Host 软件被篡改,也无法直接读取密钥。

五、中断与 DMA 通路

HSM 内部中断用于通知内核加速器完成、TRNG 就绪、Bridge 收到新命令等事件。Host 侧则通过 Bridge 中断感知 HSM 响应。DMA 通路用于在共享内存与加速器之间搬运数据,减少内核参与,提高吞吐。配置 DMA 时要明确源/目的地址、传输长度和触发源,避免与 Host 访问共享内存产生竞争。

六、Host 与 HSM 的交互机制

Host 与 HSM 的交互遵循“请求—处理—响应”模型。Host 不能直接调用 HSM 内部函数,而是把请求写入共享内存,通过 Bridge 寄存器触发。HSM 处理完成后写回结果并触发中断。典型交互流程如下:

  1. Host 准备命令结构体,填入命令 ID、输入/输出缓冲区地址和长度。
  2. Host 将结构体写入共享 SRAM,并确保缓存一致性(必要时执行 cache clean)。
  3. Host 写 Bridge 命令寄存器,通知 HSM 有新请求。
  4. HSM 内核读取命令,调用对应加速器或固件服务执行。
  5. HSM 将结果写回共享内存,更新状态字段,触发 Host 中断。
  6. Host 在中断服务中读取状态和结果,必要时执行 cache invalidate。
共享内存访问要注意缓存一致性:Host 写命令后应 clean cache,读结果前应 invalidate cache,否则可能读到旧数据。具体操作依赖芯片的 cache 维护指令。

七、一个可参考的命令结构示例

下面给出一个用于 AES-CBC 加密的共享内存命令结构示例,字段可根据项目调整:

typedef struct {
    uint32_t cmdId;        // 例如 0x01 表示 AES-CBC 加密
    uint32_t keyHandle;    // 密钥句柄,密钥不直接出现在共享内存
    uint32_t ivAddr;       // IV 缓冲区地址
    uint32_t inAddr;       // 明文缓冲区地址
    uint32_t outAddr;      // 密文缓冲区地址
    uint32_t length;       // 数据长度(字节)
    uint32_t status;       // 0=空闲, 1=处理中, 2=成功, 3=失败
} HsmAesCbcCmd;

Host 填充该结构后触发 Bridge,HSM 根据 keyHandle 从安全 RAM 取密钥,执行 AES-CBC,把密文写入 outAddr,最后把 status 置为 2 或 3。Host 通过轮询或中断读取 status 判断结果。这种“句柄代替密钥”的设计,保证密钥始终不离开 HSM 域。

八、架构层面的关键约束

  • Host 不能直接访问 HSM 内部 RAM/ROM,只能通过共享内存和 Bridge 交互。
  • 密钥以句柄形式引用,明文密钥不出 HSM 域。
  • 加速器运算与 DMA 搬运可并行,但共享内存访问需同步。
  • HSM 固件与 Host 固件独立编译、独立签名、独立升级。
  • 中断是 Host 感知 HSM 完成事件的主要手段,轮询可作为兜底。

掌握这些硬件构成与交互约束后,后续配置 HSM 服务、划分共享内存、编写 Host 侧驱动时,就能明确哪些操作在 Host 侧完成、哪些必须由 HSM 固件承担,避免把密钥或安全逻辑错误地放到 Host 域。