受信任的执行环境 ACPI 配置文件

许可:Microsoft 同意向你授予对合理且非歧视条款上“必需声明”的免费、免版税许可证,仅用于制作、使用、销售、标价出售、导入或分发本规范的任何实现。 “必需声明”是 Microsoft 拥有或 Microsoft 控制的专利的声明,这些专利从技术上来说,是实现本规范必要部分所必需的(还包括可选部分的必需元素),其中导致侵害的功能进行了详细介绍,而不仅仅是在本规范中进行引用。

1.0 背景

此规范定义 TPM 2.0 设备的 ACPI 设备对象,以及与 Windows 8 所需的 ACPI 设备对象关联的控制方法。 控制方法实现 TCG 临机操作 ACPI 接口的等效项、平台重置攻击缓解接口的等效项以及可选的 ACPI 方法,用于将命令发送到 TPM 2.0 设备。

附加的静态 ACPI 表 (TPM2) 用于定义 TPM 2.0 设备和 Windows 8 OS 之间的通信机制。

注意

Microsoft 将受信任的计算组的“TPM.Next”术语称为“TPM 2.0”

2.0 要求

此规范假设有一个计算平台,该平台支持 OS 和固件环境之间的 [ACPI09] 中指定的基于 ACPI 的通信。

3.0 使用方案(仅用作示例)

3.1 发送物理状态命令

典型的使用方案如下所示:

  1. 在 OS 环境中,应用程序检测到 TPM 2.0 设备未完全预配为用于 Windows 8。 (如何发生这种情况的一个示例是,如果在先前的 OS 映像预配 TPM 2.0 之后安装了新的 OS 映像。)

  2. 应用程序启动 OS 向导,使 TPM 2.0 设备可供使用。

  3. 向导通过 UI 与计算机管理员交互,并确定管理员需要清除 TPM 2.0 设备以进行预配,因为 TPM 2.0 设备重置锁定授权值不可用。

  4. 若要清除 TPM 2.0 设备,OS 请求(通过对 TPM 2.0 设备对象执行 ACPI 控制方法)固件执行操作以在下次启动时清除 TPM 2.0 设备,前提是实际存在的用户确认他们同意清除 TPM 2.0 设备。

  5. OS 会重启平台。

  6. 在启动过程的早期阶段,固件会识别来自 OS 的挂起请求以清除 TPM 2.0 设备。

  7. 固件向实际存在的用户提供一个 UI,要求他们采取一些操作来确认清除 TPM 2.0 设备。

  8. 实际存在的用户确认清除 TPM 2.0 设备。

  9. 固件使用平台层次结构授权清除 TPM 2.0 设备。

  10. 如有必要,若要坚持清除 TPM 2.0 设备,平台将立即重启。

  11. OS 启动。

  12. OS 查询(通过 TPM 2.0 设备上的 ACPI 控制方法)清除 TPM 2.0 设备的上次 OS 请求是 (a) 成功、(b) 未由实际存在的用户确认,还是 (c) 出现了其他错误。 下文假设已成功清除 TPM 2.0 设备。

  13. OS 中的 TPM 2.0 设备预配向导执行其他命令,使设备可供 Windows 使用。

3.2 请求在下次启动时清除内存

此方案演示了系统的内存清除功能如何帮助防范在平台意外重启后为关键材料获取系统内存的攻击。

  1. 在 OS 中,具有 TPM 2.0 设备的系统上的管理员将打开 OS 卷的 BitLocker 功能。

  2. BitLocker 功能调用 TPM 2.0 设备 ACPI 控制方法,以设置 TCG 平台重置攻击缓解规范中定义的 ClearMemory 位。

  3. BitLocker 功能加密 OS 卷。

  4. 管理员使系统无人参与,屏幕处于锁定状态。

  5. 恶意人员在系统运行时窃取系统。

  6. 恶意人员插入 U 盘并快速移除系统电池,然后重新插入它。

  7. 重新插入电池时,系统将启动。

  8. 由于之前设置了 ClearMemory 位,因此固件在启动平台制造商未提供的任何代码之前会清除整个系统内存。

  9. 恶意人员在启动期间将固件配置为启动到 USB 设备,即使 USB 设备上的代码未正确签名。

  10. USB 设备上的代码扫描系统内存以查找 BitLocker 卷主密钥,但找不到它。

    警告

    步骤 11 到 16 与前面的步骤类似,但使用 UEFI 接口而不是 ACPI

  11. 恶意人员尝试正常启动系统。

  12. 由于使用 TPM 密钥保护程序启用了 BitLocker,因此这允许 BootMgr 为 OS 卷“解封”卷主密钥,因为当 BootMgr 运行时正确的度量值在 TPM 2.0 设备中。

  13. 启动将进入 OS 登录屏幕。

  14. 恶意人员再次移除电池,然后重新插入电池,并从 USB 设备启动代码。

  15. 由于已设置 ClearMemory 位,因此系统固件在启动期间会清除整个系统内存。

  16. 即使 USB 设备中的代码扫描系统内存,OS 卷加密密钥也不在内存中。

