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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline son  
#1 Оставлено : 16 февраля 2012 г. 21:57:04(UTC)
son

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

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

Доброго времени суток.
возникла проблема:
1. создал ЭЦП при помощи функции CryptSignMessage
2. ЭЦП без проблем проверяется функцией CryptVerifyDetachedMessageSignature
3. Потребовалось проверить утилиткой csptest -

csptest -keyset -verify GOST -in son.dat -signature son.sgn -certificate son.crt
CSP (Type:75) v3.6.4071 KC2 Release Ver:3.6.5152 OS:Windows CPU:IA32 FastCode:READY,ENABLED.
AcquireContext: OK. HCRYPTPROV: 1411528
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
Public key imported from cert file: son.crt
Hash object created with alg: GOST 0x801E
The data buffer has been hashed.
An error occurred in running the program.
.\ctkey.c:2397:Bad Signature.
Error number 80090006 (2148073478).
Invalid Signature.


Total: SYS: 0.031 sec USR: 0.000 sec UTC: 0.031 sec
[ErrorCode: 0x80090006]

Причем, раньше когда создавал ЭЦП через CryptSignHash - получалось проверять.
http://rghost.ru/36551705
Online Андрей Писарев  
#2 Оставлено : 17 февраля 2012 г. 1:11:01(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2247 раз в 1753 постах
son написал:
Доброго времени суток.
возникла проблема:
1. создал ЭЦП при помощи функции CryptSignMessage
2. ЭЦП без проблем проверяется функцией CryptVerifyDetachedMessageSignature
3. Потребовалось проверить утилиткой csptest -

csptest -keyset -verify GOST -in son.dat -signature son.sgn -certificate son.crt
CSP (Type:75) v3.6.4071 KC2 Release Ver:3.6.5152 OS:Windows CPU:IA32 FastCode:READY,ENABLED.
AcquireContext: OK. HCRYPTPROV: 1411528
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
Public key imported from cert file: son.crt
Hash object created with alg: GOST 0x801E
The data buffer has been hashed.
An error occurred in running the program.
.\ctkey.c:2397:Bad Signature.
Error number 80090006 (2148073478).
Invalid Signature.


Total: SYS: 0.031 sec USR: 0.000 sec UTC: 0.031 sec
[ErrorCode: 0x80090006]

Причем, раньше когда создавал ЭЦП через CryptSignHash - получалось проверять.
http://rghost.ru/36551705




Алексей Михайлович,
возможно участки кода приведенные здесь,
помогут участникам форума ответить на вопрос :)




p.s. чтобы не вышло как в прошлый раз - без ответа\решения вопроса.
p.s.2) и не помешало бы вкладывать сертификат подписчика в ЭЦП (pkcs7)

Отредактировано пользователем 17 февраля 2012 г. 1:21:49(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline son  
#3 Оставлено : 17 февраля 2012 г. 13:39:18(UTC)
son

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

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

День добрый!

Код:
1. Создание подписи 

PCCERT_CONTEXT m_certCont;
// bsCertData - данные сертификата, dwSize - размер, szData - подписываемые данные
m_certCont = CertCreateCertificateContext(X509_ASN_ENCODING	| PKCS_7_ASN_ENCODING, bsCertData, dwSize);
....
CRYPT_KEY_PROV_INFO pCryptKeyProvInfo;		
pCryptKeyProvInfo.pwszProvName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
pCryptKeyProvInfo.pwszContainerName = bsContName;
pCryptKeyProvInfo.dwProvType = 75;
pCryptKeyProvInfo.dwFlags = 0;
pCryptKeyProvInfo.cProvParam = 0;
pCryptKeyProvInfo.rgProvParam = NULL;
pCryptKeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;

BOOL ret = CertSetCertificateContextProperty(m_cert.getContext(), CERT_KEY_PROV_INFO_PROP_ID, 0, &pCryptKeyProvInfo);

.....
// szData - gjlgbcsdftvst lfyyst 
BYTE* pbMessage = (BYTE*)szData;
DWORD cbMessage = (DWORD)strlen((char*) pbMessage)+1;    

//--------------------------------------------------------------------
// Определение размера подписи и распределение памяти.
// Создаем и заполняем структуру для создания цифроовой подписи
CRYPT_SIGN_MESSAGE_PARA  SigParams;

SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
SigParams.pSigningCert = m_certCont;
SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;


const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;

if(CryptSignMessage(
		&SigParams,              // указатель на SigParams
		TRUE,                    // подпись создается отдельно 
		1,                       // число сообщений
		MessageArray,            // сообщение
		MessageSizeArray,        // длина сообщения
		NULL,                    // буфер для подписи
		&cbSignedMessageBlob)){   // размер буфера

	// выделяем память под подпись
	if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob])){
		throw CCryptoError("Ошибка выделения памяти под подпись",GetLastError());		 
	}

	// формируем подпись
	if(!CryptSignMessage(
		&SigParams,            // указатель на SigParams
		TRUE,                  // подпись создается отдельно 
		1,                     // число сообщений
		MessageArray,          // сообщение
		MessageSizeArray,      // длина сообщения
		pbSignedMessageBlob,   // буфер для подписи
		&cbSignedMessageBlob)) // размер буфера
	{
		throw CCryptoError("Ошибка формирования подписи",GetLastError());		 
	}
	
2. Верификация 	

PCCERT_CONTEXT m_certCont;
// bsCertData - данные сертификата, dwSize - размер, szData - проверяемые данные

