资源虚拟化

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

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

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

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

注意

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

 

资源限制

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

钥匙

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

  • 使用 TPM_LoadKey2 创建密钥

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

  • 清除密钥

    当虚拟密钥句柄从客户端上下文中收到该虚拟句柄的TPM_FlushSpecific或TPM2_FlushContext消息时,TBS 会失效。 如果在收到刷新消息时 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 的独占传输会话。