3.3 向 TPM 2.0 设备发出命令

此示例并不适用于所有系统体系结构。

  1. Windows TPM 2.0 驱动程序希望向 TPM 2.0 设备发出命令。

  2. 在 Windows TPM 2.0 驱动程序初始化期间,Windows TPM 2.0 驱动程序将要执行的命令写入之前从 ACPI 定义的控制区域读取的物理地址。

  3. Windows TPM 2.0 驱动程序执行 ACPI 控制方法来执行 TPM 2.0 命令。

  4. Windows TPM 2.0 驱动程序轮询控制区域中的寄存器,直到它们指示 TPM 命令已完成。

  5. 在 Windows TPM 驱动程序初始化期间,Windows TPM 驱动程序从之前从 ACPI 定义的控制区域读取的物理地址读取命令响应。

4.0 TPM 2.0 系统和设备的常规 ACPI 要求

4.1 电源注意事项

ACPI D1/D2

TPM 2.0 设备可以支持 ACPI D1 和/或 ACPI D2,但处于 D1 或 D2 状态时必须表现得好像它处于电源状态 ACPI D0。

ACPI S3(睡眠)

TPM 2.0 可以支持 S3,但设备进入和退出 S3 低功耗状态必须由系统/平台制造商控制。

OS(或在 OS 环境中运行的其他软件)不得将 TPM 2.0 设备置于 S3 或导致 TPM 2.0 设备从 S3 退出。 例如,如果 TPM 2.0 设备在总线上,则 OS 不得关闭总线电源,从而导致 TPM 2.0 设备进入 S3。

Windows 8 TPM 驱动程序将尝试在进入 S3(睡眠)之前发出 TPM2_Shutdown 命令。

如果硬件平台确实支持 S3,并且 TPM 在系统处于 S3 时不保留其状态,则平台必须在 S3 恢复期间发出必要的 TPM2_Init 和 TPM2_Startup(TPM_SU_STATE) 命令。 在进入 S3 之前,OS 可能尚未完成 TPM2_Shutdown 命令。 这可能会导致 TPM2_Startup(TPM_SU_STATE) 的返回结果返回错误。 从 S3 恢复的系统固件必须适当地处理 TPM2_Startup 错误。 例如,通过硬件禁用对 TPM 的访问,发出 TPM2_Startup(TPM_SU_CLEAR) 命令,并通过采取诸如将带有错误摘要 (0x01) 的分隔符扩展到 PCR 0 到 7 并锁定 NV 索引等操作来安全地配置设备。

系统必须通过在每个锁定间隔 (TPM_PT_LOCKOUT_INTERVAL) 中减少系统处于 S3 的时间的 TPM 字典攻击失败计数 (TPM_PT_LOCKOUT_COUNTER) 来考虑 S3 期间经过的时间。 这可能需要平台实现提供备用电压,以在 S3 期间保留 TPM 时钟和/或状态,或者平台还可以安全地提供有关系统处于低功耗状态时经过的时间的信息,以便 TPM 能够可靠地更新其字典攻击逻辑的授权失败计数。

连接待机系统的低功耗状态

Windows 8 在进入和退出连接待机系统的低功耗状态时不会执行与 TPM 相关的任何其他操作。 每当系统进入和退出连接待机系统的低功耗状态时,平台必须执行 TPM 所需的任何操作,使其表现得就像处于 D0 状态一样。 这可能需要平台实现来提供备用电压来为 TPM 时钟供电和/或保留状态。 或者,平台可能需要安全地向 TPM 提供有关系统处于低功耗状态时经过的时间的信息,以便 TPM 能够可靠地更新其字典攻击逻辑的授权失败计数。

系统关闭

系统应通过在每个锁定间隔 (TPM_PT_LOCKOUT_INTERVAL) 中减少系统处于 S5 的时间的 TPM 字典攻击失败计数 (TPM_PT_LOCKOUT_COUNTER) 来安全地考虑完全关闭期间经过的时间。

4.2 ACPI 表