m_certCont = CertCreateCertificateContext(X509_ASN_ENCODING	| PKCS_7_ASN_ENCODING, bsCertData, dwSize);
....
CRYPT_KEY_PROV_INFO pCryptKeyProvInfo;		
pCryptKeyProvInfo.pwszProvName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
pCryptKeyProvInfo.pwszContainerName = bsContName;
pCryptKeyProvInfo.dwProvType = 75;
pCryptKeyProvInfo.dwFlags = 0;
pCryptKeyProvInfo.cProvParam = 0;
pCryptKeyProvInfo.rgProvParam = NULL;
pCryptKeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;

BOOL ret = CertSetCertificateContextProperty(m_cert.getContext(), CERT_KEY_PROV_INFO_PROP_ID, 0, &pCryptKeyProvInfo

...

CRYPT_VERIFY_MESSAGE_PARA VerifyParams;

// Заполнение структуры для верификации

VerifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
VerifyParams.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
VerifyParams.hCryptProv = 0;
VerifyParams.pfnGetSignerCertificate = MyGetSignerCertificateCallback;
VerifyParams.pvGetArg = (void*)m_certCont;

BYTE* pbMessage = (BYTE*)szData;
DWORD cbMessage = (DWORD)strlen((char*) pbMessage)+1;

const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;

// верификация подписи
if(!CryptVerifyDetachedMessageSignature(
	&VerifyParams,          // указатель на структуру VerifyParams
	0,                      // 
	pbSignature,    // указатель на подпись
	dwSignLen,    // длина подписи
	1,                      // число сообщений
	MessageArray,           // сообщение
	MessageSizeArray,       // длина сообщения
	&m_certCont)){      // указатель на сертификат
		throw CCryptoError("Ошибка проверки подписи",GetLastError());
	}
	
}
Online Андрей Писарев  
#4 Оставлено : 17 февраля 2012 г. 14:06:20(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2247 раз в 1753 постах
покажи еще код - считывания данных для подписания

написал в PM

Отредактировано пользователем 17 февраля 2012 г. 14:07:10(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Kirill Sobolev  
#5 Оставлено : 17 февраля 2012 г. 14:08:49(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
csptest -keyset -verify

не работает с PKCS#7.
для проверки PKCS#7 нужно использовать -sfsign -verify или -lowsign -verify.
Техническую поддержку оказываем тут
Наша база знаний
Offline son  
#6 Оставлено : 17 февраля 2012 г. 14:14:58(UTC)
son

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

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

Да собственно в том примере, что выложил, я передавал данные из тестовой формы - просто строка "test"

функция подписи
DWORD STDMETHODCALLTYPE CKeyPair::createSign(LPCTSTR szData,LPCTSTR certData){
..


Online Андрей Писарев  
#7 Оставлено : 17 февраля 2012 г. 14:22:28(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2247 раз в 1753 постах
укажи сертификат пользователя
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = сертификат
Техническую поддержку оказываем тут
Наша база знаний
Offline son  
#8 Оставлено : 17 февраля 2012 г. 14:29:01(UTC)
son

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

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

csptest -sfsign -verify GOST -in son.dat -signature son.sgn -my XXX XXX XXX
CSP (Type:75) v3.6.4071 KC2 Release Ver:3.6.5152 OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0:
Subject: C=RU, L=??????, O=????? ????, OU=???????? ?????, CN=????? ??????? ??????????
Valid : 14.09.2010 - 14.09.2011
Issuer : E=xxx@xxxxxx.ru, C=RU, S=Moscow, L=Moscow, O=XXXXX, OU=Promo, CN=SEDOV UC

An error occurred in running the program.
.\signtsf.c:650:Signature was NOT verified

Error number 8009310b (2148086027).
ASN1 bad tag value met.

Total: SYS: 0.000 sec USR: 0.016 sec UTC: 0.062 sec
[ErrorCode: 0x8009310b]
Online Андрей Писарев  
#9 Оставлено : 17 февраля 2012 г. 14:34:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2247 раз в 1753 постах
а -detached разве не нужно?


проверил так отсоединенную ЭЦП (pkcs7 + цепочка сертификатов):

csptest -sfsign -verify -in c:\setup.exe -signature c:\setup.exe.sig -detached

Цитата:
Detached Signature was verified OK
Total: SYS: 0.094 sec USR: 1.594 sec UTC: 2.125 sec
[ErrorCode: 0x00000000]

Отредактировано пользователем 17 февраля 2012 г. 14:44:13(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline son  
#10 Оставлено : 17 февраля 2012 г. 14:53:42(UTC)
son

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

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

Архив с файлами сертификата подписи проверяемых данных

csptest -sfsign -verify GOST -in son.dat -detached -signature son.sgn -my XXXXXXX
CSP (Type:75) v3.6.4071 KC2 Release Ver:3.6.5152 OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0:
Subject: C=RU, L=??????, O=????? ????, OU=???????? ?????, CN=????? ??????? ??????????
Valid : 14.09.2010 - 14.09.2011
Issuer : E=xx@xxxxxxx.ru, C=RU, S=Moscow, L=Moscow, O=XXXDXX, OU=Promo, CN=SEDOV UC

#0:
Subject: C=RU, L=??????, O=????? ????, OU=???????? ?????, CN=????? ??????? ??????????
Valid : 14.09.2010 - 14.09.2011
Issuer : E=xx@xxxxxxx.ru, C=RU, S=Moscow, L=Moscow, O=XXXDXX, OU=Promo, CN=SEDOV UC

An error occurred in running the program.
.\signtsf.c:678:Detached Signature was NOT verified

Error number 80090006 (2148073478).
Invalid Signature.

Total: SYS: 0.047 sec USR: 0.000 sec UTC: 0.062 sec
[ErrorCode: 0x80090006]
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.