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

Уведомление

Icon
Error

6 Страницы«<456
Опции
К последнему сообщению К первому непрочитанному
Offline Kirill Sobolev  
#51 Оставлено : 12 мая 2010 г. 20:05:13(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Можете подробнее про это рассказать? Как вы это узнали?

Ваш код запустил с Вашими же данными Angel Все отработало без ошибок, но на выходе как раз не PKCS#7, хотя ASN.1 парсится нормально.
Цитата:
А если на выходе будет не PKCS#7,

Надо сделать чтоб был PKCS#7.
Техническую поддержку оказываем тут
Наша база знаний
Offline artsb  
#52 Оставлено : 12 мая 2010 г. 20:32:06(UTC)
artsb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.05.2010(UTC)
Сообщений: 103
Откуда: центр Вселенной

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Kirill Sobolev написал:
на выходе как раз не PKCS#7, хотя ASN.1 парсится нормально.

А в чём может быть причина?

Может сертификат не в том виде?

Отредактировано пользователем 12 мая 2010 г. 20:36:02(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#53 Оставлено : 13 мая 2010 г. 15:19:52(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Сертификат в том виде, CertCreateCertificateContext же нормально отрабатывает.
Техническую поддержку оказываем тут
Наша база знаний
Offline artsb  
#54 Оставлено : 25 мая 2010 г. 20:13:13(UTC)
artsb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.05.2010(UTC)
Сообщений: 103
Откуда: центр Вселенной

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Так никто не знает как решить эту проблему?
Просто, очень нужно.
Offline artsb  
#55 Оставлено : 26 мая 2010 г. 19:35:00(UTC)
artsb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.05.2010(UTC)
Сообщений: 103
Откуда: центр Вселенной

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Генерирую подпись для документа и цепляю к ней сертификат (код писался быстро и только для теста):
Код:
bool SignString(BYTE* SignedBlob, int lenSignedBlob, BYTE* bCert, int iCertLen, std::string& SignString)
{
// SignedBlob - массив данных, которые нужно подписать
// lenSignedBlob - длина массива SignedBlob
// bCert - сертификат
// iCertLen - размер массива bCert
// SignString - результат
	DWORD						len_sign;
	BOOL						ret;
	HCRYPTMSG					hMsg = NULL;
	CRYPT_ALGORITHM_IDENTIFIER	HashAlgorithm;
	DWORD						HashAlgSize;
	CMSG_SIGNER_ENCODE_INFO		SignerEncodeInfo;
	CMSG_SIGNER_ENCODE_INFO		SignerEncodeInfoArray[1];
	CERT_BLOB					SignerCertBlob;
	CERT_BLOB					SignerCertBlobArray[1];
	std::vector< BYTE >			pbEncodedBlob;
	CMSG_SIGNED_ENCODE_INFO		SignedMsgEncodeInfo;
	DWORD						flags = 0;

	PCCERT_CONTEXT              hCert = NULL;
	HCRYPTPROV					hCryptProv;
	DWORD						keytype = 0;
	CRYPT_DATA_BLOB             cdb;


	hCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, bCert, iCertLen);
	if(!hCert)
	 goto err;

	ret = CryptAcquireCertificatePrivateKey(hCert, 0, NULL,
										   &hCryptProv,&keytype,NULL);
	if(!ret)
	 goto err;

	HashAlgSize = sizeof(HashAlgorithm);
    memset(&HashAlgorithm, 0, HashAlgSize);
	HashAlgorithm.pszObjId = szOID_PKCS_7;
    
	memset(&SignerEncodeInfo, 0, sizeof(CMSG_SIGNER_ENCODE_INFO));
    SignerEncodeInfo.cbSize = sizeof(CMSG_SIGNER_ENCODE_INFO);
	SignerEncodeInfo.pCertInfo = hCert->pCertInfo;
    SignerEncodeInfo.hCryptProv = hCryptProv;
	SignerEncodeInfo.dwKeySpec = keytype;
    SignerEncodeInfo.HashAlgorithm = HashAlgorithm;
	SignerEncodeInfo.pvHashAuxInfo = NULL;
    
    SignerEncodeInfoArray[0] = SignerEncodeInfo;

	SignerCertBlob.cbData = hCert->cbCertEncoded;
    SignerCertBlob.pbData = hCert->pbCertEncoded;

    SignerCertBlobArray[0] = SignerCertBlob;
	memset(&SignedMsgEncodeInfo, 0, sizeof(CMSG_SIGNED_ENCODE_INFO));
	SignedMsgEncodeInfo.cbSize = sizeof(CMSG_SIGNED_ENCODE_INFO);
    SignedMsgEncodeInfo.cSigners = 1;
    SignedMsgEncodeInfo.rgSigners = SignerEncodeInfoArray;
	SignedMsgEncodeInfo.cCertEncoded = 1;

	cdb.cbData = hCert->cbCertEncoded;
	cdb.pbData = hCert->pbCertEncoded;
	SignedMsgEncodeInfo.rgCertEncoded = &cdb;
	SignedMsgEncodeInfo.cCrlEncoded = 0;
	SignedMsgEncodeInfo.rgCrlEncoded = NULL;

	flags = CMSG_DETACHED_FLAG;

    len_sign =CryptMsgCalculateEncodedLength(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,flags,CMSG_SIGNED,&SignedMsgEncodeInfo,NULL,static_cast< DWORD >(lenSignedBlob));
    if(len_sign==NULL)
	{
		ShowMessage("CryptMsgCalculateEncodedLength");
		goto err;
	}

	hMsg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,flags,CMSG_SIGNED,&SignedMsgEncodeInfo,NULL,NULL);
	if(!hMsg)
	{
		ShowMessage("CryptMsgOpenToEncode");
		goto err;
	}
	
	ret=CryptMsgUpdate(hMsg,SignedBlob,static_cast< DWORD >(lenSignedBlob),TRUE);
	if(!ret)
	{
		ShowMessage("CryptMsgUpdate");
		goto err;
	}

	pbEncodedBlob.resize(len_sign,0);

    ret=CryptMsgGetParam(hMsg,CMSG_CONTENT_PARAM,0,&pbEncodedBlob[0],&len_sign);
	if(!ret)
	{
		ShowMessage("CryptMsgGetParam");
		goto err;
	}

	SignString.clear();
	SignString.append((char*)&pbEncodedBlob[0],(unsigned int)len_sign);

	if(hMsg) CryptMsgClose(hMsg);

	if(hCryptProv!=NULL)
	 CryptReleaseContext(hCryptProv,0);

	CertFreeCertificateContext(hCert);
	
	return true;
