Проверка цепочки сертификатов
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
В этом разделе описывается проверка цепочки сертификатов драйвера при использовании протокола COPP.
Цепочка сертификатов графического драйвера представляет собой XML-документ. Цепочка сертификатов содержит три сертификата. Первый сертификат называется конечным сертификатом и является сертификатом COPP драйвера. Следующий сертификат — сертификат подписи независимого поставщика оборудования (IHV). Последний сертификат — сертификат подписи Майкрософт. Чтобы убедиться, что графический драйвер является допустимым устройством 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, и они определяют открытый ключ. Элементы Modulus и Exponent имеют кодировку Base64 и хранятся в порядке биг-эндиана.
- KeyUsage. Если сертификат является сертификатом COPP драйвера, этот элемент должен содержать дочерний элемент EncryptKey. Если сертификат является сертификатом подписи IHV или сертификатом подписи Майкрософт, он должен содержать дочерний элемент SignCertificate. Оба этих дочерних элемента содержат логические значения.
- SecurityLevel. Этот элемент следует игнорировать.
- ManufacturerData. Указывает производителя и модель графического устройства. Этот элемент является только информационным.
- Features. Содержит дочерние элементы, определяющие использование сертификата. Единственным, который относится к COPP, является элемент COPPCertificate. Могут присутствовать и другие дочерние элементы; Если да, их следует игнорировать. Если элемент COPPCertificate существует, сертификат является сертификатом COPP. Этот элемент должен присутствовать в конечном узле допустимого сертификата COPP. Этот элемент содержит логическое значение.
-
Подпись. Содержит подпись для этого сертификата. Он содержит следующие дочерние элементы:
- SignedInfo. Содержит сведения о сигнатуре. Важным дочерним элементом этого элемента является элемент DigestValue, который содержит значение в кодировке Base64 хэша SHA-1 по отношению к элементу Data. Значение дайджеста используется при проверке сертификата в списке отзыва сертификатов (CRL).
- SignatureValue. Это значение вычисляется по элементу Data и вычисляется в соответствии со схемой цифровой подписи RSASSA-PSS, определенной в Public-Key Cryptography Standards (PKCS) No 1 (версия 2.1). Сведения о PKCS No 1 см. на сайте https://www.rsa.com/.
- KeyInfo. Содержит открытый ключ RSA следующего сертификата в цепочке. Этот элемент используется для проверки того, что данные в элементе Data не были изменены. Этот элемент имеет тот же формат, что и элемент PublicKey.
Проверка сертификатов
Чтобы правильно проверить цепочку сертификатов, приложение должно выполнить следующие действия. Если какой-либо шаг завершается ошибкой или если какой-либо элемент, упомянутый в этих процедурах, не существует, проверка завершается ошибкой.
Процедура проверки сбора сертификатов
Чтобы проверить цепочку сертификатов, выполните следующие действия.
- Убедитесь, что certificateCollection имеет правильный формат XML.
- Убедитесь, что CertificateCollection закодирован в формате UTF-8.
- Убедитесь, что атрибут Version в элементе CertificateCollection имеет версию 2.0 или более позднюю версию.
- Убедитесь, что цепочка сертификатов содержит ровно три элемента Certificate.
- Циклически просматривайте каждый элемент Certificate в цепочке сертификатов и выполните процедуру Проверки сертификата, описанную ниже, для каждого из них.
Процедура проверки сертификата
Чтобы проверить сертификат в цепочке, выполните следующие действия.
- Убедитесь, что ни один из дочерних элементов в элементе Data не дублируется. Например, должен быть только один элемент PublicKey.
- Убедитесь, что элемент Data/PublicKey/KeyValue/RSAKeyValue/Modulus существует. Декодированные в base64 значения должны иметь длину 256 байт для всех сертификатов, кроме корневого. В корневом сертификате этот элемент должен иметь длину 128 байт.
- Убедитесь, что элемент Data/PublicKey/KeyValue/RSAKeyValue/Exponent существует. Декодированные значения base64 не должны превышать 4 байта.
- Если этот сертификат является конечным, проверьте следующее:
- Элемент KeyUsage содержит элемент EncryptKey со значением 1.
- Элемент Features содержит элемент COPPCertificate со значением 1.
- Если этот сертификат не является конечным, проверьте следующее:
- Модули и экспоненты из элемента Data/PublicKey точно соответствуют модулю и экспоненте из элемента Signature/KeyInfo предыдущего сертификата.
- Элемент KeyUsage содержит элемент SignCertificate со значением 1.
- Используйте хэш-алгоритм SHA-1 для хэширования каждого байта в элементе Data сертификата. Каждый байт от первого символа в теге <Data> до последнего символа в закрывающем <теге /Data> должен быть хэширован. Хэш-значение используется для проверка сертификата в списке отзыва сертификатов (CRL), как описано в разделе Списки отзыва сертификатов.
- Сравните хэш-значение из шага 6 с декодированием base64 элемента Signature/SignedInfo/Reference/DigestValue. Эти значения должны совпадать.
- Выполните процедуру Проверки подписи, описанную ниже.
- Если этот сертификат не является окончательным сертификатом в цепочке, сохраните значение Signature/KeyInfo/KeyValue/RSAKeyValue для следующей итерации цикла.
- Если этот сертификат является окончательным сертификатом в цепочке, убедитесь, что значение Signature/KeyInfo/KeyValue/RSAKeyValue соответствует открытому ключу Майкрософт. Открытый ключ Майкрософт имеет следующие значения в кодировке Base64:
Модуль:
pjoeWLSTLDonQG8She6QhkYbYott9fPZ8tHdB128ZETcghn5KHoyin7HkJEcPJ0Eg4UdSv a0KDIYDjA3EXd69R3CN2Wp/QyOo0ZPYWYp3NXpJ700tKPgIplzo5wVd/69g7j+j8M66W7V NmDwaNs9mDc1p2+VVMsDhOsV/Au6E+E=
Экспоненты:
AQAB
Процедура проверки подписи
Значение элемента SignatureValue вычисляется по элементу Data в соответствии со схемой цифровой подписи RSASSA-PSS, определенной в PKCS версии 2.1 (далее — PKCS). Чтобы проверить эту сигнатуру, выполните следующие действия.
- Декодирование значений Modulus и Exponent в элементе Signature/KeyInfo/KeyValue/RSAKeyValue. Эти значения определяют открытый ключ RSA сертификата подписи.
- Декодирование элемента Signature/SignatureValue.
- Вычисление операции RSASSA-PSS-Verify, определенной в разделе 8.1.2 PKCS.
Для операции 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 определена в приложении B.2 к PKCS. Для этой функции COPP использует следующие параметры:
- Хэш = SHA-1
- hLen = 20
Выходные данные операции RSASSA-PSS-Verify указывают, является ли подпись допустимой или недопустимой.
Связанные темы