具有 TPM 2.0 设备的系统必须提供具有硬件设备 ID 和 OS 供应商特定静态表 (TPM2) 的设备对象表,如下所述。

将平台交付到客户后,TPM2 表和 TPM 2.0 设备对象都必须是持久的。 (例如,固件选项不得允许隐藏 TPM2 表或 TPM 2.0 设备对象。) 例外是,如果系统附带非默认选项,以提供 TPM 1.2 功能而不是 TPM 2.0 功能 (即 为了与 Windows 7.) 等较旧的操作系统兼容,在这种情况下,可以通过 BIOS 配置选项和枚举删除 TPM2 表和 TPM 2.0 设备对象执行的 TPM 1.2。 注意:默认情况下,Windows 8 的连接待机系统需要附带操作系统可见的 TPM 2.0。 有关在硬件平台上切换 TPM 2.0 和 TPM 1.2 的技术指南,请联系 Microsoft。

4.3 TPM 2.0 设备对象 ACPI 表

4.3.1 总线层次结构

设备对象表必须位于 ACPI 命名空间中的 DSDT 表下。TPM 2.0 设备对象必须位于系统总线下的“root\_SB”。

4.3.2 硬件标识符

TPM 2.0 设备对象的实际即插即用硬件标识符(例如 _HID)必须是“MSFT0101”,或者设备必须具有“MSFT0101”的兼容 ID,并且 _HID 可以特定于供应商。

4.3.3 资源描述符

ACPI TPM 2.0 设备对象必须声明 TPM 2.0 设备使用的所有资源。

4.3.4 控制方法

4.3.4.1 平台重置攻击缓解措施

系统必须为 UEFI 实现 [TCG08] 的所有 ACPI 和 UEFI 相关部分。 设备对象必须实现 [TCG08] 第 6 节中定义的控制方法接口。 即使平台在每次启动时无条件清除内存,也需要该接口。 内存的清除不得以 TPM 2.0 设备状态为条件(相反,如果不拥有 TPM 1.2,则 [TCG08] 不需要清除内存)。 此外,必须实现 [TCG08] 的第 3 节和第 5 节。 _DSM 查询函数必须按照 ACPI 规范实现(函数索引 0)。 (注意:ACPI 4.0 规范中关于 _DSM 方法的返回值存在错误。_DSM 方法的返回值应该是包含 0x03.) 实现必须自动检测有条不紊的 OS 关闭并清除此类事件的 ClearMemory 位。

使用 TPM 2.0 的基于 UEFI 的 Arm 系统的特别说明:在具有 TPM 2.0 的基于 UEFI 的 Arm 系统上,Windows 8将在每次启动时使用 UEFI 接口无条件地请求清除内存。 仍然需要实现 ACPI 接口,但接口可能实现为不更改 ClearMemory 或 DisableAutoDetect 标志的状态。 (注意:Microsoft 建议根据 TCG 规范实现 ACPI 接口,因此调用 ACPI 接口确实会更改 ClearMemory 或 DisableAutoDetect 的状态。)

4.3.4.2 临机操作接口

