списки отзыва сертификатов.
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
В этом разделе описывается, как изучить список отзыва сертификатов (CRL) для отозванных драйверов при использовании протокола COPP.
Список отзыва сертификатов содержит хэши отозванных сертификатов и может быть предоставлен и подписан только корпорацией Майкрософт. Список отзыва сертификатов распространяется с помощью лицензий на управление цифровыми правами (DRM). CRL может отозвать любой сертификат в цепочке сертификатов драйвера. Если какой-либо сертификат в цепочке отозван, этот сертификат и все сертификаты под ним в цепочке также отозваны.
Чтобы получить список отзыва сертификатов, приложение должно использовать пакет SDK для формата Windows Media версии 9 или более поздней и выполнить следующие действия:
- Вызовите WMCreateReader , чтобы создать объект средства чтения пакета SDK для формата Windows Media.
- Запрос объекта средства чтения для интерфейса IWMDRMReader .
- Вызовите IWMDRMReader::GetDRMProperty со значением g_wszWMDRMNet_Revocation, чтобы получить список отзыва сертификатов. Этот метод необходимо вызвать дважды: один раз, чтобы получить размер выделяемого буфера, и один раз для заполнения буфера. Второй вызов возвращает строку, содержащую список отзыва сертификатов. Вся строка закодирована в кодировке Base-64.
- Декодирование строки в кодировке Base-64. Для этого можно использовать функцию CryptStringToBinary . Эта функция является частью CryptoAPI.
Примечание
Чтобы использовать интерфейс IWMDRMReader , необходимо получить статическую библиотеку DRM от корпорации Майкрософт и связать приложение с этим файлом библиотеки. Дополнительные сведения см. в разделе "Получение необходимой библиотеки DRM" документации по пакету SDK для формата Windows Media.
Если список отзыва отзыва сертификатов отсутствует на компьютере пользователя, метод GetDRMProperty возвращает NS_E_DRM_UNSUPPORTED_PROPERTY. В настоящее время единственный способ получить список отзыва сертификатов — получить лицензию DRM.
В следующем коде показана функция, возвращающая список отзыва сертификатов:
////////////////////////////////////////////////////////////////////////
// Name: GetCRL
// Description: Gets the certificate revocation list (CRL).
//
// ppBuffer: Receives a pointer to the buffer that contains the CRL.
// pcbBuffer: Receives the size of the buffer returned in ppBuffer.
//
// The caller must free the returned buffer by calling CoTaskMemFree.
////////////////////////////////////////////////////////////////////////
HRESULT GetCRL(BYTE **ppBuffer, DWORD *pcbBuffer)
{
IWMReader *pReader = NULL;
IWMDRMReader *pDrmReader = NULL;
HRESULT hr = S_OK;
// DRM attribute data.
WORD cbAttributeLength = 0;
BYTE *pDataBase64 = NULL;
WMT_ATTR_DATATYPE type;
// Buffer for base-64 decoded CRL.
BYTE *pCRL = NULL;
DWORD cbCRL = 0;
// Create the WMReader object.
hr = WMCreateReader(NULL, 0, &pReader);
// Query for the IWMDRMReader interface.
if (SUCCEEDED(hr))
{
hr = pReader->QueryInterface(
IID_IWMDRMReader, (void**)&pDrmReader);
}
// Call GetDRMProperty once to find the size of the buffer.
if (SUCCEEDED(hr))
{
hr = pDrmReader->GetDRMProperty(
g_wszWMDRMNET_Revocation,
&type,
NULL,
&cbAttributeLength
);
}
// Allocate a buffer.
if (SUCCEEDED(hr))
{
pDataBase64 = (BYTE*)CoTaskMemAlloc(cbAttributeLength);
if (pDataBase64 == NULL)
{
hr = E_OUTOFMEMORY;
}
}
// Call GetDRMProperty again to get the property.
if (SUCCEEDED(hr))
{
hr = pDrmReader->GetDRMProperty(
g_wszWMDRMNET_Revocation,
&type,
pDataBase64,
&cbAttributeLength
);
}
// Find the size of the buffer for the base-64 decoding.
if (SUCCEEDED(hr))
{
BOOL bResult = CryptStringToBinary(
(WCHAR*)pDataBase64, // Base-64 encoded string.
0, // Null-terminated.
CRYPT_STRING_BASE64,
NULL, // Buffer (NULL).
&cbCRL, // Receives the size of the buffer.
NULL, NULL // Optional.
);
if (!bResult)
{
hr = __HRESULT_FROM_WIN32(GetLastError());
}
}
// Allocate a buffer for the CRL.
if (SUCCEEDED(hr))
{
pCRL = (BYTE*)CoTaskMemAlloc(cbCRL);
if (pCRL == NULL)
{
hr = E_OUTOFMEMORY;
}
}
// Base-64 decode to get the CRL.
if (SUCCEEDED(hr))
{
BOOL bResult = CryptStringToBinary(
(WCHAR*)pDataBase64, // Base-64 encoded string.
0, // Null-terminated.
CRYPT_STRING_BASE64,
pCRL, // Buffer.
&cbCRL, // Receives the size of the buffer.
NULL, NULL // Optional.
);
if (!bResult)
{
hr = __HRESULT_FROM_WIN32(GetLastError());
}
}
// Return the buffer to the caller. Caller must free the buffer.
if (SUCCEEDED(hr))
{
*ppBuffer = pCRL;
*pcbBuffer = cbCRL;
}
else
{
CoTaskMemFree(pCRL);
}
CoTaskMemFree(pDataBase64);
SAFE_RELEASE(pReader);
SAFE_RELEASE(pDrmReader);
return hr;
}
Затем приложение должно убедиться, что список отзыва сертификатов действителен. Для этого убедитесь, что сертификат списка отзыва сертификатов, который является частью списка отзыва сертификатов, напрямую подписан корневым сертификатом Майкрософт и имеет значение элемента SignCRL, равное 1. Кроме того, проверьте подпись списка отзыва сертификатов.
После проверки списка отзыва сертификатов приложение может сохранить его. Номер версии списка отзыва сертификатов также следует проверить перед сохранением, чтобы приложение всегда сохраняло последнюю версию.
Список отзыва сертификатов имеет следующий формат.
Section | Содержимое |
---|---|
Заголовок | 32-разрядное число записей CRL версии 32-разрядной версии |
Записи отзыва | Несколько 160-разрядных записей отзыва |
Сертификат | Длина 32-разрядного сертификатаСостоверяемый сертификат с 32-разрядной длиной |
Сигнатура | 8-разрядный тип сигнатуры16-разрядная длина подписи Сигнатура Сигнатуры с 16-разрядной длиной |
Примечание
Все целочисленные значения являются неподписанными и представлены в нотации big-endian (сетевой порядок байтов).
Описания разделов списка отзыва сертификатов
-
Заголовка
-
Заголовок содержит номер версии списка отзыва сертификатов и количество записей отзыва в списке отзыва. Список отзыва сертификатов может содержать ноль или несколько записей.
-
Записи отзыва
-
Каждая запись отзыва является 160-разрядным дайджестом отозванного сертификата. Сравните этот дайджест с элементом DigestValue в сертификате.
-
Сертификат
-
Раздел certificate содержит 32-разрядное значение, указывающее длину (в байтах) XML-сертификата и его цепочки сертификатов, а также массив байтов, содержащий XML-сертификат центра сертификации (ЦС) и цепочку сертификатов, в которой в качестве корневого каталога используется майкрософт. Сертификат должен быть подписан ЦС, который имеет полномочия для выдачи CRL.
Примечание
Сертификат не должен завершаться со значением NULL.
-
Подпись
-
Раздел сигнатуры содержит тип и длину подписи, а также саму цифровую подпись. 8-разрядный тип имеет значение 2, чтобы указать, что используется SHA-1 с 1024-разрядным шифрованием RSA. Длина — это 16-битовое значение, содержащее длину цифровой подписи в байтах. Цифровая подпись вычисляется по всем предыдущим разделам списка отзыва сертификатов.
Подпись вычисляется с помощью схемы цифровой подписи RSASSA-PSS, определенной в PKCS No 1 (версия 2.1). Хэш-функция — SHA-1, которая определена в федеральном стандарте обработки информации (FIPS) 180-2, а функция создания маски — MGF1, которая определена в разделе B.2.1 в PKCS No 1 (версия 2.1). Операции RSASP1 и RSAVP1 используют RSA с 1024-разрядным модулю с экспонентой проверки 65537.
Связанные темы