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 的详细信息,请参阅 PKCS #1 v2.1 中的第 7.1.2 节:RSA 加密标准,位于 RSA 实验室 网站。
  • 调用方未使用适当的公钥加密数据。 如果输出具有 OPM 语义,调用方应使用显示微型端口驱动程序 OPM 证书中的公钥加密数据。 如果输出具有 COPP 语义,调用方应使用显示微型端口驱动程序 COPP 证书中的公钥加密数据。
  • 调用方未加密至少 40 字节的数据。
  • 显示微型端口驱动程序解密的数据中的 16 字节随机数与 DxgkDdiOPMGetRandomNumber 函数返回的 16 字节随机数不匹配。

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

言论

签名密钥用于验证传递到 DxgkDdiOPMConfigureProtectedOutputDxgkDdiOPMGetInformation 函数的数据是否来自间接使用受保护输出的应用程序。 签名密钥还用于对 DxgkDdiOPMGetInformation 返回的数据进行签名,DxgkDdiOPMGetCOPPCompatibleInformation 函数。 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