Развернуть все
Свернуть все

Проверка подписи CAdES-BES (низкоуровневые функции)

Пример проверки подписи 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;
    }

    // Конец проверки сообщения