14.10.2006 14:59:20Перечисление алгоритмов, которые соответствуют сертификату Ответов: 1
Шмыков Дима (Казань, компания Центр-Сервис, софт-отдел, lead developer)
Здравствуйте. У меня проблема. Я не могу перечислить алгоритмы, входящие в некоторую задаваемую группу алгоритмов системы, соответствующие заданному сертификату, без доступа к закрытому ключу ключевой пары сертификата. Я пока что не крут в использовании CryptoAPI. :(

Вот пример кода, как я делаю это сейчас..



[ccode]
HCERTSTORE hSystemStore = CertOpenSystemStore(NULL, _T("MY"));
if (hSystemStore == NULL)
{
return FALSE;
}

PCCERT_CONTEXT pCertContext = NULL;
BOOL bMustFree = FALSE;
HCRYPTPROV hProv = NULL;
DWORD dwKeySpec = 0;
while ((pCertContext = CertEnumCertificatesInStore(hSystemStore, pCertContext)) != NULL)
{
if (!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hProv, &dwKeySpec, &bMustFree))
{
continue;
}
if (hProv == NULL)
{
continue;
}
PROV_ENUMALGS_EX objEnumAlgs = {0};
DWORD dwAlgLen = 0;
DWORD dwFlag = CRYPT_FIRST;
while (CryptGetProvParam(hProv, PP_ENUMALGS_EX, (BYTE *)&objEnumAlgs, &dwAlgLen, dwFlag))
{
/*
здесь код, работающий с алгоритмом
*/
dwFlag = 0;
}
if (bMustFree)
{
CryptReleaseContext(hProv, 0);
}
}
[/ccode]

Когда исполняется этот код, то идет обращение к закрытому ключу, находящемуся в ключевой паре, ассоциированной с сертификатом. Есть еще и другая функция CryptoAPI, которая позволяет брать хендл hProv


[ccode]
BOOLEAN CRYPTFUNC CryptAcquireContext(HCRYPTPROV* phProv, LPCTSTR pszContainer, LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags);
[/ccode]

Но тогда для меня вопрос в получении идентификатора CSP, который ассоциирован с сертификатом. Дело в том, что CCERT_CONTEXT содержит CERT_INFO, которая имеет поле типа CERT_PUBLIC_KEY_INFO. Оттуда можно брать только алгоритм публичного ключа, и более ничего. Неужели информацию о CSP можно как-то получать из CERT_PUBLIC_KEY_INFO?
 
Ответы:
14.10.2006 15:01:47Шмыков Дима (Казань, компания Центр-Сервис, софт-отдел, lead developer)
Забыл еще
CertCloseStore(hSystemStore, 0);

:)