Статус: Новичок
Группы: Участники
Зарегистрирован: 22.09.2022(UTC) Сообщений: 2
Сказал(а) «Спасибо»: 2 раз
|
 sign.txt.sgn (3kb) загружен 3 раз(а). sign.txt (1kb) загружен 3 раз(а).Добрый день. Получаю ошибку при проверке подписи в C/C++ созданной в КриптоПро ЭЦП Browser plug-in. Использую метод CadesVerifyDetachedMessage https://docs.cryptopro.r...esverifydetachedmessage,верификация не проходит. Подскажите почему я получаю ошибку верификации? Далее прилагаю листинги кода JavaScript, С++ и проверки подписи, а также файлы подписи и сообщения. Заранее спасибо за любую помощь. Создаю отделенную подпись строки "abc" - кодирую ее в BASE64 "YWJj" и передаю ее в эту функцию: Код:function SignCreate(sCertName, message) {
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
const oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(cadesplugin.CAPICOM_CURRENT_USER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
const oStoreCerts = yield oStore.Certificates;
const oCertificates = yield oStoreCerts.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, sCertName);
const certsCount = yield oCertificates.Count;
if (certsCount === 0) {
const err = "Certificate not found: " + sCertName;
messagingService.showError(err);
return args[1](err);
}
const oCertificate = yield oCertificates.Item(1);
const oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);
yield oSigner.propset_Certificate(oCertificate);
yield oSigner.propset_CheckCertificate(true);
const oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
// Значение свойства ContentEncoding должно быть задано до заполнения свойства Content
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(message);
try {
const sSignedMessage = yield oSignedData.SignCades(oSigner, cadesplugin.CADESCOM_CADES_BES, true, cadesplugin.CADESCOM_ENCODE_BASE64);
yield oStore.Close();
return args[0](sSignedMessage);
} catch (e) {
const err = cadesplugin.getLastError(e);
messagingService.showError("Failed to create signature. Error: " + err);
yield oStore.Close();
return args[1](err);
}
}
, resolve, reject);
});
}
Проверка подписи на https://dss.cryptopro.ru/Verify/Verify прошла успешно. Код:Результат проверки
Название документа
sign.txt.sgn
Подпись 1
Результат проверки
Подпись действительна
Дополнительная информация
Отсутствует
Дополнительная информация о подписи
Формат подписи CAdES
Подпись в формате BES
Время подписи
22.09.2022 13:22:11
Информация о сертификате
Субъект
O=Working, OU=Рабочий сертификат, CN=test, E=test@mail.com
Издатель
CN="Тестовый УЦ ООО ""КРИПТО-ПРО""", O="ООО ""КРИПТО-ПРО""", L=Москва, S=г. Москва, C=RU, STREET=ул. Сущёвский вал д. 18, ИНН=001234567890, ОГРН=1234567890123
Серийный номер
7C0006AA95865B2169C68E692C00010006AA95
Срок действия
22.09.2022 09:35:49 - 22.12.2022 09:45:49
Отпечаток сертификата
434D76723DFBC82C74EEEFDB4E07ADAF1153DA2E
Консольная утилита cryptcp.x64.exe проверяет подпись успешно. Код:cryptcp.x64.exe -verify -cadesbes -detached sign.txt
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2022.
Утилита командной строки для подписи и шифрования файлов.
Будет использован следующий сертификат:
Субъект:Working, Рабочий сертификат, test, test@mail.com
Действителен с 22.09.2022 09:35:49 по 22.12.2022 09:45:49
Цепочки сертификатов проверены.
Папка '.\':
sign.txt... Проверка подписи...
Автор подписи: Working, Рабочий сертификат, test, test@mail.com
Подпись проверена.
[ErrorCode: 0x00000000]
Пишу свой код проверки на C/C++: Код:int verify_signature(vector<BYTE> cms, vector<BYTE> msg) {
PCCERT_CONTEXT cert_context = NULL;
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* pbMessage = (BYTE*)&msg[0];
DWORD cbMessage = (DWORD)strlen((char*)pbMessage) + 1;
const BYTE* MessageArray[] = { pbMessage };
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;
const BYTE* pbDetachedSignBlob = (const BYTE*)&cms[0];
DWORD cbDetachedSignBlob = (DWORD)cms.size();
// верификация подписи
BOOL verified = CadesVerifyDetachedMessage(
&verifyPara,
0,
pbDetachedSignBlob, // указатель на подпись
cbDetachedSignBlob, // длина подписи
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
&pVerifyInfo);
cout << "pVerifyInfo->dwStatus = " << pVerifyInfo->dwStatus << endl;
cout << "GetLastError = " << hex << GetLastError() << endl;
if (!verified) {
CadesFreeVerificationInfo(pVerifyInfo);
std::cout << "CadesVerifyDetachedMessage() failed" << std::endl;
return -1;
}
if (pVerifyInfo->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(pVerifyInfo)) {
std::cout << "CadesFreeVerificationInfo() failed" << std::endl;
return -1;
}
return 0;
}
std::vector<BYTE> readFile(const char* filename) {
std::basic_ifstream<BYTE> file(filename, std::ios::binary);
return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)), std::istreambuf_iterator<BYTE>());
}
void main() {
vector<BYTE> cms = readFile("sign.txt.sgn");
vector<BYTE> msg = readFile("sign.txt");
vector<BYTE> cms_dec = StrUtil::base64_decode(string(cms.begin(), cms.end()));
cout << "File 1: " << "`" << string(msg.begin(), msg.end()) << "`" << endl;
cout << "File 2: " << "`" << string(cms.begin(), cms.end()) << "`" << endl;
cout << "Verify: " << CryptoGost::verify_signature(cms_dec, msg) << endl;
}
Результат запуска: Код:File 1: `abc`
File 2: `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`
pVerifyInfo->dwStatus = 8
pVerifyInfo->pSignerCert = 0000019822137D30
GetLastError = 80091007
CadesVerifyDetachedMessage() failed
Verify1: ffffffff
|