DXGKDDI_OPM_SET_SIGNING_KEY_AND_SEQUENCE_NUMBERS回调函数 (dispmprt.h)

DxgkDdiOPMSetSigningKeyAndSequenceNumbers 函数设置给定受保护输出对象的签名密钥和两个序列号。

语法

DXGKDDI_OPM_SET_SIGNING_KEY_AND_SEQUENCE_NUMBERS DxgkddiOpmSetSigningKeyAndSequenceNumbers;

NTSTATUS DxgkddiOpmSetSigningKeyAndSequenceNumbers(
  [in] PVOID MiniportDeviceContext,
  [in] HANDLE ProtectedOutputHandle,
  [in] const DXGKMDT_OPM_ENCRYPTED_PARAMETERS *EncryptedParameters
)
{...}

参数

[in] MiniportDeviceContext

与显示适配器关联的上下文块的句柄。 以前,显示微型端口驱动程序的 DxgkDdiAddDevice 函数为 DirectX 图形内核子系统提供了此句柄。

[in] ProtectedOutputHandle

受保护输出对象的句柄。 DxgkDdiOPMCreateProtectedOutput 函数创建受保护的输出对象,并将句柄返回到 对象。

[in] EncryptedParameters

指向包含 256 字节数组 的DXGKMDT_OPM_ENCRYPTED_PARAMETERS 结构的指针。 数组包含 40 到 256 字节的数据,这些数据使用相应证书中的公钥进行加密。 有关公钥的详细信息,请从支持输出保护 管理器下载输出内容保护文档。 如果受保护的输出具有 OPM 语义,则会使用显示微型端口驱动程序的 OPM 证书中的公钥对数据进行加密。 如果受保护的输出具有认证输出保护协议 (COPP) 语义,则会使用显示微型端口驱动程序 COPP 证书中的公钥对数据进行加密。

显示微型端口驱动程序应用于解密数组中的数据的算法取决于受保护输出的语义。 具有 OPM 语义的受保护输出使用 RSAES-OAEP 加密方案来解密数据。 有关 RSAES-OAEP 的详细信息,请参阅 RSA 实验室 网站。 具有 COPP 语义的受保护输出使用标准 RSA 加密算法来解密加密的数据。

显示微型端口驱动程序解密数据后,目前只有前 40 个字节的数据有用。 解密数据的前 16 个字节包含显示微型端口驱动程序的 DxgkDdiOPMGetRandomNumber 函数在 将 ProtectedOutputHandle 参数中的句柄传递给它的随机数。 接下来的 16 个字节包含 128 位 AES 签名密钥。 接下来的 4 个字节包含 由 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 使用的序列号。 最后 4 个字节包含 DxgkDdiOPMConfigureProtectedOutput 使用的序列号。 如果已解密数据的其余部分存在,则应忽略这些数据。

返回值

如果函数成功设置签名密钥和两个序列号,DxgkDdiOPMSetSigningKeyAndSequenceNumbers 将返回STATUS_SUCCESS。 否则,可能会由于以下原因之一返回 STATUS_OPM_INVALID_ENCRYPTED_PARAMETERS

  • 如果受保护的输出具有 OPM 语义,则显示微型端口驱动程序解密的数据未使用 RSAES-OAEP 编码算法进行编码。 有关 RSAES-OAEP 的详细信息,请参阅 RSA 实验室网站上的 PKCS #1 v2.1: RSA 加密标准中的 7.1.2 部分。
  • 调用方未使用适当的公钥加密数据。 如果输出具有 OPM 语义,则调用方应使用显示微型端口驱动程序的 OPM 证书中的公钥加密数据。 如果输出具有 COPP 语义,则调用方应使用显示微型端口驱动程序的 COPP 证书中的公钥加密数据。
  • 调用方未加密至少 40 个字节的数据。
  • 显示微型端口驱动程序解密的数据中的 16 字节随机数与 DxgkDdiOPMGetRandomNumber 函数返回的 16 字节随机数不匹配。

此函数还可能返回 Ntstatus.h 中定义的其他错误代码。

注解

签名密钥用于验证传递到 DxgkDdiOPMConfigureProtectedOutputDxgkDdiOPMGetInformation 函数的数据是否来自间接使用受保护输出的应用程序。 签名密钥还用于对 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 函数返回的数据进行签名。 其中一个序列号由 DxgkDdiOPMConfigureProtectedOutput 使用。 另一个序列号由 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 使用。

DxgkDdiOPMSetSigningKeyAndSequenceNumbers 应返回失败代码,如果发生错误,或者 EncryptedParameters 参数指向的 DXGKMDT_OPM_ENCRYPTED_PARAMETERS 结构中的数据不采用所需的格式。 否则, DxgkDdiOPMSetSigningKeyAndSequenceNumbers 应执行以下操作序列:

  1. 使用适当的私钥和加密方案解密 EncryptedParameters 指向的数据。 如果输出具有 OPM 语义,则显示微型端口驱动程序应使用其 OPM 私钥来解密数据。 如果输出具有 COPP 语义,则显示微型端口驱动程序应使用其 COPP 私钥来解密数据。
  2. 如果输出具有 OPM 语义,请验证解密的数据是否已使用 RSAES-OAEP 编码算法进行编码。
  3. 验证是否已解密至少 40 字节的数据。
  4. 验证解密的数据的前 16 个字节中包含的随机数是否与显示微型端口驱动程序的 DxgkDdiOPMGetRandomNumber 在向它传递 ProtectedOutputHandle 参数中的句柄时返回的随机数匹配。
  5. 缓存 128 位 AES 签名密钥和两个 32 位序列号。

在受保护的输出对象的句柄传递到 DxgkDdiOPMSetSigningKeyAndSequenceNumbers 之前,该句柄将传递到 DxgkDdiOPMGetRandomNumber。 每个受保护的输出对象句柄仅传递给 DxgkDdiOPMSetSigningKeyAndSequenceNumbers 一次。

DxgkDdiOPMSetSigningKeyAndSequenceNumbers 应可分页。

RSAES-OAEP 和 MGF1 参数

RSAES-OAEP 是参数化加密方案,MGF1 是参数化掩码生成函数。 以下是 OPM 使用 RSAES-OAEP 和 MGF1 时使用的参数。 有关以下术语和 RSA 加密标准的详细信息,请参阅 RSA 实验室和安全哈希网站。

要求

要求
目标平台 桌面
标头 dispmprt.h (包括 Dispmprt.h)
IRQL PASSIVE_LEVEL (请参阅备注部分)

另请参阅

DxgkDdiOPMGetCOPPCompatibleInformation

DxgkDdiOPMCreateProtectedOutput

DXGKMDT_OPM_ENCRYPTED_PARAMETERS

DxgkDdiAddDevice

DxgkDdiOPMGetRandomNumber

DxgkDdiOPMGetInformation

DxgkDdiOPMConfigureProtectedOutput