系统必须按下面的附加说明实现 [TCG11] 中定义的规范:

  1. 在 TCG 规范中使用 TPM 应与 TPM 2.0 设备等同。

  2. 必须在以下限制下实现第 2 节中定义的控制方法:

    1. _DSM 查询函数必须按照 ACPI 规范实现(函数索引 0)。 (注意:ACPI 4.0 规范中关于 _DSM 方法的返回值存在错误。_DSM 方法的返回值应该是包含 0x01FF.)

    2. 实现必须为“获取特定于平台的操作以过渡到预 OS 环境”返回值“2: 重启”。PPI 操作必须发生在重启的转换中,并且应发生在关闭转换中。

    3. 以下控制方法的实现是可选的:“向预 OS 环境提交 TPM 操作请求”(可能返回“2: 常规失败”)和“提交首选用户语言”(可能返回“3: 未实现”)。

  3. 必须通过以下修订来实现第 3 节中的要求:

    1. BIOS 不需要为 NoPPIProvision 标志提供持久存储,因为它授权的操作与 TPM 2.0 设备状态无关。

    2. 表 2 的修订如下:

      表 1:修订后的 PPI 表 2

      操作值

      操作名称

      TPM 状态

      BIOS TPM 管理标志

      必需与可选

      需要临机操作确认时

      可能需要其他启动周期

      0

      无操作

      M

      1-4

      无操作

      M

      5

      TPM2_ClearControl(NO) +

      TPM2_Clear

      X

      M

      NoPPIClear 为 FALSE

      X

      6-11

      无操作

      M

      12-13

      无操作

      O

      14

      TPM2_ClearControl(NO) +

      TPM2_Clear

      X

      M

      NoPPIClear 为 FALSE

      X

      15-16

      无操作

      M

      17

      SetNoPPIClear_False

      X

      O1

      18

      SetNoPPIClear_True

      X

      O1

      始终

      19-20

      无操作

      O2

      21-22

      TPM2_ClearControl(NO) +

      TPM2_Clear

      X

      M

      NoPPIClear 为 FALSE

      X

      23-127

      保留

      >=128

      供应商特定

      X

      X

      O

      X

      重要

      对于 SetNoPPIClear_False:如果 BIOS 实现标记为“O1”或“O2”的项,则它必须以集的形式实现它们。 对于 SetNoPPIClear_True 之后的“无操作”,如果 BIOS 未实现操作 12,则它不得实现操作 19 和 20。

    3. 表 3 的修订如下:

      操作

      操作

      名称

      BIOS 发送的 TPM 命令和用于执行操作的其他 BIOS 操作

      0

      无操作

      无操作

      1-4、6-13、15-16、19-20

      无操作

      无操作。 但是,必须记住操作编号,如果从 OS 查询结果,则必须返回成功。

      5、14、21、22

      清除

      TPM2_ClearControl(NO) +

      TPM2_Clear

      <PLATFORM RESET>* [*如有必要,保留 TPM2_CLEAR 中的 TPM 更改。 Microsoft 预计大多数系统不需要这样做。]

      17

      SetNoPPIClear_False

      (需要临机操作才能清除。)

      此操作不会更改 TPM 状态。

      将 BIOS TPM 管理标志 NoPPIClear 清除为 FALSE。

      18

      SetNoPPIClear_True

      (不需要临机操作确认即可清除。)

      此操作不会更改 TPM 状态。

      将 BIOS TPM 管理标志 NoPPIClear 设置为 TRUE。

      23-127

      保留

      保留,不实现或不使用

      >=128

      供应商特定

      TPM 命令映射到供应商特定的操作

  4. 当需要执行操作但实际机制不需要按键时,必须维护第 4 节的理念,才能从实际存在的用户处获得确认。 用于确认同意的密钥或其他机制取决于平台制造商。

    Op

    操作

    名称

    确认

    文本

    5、14、21 和 22

    清除

    请求更改配置以清除此计算机的 TPM(受信任的平台模块)

    警告:清除会擦除存储在 TPM 上的信息。 你将丢失所有创建的密钥,且无法访问通过这些密钥加密的数据。

    按 <CAK> 清除 TPM

    按 <RK> 拒绝此更改请求并继续

    18

    SetNoPPIClear_True

    请求更改配置以允许操作系统清除计算机的 TPM(受信任的平台模块),而无需在未来要求用户确认。

    注意:此操作不会清除 TPM,但通过批准此配置更改,清除 TPM 的未来操作不需要用户确认。

    警告:清除会擦除存储在 TPM 上的信息。 你将丢失所有创建的密钥,且无法访问通过这些密钥加密的数据。

    按 <CAK> 批准将来的操作系统请求以清除 TPM

    按 <RK> 拒绝此更改请求并继续

  5. 第 5 部分是信息。

  6. 连接待机系统可能将 NoPPIClear 硬编码为 TRUE,并且不实现操作 17 和 18。 这意味着,它们不需要为临机操作实现任何确认对话框,因为没有临机操作需要用户确认。

  7. 当固件将控制权传递给初始程序加载器代码(如 Windows 启动管理器)时,必须启用存储和认可层次结构。

4.3.4.3 可选的 ACPI Start 方法

注意:某些平台可能实现此可选的 ACPI 方法,以允许 OS 请求固件执行或取消 TPM 2.0 命令。 ACPI Start 方法的使用由静态 ACPI 表(参见第 4.4 节)的 StartMethod 字段确定。如果静态 ACPI 表的 StartMethod 字段指示使用此方法,则必须实现 ACPI Start 方法。此处定义的 ACPI 函数应驻留在 _DSM 控制方法对象中。 [注意:这不是 TPM2 ACPI 表中的控制方法。] 此处定义的 _DSM 方法必须按如下方式实现:

UUID

修订

Function

说明

6bbf6cab-5463-4714-b7cd-f0203c0368d4

0

0

如 [ACPI09] 第 9.14.1 节中所述。

0

1

开始

函数启动

输入参数:

Arg0 (Buffer): UUID = 6bbf6cab-5463-4714-b7cd-f0203c0368d4
Arg1 (Integer): Revision ID = 0
Arg2 (Integer): Function Index = 1
Arg3 (Package): Arguments = Empty Package

