none
Проверка подписи CRL RRS feed

  • Вопрос

  • Добрый день всем. Есть необходимость программно проверить действительность подписи CRL файла.

    Использую вот такой код:

    #include <iostream>
    #include <windows.h> 
    #include <wincrypt.h>
    #pragma comment (lib,"Crypt32.lib")
    
    using namespace std;
    
    void main(){
    	wchar_t* pwszCrlFileName = L"D:\\CRL.crl";
    	wchar_t* pwszIssuerCertFileName = L"D:\\Cert.cer";
    
    	bool boolResult = false;
    	DWORD dwError = 0x00000000;
    
    	CRL_CONTEXT* pCrlContext;
    	boolResult = CryptQueryObject(
    		CERT_QUERY_OBJECT_FILE,
    		pwszCrlFileName,
    		CERT_QUERY_CONTENT_FLAG_CRL,
    		CERT_QUERY_FORMAT_FLAG_BINARY,
    		0,0,0,0,0,0,
    		(const void**)&pCrlContext
    		);
    	dwError = GetLastError();
    
    	CERT_CONTEXT* pIssuerCertContext;
    	boolResult = CryptQueryObject(
    		CERT_QUERY_OBJECT_FILE,
    		pwszIssuerCertFileName,
    		CERT_QUERY_CONTENT_FLAG_CERT,
    		CERT_QUERY_FORMAT_FLAG_BINARY,
    		0,0,0,0,0,0,
    		(const void**)&pIssuerCertContext
    		);
    	dwError = GetLastError();
    
    	boolResult = CryptVerifyCertificateSignatureEx(
    		0,
    		X509_ASN_ENCODING,
    		CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL,
    		pCrlContext,
    		CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT,
    		pIssuerCertContext,
    		0,0
    		);
    	dwError = GetLastError();
    	system("PAUSE");
    }
    
    Все сертификаты в DER кодировке, проверено. Все функции возвращают true в ходе работы. Но! После работы первых двух функций GetLastError() выдает 0x00000000, а вот после работы последней 0x0000007f "The specified procedure could not be found.", несмотря на то, что функция вернула true. Также если для проверки подписи CRL подсунуть неверный сертификат удостоверяющего центра то функция волне адекватно возвращает false, а GetLastError() - 0x80090006. В чем моя ошибка или это является особенностью работы функции, хотя и очень странной 

    28 октября 2010 г. 8:34

Ответы

  • Проверяйте GetLastError() только тогда, когда функция завершилась неудачно, т.е. в вашем случае CryptVerifyCertificateSignatureEx должна вернуть 0. А так как она возвращает ненулевое значение, то все хорошо и вызов GetLastError() не нужен. Тем более GetLastError() может возвращать код ошибки, даже если функция выполнилась успешно (ваш случай).

    "However, some functions also set the last-error code when they succeed" - из описания функции GetLastError

    • Помечено в качестве ответа Abolmasov Dmitry 8 ноября 2010 г. 9:09
    3 ноября 2010 г. 10:01

Все ответы

  • Проверяйте GetLastError() только тогда, когда функция завершилась неудачно, т.е. в вашем случае CryptVerifyCertificateSignatureEx должна вернуть 0. А так как она возвращает ненулевое значение, то все хорошо и вызов GetLastError() не нужен. Тем более GetLastError() может возвращать код ошибки, даже если функция выполнилась успешно (ваш случай).

    "However, some functions also set the last-error code when they succeed" - из описания функции GetLastError

    • Помечено в качестве ответа Abolmasov Dmitry 8 ноября 2010 г. 9:09
    3 ноября 2010 г. 10:01
  • Честно говоря я сам к такому выводу пришел, спасибо за ответ
    4 ноября 2010 г. 9:39