TPM 2.0第1部分包含对TPM属性、功能和方法的叙述描述。
本篇主要基于TPM 2.0规范Part 1的第12章(TPM Operational States)的内容,对TPM的运行状态定义进行解读。
本文描述TPM的运行状态和状态迁移。
Figure 5描述了TPM启动序列。
在复位断言时或未上电的情况下,硬件TPM模块处于下电状态。 TPM可以通过检测低功率在内部产生复位,或者可以由外部源提供复位。
可以从任何其他状态转换到Power-off状态,因为电源随时可能失去。
注:到这种状态的不受控制的转换不会显示在图表/描述中,因为它们会增加不必要的混乱,并且不能提供额外的理解。
当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时,会保留相当多的信息。
TPM2_Startup()将TPM从初始化状态转换为操作状态。 该命令包含来自平台的信息,用于通知TPM平台的运行状态。 TPM2_Startup()有两个选项:TPM_SU_CLEAR和TPM_SU_STATE。 TPM2_Startup()之后TPM的运行状态取决于TPM关闭的方式和所选的启动选项。
以下术语用于描述不同的启动和关闭操作:
Shutdown()和Startup()的组合提供了三种独特的TPM操作准备方法:
如果TPM接收到Startup(STATE)之前没有Shutdown(STATE),则没有状态需要恢复,TPM将返回TPM_RC_VALUE。 CRTM预计将采取纠正措施,防止恶意软件操纵PCR值,从而歪曲平台的状态。 CRTM将中止Startup(STATE),并在Startup(CLEAR)时重新启动。
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固件升级的受保护功能。 本规范中描述的方法将允许在来自多个供应商的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适当地设置模式。
如果在FUM中TPM模块被复位(_TPM_Init), TPM模块无法恢复正常运行,则有三种恢复的可能性。 这个选择是由_TPM_Init之后提供给TPM的第一个升级块的摘要决定的。 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章)。