簡體   English   中英

MS OPM(輸出保護管理器)初始化X509鏈

[英]MS OPM (Output Protection Manager) Initializing X509 chain

我試圖使用OPMAPI與Visual C ++(本機)進行OPM(輸出保護管理器)。 我的目標是在HDMI設備驅動程序和顯示器之間啟用HDCP會話,以通過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加密框架來驗證並獲取公鑰。

  1. 使用CryptGetMessageCertificates函數獲取證書鏈
  2. (可選)您可以按照“使用CryptoAPI執行X.509證書驗證”中的說明驗證證書鏈。
  3. 按照步驟2中的說明獲取主題證書CERT_CONTEXT 。可以從CERT_CONTEXT的pCertInfo中檢索主題公鑰。

使用OpenSSL更容易(至少在我看來是這樣),它被解釋為“如何從PKCS7.p7b證書文件usind openssl中讀取證書文件” 它顯示了如何檢索證書,並且您可以使用X509_get_pubkey函數輕松地檢索公鑰。

這是一個示例代碼,用於實現提到的MSDN中缺少的功能,並展示如何基於標准窗口API https://github.com/wangf1978/D3DTest,CryptoUtil.cpp / OPMSession.cpp使用OPM和相關的加密實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM