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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline smd44  
#1 Оставлено : 10 октября 2022 г. 16:17:22(UTC)
smd44

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

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

Сказал(а) «Спасибо»: 4 раз
Добрый день!
Есть задача подписать PDF усиленной квалифицированной подписью с использованием рутокена ("флешки").
Чтобы разобраться, пробую собирать и запускать примеры. Сертификат установлен в личное хранилище.

Взял из справочника по ЭЦП SDK:
Создание подписи (упрощённые функции)
На вход подаю файл PDF, функция завершается успехом. При попытке проверки результирующего файла через Инструменты КриптоПро (5.0.125000) получаю ошибку:
Выбранный файл не является подписью или повреждён.

Подпись и последующая проверка этого же документа через Инструменты КриптоПро завершается успешно.
Сравнение результирующих файлов показало, что в версии из примера в конце файла не хватает блока информации. При этом часть данных добавляется и совпадает с корректной версией.
Из того, что можно прочитать в недостающем куске, вижу информацию о субъекте и поставщике. При этом часть информации о поставщике присутствует и в моей, и в корректной версии

В примере поменял signPara.HashAlgorithm.pszObjId, поскольку с исходным попытка подписать заканчивалась ошибкой 0х80092004
Ниже код используемой функции
Код:
std::vector<BYTE> CreateSignSimpleExample(PCCERT_CONTEXT pContext, const std::vector<BYTE> &data)
 {
	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 = (LPSTR)szOID_CP_GOST_R3411_12_256; //был szOID_OIWSEC_sha1;

	CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
	cadesSignPara.dwCadesType = CADES_BES; 
	cadesSignPara.pSignerCert = pContext; 

	CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
	para.pSignMessagePara = &signPara;
	para.pCadesSignPara = &cadesSignPara;

	std::vector<BYTE> empty;

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

	PCRYPT_DATA_BLOB pSignedMessage = 0;

	if(!CadesSignMessage(&para, FALSE, 1, pbToBeSigned, cbToBeSigned, &pSignedMessage))
	{
		std::cout << "CadesSignMessage() failed" << std::endl;
		//std::cout << getLastError() << std::endl; 
		return empty;
	}

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

	if(!CadesFreeBlob(pSignedMessage))
	{
		std::cout << "CadesFreeBlob() failed" << std::endl;
		std::cout << "Error:" << GetLastError() << std::endl;
		return empty;
	}
	return message;
 }


Что я делаю не так?

Отредактировано пользователем 10 октября 2022 г. 16:37:15(UTC)  | Причина: Не указана

Offline smd44  
#2 Оставлено : 10 октября 2022 г. 17:11:31(UTC)
smd44

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

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

Сказал(а) «Спасибо»: 4 раз
Нашел, что нужно было добавить не хватающие данные через
signPara.cMsgCert = 1;
signPara.rgpMsgCert = &pContext;
Теперь они появляются, однако в самом начале и в конце файлов есть разница, которая всё ещё не позволяет пройти проверку подписи

Код:
std::vector<BYTE> CreateSignSimpleExample(PCCERT_CONTEXT pContext, const std::vector<BYTE> &data)
 {
	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 = (LPSTR)szOID_CP_GOST_R3411_12_256; //szOID_OIWSEC_sha1;

	signPara.cMsgCert = 1;
	signPara.rgpMsgCert = &pContext;

	CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
	cadesSignPara.dwCadesType = CADES_BES; 
	cadesSignPara.pSignerCert = pContext; 

	CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
	para.pSignMessagePara = &signPara;
	para.pCadesSignPara = &cadesSignPara;

	std::vector<BYTE> empty;

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

	PCRYPT_DATA_BLOB pSignedMessage = 0;
	if(!CadesSignMessage(&para, FALSE, 1, pbToBeSigned, cbToBeSigned, &pSignedMessage))
	{
		ofs << "CadesSignMessage() failed" << std::endl;
		//ofs << getLastError() << std::endl;
		return empty;
	}

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

	if(!CadesFreeBlob(pSignedMessage))
	{
		ofs << "CadesFreeBlob() failed" << std::endl;
		ofs << "Error:" << GetLastError() << std::endl;
		return empty;
	}
	return message;
 }
Offline smd44  
#3 Оставлено : 12 октября 2022 г. 9:35:34(UTC)
smd44

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

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

Сказал(а) «Спасибо»: 4 раз
Почему полученная таким способом подпись не проходит проверку в КриптоПро?
Offline Андрей *  
#4 Оставлено : 12 октября 2022 г. 9:46:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: smd44 Перейти к цитате

однако в самом начале и в конце файлов есть разница, которая всё ещё не позволяет пройти проверку подписи


Что имеется ввиду, каким ПО анализируется?

Выложить pdf и подпись тестовые можете?
Через стороннее ПО проверяли, хеш файла не сходится?
Техническую поддержку оказываем тут
Наша база знаний
Offline smd44  
#5 Оставлено : 12 октября 2022 г. 10:18:06(UTC)
smd44

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

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

Сказал(а) «Спасибо»: 4 раз
Пробовал упростить задачу и подписать txt файл с содержимым "1234567890"
Итог аналогичный. Получаю файл размером около 4 Кб. Моя версия не проходит проверку в Инструментах КриптоПро с той же ошибкой (Выбранный файл не является подписью или повреждён).
Сравнивал через Compare в Notepad++, Utf8
Разница в 3 местах:
1)Самое начало (правильная версия справа)
begin.JPG (46kb) загружен 8 раз(а).
2) Самый конец (правильная версия сверху)
end.JPG (54kb) загружен 4 раз(а).

3) строка с датой-временем подписания, там разница только в цифрах, они читаемы и не вызывают вопросов.
В остальном файлы совпадают.
Выложить целиком, к сожалению, не могу, боюсь скомпрометировать личные данные. Вероятно, ошибка в передаваемых CadesSignMessage параметрах

Отредактировано пользователем 12 октября 2022 г. 10:23:58(UTC)  | Причина: Не указана

Offline Андрей *  
#6 Оставлено : 12 октября 2022 г. 10:47:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Сделать тестовый сертификат и проверять с ним.
https://testgost2012.cryptopro.ru/certsrv/



Структуры смотреть через ASN.1 редакторы или через https://lapo.it/asn1js/
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#7 Оставлено : 12 октября 2022 г. 10:49:24(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: smd44 Перейти к цитате
Вероятно, ошибка в передаваемых CadesSignMessage параметрах

Обычно возникают ошибки в функциях и отказ. Здесь же - формируется cms.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#8 Оставлено : 12 октября 2022 г. 10:51:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
test (pfx).zip (3kb) загружен 1 раз(а).

пароль: 123456
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
smd44 оставлено 12.10.2022(UTC)
Offline smd44  
#9 Оставлено : 12 октября 2022 г. 11:38:47(UTC)
smd44

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: Андрей * Перейти к цитате
test (pfx).zip (3kb) загружен 1 раз(а).

пароль: 123456


Попытка подписать с помощью Вашего сертификата:
test.zip (2kb) загружен 1 раз(а).
Offline Андрей *  
#10 Оставлено : 12 октября 2022 г. 11:50:23(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
неправильно сохраняете CMS в файл.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.