Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Это подпись, а где добавление сертификата с использованием CryptMsgControl? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.05.2010(UTC) Сообщений: 103 Откуда: центр Вселенной
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Ох, сори. Спутал функции. Я имел ввиду CryptSignMessage. А вот как с помощью CryptMsgControl прицепить сертификат к подписи я так и не разобрался: - не понятно, как получить HCRYPTMSG, учитывая, что ЭЦП у меня хранится в памяти как массив байт. - как потом сохранить результат в файл. Отредактировано пользователем 11 мая 2010 г. 20:32:59(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:как получить HCRYPTMSG, учитывая, что ЭЦП у меня хранится в памяти как массив байт. CryptMsgOpenToDecode, потом CryptMsgUpdate Цитата:как потом сохранить результат в файл CryptMsgGetParam( .., CMSG_ENCODED_MESSAGE, ..) |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.05.2010(UTC) Сообщений: 103 Откуда: центр Вселенной
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Большое спасибо. Буду разбираться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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;
}
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Раз ЭЦП в отдельном файле то и CryptMsgOpenToDecode надо вызывать с CMSG_DETACHED_FLAG. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.05.2010(UTC) Сообщений: 103 Откуда: центр Вселенной
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Kirill Sobolev написал:Раз ЭЦП в отдельном файле то и CryptMsgOpenToDecode надо вызывать с CMSG_DETACHED_FLAG. Ок. Проверю завтра на работе. А сертификат там останется? И ещё такой момент: файл получился не в формате PKCS#7
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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);
На всякий случай скриншот: Отредактировано пользователем 12 мая 2010 г. 13:47:33(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Вообще возможно. Выложите эти файлы в архиве здесь. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close