err:

	if(hMsg) CryptMsgClose(hMsg);

	if(hCryptProv!=NULL)
	 CryptReleaseContext(hCryptProv,0);

    CertFreeCertificateContext(hCert);

	return false;
}

В результате получаю PKCS#7 с подписью и сертификатом. Файл получается как раз такой как мне нужен. Вот только мне нужно не генерировать подпись, а просто её прицепить.

Сравнил полученный мною файл с использованием кода из предыдущего поста и полученный кодом из этого поста: различий мало, но они есть. Из-за чего они могут появляться?

Отредактировано пользователем 26 мая 2010 г. 19:39:16(UTC)  | Причина: Не указана

Offline artsb  
#56 Оставлено : 27 мая 2010 г. 19:35:36(UTC)
artsb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.05.2010(UTC)
Сообщений: 103
Откуда: центр Вселенной

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Всё. Разобрался. Теперь всё работает. Позже отпишусь в чём было дело.
Offline artsb  
#57 Оставлено : 28 мая 2010 г. 14:17:11(UTC)
artsb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.05.2010(UTC)
Сообщений: 103
Откуда: центр Вселенной

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Последняя функция CertToECP работала правильно. Всё дело было в том, что сертификат, который я брал из БД был подпорчен: другая софтина, при добавлении сертификата в БД, дописывает в конец NULL'ы. Почему она это делает ещё придётся разобраться.
Ещё раз функция:
Код:
bool CertToECP(const char *ccFileName, Byte *bECP, int iECPLen, Byte *bCert, int iCertLen) {

// ccFileName - путь куда будет сохранён результат
// bECP - файл ЭЦП (байтовый массив)
// iECPLen - длина массива
// bCert - файл сертификата (байтовый массив)
// iCertLen - длина массива

 HCRYPTMSG hMsg;
 CRYPT_INTEGER_BLOB cib;
 PCCERT_CONTEXT hCert = NULL;
 Byte *bRes;
 unsigned long int iSize;

 hCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, bCert, iCertLen);

 if(!hCert) {
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, NULL, NULL, NULL);
 if(!hMsg) {

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 if(!CryptMsgUpdate(hMsg, bECP, iECPLen, true)) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 cib.cbData = iCertLen;
 cib.pbData = bCert;

 if(!CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &cib)) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);                                                             

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 iSize = 0;
 if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, NULL, &iSize)) {      
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 bRes = new Byte[iSize];
 if(!bRes) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, bRes, &iSize)) {
  delete [] bRes;
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 int hFile;
 hFile = FileCreate(ccFileName);

 if(hFile) {
  FileWrite(hFile, bRes, iSize);

  FileClose(hFile);
 }
 else {
  delete [] bRes;
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
				FORMAT_MESSAGE_FROM_SYSTEM |
				FORMAT_MESSAGE_IGNORE_INSERTS,
				NULL,
				GetLastError(),
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
				(LPTSTR) &lpMsgBuf,
				0,
				NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 delete [] bRes;
 CertFreeCertificateContext(hCert);
 CryptMsgClose(hMsg);
 return true;
}


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