返回值:

类型:整数

返回值的说明:

0:成功

1:常规失败

功能行为:

此函数告知系统查看 TPM 2.0 设备控制区域中的状态寄存器,并采取适当的操作来执行或取消 TPM 2.0 命令。

函数是非阻塞的。 调用将立即返回。 (不要尝试从 ACPI 方法中执行命令。AML 调用需要简短。) 返回返回值 0 时,已接受提交的命令,固件将执行或取消(如果已设置 Cancel 字段)。 只要可能,系统应从此调用返回 TPM 响应而不是“常规失败”。 例如,现在无法处理命令,可以写入 TPM2_RC_RETRY 的响应缓冲区,并且可以清除“启动”字段。 如果由于设置了“取消”字段而取消了命令,则此方法可能会在响应缓冲区中写入 TPM2_RC_Cancelled 返回代码,清除“启动”字段并返回值 0。 或者,如果设置了“取消”字段,则该方法可能会返回值 0,并且 TPM 2.0 设备稍后可能会根据取消命令的要求完成或取消该命令。

当返回“返回值 1”时,固件无法读取或处理请求。 除返回值外,请求等效于“无操作”。 例如,(a) 错误的 OS 驱动程序在先前命令完成之前请求执行其他命令,(b) 控制区域不在物理内存中 [可能是由于内存损坏],或 (c) 命令或响应物理地址不存在。 返回值 1 可能会导致 Windows TPM 2.0 驱动程序停止使用 TPM 2.0 设备,直到下一次完整的系统启动(这不包括休眠/恢复周期)。

注意:命令执行开始后,如果 OS 选择取消当前正在执行的命令,则不会再调用此方法。 (但是,在设置“取消”字段时,最初可能会为命令调用控件方法。)

4.4 TPM2 静态 ACPI 表

“RSDT”ACPI 表中列出的名为“TPM2”的 ACPI 表描述了平台的 TPM 2.0 硬件接口。 Windows TPM 2.0 驱动程序使用此表来确定它与 TPM 2.0 设备通信的方式。 支持此接口所需的 ACPI 表中的参数如下表所示。

表 3:TPM2 ACPI 表布局

字段

字节长度

字节偏移量

说明

标头

签名

4

00h

“TPM2”。 TPM 2.0 设备硬件接口表的签名

长度

4

04h

表的长度(以字节为单位,包括标头,从偏移量 0 开始)。 此字段用于记录整个表的大小。

修订

1

08h

此表的修订,包括它引用的数据和结构。 如果此引用的任何结构发生更改(例如,控制区域),则此修订必须更改。 值 03h。

校验和

1

09h

整个表(包括校验和字段)必须添加到零才被视为有效。

OEM ID

6

0Ah

每个 ACPI 规范的 OEM ID。 OEM 提供的字符串,用于标识 OEM(这可能是芯片组供应商)。

OEM 表格 ID

8

10h

OEM 表 ID 是制造商型号 ID(由“OEM ID”标识的 OEM 分配;可能是芯片组供应商)。

OEM 修订

4

18h

给定 OEM 表 ID 的 OEM 修订。 根据 ACPI,“[an] OEM 提供的修订号。 较大的数字被视为较新的修订版本。”

创建者 ID

4

1Ch

创建该表的实用工具的供应商 ID。 对于包含定义块的表,这是 ASL 编译器的 ID。

创建者修订

4

20h

创建该表的实用工具的修订。 对于包含定义块的表,这是 ASL 编译器的修订版本。

Flags

4

24h

保留

必须始终为零

控制区域的地址

8

28h

控制区域的物理地址。 可能位于 TPM 2.0 设备内存中,也可能位于系统在启动期间保留的内存中。 TPM 2.0 驱动程序在整个启动周期(包括休眠和恢复周期)中保留此地址的知识。 如果系统不使用“控制区域”,此值必须全部为零。

Start 方法

4

30h

Start 方法选择器确定 Windows TPM 2.0 驱动程序使用哪种机制将 TPM 2.0 命令传送到设备并通知 TPM 2.0 设备命令可供处理。 此字段可能包含以下值之一:

说明

0

保留。

1

保留(供应商特定)

2

使用 ACPI Start 方法。

3-5

6

保留(供应商特定)

为内存映射 I/O 接口保留(TIS 1.2+取消)。 此选项不符合 Windows 8 硬件认证。 使用此选项需要获得批准的 Windows 8 WHLK 应变请求以进行徽标认证。 请联系 Microsoft 了解详细信息。

