Статус: Активный участник
Группы: Участники
Зарегистрирован: 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(¶, (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;
}
Можно ли создать коректную подпись с помощью упрощенных функций, или все необходимо делать низкоуровневыми?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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.
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
Depish оставлено 28.10.2021(UTC)
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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.
Спасибо! понял как работает. А как можно определить какой тип подписи, отсоединеная или присоединеная, видел функции для верификации отсоединеной и присоединеной подписи, но как определить что подпись отсоединеная?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,162   Сказал «Спасибо»: 618 раз Поблагодарили: 2389 раз в 1880 постах
|
Автор: Depish  А как можно определить какой тип подписи, отсоединеная или присоединеная, видел функции для верификации отсоединеной и присоединеной подписи, но как определить что подпись отсоединеная?
а на входе разве не известно (разные имена файлов или ПО не понимает что на входе)? или в CMSG_STREAM_INFO указать для pfnStreamOutput функцию CryptMsgOpenToDecode CryptMsgUpdate ( буфер, например, 100 .. кб) если в pfnStreamOutput будет вызов - значит присоединенная и доступны уже частично данные для записи (то, что подписывалось) |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close