TPM 2.0规范系列解读——Part 1体系结构第(五)读:TPM运行状态

前言

TPM 2.0第1部分包含对TPM属性、功能和方法的叙述描述。
本篇主要基于TPM 2.0规范Part 1的第12章(TPM Operational States)的内容,对TPM的运行状态定义进行解读。


文章目录

  • 前言
  • 一、介绍
  • 二、TPM基本运行状态
    • 1.下电状态(Power-off State)
    • 2.初始化状态(Initialization State)
    • 3.启动状态(Startup State)
      • 3.1 TPM2_Startup()
      • 3.2 启动类型
    • 4.关闭状态(Shutdown State)
  • 三、自检测模式
  • 四、失效模式
  • 五、现场升级(Field Upgrade)模式
    • 1.介绍
    • 2.现场升级模式
  • 总结


一、介绍

本文描述TPM的运行状态和状态迁移。

二、TPM基本运行状态

Figure 5描述了TPM启动序列。

1.下电状态(Power-off State)

在复位断言时或未上电的情况下,硬件TPM模块处于下电状态。 TPM可以通过检测低功率在内部产生复位,或者可以由外部源提供复位。
可以从任何其他状态转换到Power-off状态,因为电源随时可能失去。
注:到这种状态的不受控制的转换不会显示在图表/描述中,因为它们会增加不必要的混乱,并且不能提供额外的理解。

2.初始化状态(Initialization State)

当TPM接收到_TPM_Init指示后,TPM处于初始化状态。 _TPM_Init以特定于平台的方式提供。 对于硬件TPM模块,_TPM_Init通常由TPM模块复位信号去断言发出。 它也可以由接口协议或设置发出。 对于软件实现,_TPM_Init可能是一个专用的过程调用。

不管它是如何生成的,_TPM_Init都应该与可信度量根的重置一致,其中TPM是可信报告根。 例如,如果TPM是PC主板上的一个组件,_TPM_Init应该与处理器和芯片组的复位一致。 指示_TPM_Init之后,RTM应该开始执行可信度量核心根。 不复位RTM就复位TPM是不可能的。 不复位TPM也不可能复位RTM。

在Initialization状态下,TPM模块执行基本的初始化功能,为接受TPM接口的命令做准备。 尽管这些功能依赖于实现,但最起码,TPM应该进行对执行预期命令所需的TPM固件进行验证。 如果TPM处于现场升级模式(Field Upgrade mode, FUM),则预期的命令为TPM2_FieldUpgradeData()。 如果TPM不在现场升级模式中,则预期的命令为TPM2_Startup()。当TPM接收到TPM2_Startup()后,它就可以运行并能够开始处理其他命令了。

完成初始化后,TPM等待下一个命令,如果该命令不是预期的第一个命令,TPM将返回指示模式的错误。 如果TPM返回一个错误,它将继续等待预期的第一个命令。

注1:如果TPM不在现场升级模式中,则返回TPM_RC_INITIALIZE。 如果TPM处于现场升级模式状态,则返回TPM_RC_UPGRADE。

注2:为了符合其他标准,如FIPS 140,在执行命令之前,TPM需要验证与命令执行相关联的固件。 这包括与TPM2_Startup()和TPM2_FieldUpgadeData()相关联的代码。 此验证可能需要使用数字签名或消息身份验证代码。

有时,在电源转换过程中可能需要保留某些TPM状态。 如果平台进入Suspend状态(其中保留了系统的主要状态),可能会出现这种情况。 为了让TPM反映这种情况,系统软件可能会向TPM发出TPM2_Shutdown (TPM_SU_STATE)命令。

TPM2_Shutdown()启动TPM的有序关闭。 该命令的startupType参数指示预期要遵循的启动类型和要保存的数据类型。 对于TPM2_Shutdown (TPM_SU_CLEAR),保存到NV内存中的数据量相对较小,当指示TPM_SU_STATE时,会保留相当多的信息。

3.启动状态(Startup State)

3.1 TPM2_Startup()

TPM2_Startup()将TPM从初始化状态转换为操作状态。 该命令包含来自平台的信息,用于通知TPM平台的运行状态。 TPM2_Startup()有两个选项:TPM_SU_CLEAR和TPM_SU_STATE。 TPM2_Startup()之后TPM的运行状态取决于TPM关闭的方式和所选的启动选项。

