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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Oleg15689  
#1 Оставлено : 22 сентября 2022 г. 17:53:23(UTC)
Oleg15689

Статус: Новичок

Группы: Участники
Зарегистрирован: 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
Offline Андрей *  
#2 Оставлено : 22 сентября 2022 г. 18:04:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Строка 17
Цитата:
DWORD cbMessage = (DWORD)strlen((char*)pbMessage) + 1;

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Oleg15689 оставлено 22.09.2022(UTC)
Offline Андрей *  
#3 Оставлено : 22 сентября 2022 г. 18:05:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
GetLastError = 80091007

The hash value is not correct. (0x80091007)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Oleg15689 оставлено 22.09.2022(UTC)
Offline Oleg15689  
#4 Оставлено : 22 сентября 2022 г. 18:18:29(UTC)
Oleg15689

Статус: Новичок

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

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