7

8

使用命令响应缓冲区接口。

将命令响应缓冲区接口与 ACPI Start 方法一同使用。

保留。

 

平台特定参数

可变

34h

平台特定参数的内容由此系统的 TPM 2.0 设备接口使用的启动机制决定。 此字段包含可用于启动命令处理的值。 此信息可能特定于供应商。 对于 Start 方法值 2 或 6,不使用该字段并且字节长度为零。

4.4.1 控制区域内容

控制区域结构包含状态字段以及其他控制位/字段和一个或多个地址。 控制区域包含命令缓冲区的物理地址和响应缓冲区的物理地址。

并非所有 TPM 2.0 接口实现都使用控制区域,例如,Start 方法值 6 不使用控制区域,本节中的信息不适用于平台。

控制区域必须在 ACPI AddressRangeReserved 内存中。

控制区结构如下表所示,除非另有说明,否则对控制区的所有访问都以 little endian 格式完成。

表 4:控制区域布局

字段

字节长度

Offset

说明

状态字段

TPM 2.0 状态字段

保留

4

00h

保留。 (必须为零。)

错误

4

04h

由 TPM 2.0 设置以指示错误情况

取消

4

08h

由驱动程序设置以中止命令处理

开始

4

0Ch

由驱动程序设置以指示命令可用于处理。

中断控制

8

10h

保留。 (必须为零。)

命令大小

4

18h

命令缓冲区的大小

命令

8

1Ch

此字段包含命令缓冲区的物理地址。 请注意,实际的命令缓冲区(不是命令缓冲区的物理地址)采用 TCG 规定的 big-endian 格式。

响应大小

4

24h

响应缓冲区的大小

响应

8

28h

此字段包含响应缓冲区的物理地址。 请注意,实际的响应缓冲区(不是响应缓冲区的物理地址)采用 TCG 规定的 big-endian 格式。

TPM 2.0 驱动程序在操作系统初始化期间读取一次以下信息:

  1. 控制区域的物理地址

  2. 命令缓冲区的大小

  3. 命令缓冲区的物理位置

  4. 响应缓冲区的大小

  5. 响应缓冲区的物理位置

对于使用控制区域(即 Start 方法值不等于 6)并支持休眠和恢复的系统,上述五个值必须在休眠和恢复周期中保持不变。

4.4.1.1 错误

TPM 2.0 设备可能会设置此状态。 它只能在“启动”为“设置”时写入此状态。 在 TPM 2.0 设备设置此状态后,它会立即清除“启动”值。 除非“启动”字段为“清除”,否则 Windows TPM 2.0 驱动程序将不会读取“错误”字段。

“错误”字段的“设置”值被视为 TPM 2.0 设备或其硬件接口的一般错误。 任何“设置”值都会导致取消当前命令。 该命令必须回滚,以便 TPM 2.0 设备保持一致状态。

对于具有 ACPI Start 方法的设备,此字段应仅用于无法为其提供响应代码的错误。 例如:响应缓冲区不在物理内存中。 当此字段为“设置”时,Windows TPM 2.0 驱动程序可能会停止使用 TPM 2.0 设备。

ExitBootServices 之后此字段的初始值必须反映设备是否工作。

4.4.1.2 取消

Windows TPM 2.0 驱动程序可以设置此字段以请求终止当前命令的 TPM 2.0 设备处理。 Windows TPM 2.0 驱动程序不会调用 Start 方法来启动取消请求的处理。

当“取消”由 Windows TPM 2.0 驱动程序设置并且 TPM 2.0 设备正在处理命令时,TPM 2.0 设备将在最早的方便点停止处理当前命令。 对于大多数命令,预计 TPM 2.0 设备将完成命令并提供正常响应。 对于长时间运行的命令(例如,RSA 密钥生成),TPM 2.0 设备可能会以 TPM_RC_CANCELLED 退出。 TPM 2.0 设备必须在 90 秒内完成或取消命令。 (通常大多数 TPM 2.0 命令应在 500 毫秒内完成,但 RSA 密钥生成命令可能需要更长时间,命令取消应在 200 毫秒内完成)

当“启动”字段为“清除”时,Windows TPM 2.0 驱动程序可能会清除此值。 ExitBootServices 后的此字段的初始值必须为“清除”。

4.4.1.3 启动

Windows TPM 2.0 驱动程序可能会设置此状态以指示新命令已放置在命令缓冲区中。 Windows TPM 2.0 驱动程序可以调用 Start 方法来启动命令的处理。 TPM 2.0 设备在完成命令处理后将清除此状态。

