Пример получения доказательств достоверности подписи из сообщения с помощью низкоуровневых функций КриптоПро ЭЦП 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;