3. 密码服务接口软件栈

在英飞凌 AURIX 这类多核 MCU 上,密码服务并不是“调用一个函数就完成加密”这么简单。它横跨两个执行域:一侧是运行在 HSM(Hardware Security Module)上的固件,另一侧是运行在 Host CPU(如 TriCore)上的应用与驱动。理解这一节的软件栈,关键是看清一条请求从 Host 应用出发,经过驱动、共享内存、HSM 固件,再原路返回的完整链路,以及这条链路上“谁在等、谁在跑、怎么通知”的两种基本模式。

一、软件栈的分层结构

从下往上,AURIX 密码服务软件栈大致分为四层。最底层是 HSM 硬件与固件:HSM 是一个独立的安全核,拥有自己的 ROM、RAM、Flash 和密码加速器(如 AES、SHA、ECC 引擎),固件负责实现真正的密码算法、密钥管理和安全策略。往上一层是 Host 与 HSM 之间的通信基础设施,通常表现为共享内存(Shared Memory)加一组寄存器(如请求/响应门铃、状态寄存器、中断控制寄存器)。再往上是 Host 端驱动,它把共享内存和寄存器封装成可调用的服务接口,负责参数搬运、请求排队、结果取回和错误映射。最上层是应用可见的 API,即 CSRM(Crypto Service Request Manager)与 CSM(Crypto Service Manager)风格的接口,应用通过它们提交作业、查询状态、获取结果。

需要强调的是:CSM/CSRM 是 Host 侧的“门面”,HSM 固件是真正的“执行者”,两者之间靠共享内存中的请求/响应描述符解耦。应用看到的是一次 API 调用,底层实际发生的是“写描述符 → 触发门铃 → HSM 取任务 → 执行 → 写回结果 → 通知 Host”这一串动作。

二、服务请求与响应模型

典型的请求/响应模型围绕一个作业(Job)展开。Host 侧先准备一个作业描述符,里面包含:算法标识(例如 AES-128-CBC、SHA-256、ECC P-256 签名)、密钥句柄或密钥槽编号、输入数据缓冲区地址与长度、输出缓冲区地址与长度、以及一个用于回传状态的字段。描述符写入共享内存后,Host 通过写门铃寄存器通知 HSM“有新请求”。

HSM 固件在调度循环中读取门铃,从共享内存取出描述符,校验参数与权限,调用对应密码引擎执行,然后把结果和状态码写回响应区,再通过中断或状态位通知 Host。Host 驱动收到通知后,把结果从共享内存拷贝到应用缓冲区,并把状态码翻译成 API 返回值。

这里有一个工程上极易踩坑的点:共享内存是双方共同访问的资源,必须约定好所有权。常见做法是“请求区由 Host 写、HSM 读;响应区由 HSM 写、Host 读”,并用序列号或状态字段标记当前归属,避免双方同时写同一块区域造成数据竞争。

三、中断模式与轮询模式

Host 等待 HSM 完成的方式有两种。中断模式下,Host 提交请求后可以让出 CPU 去处理其他任务,HSM 完成后拉高中断线,Host 在中断服务程序或回调中取回结果。这种方式 CPU 利用率高,适合长耗时运算(如大块数据哈希、ECC 签名)与多任务系统。轮询模式下,Host 提交请求后循环读取状态寄存器或响应区的完成标志,直到看到“完成”才继续。它实现简单、时序确定,但会占用 CPU,适合短作业或对实时性要求明确、不希望引入中断延迟抖动的场景。

选择哪种模式,取决于作业时长、系统实时性要求和 CPU 负载。一个实用的经验是:单次运算在微秒级、且调用频繁时,轮询的额外开销可能比中断还小;而毫秒级的大运算,中断模式几乎总是更优。

AURIX 密码服务软件栈与请求/响应链路 Host CPU(TriCore) 应用层 调用 CSM/CSRM API 提交作业 CSRM / CSM API 作业描述符、密钥句柄、状态查询 Host 端驱动 参数搬运、请求排队、结果取回 中断/轮询等待、错误码映射 共享内存 + 寄存器 请求区 / 响应区 / 门铃 / 状态 HSM 安全核 HSM 固件调度循环 读门铃、取描述符、校验权限 密码算法引擎 AES / SHA / ECC 硬件加速 密钥管理 密钥槽、访问策略、安全存储 共享内存 + 寄存器 响应区 / 完成标志 / 中断线 请求描述符 结果 + 状态码 等待模式: 中断模式(HSM 完成后拉中断,Host 让出 CPU) 轮询模式(Host 循环读完成标志,占用 CPU)

四、一次 AES 加密请求的完整走查

下面用一个教学示例把链路串起来。假设应用要对 1 KB 数据做 AES-128-CBC 加密,密钥已预先导入 HSM 的 3 号密钥槽,IV 由应用提供。示例参数均为合理假设,用于说明流程,不代表实测值。

  1. 应用调用 CSM 接口,传入算法 AES-128-CBC、密钥槽 3、明文缓冲区地址、1 KB 长度、输出缓冲区地址、IV 指针。
  2. CSRM 分配一个作业描述符,填入上述字段,并把描述符写入共享内存请求区,状态字段置为“待处理”。
  3. Host 驱动写门铃寄存器,通知 HSM 有新请求。若采用中断模式,驱动此时挂起当前任务;若采用轮询模式,驱动进入状态读取循环。
  4. HSM 固件调度循环检测到门铃,读取描述符,校验密钥槽 3 是否允许当前调用者使用、长度是否合法。
  5. 校验通过后,固件调用 AES 引擎,按 CBC 模式逐块加密,把密文写入响应区指向的输出缓冲区。
  6. 固件把状态码(例如 0x00 表示成功)写入响应区,置完成标志,并拉高中断线。
  7. Host 驱动收到中断或轮询到完成标志,读取状态码,把结果交付应用,释放描述符。

判断是否成功的依据很直接:状态码为成功且输出长度等于输入长度(CBC 无填充时)。若状态码指示“密钥槽无权限”或“长度非法”,则说明请求在 HSM 侧被拒绝,应用应检查密钥槽配置和缓冲区长度,而不是重试。

五、两种模式的工程取舍

中断模式的优势在于 CPU 不被空等占用,适合在 RTOS 下与其他任务并行;代价是中断延迟和上下文切换开销,且中断服务程序里不宜做大量数据拷贝,通常只置标志、由任务上下文完成取结果。轮询模式的优势是逻辑简单、时序可预测,适合裸机或对确定性要求高的短作业;代价是 CPU 空转,若作业时间较长会明显浪费算力。

实践建议:先用轮询模式打通链路、确认描述符与共享内存布局正确,再切换到中断模式优化 CPU 占用。切换时重点检查中断使能位、中断优先级与共享内存的可见性(必要时插入内存屏障),避免出现“HSM 已完成但 Host 看不到结果”的假死现象。
常见错误:Host 在 HSM 尚未完成时复用同一块输出缓冲区,或在描述符仍处于“待处理”时修改其内容。共享内存的所有权必须严格按“请求区 Host 写、响应区 HSM 写”的约定执行,否则会出现难以复现的数据错乱。

把这一节压缩成一句话:CSM/CSRM 是应用看到的接口,Host 驱动负责搬运与等待,共享内存与寄存器是双方握手的通道,HSM 固件是真正的执行者;中断与轮询只是 Host 等待结果的两种姿态,选择取决于作业时长与系统实时性要求。