Пример получения доказательств достоверности подписи из сообщения с помощью низкоуровневых функций КриптоПро ЭЦП 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;
}
ALG_ID hashAlgId = CadesMsgGetSigningCertIdHashAlg(hMsg,0);
if(!hashAlgId)
{
CryptMsgClose(hMsg);
std::cout << "CadesMsgGetSigningCertIdHashAlg() failed" << std::endl;
return;
}
PCADES_BLOB_ARRAY pTimestamps = 0;
if(!CadesMsgGetSignatureTimestamps(hMsg, 0, &pTimestamps))
{
CryptMsgClose(hMsg);
std::cout << "CadesGetSignatureTimestamps() failed" << std::endl;
return;
}
if(!CadesFreeBlobArray(pTimestamps))
{
CryptMsgClose(hMsg);
std::cout << "CadesFreeBlobArray() failed" << std::endl;
return;
}
PCADES_BLOB_ARRAY pCerts = 0;
if(!CadesMsgGetCertificateValues(hMsg, 0, &pCerts))
{
CryptMsgClose(hMsg);
std::cout << "CadesGetCertificateValues() failed" << std::endl;
return;
}
if(!CadesFreeBlobArray(pCerts))
{
CryptMsgClose(hMsg);
std::cout << "CadesFreeBlobArray() failed" << std::endl;
return;
}
PCADES_BLOB_ARRAY pCRLs = 0;
PCADES_BLOB_ARRAY pOCSPs = 0;
if(!CadesMsgGetRevocationValues(hMsg, 0, &pCRLs, &pOCSPs))
{
CryptMsgClose(hMsg);
std::cout << "CadesGetRevocationValues() failed" << std::endl;
return;
}
PCADES_BLOB_ARRAY pCadesCTimestamps = 0;
if(!CadesMsgGetCadesCTimestamps(hMsg, 0, &pCadesCTimestamps))
{
CryptMsgClose(hMsg);
std::cout << "CadesMsgGetCadesCTimestamps() failed" << std::endl;
return;
}
if(!CadesFreeBlobArray(pCadesCTimestamps))
{
CryptMsgClose(hMsg);
std::cout << "CadesFreeBlobArray() failed" << std::endl;
return;
}
if(!CadesFreeBlobArray(pCRLs))
{
CryptMsgClose(hMsg);
CadesFreeBlobArray(pOCSPs);
std::cout << "CadesFreeBlobArray() failed" << std::endl;
return;
}
if(!CadesFreeBlobArray(pOCSPs))
{
CryptMsgClose(hMsg);
std::cout << "CadesFreeBlobArray() failed" << std::endl;
return;
}
if(!CryptMsgClose(hMsg))
{
std::cout << "CryptMsgGetParam() failed" << std::endl;
return;
}
std::cout << "All CAdES attributes obtained successfully." << std::endl;