我试图使用Visual C++(本机)进行OPM(输出保护管理器)
OPMAPI。我的目标是在HDMI设备驱动程序和显示器之间启用HDCP session ,以通过HDMI电缆保护内容。

我从MSDN得到一个例子

在示例代码中,有一些关于证明的未记录功能。
(ValidateX509Certificate,GetPublicKeyFromCertificate)

下面是示例代码。

    OPM_RANDOM_NUMBER random;   // Random number from driver.
    ZeroMemory(&random, sizeof(random));
    BYTE *pbCertificate = NULL; // Pointer to a buffer to hold the certificate.
    ULONG cbCertificate = 0;    // Size of the certificate in bytes.

    PUBLIC_KEY_VALUES *pKey = NULL; // The driver's public key.

    // Get the driver's certificate chain + random number
    HRESULT hr = pVideoOutput->StartInitialization(
        &random,
        &pbCertificate,
        &cbCertificate );

    // Validate the X.509 certificate. (Not shown.)
    hr = ValidateX509Certificate(pbCertificate, cbCertificate);

    if (FAILED(hr))
    {
        goto done;
    }

    // Get the public key from the certificate. (Not shown.)
    hr = GetPublicKeyFromCertificate(
        pbCertificate,
        cbCertificate,
        &pKey );

根据MSDNIOPMVideoOutput::StartInitialization()检索随机数和X509证书链(pbCertificate)。

没有显示ValidateX509Certificate()GetPublicKeyFromCertificate()函数。

有人可以向我解释上面两个函数的编写方式吗?

或者我想知道如何将X.509证书链数据(DER)解码为CERT_CHAIN_CONTEXT。

最佳答案

StartInitialization函数将驱动程序的完整证书链作为带DER编码的签名PKCS7数据返回。这不是我们通常处理的带有DER编码的普通X509证书。不幸的是,这在MSDN页面中没有提到。

可以使用任何加密库/框架从已签名的PKCS7 DER中提取证书/证书链。我们可以按照以下步骤使用Microsoft加密框架来验证并获取公钥。

  • 使用CryptGetMessageCertificates函数
  • 获取证书链
  • (可选)您可以按照说明的方式验证证书链"Performing X.509 Certificate Verification with CryptoAPI"
  • 按照步骤2中的说明获取主题证书CERT_CONTEXT。可以从CERT_CONTEXT的pCertInfo中检索主题公钥。

  • 使用ozt_a解释的OpenSSL更加容易(至少在我看来是这样)。它显示了如何检索证书,您可以使用X509_get_pubkey函数轻松地检索公钥。

    关于c++ - MS OPM(输出保护管理器)初始化X509链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21012866/

    10-10 13:41