15.09.2005 14:57:45Вылетает ошибка при проверке подписи Ответов: 3
Алексей
Пытаюсь проверить подпись под сообщением в формате PKCS#7, но вылетает ошибка "Неправильная подпись".
Вот код проверки подписи:
if (kl)
hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, hCryptProv, NULL, NULL);

if (kl && !hMsg)
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

if (kl && !CryptMsgUpdate(hMsg, pbMessage, cbMessage, TRUE))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

if (kl && !CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, 0, NULL, &cbSignerCertInfo))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

if (kl && !(pbSignerCertInfo = (PCERT_INFO)malloc(cbSignerCertInfo)))
{
WriteLog("Не могу выделить память под информацию о подписчике.");
kl = false;
}

if (kl && !CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, 0, pbSignerCertInfo, &cbSignerCertInfo))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

if (kl && !CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, NULL, &cbBuffer))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

if(kl && !(pbBuffer = (BYTE*)malloc(cbBuffer)))
{
WriteLog("Не могу выделить память под выходные данные.");
kl = false;
}

if (kl && !CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, pbBuffer, &cbBuffer))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}


if (kl)
{
kl = false;
if (hSystemStore = CertOpenStore(CERT_STORE_PROV_MSG, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, hCryptProv, 0, hMsg))
if (otprCert = CertGetSubjectCertificateFromStore(hSystemStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbSignerCertInfo))
{
pbSignerCertInfo = otprCert->pCertInfo;
kl = true;
}

}

if (kl && !CryptMsgControl(hMsg, 0, CMSG_CTRL_VERIFY_SIGNATURE, pbSignerCertInfo))
{
WriteLog((char *)(const char *)DecodeError());
kl = false;
}

Эта ошибка вылетает при вызове функции CryptMsgControl. В чем может быть проблема?
 
Ответы:
16.09.2005 10:35:18Kirill Sobolev
Код вроде верный, может действительно неправильная подпись?
03.09.2007 2:07:58sql
Использую аналогичный код, и он работает на cryptopro 3.0 и не работает на cryptopro 2.0 . Хотя и сертификаты тоже разные. Может быть в них дело?
03.09.2007 10:59:30Kirill Sobolev
Что значит сертификаты разные? У 2.0 и 3.0 отличий в плане проверки подписи нет, поддерживается и 94 и 2001 ГОСТ.