Resource Virtualization

TBS 的主要功能是有效地共享某些有限的 TPM 资源:密钥、授权和传输会话。

创建其中一个资源的实例时,TBS 会创建资源的虚拟实例,并在结果命令流中返回此虚拟实例的句柄 (而不是 TPM) 返回的实际句柄实例。 TBS 维护虚拟句柄与内部实际句柄之间的映射。 如果 TPM 用完空间来保存给定类型的更多资源,则会有选择地保存和逐出资源的现有实例,直到 TPM 可以保存新资源。 当再次需要旧资源时,TBS 会加载保存的上下文, (保存并逐出其他资源(如有必要) 提交命令)。

TBS 中的所有虚拟化都代表特定上下文执行。 每个上下文仅允许访问专门代表其创建的虚拟资源,以及对应于这些虚拟资源的 TPM 上的物理资源。 默认情况下,所有虚拟化资源的总数限制为 500。 可以通过在 HKEY_LOCAL_MACHINE\SoftwareMicrosoftTpm\\ 下创建或修改名为 MaxResourcesDWORD 注册表值来更改此数字。 可以使用 性能监视器 工具跟踪 TBS 资源的数量来观察实时 TBS 资源使用情况。 此限制随着Windows 8和Windows Server 2012而过时。

未通过 TBS ((例如计数器和 NV 存储) )虚拟化的有限 TPM 资源必须在软件堆栈之间协作共享。

注意

此句柄虚拟化会导致在计算 HMAC 授权参数时包含密钥句柄的命令失败。 因此,TPM 版本 1.2 中弃用的许多命令不能由 TBS 环境中的应用程序软件使用。

 

资源限制

TPM 使调用方能够查询其功能,以确定特定类型的资源可用的空间量。 其中一些资源限制(例如密钥、授权会话和传输会话可用的空间量)通过虚拟化有效地扩展了 TBS。 由 MaxResources 注册表设置控制的 TBS 限制通常远远大于基础 TPM 硬件的实际限制。 未提供任何机制来独立于 TPM 硬件限制查询 TBS 限制。 此 TBS 限制因Windows 8和Windows Server 2012而过时。

TBS 虚拟化密钥句柄,以便在不需要密钥时从 TPM 透明卸载密钥,并在需要密钥时将其加载回 TPM。 创建密钥时,TBS 会将虚拟句柄与加载的密钥相关联。 同一虚拟句柄用于资源的生存期。 虚拟密钥句柄仅在创建它们的上下文中有效,并且不会在上下文生存期之外保留关联的资源。

  • 使用 TPM_LoadKey2 创建密钥

    如果使用TPM_LoadKey2、TPM2_CreatePrimary、TPM2_Load或TPM2_LoadExternal命令创建密钥,则 TBS 会将返回字节流中的句柄替换为其选择的虚拟密钥句柄。 因此,TBS 可确保每个虚拟句柄是唯一的。 如果 TBS 检测到冲突 (极不可能的事件) ,则 TBS 将从 TPM 卸载密钥并通知调用软件。 然后,软件可以重新提交操作。 此过程可以重复,直到 TBS 获取唯一键句柄。

  • 清除密钥

    TBS 在从客户端上下文接收虚拟句柄的TPM_FlushSpecific或TPM2_FlushContext消息时,会使虚拟密钥句柄失效。 如果收到刷新消息时 TPM 上实际存在密钥,则 TBS 会从 TPM 刷新该密钥。

  • 暂时删除密钥

    从 TPM 逐出密钥以腾出新项空间时,TBS 会在逐出密钥之前对密钥执行TPM_SaveContext或TPM2_ContextSave命令。

  • 还原密钥

    当引用已加载密钥的命令提交到 TBS 时,它将确保密钥在 TPM 上实际存在。 如果密钥不存在,则 TBS 会通过调用TPM_LoadContext或TPM2_ContextLoad将其还原。 如果无法将密钥还原到 TPM,TBS 将返回TPM_E_INVALID_KEYHANDLE作为 TPM 结果。

