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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Depish  
#1 Оставлено : 28 октября 2021 г. 13:11:25(UTC)
Depish

Статус: Активный участник

Группы: Участники
Зарегистрирован: 12.07.2021(UTC)
Сообщений: 39
Российская Федерация

Сказал(а) «Спасибо»: 10 раз
Взял код из примера создания подписи CADES_BES с помощью упрощенных функций, но подпись создается без сертификата и ни как не проверяется.

Фаил подписи:
sign.zip (1kb) загружен 1 раз(а).

Код:
bool FileSigner::signFile(const SignOptions& signOptions, CertificatePtr cert) {
    if (!FileExists(signOptions.file_in)) {
        LOG_WARNING << "File " << signOptions.file_in << " is not exists, exit with false";
        return false;
    }

    if (!cert) {
        LOG_ERROR << "Certificate is null";
        return false;
    }

    CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
    signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
    signPara.pSigningCert = CertDuplicateCertificateContext(cert->certContext);
    signPara.HashAlgorithm.pszObjId = (LPSTR)GetHashOid(cert->certContext);

    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;
    ReadFileToVector(signOptions.file_in, data);

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

    PCRYPT_DATA_BLOB pSignedMessage = 0;
    if(!CadesSignMessage(&para, (signOptions.detached ? TRUE : FALSE)
                         ,(!signOptions.detached ? 1 : 1/* count elements in pbToBeSigned*/), pbToBeSigned, cbToBeSigned, &pSignedMessage)) {
        LOG_ERROR << "CadesSignMessage() failed! Last Error: " << GetLastError();
        return false;
    }

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

    SaveVectorToFile(signOptions.file_out, message);
    LOG_INFO << "Save signed data to " << signOptions.file_out << ", write " << message.size() << " bytes";

    if(!CadesFreeBlob(pSignedMessage))
        LOG_ERROR << "CadesFreeBlob() failed";

    return true;
}


Можно ли создать коректную подпись с помощью упрощенных функций, или все необходимо делать низкоуровневыми?
Offline Андрей *  
#2 Оставлено : 28 октября 2021 г. 13:43:46(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,162
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Нужно указать в структуре CRYPT_SIGN_MESSAGE_PARA, чтобы вложился.

https://docs.microsoft.c...-crypt_sign_message_para

Цитата:

cMsgCert

Number of elements in the rgpMsgCert array of CERT_CONTEXT structures. If set to zero no certificates are included in the signed message.

rgpMsgCert

Array of pointers to CERT_CONTEXT structures to be included in the signed message. If the pSigningCert is to be included, a pointer to it must be in the rgpMsgCert array.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Depish оставлено 28.10.2021(UTC)
Offline Depish  
#3 Оставлено : 28 октября 2021 г. 14:50:03(UTC)
Depish

Статус: Активный участник

Группы: Участники
Зарегистрирован: 12.07.2021(UTC)
Сообщений: 39
Российская Федерация

Сказал(а) «Спасибо»: 10 раз
Автор: Андрей * Перейти к цитате
Нужно указать в структуре CRYPT_SIGN_MESSAGE_PARA, чтобы вложился.

https://docs.microsoft.c...-crypt_sign_message_para

Цитата:

cMsgCert

Number of elements in the rgpMsgCert array of CERT_CONTEXT structures. If set to zero no certificates are included in the signed message.

rgpMsgCert

Array of pointers to CERT_CONTEXT structures to be included in the signed message. If the pSigningCert is to be included, a pointer to it must be in the rgpMsgCert array.


Спасибо! понял как работает.

А как можно определить какой тип подписи, отсоединеная или присоединеная, видел функции для верификации отсоединеной и присоединеной подписи, но как определить что подпись отсоединеная?
Offline Андрей *  
#4 Оставлено : 28 октября 2021 г. 15:02:35(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,162
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Автор: Depish Перейти к цитате

А как можно определить какой тип подписи, отсоединеная или присоединеная, видел функции для верификации отсоединеной и присоединеной подписи, но как определить что подпись отсоединеная?


а на входе разве не известно (разные имена файлов или ПО не понимает что на входе)?

или в CMSG_STREAM_INFO
указать для pfnStreamOutput функцию
CryptMsgOpenToDecode
CryptMsgUpdate ( буфер, например, 100 .. кб)

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