3.2 启动类型

以下术语用于描述不同的启动和关闭操作:

  • Startup(CLEAR)表示TPM2_Startup(startupType == TPM_SU_CLEAR);
  • Startup(STATE)表示TPM2_Startup(startupType == TPM_SU_STATE);
  • Shutdown(STATE)表示TPM2_Shutdown(startupType == TPM_SU_STATE);
  • Shutdown(CLEAR)表示TPM2_Shutdown(startupType == TPM_SU_CLEAR)。

Shutdown()和Startup()的组合提供了三种独特的TPM操作准备方法:

  1. TPM Reset是在Shutdown(CLEAR)之后的一个Startup(CLEAR),或者在没有Shutdown()之前的Startup(CLEAR)(即无序关机)。 TPM Reset大致类似于平台的重启。 与重新引导一样,大多数值被放置在默认的初始状态,但是持久值被保留。 任何本规范中不需要保存在NV内存中的值都将被重新初始化。 在某些情况下,这意味着清除值,在其他情况下,这意味着选择新的随机值。
  2. TPM Restart是在Shutdown(STATE)之后的启动(CLEAR)。 这表示系统正在从非易失性存储(有时称为“休眠”)恢复操作系统。 对于TPM Restart, TPM恢复之前Shutdown(STATE)保存的值,除了所有的PCR被设置为默认的初始状态。 这允许TPM记录启动序列,以确保TCB正确实例化,同时允许恢复的操作系统继续运行。
  3. TPM Resume是在Shutdown(STATE)之后的Startup(STATE)。 这表示系统正在从RAM内存中重新启动操作系统,有时称为“睡眠”。 对于睡眠,期望CRTM将执行使系统正常工作所需的最小操作,然后“返回”运行的操作系统,而不是重新启动它。 TPM Resume恢复Shutdown(STATE)保存的所有状态,包括Startup(STATE)指定保存的PCR状态。 未指定为保存的PCR会被重置为默认初始状态。

如果TPM接收到Startup(STATE)之前没有Shutdown(STATE),则没有状态需要恢复,TPM将返回TPM_RC_VALUE。 CRTM预计将采取纠正措施,防止恶意软件操纵PCR值,从而歪曲平台的状态。 CRTM将中止Startup(STATE),并在Startup(CLEAR)时重新启动。

4.关闭状态(Shutdown State)

TPM2_Shutdown()用于TPM模块准备下电时。 与TPM2_Startup ()相对应,TPM2_Shutdown()有两个选项:TPM_SU_CLEAR和TPM_SU_STATE。

TPM2_Shutdown(TPM_SU_STATE)保留了大部分TPM操作状态,以便可以在后续的TPM2_Startup()中恢复。 TPM2_Shutdown(TPM_SU_CLEAR)保留了少量的状态,主要是为了确保TPM计时功能的连续性。

TPM将状态数据保存在NV存储器中。 数据将从RAM复制到NV内存中,这样TPM上电时数据就不会丢失。 复制到NV内存的数据量在很大程度上取决于实现,但是规范指明了需要保存的状态数据。 在后续的TPM2_Startup()中恢复此状态数据。 启动的类型决定了保存的状态数据的哪些部分将被恢复,哪些部分将被丢弃。

如果TPM在电源丢失之前接收到TPM2_Shutdown(),并且在下一个_TPM_Init之前没有通过TPM命令修改状态,则关闭是“有序的”。

三、自检测模式

如果命令需要使用未测试的算法或功能模块,TPM将执行测试,然后完成命令操作。 当按需(On-Demand)执行自检时,TPM应该只测试完成命令所需的那些算法(参见Figure 6)。

注:TPM最好对未测试的算法和功能块作为后台任务进行自检,以增加算法在需要使用之前进行测试的可能性。

发送TPM2_Startup()后,系统可能会使用TPM2_SelfTest()或TPM2_IncrementalSelfTest()来使TPM对未测试的算法进行测试。 TPM2_SelfTest()可以选择性地使TPM对所有算法和功能块执行完全自检。 一旦发出这些命令,TPM将返回TPM_RC_TESTING,用于任何需要使用任何可测试功能的命令,直到完成所有请求的测试。