当 Start 方法调用失败时,Windows TPM 2.0 驱动程序可能会清除此状态。

ExitBootServices 后的此字段的初始值必须为“清除”。

4.4.1.4 命令

这是 Windows TPM 2.0 驱动程序将要执行的命令写入的物理地址。 Windows TPM 2.0 驱动程序永远不会写入大于“命令大小”的命令。

Windows TPM 2.0 驱动程序不得写入此内存区域,除非“启动”字段为“清除”。 请注意,地址在控制区域中以 little-endian 格式指定,但实际的命令缓冲区采用 TCG 规定的 big-endian 格式。

4.4.1.5 响应

这是 Windows TPM 2.0 驱动程序将从中读取命令响应的物理地址。 Windows TPM 2.0 驱动程序永远不会读取大于“响应大小”的响应。

Windows TPM 2.0 驱动程序只会在“启动”字段从“设置”更改为“清除”并且“错误”为“清除”后读取响应。 请注意,地址在控制区域中以 little-endian 格式指定,但实际的响应缓冲区采用 TCG 规定的 big-endian 格式。

4.5 控件区域接口定义

对于使用控制区域作为 TPM 2.0 接口的硬件平台,本节和第 4.4 节中的信息描述了 TPM 2.0 驱动程序与硬件的交互。 使用控制区域的系统示例是 TPM2 表中 Start 方法值为 2 的系统。

4.5.1 状态组合

表 5 描述了 Windows TPM 2.0 驱动程序所做更改的预期行为。 请注意,仅允许某些组合。 仅记录允许的组合和更改。 所有其他组合均无效。 Windows TPM 2.0 驱动程序未执行任何操作的字段更改意味着 TPM 2.0 设备或 ACPI Start 方法更改了字段。

标有“0”的状态表示此字段为“清除”。 标有“1”的状态表示此字段为“设置”。 标有“?”的状态表示此字段的值可能是“清除”或“设置”。 状态字段缩写为:“ERR”- 错误、“CCL”- 取消和“STR”- 启动。 字段可以由 Windows TPM 2.0 驱动程序或 TPM 2.0 设备接口写入,操作列中进行了详细介绍。

|---

当前状态

---|

|---

写入的字段

---|

|---

下一个状态

---|

TPM 2.0 设备接口采取的操作

#

ERR

CCL

STR

ERR

CCL

STR

ERR

CCL

STR

1

0

1

0

-

0

-

0

0

0

Windows TPM 2.0 驱动程序清除“取消”值以便为下一个命令准备控制区域。 仅当“启动”为“清除”时,Windows TPM 2.0 驱动程序才可能清除“取消”值。

(TPM 2.0 设备不得写入“取消”字段。)

2

0

0

0

-

-

1

0

0

1

Windows TPM 2.0 驱动程序设置“启动”值以指示命令区域中存在命令。

Windows TPM 2.0 驱动程序可能会调用 ACPI Start 方法来启动命令的执行。 完成 ACPI Start 方法后,TPM 2.0 设备必须在 90 秒内完成命令并清除“启动”字段。 超过时间限制可能会导致 Windows TPM 2.0 驱动程序假定 TPM 2.0 设备挂起。

3

0

?

1

-

-

0

0

?

0

TPM 2.0 设备在完成命令处理或取消命令时清除“启动”字段。

如果命令被取消,则返回代码为 TPM_RC_CANCELLED 的响应被放入响应缓冲区并清除“启动”。

Windows TPM 2.0 驱动程序可能会在“启动”字段为“清除”时读取响应缓冲区。 Windows TPM 2.0 驱动程序不得在“启动”字段为“设置”时读取响应缓冲区。

4

0

0

1

-

1

-

0

1

1

Windows TPM 2.0 驱动程序设置“取消”以指示 TPM 2.0 设备取消当前命令。 通常,应在下一个方便点取消长时间运行的命令。 可能会完成短时间运行的命令。 具体来说,TPM 2.0 设备必须在“取消”字段为“设置”后的 90 秒内清除“启动”字段。 (良好的性能目标是 200 毫秒而不是 90 秒。) 注意:调用 ACPI Start 方法时,可能会设置 Cancel 字段,因为 OS 中的一个线程可以在另一个线程调用 ACPI Start 方法之前设置取消字段。

5

0

?

1

1

-

-

1

?

1

TPM 2.0 设备指示设备中的错误情况。 TPM 2.0 设备的状态就像命令执行从未启动一样。 Windows TPM 2.0 驱动程序将此值视为 TPM 2.0 设备的常规失败并取消命令的处理。

