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

Уведомление

Icon
Error

6 Страницы«<23456>
Опции
К последнему сообщению К первому непрочитанному
Offline Kirill Sobolev  
#31 Оставлено : 11 мая 2010 г. 20:01:56(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Это подпись, а где добавление сертификата с использованием CryptMsgControl?
Техническую поддержку оказываем тут
Наша база знаний
Offline artsb  
#32 Оставлено : 11 мая 2010 г. 20:27:02(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Ох, сори. Спутал функции.
Я имел ввиду CryptSignMessage.
А вот как с помощью CryptMsgControl прицепить сертификат к подписи я так и не разобрался:

- не понятно, как получить HCRYPTMSG, учитывая, что ЭЦП у меня хранится в памяти как массив байт.
- как потом сохранить результат в файл.

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

Offline Kirill Sobolev  
#33 Оставлено : 11 мая 2010 г. 20:44:32(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
как получить HCRYPTMSG, учитывая, что ЭЦП у меня хранится в памяти как массив байт.

CryptMsgOpenToDecode, потом CryptMsgUpdate
Цитата:
как потом сохранить результат в файл

CryptMsgGetParam( .., CMSG_ENCODED_MESSAGE, ..)
Техническую поддержку оказываем тут
Наша база знаний
Offline artsb  
#34 Оставлено : 11 мая 2010 г. 20:49:07(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Большое спасибо. Буду разбираться.
Offline artsb  
#35 Оставлено : 11 мая 2010 г. 21:30:20(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Получил файл.
Пытаюсь проверить наличие подписи в нём, используя АРМ разбора конфликтных ситуаций:
1. открываю документ.
2. ставлю галку "ЭЦП в отдельном файле".
3. указываю полученный ранее файл.

Получаю ошибку: "Ошибка при декодировании файла. В ASN1 встречен неожиданный конец данных."

Вот код:
Код:
bool CertToECP3(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;

 hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, NULL, NULL, NULL);
 if(!hMsg) {
  return false;
 }

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

 if(!hCert) {
  CryptMsgClose(hMsg);  
  return false;
 }

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

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

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

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

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

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

 int hFile;
 hFile = FileCreate(ccFileName);

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

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

 delete [] bRes;
 CertFreeCertificateContext(hCert);
 CryptMsgClose(hMsg);
 return true;
}
Offline Kirill Sobolev  
#36 Оставлено : 11 мая 2010 г. 22:04:34(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Раз ЭЦП в отдельном файле то и CryptMsgOpenToDecode надо вызывать с CMSG_DETACHED_FLAG.
Техническую поддержку оказываем тут
Наша база знаний
Offline artsb  
#37 Оставлено : 11 мая 2010 г. 22:31:56(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Kirill Sobolev написал:
Раз ЭЦП в отдельном файле то и CryptMsgOpenToDecode надо вызывать с CMSG_DETACHED_FLAG.

Ок. Проверю завтра на работе. А сертификат там останется?

И ещё такой момент: файл получился не в формате PKCS#7
Offline artsb  
#38 Оставлено : 12 мая 2010 г. 12:53:27(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Флаг CMSG_DETACHED_FLAG не помог. Та же самая ошибка.
Пишу так:
Код:
hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, NULL, NULL, NULL);


На всякий случай скриншот:
UserPostedImage

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

Offline artsb  
#39 Оставлено : 12 мая 2010 г. 14:33:28(UTC)
artsb

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Ещё раз постараюсь полностью описать задачу:

Есть три файла:
1. some_document.xml - некий документ
2. some_cert.cer - сертификат в формате X509
3. some_ecp.sign - ЭЦП в формате PKCS#7, сделанная сертификатом выше для документа

Нужно "склеить" ЭЦП и сертификат, и засунуть в контейнер PKCS#7
Причём, пересоздавать ЭЦП нельзя.
И нужно, чтобы потом, при проверке подписи с помощью "АРМ разбора конфликтных ситуаций", можно было указать полученный файл в поле "ЭЦП в отдельном файле".

Вообще, возможно ли это? А то может я делаю то, что нельзя сделать :)

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

Offline Kirill Sobolev  
#40 Оставлено : 12 мая 2010 г. 14:50:53(UTC)
Кирилл Соболев

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

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

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