如果任何自检失败,TPM将进入Failure模式,并且不允许执行除TPM2_GetTestResult()和TPM2_GetCapability()之外任何的受保护功能。 当TPM模块接收到_TPM_Init时,会退出Failure模式。

四、失效模式

如果TPM模块内部测试失败,则进入Failure模式。 在失效模式下,TPM返回TPM_RC_FAILURE以响应除TPM2_GetTestResult()或TPM2_GetCapability()以外的任何命令(参见Figure 7)。在失效模式下,TPM只需要提供有限数量的属性值。 它们都在TPM属性集合(TPM_CAP_TPM_ PROPERTIES)中:

  • TPM_PT_MANUFACTURER
  • TPM_PT_VENDOR_STRING_1
  • TPM_PT_VENDOR_STRING_2
  • TPM_PT_VENDOR_STRING_3
  • TPM_PT_VENDOR_STRING_4
  • TPM_PT_VENDOR_TPM_TYPE
  • TPM_PT_FIRMWARE_VERSION_1
  • TPM_PT_FIRMWARE_VERSION_2
    注:具体实现允许返回其他属性值。
    TPM 2.0规范系列解读——Part 1体系结构第(五)读:TPM运行状态_第1张图片

五、现场升级(Field Upgrade)模式

1.介绍

本规范描述了可选的用于TPM固件升级的受保护功能。 本规范中描述的方法将允许在来自多个供应商的TPM上以标准方式处理升级过程。 不应将这里描述的方法视为限制供应商实现其自己的或特定于供应商的TPM固件升级方法。 但是,供应商选择的现场升级方法的健壮性不应低于本规范中描述的方法。 特别地,升级的授权应该与本规范中的字段升级命令相同。

2.现场升级模式

本规范描述了两种可选的升级方式:全量升级和增量升级。 这些术语并不是指TPM中的固件更改了多少,而是指如何进行升级。

  • 对于全量升级,TPM将所有固件更新块存储在屏蔽位置。 除非确认所有的块都是正确的,否则不会对正在执行的固件进行更改。 升级过程可能会中断或放弃,但不会影响TPM功能。
  • 对于增量升级,固件更新可能会在每一个块收到时进行更新。如果放弃升级过程,可能会导致TPM模块功能不全。

当TPM收到正确授权的TPM2_FieldUpgradeStart()时(参见Figure 5),现场升级过程就开始了。该命令包含升级的第一个块的摘要。 如果下一个命令是TPM2_FieldUpgradeData(),并且命令的数据参数(fuData)的摘要匹配TPM2_FieldUgradeStart()中的签名摘要,TPM将接受fuData作为升级数据。

TPM可以缓冲固件更新块,并且在其缓冲区满之前不会更改固件。 当对正在运行的固件进行相应更改时,TPM将进入现场升级模式(FUM),并且不接受除TPM2_FieldUpgradeData()以外的任何命令,直到更新完成(参见Figure 7)。

升级完成后,TPM模块可以恢复正常运行,也可以进入需要_TPM_Init才能恢复正常运行的模式。 TPM厂商应该确定固件更新后是否需要重新启动,并让TPM适当地设置模式。
TPM 2.0规范系列解读——Part 1体系结构第(五)读:TPM运行状态_第2张图片

如果在FUM中TPM模块被复位(_TPM_Init), TPM模块无法恢复正常运行,则有三种恢复的可能性。 这个选择是由_TPM_Init之后提供给TPM的第一个升级块的摘要决定的。 TPM最多可以保留三个摘要值,用于比较:

  1. 当意图从开始重新启动当前升级序列时,要使用的当前序列的第一个升级块的摘要(在Figure 8中称为摘要C,Current);
  2. 正在被替换的固件的第一个块的摘要(在Figure 8中称为摘要P,Previous),当意图中止升级并恢复以前的固件时使用;
  3. 出厂安装的固件的第一个升级块的摘要(在Figure 8中称为摘要F,Factory),以恢复TPM到其出厂状态

总结

以上就是今天要讲的内容。本文介绍TPM的运行状态,主要包括基本运行状态(包括Power-off State、Initialization State、Startup State,Shutdown State)、Self-Test Modes、Failure Mode和Field Upgrade Mode。

下一篇我们介绍TPM控制域(TPM Control Domains,Part 1体系结构第13章)。

你可能感兴趣的:(TCM,TPM,可信计算,安全架构,系统安全,安全)