[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine,以及媒體基金會中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
本主題描述如何使用認證輸出保護通訊協定 (COPP) 來驗證驅動程式的憑證鏈結。
圖形驅動程序的憑證鏈結是 XML 檔。 憑證鏈結包含三個憑證。 第一個憑證稱為 子憑證,而是驅動程式的 COPP 憑證。 下一個憑證是獨立硬體廠商 (IHV) 的簽署憑證。 最後一個憑證是Microsoft的簽署憑證。 為了確保圖形驅動程式是合法的COPP裝置,應用程式必須驗證這三個憑證。 如果應用程式未正確驗證鏈結中的憑證,惡意程式可能會防止 COPP 運作。
COPP 憑證鏈結會使用UTF-8字元集。 憑證中的二進位數據,例如 RSA 公鑰,會以base64編碼並依大端順序儲存。 (Big-endian 表示最重要的位元組會儲存在記憶體位置中,位址最低。
憑證內的某些元素包含布爾值,表示憑證的功能存在。 如果功能存在,對應的子專案值會設定為 1。 如果功能不存在,該子專案就不會出現在憑證中。
XML 元素定義
以下是憑證架構中元素的定義:
- CertificateCollection。 XML 檔的根元素。 它包含多個 Certificate 元素,每個元素對應於鏈中的一個憑證。
- 憑證。 包含一個憑證。 此元素包含 Data 和 Signature 元素。
-
資料。 包含憑證的相關信息。 特別是,它包含憑證的公鑰和類型。 Data 元素包含下列子元素:
- PublicKey。 包含憑證的 RSA 公鑰。 PublicKey 元素包含 KeyValue 元素,其中包含 RSAKeyValue 元素。 RSAKeyValue 元素有兩個子元素 Modulus 和 Exponent,而這些元素會定義公鑰。 模數和指數元素會以base64編碼,並以大到小的順序儲存。
- KeyUsage。 如果憑證是驅動程式的COPP憑證,則此元素應該包含名為 EncryptKey 的子元素。 如果憑證是 IHV 的簽署憑證或Microsoft的簽署憑證,它應該包含名為 SignCertificate 的子元素。 這兩個子元素都包含布爾值。
- SecurityLevel。 這個元素應該被忽略。
- ManufacturerData。 指定圖形裝置的製造商和型號。 此元素僅供參考。
- 功能。 包含指定憑證使用方式的子專案。 與 COPP 相關的唯一一個是 COPPCertificate 元素。 其他子元素可能存在;如果有的話,則應該忽略它們。 如果 COPPCertificate 元素存在,憑證就是 COPP 憑證。 這個元素必須存在於有效 COPP 憑證的分葉節點中。 這個元素包含布爾值。
-
簽章。 包含此憑證的簽章。 包含下列子專案:
- SignedInfo。 包含簽章的相關信息。 這個專案的重要子元素是 DigestValue 元素,其中包含 Data 元素上 SHA-1 哈希的 base64 編碼值。 針對證書吊銷清單 (CRL) 檢查憑證時,會使用摘要值。
- SignatureValue。 此值是在數據元素上計算的,並根據在 Public-Key 密碼編譯標準 PKCS 第1號(版本2.1)中定義的 RSASSA-PSS 數位簽名方案來計算。 如需 PKCS #1 的相關信息,請瀏覽 https://www.rsa.com/。
- KeyInfo。 包含鏈結中下一個憑證的 RSA 公鑰。 此元素可用來確認 Data 元素中的數據尚未遭到竄改。 此元素的格式與 PublicKey 元素相同。
憑證驗證
應用程式必須執行下列步驟,才能正確驗證憑證鏈結。 如果任何步驟失敗,或這些程序中參考的任何專案不存在,驗證就會失敗。
驗證憑證收集程序
若要驗證憑證鏈結,請執行下列步驟:
- 確認 CertificateCollection 是格式良好的 XML。
- 確認 CertificateCollection 是以 UTF-8 格式編碼。
- 檢查 CertificateCollection 元素中的 Version 屬性是否為 2.0 或更新版本。
- 確認憑證鏈結只包含三個 Certificate 元素。
- 依次檢查憑證鏈結中的每個 Certificate 元素,並對每個元素執行下述的驗證憑證的程序。
驗證憑證程式
若要驗證鏈結中的憑證,請執行下列步驟:
- 確認 Data 元素中沒有任何子項目重複。 例如,應該只有一個 PublicKey 元素。
- 確定 Data/PublicKey/KeyValue/RSAKeyValue/Modulus 元素存在。 除了根目錄以外的所有憑證,base64 譯碼的值必須長度為 256 個字節。 在根憑證中,此元素的長度必須是128字節。
- 確定 Data/PublicKey/KeyValue/RSAKeyValue/Exponent 元素存在。 base64 譯碼的值不得大於 4 個字節。
- 如果此憑證是葉證書,請確認下列各項:
- KeyUsage 元素包含值為 1 的 EncryptKey 元素。
- Features 元素包含值為 1 的 COPPCertificate 元素。
- 如果此憑證不是末端憑證,請確認下列各項:
- Data/PublicKey 元素的模數和指數完全符合上一個憑證之 Signature/KeyInfo 元素的模數和指數。
- KeyUsage 元素包含 SignCertificate 元素,值為 1。
- 使用 SHA-1 哈希演算法來哈希憑證 Data 元素中的每個位元組。 從 <Data> 標籤的第一個字元到結尾 </Data> 標記的最後一個字元,每個位元組都應該進行哈希處理。 哈希值用於檢查憑證是否在證書吊銷清單(CRL)中,如 證書吊銷清單中所述
- 比較步驟 6 中的哈希值與 Signature/SignedInfo/Reference/DigestValue 元素的 base64 譯碼值。 這些值必須相符。
- 執行驗證簽章程式,如下所述。
- 如果此憑證不是鏈結中的最終憑證,請為迴圈的下一個反覆專案儲存 Signature/KeyInfo/KeyValue/RSAKeyValue 值。
- 如果此憑證是鏈結中的最終憑證,請確定 Signature/KeyInfo/KeyValue/RSAKeyValue 的值符合Microsoft的公鑰。 Microsoft公鑰具有下列 base64 編碼值:
模數:
pjoeWLSTLDonQG8She6QhkYbYott9fPZ8tHdB128ZETcghn5KHoyin7HkJEcPJ0Eg4UdSv a0KDIYDjA3EXd69R3CN2Wp/QyOo0ZPYWYp3NXpJ700tKPgIplzo5wVd/69g7j+j8M66W7V NmDwaNs9mDc1p2+VVMsDhOsV/Au6E+E=指數:
AQAB
驗證簽章程序
SignatureValue 元素的值是按照 PKCS #1 版本 2.1 中定義的 RSASSA-PSS 數位簽名方案,針對 Data 元素計算得出(以下簡稱為 PKCS)。 若要確認此簽章,請執行下列步驟:
- 解碼 Signature/KeyInfo/KeyValue/RSAKeyValue 元素中的模數和指數值。 這些值會定義簽署憑證的 RSA 公鑰。
- 將 Signature/SignatureValue 元素譯碼。
- 計算 PKCS 第 8.1.2 節中定義的 RSASSA-PSS-Verify 作業。
針對 RSASSA-PSS-Verify 作業,請使用下列輸入:
- (n,e) 是步驟 1 的公鑰。
- M 是 Data 元素中的所有位元組,包括封入元素的 <Data> 和 </Data> 標記。
- S 是步驟 2 的已譯碼簽章值。
RSASSA-PSS-Verify 作業會使用 EMSA-PSS-ENCODE 作業,定義於 9.1.1 節中。 屬於 PKCS 的部分。 針對這項作業,COPP 會使用下列選項:
- 哈希 = SHA-1
- hLen = 20
- MGF (遮罩產生函數) = MGF1
- sLen = 0
遮罩產生函式 MGF1 定義於 PKCS 附錄 B.2 中。 針對此函式,COPP 會使用下列選項:
- 哈希 = SHA-1
- hLen = 20
RSASSA-PSS-Verify 作業的輸出會指出簽章是否有效或無效。
相關主題