Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline BrainStorm  
#1 Оставлено : 17 августа 2012 г. 3:01:22(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2011(UTC)
Сообщений: 17

Прошу помощи. Уже кажется все проверил, но никак не работает.

Пишу на Qt. Код рабочий. Все работало исправно. Потом необходимо было отдать машину с разработкой (отформатив все), и все развернуть на новой. После разворачивания новой системы работающий до этого код перестал работать (понятно, что поменялось многое, ОС, версии Qt, КриптоПро). Пытался проверить на чистых виртуалках (WinXP), тоже не работает.
Пытался подписывать/проверять подпись со старыми сертификатами (все неистекшие, все проверил), так и с новыми тестовыми (сгенерил с тестового УЦ тут на криптопро) - не работает.
Ставил последние CSP и SDK.

Дано:
ОС: Windows 7 x64 (разработка) + Windows XP (виртуалка для тестирования)
Среда разработки: Qt 4.8.2 (компилятор Microsoft Visual C++)


Ставил:
1. Крипто Про CSP 3.6.6497
2. Крипто Про SDK 1.05.0970
3. Добавлял корневые сертификаты в "доверенные корневые сертификаты"
4. Добавлял личный сертификат в Личное через интерфейс КриптоПро.
Я так понимаю, этого достаточно?

Дебаггер говорит:
Цитата:
(1fd8.2f18): C++ EH exception - code e06d7363 (first chance)
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\WinSxS\x86_cryptopro.pki.cades_a6d31b994cfcddc4_1.0.1667.0_none_d1b5c7508bb46455\cades.dll -
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
(1fd8.2f18): C++ EH exception - code e06d7363 (first chance)
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
CadesSignMessage() failed
0
(1fd8.2f18): C++ EH exception - code e06d7363 (first chance)
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
CadesVerifyMessage() failed
0
N
(1fd8.2f18): C++ EH exception - code e06d7363 (first chance)
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
Exception at 0x76d3b9bc, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in cades!CryptoPro::PKI::CAdES::CCrlValidatedID::get_crlIdentifier
CadesVerifyMessage() failed
0



На всякий случай привожу код.
Проверяю так:
Код:
QFile fl("page1.jpg");
    QByteArray message_data ;
    if ( fl.open(QIODevice::ReadOnly) )
    {
      message_data = fl.readAll();
      fl.close();
    }
    QByteArray signed_msg;
    qDebug()<<"size:"<<message_data.size();
    signed_msg = signmessage(message_data);
    qDebug()<< (signmessageverify(signed_msg,message_data)?"Y":"N");

функции тут:
Код:

#ifndef CRYPTO_H
#define CRYPTO_H

#include <QObject>
#include <QByteArray>

#include <windows.h>
#include <mainwindow.h>
#include <WinCryptEx.h>
#include <cades.h>
#include <iostream>
#include <vector>
#include <QByteArray>
#include <QFile>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlField>

#define CERT_STORE_NAME  L"MY"
#define SIGNER_NAME  L"Andrey" //"test_flash"

#pragma comment(lib, "crypt32")
#pragma comment(lib, "cades")


static QByteArray signmessage(const QByteArray &message_data) {
    PCCERT_CONTEXT pContext;
    HCERTSTORE hStoreHandle;

    if ( !( hStoreHandle = CertOpenStore(
       CERT_STORE_PROV_SYSTEM,
       0,
       NULL,
       CERT_SYSTEM_STORE_CURRENT_USER,
       CERT_STORE_NAME))) {
         qDebug()<< "The MY store could not be opened.\n";
    }

    if(pContext = CertFindCertificateInStore(
       hStoreHandle,
       X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
       0,
       CERT_FIND_SUBJECT_STR,
           SIGNER_NAME,
       NULL)) {
        qDebug()<< "The signer's certificate was found.\n";
    } else {
        qDebug()<< "Signer certificate not found.\n";
    }

    CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
    signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
    signPara.pSigningCert = pContext; // 0 for window
    signPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411;

    CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
    cadesSignPara.dwCadesType = CADES_BES;

    CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
    para.pSignMessagePara = &signPara;
    para.pCadesSignPara = &cadesSignPara;


    std::vector<BYTE> data(10,25);

    BYTE *pbToBeSigned = (BYTE*)message_data.data();
    DWORD cbToBeSigned = message_data.size();

    PCRYPT_DATA_BLOB pSignedMessage = 0;
    if(!CadesSignMessage(&para,true,1,(const BYTE**)&pbToBeSigned,&cbToBeSigned,
        &pSignedMessage))
    {
        qDebug()<< "CadesSignMessage() failed";
        qDebug()<< GetLastError();
        return NULL;
    }


    std::vector<BYTE> message(pSignedMessage->cbData);
    std::copy(pSignedMessage->pbData,
        pSignedMessage->pbData + pSignedMessage->cbData,message.begin());
    QByteArray message_signed((char*)(pSignedMessage->pbData), pSignedMessage->cbData);

    if(!CadesFreeBlob(pSignedMessage))
    {
        qDebug()<< "CadesFreeBlob() failed";
        return NULL;
    }

    qDebug()<< "OK! Signed successful!";

    return message_signed;
}


static bool signmessageverify(const QByteArray &message_signed, const QByteArray &message_data) {

    CRYPT_VERIFY_MESSAGE_PARA cryptVerifyPara = { sizeof(cryptVerifyPara) };
        cryptVerifyPara.dwMsgAndCertEncodingType =
            X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;

        CADES_VERIFICATION_PARA cadesVerifyPara = { sizeof(cadesVerifyPara) };
        cadesVerifyPara.dwCadesType = CADES_BES;

        CADES_VERIFY_MESSAGE_PARA verifyPara = { sizeof(verifyPara) };
        verifyPara.pVerifyMessagePara = &cryptVerifyPara;
        verifyPara.pCadesVerifyPara = &cadesVerifyPara;

        PCADES_VERIFICATION_INFO pVerifyInfo = 0;

        BYTE *pbToBeSigned = (BYTE*)message_data.data();//{ &data[0] };
        DWORD cbToBeSigned = message_data.size();//{ (DWORD)data.size() };

        if(!CadesVerifyDetachedMessage(&verifyPara,0,
            (const BYTE*)(message_signed.constData()),message_signed.size(),1,(const BYTE**)&pbToBeSigned,&cbToBeSigned,&pVerifyInfo))
        {
            CadesFreeVerificationInfo(pVerifyInfo);
            qDebug() << "CadesVerifyMessage() failed";
            qDebug()<< GetLastError();
            return false;
        }


        if(pVerifyInfo->dwStatus != CADES_VERIFY_SUCCESS )
            qDebug() << "CAdES-BES message is not verified successfully.";
        else
            qDebug() << "CAdES-BES message verified successfully.";

        qDebug()<< "OK!";

    return true;
}

#endif // CRYPTO_H


RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.