离散TPM驱动程序

安全之安全(security²)博客目录导读

目录

一、驱动架构

1.1 头文件

1.2 源文件

二、编译时配置选项

三、离散TPM初始化

四、离散TPM PCR扩展


本博客重点介绍了TF-A中离散TPM驱动的设计与功能。TPM技术旨在提供一种专用的、基于硬件的解决方案,用于存储加密密钥以及执行安全相关操作。

离散TPM是一种独立的硬件组件,物理上与系统主处理器隔离。这种隔离有助于保护敏感信息(如加密密钥和平台凭据)不被恶意软件或未经授权的用户访问或篡改。当离散TPM接口被正确实现时,可降低基于软件的攻击风险,从而进一步缩小攻击面。

TPM度量用于建立系统的安全状态,并用于认证。从安全角度看,在TF-A中使用TPM进行度量是有益的,因为它能够在启动流程的早期实现基于硬件的认证,从而降低信任根被破坏的风险。

TF-A中的设计支持多种TPM硬件接口类型和硬件总线类型,以实现对不同平台的兼容。各平台可以选择特定的消息接口(如CRB或FIFO)和特定的硬件总线接口(如I2C或SPI)。

一、驱动架构

离散TPM驱动被划分为四个层次,每一层在整体架构中都具有明确的职责:

  • 命令层(Command Layer):该层基于TCG TPM 2.0库规范提供各种TPM命令。它允许系统初始化TPM接口、执行TPM启动、设置操作所需的locality(如PCR扩展和读取),并在操作完成后释放locality。

  • 接口层(Interface Layer):该层通过特定TPM接口(如FIFO或CRB)处理TPM命令的发送和接收。它还包括获取信息、请求访问、释放访问等功能,具体实现依赖于所选接口。

  • 链路层(Link Layer):离散TPM可以作为SPI、I2C或内存映射设备存在。链路层将接口层传递的命令映射到相应的总线类型,并通过平台总线接口完成读写操作。

  • 平台层(Platform Layer):平台层实现了特定平台上与TPM芯片通信的细节。链路层依赖平台层来完成对TPM的读写。

注意:
命令层、接口层和链路层在TF-A中是以通用代码实现的;而平台层则由特定平台的代码实现。

以下图示展示了Raspberry Pi 3平台上离散TPM驱动结构:

离散TPM驱动程序_第1张图片

1.1 头文件

  • TPM 驱动:include/drivers/tpm

1.2 源文件

  • TPM 驱动:drivers/tpm


二、编译时配置选项

  • MBOOT_TPM_HASH_ALG:指定TPM使用的哈希算法,目前唯一支持的算法是 sha256。随着更多离散TPM在TF-A中被测试和集成,将支持更多算法。

  • DISCRETE_TPM:布尔值标志,用于启用离散TPM支持。根据所选择的TPM接口,会构建并打包相应的驱动至固件中。

  • TPM_INTERFACE:当 DISCRETE_TPM=1 时必须设置此选项,目前唯一支持的接口是 FIFO_SPI。理想情况下应支持以下四种接口:

    • FIFO_I2C

    • FIFO_SPI

    • FIFO_MMIO

    • CRB

注意:
MBOOT_TPM_HASH_ALG 会自动覆盖 MBOOT_EL_HASH_ALG。这样可以确保事件日志与TPM使用相同的哈希算法。


三、离散TPM初始化

TPM需要根据具体平台进行初始化,硬件接口需要单独配置。一旦配置完成,可调用TPM命令 tpm_interface_init(),随后调用 tpm_startup() 进行启动。tpm_startup() 仅需在系统启动后或系统重置后调用一次。

Raspberry Pi 3平台中与TPM硬件初始化相关的示例代码可见于:

  • plat/rpi/rpi3/rpi3_bl1_setup.c

  • plat/rpi/rpi3/rpi3_bl1_mboot.c


四、离散TPM PCR扩展

TPM初始化完成后,可以使用TPM的 pcr_extend 操作将哈希值扩展并存储至PCR 0中。

Raspberry Pi 3平台中测量启动期间使用 pcr_extend 的示例代码可见于:

  • plat/rpi/rpi3/rpi3_bl1_mboot.c

  • plat/rpi/rpi3/rpi3_bl2_mboot.c

你可能感兴趣的:(可信计算与可信启动,ARM安全架构,可信计算,可信启动,trusted,boot,measured,boot,离散TPM,TPM驱动程序)