Статус: Новичок
Группы: Участники
Зарегистрирован: 08.10.2008(UTC) Сообщений: 9
|
Добрый день. Есть необходимость проверить действительность сертификата по CRL. Как я понял для начала надо проверить сам CRL, т.е. его ЭЦП. Вопрос как лучше это сделать? я использую следующий алгоритм: получаю подпись в структуре PCERT_SIGNED_CONTENT_INFO, потом пытаюсь получить открытый ключ - PCERT_PUBLIC_KEY_INFO, и затем вызвать функцию CryptVerifyCertificateSignature для собственно самой проверки. Проблема в том что не удается получить структуру содержащую открытый ключ - PCERT_PUBLIC_KEY_INFO, ниже приведен используемый код. Код:
// Get CRL PCERT_SIGNED_CONTENT_INFO
BYTE* pbDecSign;
DWORD cbDecSign;
if (!CryptDecodeObject(
pCRLContext->dwCertEncodingType,
X509_CERT,
pCRLContext->pbCrlEncoded,
pCRLContext->cbCrlEncoded,
NULL,
NULL,
&cbDecSign))
{
return FALSE;
}
// Allocated the needed buffer
pbDecSign = (BYTE*)malloc(cbDecSign);
if (!pbDecSign)
{
return FALSE;
}
// Call again to
if (!CryptDecodeObject(
pCRLContext->dwCertEncodingType,
X509_CERT,
pCRLContext->pbCrlEncoded,
pCRLContext->cbCrlEncoded,
NULL,
pbDecSign,
&cbDecSign))
{
return FALSE;
}
PCERT_SIGNED_CONTENT_INFO pCRLSignInfo;
pCRLSignInfo = (PCERT_SIGNED_CONTENT_INFO) pbDecSign;
// Get CRL CERT_PUBLIC_KEY_INFO
BYTE* pbPublicKey;
DWORD cbPublicKey;
if (!CryptDecodeObject(
pCRLContext->dwCertEncodingType,
X509_PUBLIC_KEY_INFO,
pCRLContext->pbCrlEncoded,
pCRLContext->cbCrlEncoded,
NULL,
NULL,
&cbPublicKey))
{
DWORD dw = GetLastError(); // функция попадает сюда, и происходит выход. dw = 2148086027.
dw = 0;
return FALSE;
}
// Allocated the needed buffer
pbPublicKey = (BYTE*)malloc(cbPublicKey);
if (!pbDecSign)
{
return FALSE;
}
// Call again to
if (!CryptDecodeObject(
pCRLContext->dwCertEncodingType,
X509_PUBLIC_KEY_INFO,
pCRLContext->pbCrlEncoded,
pCRLContext->cbCrlEncoded,
NULL,
pbPublicKey,
&cbPublicKey))
{
return FALSE;
}
PCERT_PUBLIC_KEY_INFO pCRLPublicKeyInfo;
pCRLPublicKeyInfo = (PCERT_PUBLIC_KEY_INFO) pbPublicKey;
// Verificate CRL signature
BOOL Result;
Result = CryptVerifyCertificateSignature(
NULL,
pCRLContext->dwCertEncodingType,
pCRLSignInfo->Signature.pbData,
pCRLSignInfo->Signature.cbData,
pCRLPublicKeyInfo);
(?) и еще правильно ли то что первый параметр CryptVerifyCertificateSignature имеет значение NULL, в MSDN написано следующее: "This parameter is not used and should be set to NULL. Windows Server 2003, Windows XP, and Windows 2000: A handle to the cryptographic service provider (CSP) used to verify the signature. This parameter's data type is HCRYPTPROV. NULL is passed unless there is a strong reason for passing in a specific cryptographic provider. Passing in NULL causes the default RSA or DSS provider to be acquired." а мое приложение может быть использовано как в Vista, так и в windows xр, получается что для висты можно оставить NULL, но для того чтобы приложение работало и в хр необходимо, получить контекст выбранного криптопровайдера(Крипто ПРО) и передавать его в функцию?
|