Partager via


Validation de la chaîne de certificats

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette rubrique explique comment valider la chaîne de certificats du pilote lors de l’utilisation du protocole COPP (Certified Output Protection Protocol).

La chaîne de certificats du pilote graphique est un document XML. La chaîne de certificats contient trois certificats. Le premier certificat est appelé certificat feuille et est le certificat COPP du pilote. Le certificat suivant est le certificat de signature du fournisseur de matériel indépendant (IHV). Le dernier certificat est le certificat de signature de Microsoft. Pour s’assurer que le pilote graphique est un appareil COPP légitime, l’application doit valider ces trois certificats. Un programme malveillant peut empêcher copp de fonctionner si une application ne valide pas correctement les certificats dans la chaîne.

Les chaînes de certificats COPP utilisent le jeu de caractères UTF-8. Les données binaires dans les certificats, telles que la clé publique RSA, sont encodées en base64 et stockées dans l’ordre big-endien. (Big-endian signifie que l’octet le plus important est stocké dans l’emplacement de mémoire avec l’adresse la plus basse.)

Certains éléments d’un certificat contiennent des valeurs booléennes pour indiquer qu’il existe une fonctionnalité du certificat. Si la fonctionnalité existe, la valeur de l’élément enfant correspondant est définie sur 1. Si aucune fonctionnalité n’est présente, cet élément enfant n’est pas présent dans le certificat.

Définitions d’éléments XML

Voici les définitions des éléments du schéma de certificat :

  • CertificateCollection. Élément racine du document XML. Il contient des éléments Certificate, un pour chaque certificat de la chaîne.
  • Certificat. Contient un certificat. Cet élément contient des éléments Data et Signature.
  • Data. Contient des informations sur le certificat. En particulier, il contient la clé publique et le type du certificat. L’élément Data contient les éléments enfants suivants :
    • PublicKey. Contient la clé publique RSA du certificat. L’élément PublicKey contient un élément KeyValue, qui contient un élément RSAKeyValue. L’élément RSAKeyValue a deux éléments enfants, Modulus et Exponent, qui définissent la clé publique. Les éléments Modulus et Exponent sont codés en base64 et stockés dans l’ordre big-endien.
    • KeyUsage. Si le certificat est le certificat COPP du pilote, cet élément doit contenir un élément enfant appelé EncryptKey. Si le certificat est le certificat de signature de l’IHV ou le certificat de signature de Microsoft, il doit contenir un élément enfant appelé SignCertificate. Ces deux éléments enfants contiennent des valeurs booléennes.
    • SecurityLevel. Cet élément doit être ignoré.
    • ManufacturerData. Spécifie le fabricant et le modèle du périphérique graphique. Cet élément n’est qu’informationnel.
    • Features. Contient des éléments enfants qui spécifient l’utilisation du certificat. Le seul qui concerne COPP est l’élément COPPCertificate. D’autres éléments enfants peuvent être présents ; si c’est le cas, ils doivent être ignorés. Si l’élément COPPCertificate existe, le certificat est un certificat COPP. Cet élément doit être présent dans le nœud feuille d’un certificat COPP valide. Cet élément contient une valeur booléenne.
  • Signature. Contient la signature de ce certificat. Il contient les éléments enfants suivants :
    • SignedInfo. Contient des informations sur la signature. L’élément enfant important de cet élément est l’élément DigestValue, qui contient la valeur encodée en base64 du hachage SHA-1 sur l’élément Data. La valeur digest est utilisée lors de la vérification du certificat par rapport à la liste de révocation de certificats (CRL).
    • SignatureValue. Cette valeur est calculée sur l’élément Data et calculée selon le schéma de signature numérique RSASSA-PSS défini dans Public-Key Cryptography Standards (PKCS) #1 (version 2.1). Pour plus d’informations sur PKCS #1, consultez https://www.rsa.com/.
    • KeyInfo. Contient la clé publique RSA du certificat suivant dans la chaîne. Cet élément est utilisé pour vérifier que les données de l’élément Data n’ont pas été falsifiées. Cet élément a le même format que l’élément PublicKey.

Validation de certificat

L’application doit effectuer les étapes suivantes pour valider correctement la chaîne de certificats. Si une étape échoue, ou si un élément mentionné dans ces procédures n’existe pas, la validation échoue.

Valider la procédure de collecte de certificats

Pour valider la chaîne de certificats, procédez comme suit :

  1. Vérifiez que certificateCollection est bien formé.
  2. Vérifiez que certificateCollection est encodé au format UTF-8.
  3. Vérifiez que l’attribut Version dans l’élément CertificateCollection est 2.0 ou version ultérieure.
  4. Vérifiez que la chaîne de certificats contient exactement trois éléments Certificate.
  5. Parcourez en boucle chaque élément Certificate de la chaîne de certificats et exécutez la procédure Valider le certificat, décrite ci-dessous, sur chacun d’eux.

