Пример проверки подписи 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; } // Конец проверки сообщения