TBS 会将与命令流中的密钥关联的每个虚拟句柄替换为 TPM 上加载的密钥的物理句柄。 如果在调用方上下文中通过 TBS 无法识别的虚拟句柄提交命令,则 TBS 会为调用方设置具有TPM_E_INVALID_KEYHANDLE的错误流的格式。

授权会话

授权会话是通过调用TPM_OIAP、TPM_OSAP或TPM_DSAP创建的。 在每个情况下,返回字节流包含新创建的授权会话的物理 TPM 句柄。 TBS 将此替换为虚拟句柄。 在随后引用授权会话时,TBS 会将命令流中的虚拟句柄替换为授权会话的物理句柄。 TBS 可确保虚拟授权会话的生存期与物理授权会话的生存期匹配。 如果客户端尝试使用过期的虚拟句柄,TBS 会将错误流格式化为错误TPM_INVALIDAUTHHANDLE。

会话槽是有限的,TBS 可能会耗尽外部槽,以保存授权会话上下文。 如果发生这种情况,TBS 会选择授权会话以失效,以便成功保存新上下文。 尝试使用旧上下文的应用程序需要重新创建授权会话。

当发生以下任一情况时,TBS 会使虚拟授权会话失效:

  • 与 TPM 返回的命令流中的授权会话关联的继续使用标志为 FALSE

  • 使用授权会话的命令失败。

  • 执行命令,使与命令关联的授权会话失效 (,例如TPM_CreateWrapKey) 。

  • 与 OSAP 或 DSAP 会话关联的密钥从 TPM 中逐出,调用TPM_FlushSpecific或TPM2_FlushContext (,而不考虑此命令源自 TBS 还是高级软件) 。

    在成功执行某些不确定命令后,TBS 将自动重新同步授权会话,以确保 TBS 状态与 TPM 状态保持一致。 受影响的命令包括:

    • TPM_ORD_Delegate_Manage
    • TPM_ORD_Delegate_CreateOwnerDelegation
    • TPM_ORD_Delegate_LoadOwnerDelegation

在以下每种情况下,TPM 会自动刷新 TPM 上的授权会话:

  • 创建授权会话

    虚拟授权会话句柄仅在创建它们的上下文中有效,并且关联资源不会保留在关联上下文的生存期之外。

  • 清除授权会话

    如果 TBS 收到来自客户端上下文的虚拟句柄的TPM_FlushSpecific或TPM2_FlushContext命令,则它会使虚拟授权会话失效。 如果收到刷新命令时 TPM 上存在授权会话,则 TBS 会立即从 TPM 刷新物理会话。

  • 暂时删除授权会话

    从 TPM 逐出授权会话以为新实体腾出空间时,TBS 在该授权会话上执行TPM_SaveContext或TPM2_ContextSave。

  • 还原授权会话

    将授权的 TPM 命令提交到 TBS 时,TBS 可确保命令中引用的所有虚拟授权会话在 TPM 上实际存在。 如果不存在任何授权会话,TBS 会通过调用TPM_LoadContext或TPM2_ContextLoad还原它们。 如果无法将授权会话还原到 TPM,TBS 将返回TPM_E_INVALID_HANDLE作为 TPM 结果。

TBS 会将与命令流中的授权会话关联的每个虚拟句柄替换为 TPM 上加载的授权会话的物理句柄。

如果在调用方上下文中通过 TBS 无法识别的虚拟句柄提交命令,则 TBS 将为调用方设置错误流的格式,并TPM_E_INVALID_HANDLE错误。

传输会话

注意

此处所述的传输会话的处理特定于 Windows Vista 和 Windows Server 2008。

 

传输会话是 TPM 提供的一种机制,它使软件堆栈能够在软件与 TPM 之间传递时加密命令中的数据。 这可以防止攻击者在通过硬件总线时截获数据。

重要

仅对有效负载数据进行加密。 仍可以识别正在执行的命令。

 