Valider la procédure de certificat

Pour valider un certificat dans la chaîne, procédez comme suit :

  1. Vérifiez qu’aucun des éléments enfants de l’élément Data n’est dupliqué. Par exemple, il ne doit y avoir qu’un seul élément PublicKey.
  2. Vérifiez que l’élément Data/PublicKey/KeyValue/RSAKeyValue/Modulus existe. La valeur décodée en base64 doit être de 256 octets pour tous les certificats à l’exception de la racine. Dans le certificat racine, cet élément doit avoir une longueur de 128 octets.
  3. Vérifiez que l’élément Data/PublicKey/KeyValue/RSAKeyValue/Exponent existe. La valeur décodée en base64 ne doit pas être supérieure à 4 octets.
  4. Si ce certificat est le certificat feuille, vérifiez les points suivants :
    • L’élément KeyUsage contient un élément EncryptKey avec la valeur 1.
    • L’élément Features contient un élément COPPCertificate avec la valeur 1.
  5. Si ce certificat n’est pas le certificat feuille, vérifiez les points suivants :
    • Le module et l’exposant de l’élément Data/PublicKey correspondent exactement au module et à l’exposant de l’élément Signature/KeyInfo du certificat précédent.
    • L’élément KeyUsage contient un élément SignCertificate, avec la valeur 1.
  6. Utilisez l’algorithme de hachage SHA-1 pour hacher chaque octet dans l’élément Data du certificat. Chaque octet du premier caractère de la <balise Données> au dernier caractère de la balise /Data> fermante <doit être haché. La valeur de hachage est utilisée pour case activée le certificat par rapport à la liste de révocation de certificats (CRL), comme décrit dans Listes de révocation de certificats
  7. Comparez la valeur de hachage de l’étape 6 avec la valeur décodée en base64 de l’élément Signature/SignedInfo/Reference/DigestValue. Ces valeurs doivent correspondre.
  8. Effectuez la procédure Vérifier la signature, décrite ci-dessous.
  9. Si ce certificat n’est pas le certificat final de la chaîne, enregistrez la valeur Signature/KeyInfo/KeyValue/RSAKeyValue pour l’itération suivante de la boucle.
  10. Si ce certificat est le dernier certificat de la chaîne, assurez-vous que la valeur de Signature/KeyInfo/KeyValue/RSAKeyValue correspond à la clé publique de Microsoft. La clé publique Microsoft a les valeurs encodées en base64 suivantes :
    • Module:

      pjoeWLSTLDonQG8She6QhkYbYott9fPZ8tHdB128ZETcghn5KHoyin7HkJEcPJ0Eg4UdSv a0KDIYDjA3EXd69R3CN2Wp/QyOo0ZPYWYp3NXpJ700tKPgIplzo5wVd/69g7j+j8M66W7V NmDwaNs9mDc1p2+VVMsDhOsV/Au6E+E=

    • Exposant: AQAB

Vérifier la procédure de signature

La valeur de l’élément SignatureValue est calculée sur l’élément Data selon le schéma de signature numérique RSASSA-PSS défini dans PKCS #1 version 2.1 (ci-après appelé PKCS). Pour vérifier cette signature, procédez comme suit :

  1. Décodez les valeurs Modulus et Exponent dans l’élément Signature/KeyInfo/KeyValue/RSAKeyValue. Ces valeurs définissent la clé publique RSA du certificat de signature.
  2. Décodez l’élément Signature/SignatureValue.
  3. Calculez l’opération RSASSA-PSS-Verify, définie dans la section 8.1.2 de PKCS.

Pour l’opération RSASSA-PSS-Verify, utilisez les entrées suivantes :

  • (n,e) est la clé publique de l’étape 1.
  • M correspond à tous les octets de l’élément Data, y compris les <balises Data> et </Data> qui entourent l’élément.
  • S est la valeur de signature décodée de l’étape 2.

L’opération RSASSA-PSS-Verify utilise l’opération EMSA-PSS-ENCODE, définie dans la section 9.1.1. de PKCS. Pour cette opération, COPP utilise les options suivantes :

  • Hachage = SHA-1
  • hLen = 20
  • MGF (fonction de génération de masque) = MGF1
  • sLen = 0

La fonction de génération de masque MGF1 est définie dans l’Annexe B.2 de PKCS. Pour cette fonction, COPP utilise les options suivantes :

  • Hachage = SHA-1
  • hLen = 20

La sortie de l’opération RSASSA-PSS-Verify indique si la signature est valide ou non valide.

Utilisation du protocole COPP (Certified Output Protection Protocol)