| ||||
| ||||
Здравствуйте. У меня проблема. Я не могу перечислить алгоритмы, входящие в некоторую задаваемую группу алгоритмов системы, соответствующие заданному сертификату, без доступа к закрытому ключу ключевой пары сертификата. Я пока что не крут в использовании 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? | ||||
Ответы: | ||||
| ||||
Забыл еще CertCloseStore(hSystemStore, 0); :) | ||||