遗憾的是,此机制还会阻止 TBS 检查有效负载数据。 在大多数情况下,这不是问题,因为 TBS 仅修改句柄,而不是有效负载数据。 但是,例如,对于TPM_LoadContext,返回的资源句柄由加密涵盖。 因此,TBS 可防止尝试执行传输会话涵盖的TPM_LoadContext操作。

TBS 在传输会话下阻止以下命令:

  • TPM_EstablishTransport
  • TPM_ExecuteTransport
  • TPM_Terminate_Handle
  • TPM_LoadKey
  • TPM_EvictKey
  • TPM_SaveKeyContext
  • TPM_LoadKeyContext
  • TPM_SaveAuthContext
  • TPM_LoadAuthContext
  • TPM_SaveContext
  • TPM_LoadContext
  • TPM_FlushSpecific

当传输会话涵盖其中任一命令时,TBS 将返回TPM_E_EMBEDDED_COMMAND_UNSUPPORTED作为 TPM 结果。

传输会话句柄以类似于密钥句柄和授权句柄的方式虚拟化。 TPM 上提供了有限数量的保存的传输会话上下文槽。

如果出现以下任一情况,TBS 会使虚拟传输会话失效:

  • 与 TPM 返回命令流中的传输会话关联的继续使用标志为 FALSE

    与上述授权会话一样,TBS 会在成功执行某些不确定命令后自动重新同步传输会话,以确保 TBS 状态与 TPM 状态保持一致。 受影响的命令包括:

    • TPM_ORD_Delegate_Manage
    • TPM_ORD_Delegate_CreateOwnerDelegation
    • TPM_ORD_Delegate_LoadOwnerDelegation

在这些情况下,TPM 上的传输会话将自动由 TPM 刷新:

  • 创建传输会话

    TBS 为客户端创建的每个传输会话创建虚拟句柄。 虚拟传输句柄仅在创建虚拟传输句柄的上下文中有效,并且关联资源不会保留在关联上下文的生存期之外。

  • 清除传输会话

    如果 TBS 从客户端上下文收到虚拟句柄的TPM_FlushSpecific命令,则其无效。 如果接收刷新命令时,传输会话在 TPM 上物理上存在,则 TBS 会立即从 TPM 刷新物理会话。

  • 暂时删除传输会话

    从 TPM 逐出传输会话以腾出新实体的空间时,TBS 在该传输会话上执行TPM_SaveContext。

  • 还原传输会话

    将TPM_ExecuteTransport命令提交到 TBS 时,TBS 可确保命令中引用的传输会话在 TPM 上物理存在。 如果传输会话不存在,则 TBS 会通过调用TPM_LoadContext将其还原。

TBS 将命令流中与传输会话关联的虚拟句柄替换为 TPM 上加载的传输会话的物理句柄。 如果在调用方上下文中通过 TBS 无法识别的虚拟句柄提交命令,则 TBS 使用 TPM_E_INVALID_HANDLE 设置调用方的错误流的格式。

独占传输会话

独占包装传输会话是顶级软件确定任何其他软件是否在命令链中访问 TPM 的方法。 它们不会阻止其他软件访问 TPM,它们只是为传输会话的创建者提供一种确定其他访问发生的方法。 TBS 不会执行任何特定于阻碍独占传输会话的任何操作,但与它们有些不兼容。 TBS 尝试通过透明方式复制 TPM 的自然行为,因此它不支持来自建立独占传输会话的上下文中的命令。 例如,如果客户端 B 在客户端 A 处于独占传输会话时提交命令,则它将使客户端 A 的独占传输会话失效。

TBS 启动的命令还可以终止独占传输会话。 当客户端 A 处于独占传输会话中,以及客户端 A 对 TPM 中不存在的资源的调用执行的命令时,就会发生这种情况。 这种情况触发 TBS 虚拟化管理器执行TPM_LoadContext命令以提供该资源,从而终止客户端 A 的独占传输会话。