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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline BrainStorm  
#1 Оставлено : 5 сентября 2012 г. 4:19:29(UTC)
BrainStorm

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

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

Среда разработки: Qt 4.8.2 (VS 2008)
Компилируется нормально. Собираю под Windows 7 x64.
Для тестов поднял виртуалку Windows XP.

Создаю отделенную подпись (пока простую).

В результате под WinXP подписывается нормально, но не проверяет (CadesVerifyDetachedMessage() возвращает false, GetLastError() возвращает 0).
Тот же exeшник Под Win7 подпись не создает (CadesSignMessage возвращает false, GetLastError() возвращает 0), НО успешно проверяет подпись, сделанную под WinXP.

Подпись сгенерировал на тестовом УЦ. Подпись добавил в личные через КриптоПро CSP. Корневой сертификат добавил в доверенные корневые сертификаты.

Код:
Код:

#include <QtCore/QCoreApplication>

#include <windows.h>
#include <WinCryptEx.h>
#include <cades.h>
#include <iostream>
#include <vector>
#include <QByteArray>
#include <QFile>
#include <QDebug>

#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_OIWSEC_sha1;
    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();//{ &data[0] };
    DWORD cbToBeSigned = message_data.size();//{ (DWORD)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();
        DWORD cbToBeSigned = message_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.";


    return true;
}



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile fl_signed_new("page1_signed_new.jpg");
    QFile fl_signed("page1_signed.jpg");
    QFile fl("page1.jpg");
    QByteArray message_data ;
    QByteArray signed_msg;
    QByteArray signed_msg_readed;
    if ( fl.open(QIODevice::ReadOnly)) {
      message_data = fl.readAll();
      fl.close();
    }

    if ( fl_signed.open(QIODevice::ReadOnly)) {
      signed_msg_readed = fl_signed.readAll();
      fl_signed.close();
    }

    qDebug()<< "veryfy signed:" << (signmessageverify(signed_msg,message_data)?"Y":"N");
    qDebug()<< "veryfy readed:" << (signmessageverify(signed_msg_readed,message_data)?"Y":"N");

    signed_msg = signmessage(message_data);
    if ( fl_signed_new.open(QIODevice::WriteOnly) )
    {
      fl_signed_new.write(signed_msg);
      fl_signed_new.close();
    }

    return a.exec();
}
Offline Новожилова Елена  
#2 Оставлено : 5 сентября 2012 г. 16:20:25(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Offline BrainStorm  
#3 Оставлено : 7 сентября 2012 г. 2:22:02(UTC)
BrainStorm

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

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

Спасибо, лог снял. Половина проблем решилась :)
Windows XP и подписывает, и проверяет.

Осталась Windows 7 x64. Подпись проверяет, но подписывать не может.
1. Операционная система:
Windows 7 x64.
2. Какой продукт используете
UserPostedImage
3. Какую подпись создаете/проверяете (и создаете или проверяете)
Создание подписи (используются упрощённые функции)
4. Лог возникновения ошибки
Цитата:
[2284] .\CPSettings.cpp(193) : /Init/
[2284] cades.dll: {5340} /CadesSignMessage/ cades.cpp(2077) : (pSignPara=0x002AF9C4, fDetachedSignature=1, cToBeSigned=1, rgpbToBeSigned=0x002AF988, rgcbToBeSigned=0x002AF9C0, ppSignedBlob=0x002AF984)
[2284] cades.dll: {5340} /CadesSignMessageImpl/ cades.cpp(1962) : Hash algorithm deduced
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImplNamespace::UpdateSignedAttributes/ cades.cpp(379) : Signer does not have any of signing-certificate attributes
[2284] cpcspi: Thread: file:line function text xcode(dcode) level: 0
[2284] cpui: Thread: file:line function text xcode(dcode) level: 0
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImplNamespace::UpdateSignedAttributes/ cades.cpp(391) : Signer is updated successfully
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImpl/ cades.cpp(441) : Start
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImpl/ cades.cpp(454) : Copy of input structures is ready
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImpl/ cades.cpp(465) : Signer #0
[2284] cades.dll: {5340} /CadesMsgOpenToEncodeImplNamespace::CheckAlgorithms/ cades.cpp(415) : Exception thrown: _hr
[2284] cades.dll: {5340} /CadesMsgOpenToEncode/ cades.cpp(524) : (hMsg=0x00000000, GetLastError=0x80092004)
[2284] cades.dll: {5340} /CadesSignMessage/ cades.cpp(2097) : COleException, m_sc=0x80092004
Offline Новожилова Елена  
#4 Оставлено : 12 сентября 2012 г. 18:06:41(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Вы указываете алгоритм хэширования ГОСТ Р 34.11. А сертификат какой выбираете? ГОСТовый?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.