Пример проверки подписи CAdES-BES с помощью низкоуровневых функций КриптоПро ЭЦП SDK
C++
HCRYPTMSG hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,0,0,0,0);
if (!hMsg)
{
std::cout << "CryptMsgOpenToDecode() failed" << std::endl;
return;
}
if (!CryptMsgUpdate(hMsg, &message[0], (DWORD)message.size(), TRUE))
{
CryptMsgClose(hMsg);
std::cout << "CryptMsgUpdate() failed" << std::endl;
return;
}
// Проверка на соответствие типу CAdES-BES при помощи функции CadesMsgIsType.
// Данная проверка приведена здесь в качестве примера использования
// функции CadesMsgIsType и не является обязательной при проверке подписи.
BOOL bResult = false;
if (!CadesMsgIsType (hMsg, 0, CADES_BES, &bResult))
{
CryptMsgClose(hMsg);
std::cout << "CadesMsgIsType() failed" << std::endl;
return;
}
if (!bResult)
{
CryptMsgClose(hMsg);
std::cout << "Message is not CAdES-BES message." << std::endl;
return;
}
std::cout << "Message is CAdES-BES message." << std::endl;
// Проверка подписи CAdES-BES
PCADES_VERIFICATION_INFO pInfo = 0;
CADES_VERIFICATION_PARA verificationPara = { sizeof(verificationPara) };
verificationPara.dwCadesType = CADES_BES;
if (!CadesMsgVerifySignature(hMsg, 0, &verificationPara, &pInfo))
{
CadesFreeVerificationInfo(pInfo);
CryptMsgClose(hMsg);
std::cout << "CadesMsgVerifySignature() failed" << std::endl;
return;
}
if (pInfo->dwStatus != CADES_VERIFY_SUCCESS )
std::cout << "CAdES-BES message is not verified successfully." << std::endl;
else
std::cout << "CAdES-BES message verified successfully." << std::endl;
if(!CadesFreeVerificationInfo(pInfo))
{
CryptMsgClose(hMsg);
std::cout << "CadesFreeVerificationInfo() failed" << std::endl;
return;
}
if(!CryptMsgClose(hMsg))
{
std::cout << "CryptMsgGetParam() failed" << std::endl;
return;
}
// Конец проверки сообщения