基于 FF-A 的 TPM CRB 驱动

TPM 命令响应缓冲区 (CRB) 接口是一个标准的 TPM 接口,定义在 TCG PC 客户端平台 TPM 配置文件 (PTP) 规范中 [1]。CRB 提供了一组结构化的控制寄存器,客户端在与 TPM 交互时使用,以及一个用于存储 TPM 命令和响应的数据缓冲区。CRB 接口可以实现为

  • 独立 TPM 芯片中的硬件寄存器

  • 在隔离环境中运行的 TPM 的内存中,其中共享内存允许客户端与 TPM 交互

适用于 Arm A-profile 的固件框架 (FF-A) [2] 是一个定义了以下目的接口和协议的规范

  • 将固件划分为在 Arm 安全世界环境(也称为 TrustZone)中运行的软件分区

  • 为非安全状态下的软件组件(例如操作系统和虚拟机管理器)提供一个标准接口,以与该固件通信。

TPM 可以作为 FF-A 安全服务实现。这可以是一个固件 TPM,也可能是一个充当独立 TPM 芯片代理的 TPM 服务。基于 FF-A 的 TPM 将硬件细节(例如总线控制器和芯片选择)从操作系统中抽象出来,并且可以保护局部性 4 不受操作系统访问。TCG 定义的 CRB 接口用于客户端与 TPM 服务交互。

基于 FF-A 的 Arm TPM 服务命令响应缓冲区接口 [3] 规范定义了 FF-A 消息,客户端可以使用这些消息来通知 CRB 何时进行了更新。

Linux CRB 驱动与 FF-A 的交互方式总结如下

  • tpm_crb_ffa 驱动程序在内核中向 FF-A 子系统注册,使用基于 FF-A 规范中定义的架构化 TPM 服务 UUID。

  • 如果 FF-A 发现 TPM 服务,tpm_crb_ffa 驱动程序中的 probe() 函数会运行,并且驱动程序会初始化。

  • Linux CRB 驱动程序的探测和初始化是通过 ACPI 宣告的 TPM 的发现来触发的。CRB 驱动程序可以通过 ACPI 的 'start' 方法检测 TPM 的类型。Arm FF-A 的 start 方法定义在 TCG ACPI v1.4 中 [4]

  • 当 CRB 驱动程序执行其正常功能时,例如发出 'start' 信号和请求/放弃局部性,它会调用 tpm_crb_ffa 驱动程序中的 tpm_crb_ffa_start() 函数,该函数处理向 TPM 发送的 FF-A 消息。

参考文献