6

1

?

1

-

-

0

1

?

0

TPM 2.0 设备在设置“错误”字段后立即清除“启动”字段。

Windows TPM 2.0 驱动程序仅在“启动”字段为“清除”时,或命令执行或取消未在所需时间段内发生时,检查“错误”字段。 当此“错误”字段为“设置”时,Windows TPM 2.0 驱动程序可能会停止使用 TPM 2.0 设备。

4.5.2 使用 ACPI Start 方法时的状态图

此状态图仅供参考。 行为的规范描述是前面章节中的文本。 如果状态转换缺失或不明确,请参阅上述文本。

使用 ACPI Start 方法时的 TPM 2.0 设备状态

图 1:使用 ACPI Start 方法时的 TPM 2.0 设备状态

注意

(a) 请注意,多个并发线程可以同时与控制区域交互。 例如:一个线程可以通过设置“启动”字段然后发出 Start 方法来启动命令。 另一个线程可以并行设置“取消”字段。 因此,可以在设置“启动”字段之后,但在发出 Start 方法之前设置“取消”字段。 (b) Windows TPM 2.0 驱动程序对错误情况的反应可能与描述的不同。 例如,当超时达到时,它可能会转换为错误状态。

4.5.3 不使用 ACPI Start 方法的状态图

此状态图仅供参考。 行为的规范描述是前面章节中的文本。 如果状态转换缺失或不明确,请参阅上述文本。

不使用 ACPI Start 方法的 TPM 2.0 设备状态

图 2:不使用 ACPI Start 方法的 TPM 2.0 设备状态

4.6 内存映射 I/O 接口

对于使用内存映射 I/O 接口的硬件平台,本节和第 4.4 节中的信息描述了 TPM 2.0 驱动程序与硬件的交互。 使用内存映射 I/O 接口的系统示例是 TPM2 表中 Start 方法值为 6 的系统。

4.6.1 TCG TPM 接口规范要求

对于以下部分,系统必须符合 [TCG12] 中的 TPM 1.2 硬件接口要求:

第 9.1 节:TPM 区域级别

第 9.2 节:区域使用

第 9.3 节:每个寄存器的区域使用情况

第 10 节:TPM 寄存器空间

第 11 节:系统交互和流

不包括“第 11.2.4 节:故障模式”的所有内容

不包括“第 11.2.5 节:命令持续时间”的规范项目 2

不包括“第 11.2.6 节:超时”的所有内容

不包括“第 11.2.8 节:自我测试和早期平台初始化”的所有内容

不包括“第 11.2.9 节:输入缓冲区大小”的所有内容

不包括“第 11.2.10 节:错误”的规范项目 2c 和 3。

第 13 节:TPM 硬件协议

有关 [TCG12] 的未来草案规范,请联系 Microsoft。

4.6.2 支持取消命令

Windows 要求 TPM 2.0 设备通过展示下述行为来允许使用内存映射 I/O 接口取消 TPM 2.0 命令。

STS 寄存器之前未使用的第 24 位被定义为只写,并称为 commandCancel。

在命令执行阶段向 commandCancel 写入“1”可能会取消当前正在执行的命令,并且必须返回响应。 响应指示命令是取消(没有 TPM 2.0 状态更改,但返回取消响应代码 TPM_RC_CANCELLED)还是完成(返回指示命令结果的常规 TPM 2.0 响应)。 当 TPM 不处于命令执行状态时,必须忽略对 commandCancel 寄存器的写入。

4.6.3 额外要求

  1. 所有 TPM 命令必须在最多 90 秒内完成。

  2. 如果 TPM 2.0 驱动程序请求取消命令,它必须在 90 秒内完成或取消。

  3. 必须实现以下 TIMEOUT 值:TIMEOUT_A = 1 秒、TIMEOUT_B = 2 秒、TIMEOUT_C = 1 秒、TIMEOUT_D = 1 秒。

  4. 最小输入缓冲区大小必须为 0x500(或更大)。

5.0 参考

[ACPI09]

“高级配置和电源接口规范”,版本 4.0,2009 年 6 月 16 日。

[TCG08]

受信任的计算组,“TCG 平台重置攻击缓解规范”,版本 1.0,2008 年 5 月 15 日。

[TCG11]

受信任的计算组,“TCG 临机操作接口规范”,版本 1.20,2011 年 2 月 10 日。

[TCG12]

受信任的计算组,“PC 客户端工作组 PC 客户端特定 TPM 接口规范 (TIS)”,版本 1.21,修订版 1.00。