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

Уведомление

Icon
Error

6 Страницы<12345>»
Опции
К последнему сообщению К первому непрочитанному
Offline Новожилова Елена  
#21 Оставлено : 17 апреля 2013 г. 14:35:59(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
С отделенной подписью проблема. CryptoAPI умеет добавлять подписи только по уже известным алгоритмам хэширования. Тем, которые записаны в поле digestAlgorithms.

Есть предположение, что именно по этим алгоритмам хэшируются данные при вызове CryptMsgUpdate.

По этой же причине не удается добавить вторую отделенную подпись на любом алгоритме хэширования, отличном от использованного в первой - данных-то нет, хэш посчитать не получится.

Но, если заполнить поле DigestAlgorithms нужным алгоритмом (алгоритмами) заранее, то теоретически (я не проверяла) можно будет создавать подписи.

Остается вопрос, как это можно сделать при помощи CryptoAPI.

UPD. Возможно, сработает вариант "добавить подпись - удалить подпись". Но это уже на любителя :-)

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

thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
Boris@Serezhkin.com оставлено 17.04.2013(UTC)
Offline Юрий  
#22 Оставлено : 17 апреля 2013 г. 14:40:38(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Автор: Новожилова Елена Перейти к цитате
С отделенной подписью проблема. CryptoAPI умеет добавлять подписи только по уже известным алгоритмам хэширования. Тем, которые записаны в поле digestAlgorithms.

Есть предположение, что именно по этим алгоритмам хэшируются данные при вызове CryptMsgUpdate.

По этой же причине не удается добавить вторую отделенную подпись на любом алгоритме хэширования, отличном от использованного в первой - данных-то нет, хэш посчитать не получится.

Но, если заполнить поле DigestAlgorithms нужным алгоритмом (алгоритмами) заранее, то теоретически (я не проверяла) можно будет создавать подписи.

Остается вопрос, как это можно сделать при помощи CryptoAPI.

Вручную хэш посчитайте (CryptSignHash), да добавьте потом в качестве со-подписи.
И ещё - что значит "данных-то нет"? Подписываете то что?

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

С уважением,
Юрий Строжевский
Offline Boris@Serezhkin.com  
#23 Оставлено : 17 апреля 2013 г. 18:27:08(UTC)
Boris@Serezhkin.com

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

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Юрий Перейти к цитате

Вручную хэш посчитайте (CryptSignHash), да добавьте потом в качестве со-подписи.
И ещё - что значит "данных-то нет"? Подписываете то что?


Аксиома: вручную можно сделать все.
Речь идет о том, что CryptMsgControl(CMSG_CTRL_ADD_SIGNER)
падает на добавлении первой Detach подписи.
"данных-то нет" означает, что сами данные есть, а данных подписи нет.
И самое удивительное для Attached подписи данный вариант работает на ура.

Смотря на поведение системы можно сделать вывод:
Для Attached подписи алгоритм хэширования берется из сертификата,
что позволяет смешивать ГОСТ и RSA.
А для Detach подписи CryptMsgControl(CMSG_CTRL_ADD_SIGNER)пытается
взять алгоритм из существующей подписи. А его и нетути, и соответственно
нельзя мешать гост с не гостом. Вроде такое поведение говорит об Ошибке?Drool

Спасибо Елене, объяснила.

И напоследок самое веселое:
CryptSignMessage и иже с ним попал в список
"Unsupported CryptoAPI 2.0 in Windows CE 5.0"

Как ни крути, а придется считать хэш вручную.
или иметь две заготовки для пустой подписи и подкладывать их...
Offline Юрий  
#24 Оставлено : 17 апреля 2013 г. 18:36:58(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Автор: Boris@Serezhkin.com Перейти к цитате
Автор: Юрий Перейти к цитате

Вручную хэш посчитайте (CryptSignHash), да добавьте потом в качестве со-подписи.
И ещё - что значит "данных-то нет"? Подписываете то что?


Аксиома: вручную можно сделать все.
Речь идет о том, что CryptMsgControl(CMSG_CTRL_ADD_SIGNER)
падает на добавлении первой Detach подписи.
"данных-то нет" означает, что сами данные есть, а данных подписи нет.
И самое удивительное для Attached подписи данный вариант работает на ура.

Смотря на поведение системы можно сделать вывод:
Для Attached подписи алгоритм хэширования берется из сертификата,
что позволяет смешивать ГОСТ и RSA.
А для Detach подписи CryptMsgControl(CMSG_CTRL_ADD_SIGNER)пытается
взять алгоритм из существующей подписи. А его и нетути, и соответственно
нельзя мешать гост с не гостом. Вроде такое поведение говорит об Ошибке?Drool

Спасибо Елене, объяснила.

И напоследок самое веселое:
CryptSignMessage и иже с ним попал в список
"Unsupported CryptoAPI 2.0 in Windows CE 5.0"

Как ни крути, а придется считать хэш вручную.
или иметь две заготовки для пустой подписи и подкладывать их...

...Нет, жестко как-то первый раз написал...
Вообщем мой ответ Елене был на "...как это сделать с помощью Crypto API - не знаю". А не знает она как это сделать с помощью высокоуровневых функций Crypto API. С помощью низкоуровневых всё будет отлично.

P.S.: И всё-таки посмотрите может ли это сделать КриптоАРМ.

Отредактировано пользователем 17 апреля 2013 г. 18:43:34(UTC)  | Причина: Не указана

С уважением,
Юрий Строжевский
Offline Boris@Serezhkin.com  
#25 Оставлено : 17 апреля 2013 г. 20:29:26(UTC)
Boris@Serezhkin.com

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

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Юрий Перейти к цитате
P.S.: И всё-таки посмотрите может ли это сделать КриптоАРМ.


Сделать что?
Создать подпись - ДА
Добавить подпись - полуДА
неважно какая подпись, при добавлении сравнивает алгоритмы и не дает смешивать.
Кто его об этом спрашивал?
Т.е. поведение криптоарма не проясняет поднятый вопрос.

Я правильно понимаю, что спустившись на третий уровень сумрака....
1 CryptSignMrssage
2 CryptMsgControl
3 CryptSignHas
Я смогу получить Detach подпись для смеси алгоритмов?
Только там у меня пока Brick wall -собрать правильно обратно из кусочков
Не смотрел пока внимательно.
Offline Юрий  
#26 Оставлено : 17 апреля 2013 г. 20:50:45(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Нет, то что описали это только первый уровень этого сумрака :)

На самом деле придется переделывать "digestAlgorithms", как уже упоминала Елена, а для этого надо будет пользоваться "CryptEncodeObject" и спускаться к ASN.1 и понятиям SEQUENCE и SET.
Ибо как сказано в RFC5652 про "digestAlgorithms":
"Implementations MAY fail to validate signatures that use a digest algorithm that is not included in this set".

И вот уже потом пробовать добавлять подпись с другим алгоритмом.
С уважением,
Юрий Строжевский
Offline Юрий  
#27 Оставлено : 17 апреля 2013 г. 21:05:45(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
А вообще-то в КриптоАРМ добавление подписи (присоединенной и отсоединенной) реализовано так:
1) Отдельно подписывается сообщение на добавляемом сертификате (то есть первичные данные, без подписей, подписываются новой подписью);
2) Из этой подписи получается CMSG_SIGNER_INFO;
3) Инициализируется новая структура типа CMSG_SIGNER_ENCODE_INFO, которая заполняется следующим образом (pSignerInfo это информация со второго шага):

SignerEncodeInfo.cbSize=sizeof(SignerEncodeInfo);
SignerEncodeInfo.hCryptProv=hProv;
SignerEncodeInfo.pvHashAuxInfo=NULL;
SignerEncodeInfo.dwKeySpec=AT_KEYEXCHANGE;
SignerEncodeInfo.HashAlgorithm.pszObjId=pSignerInfo->HashAlgorithm.pszObjId;
SignerEncodeInfo.HashAlgorithm.Parameters.cbData=pSignerInfo->HashAlgorithm.Parameters.cbData;
SignerEncodeInfo.HashAlgorithm.Parameters.pbData=pSignerInfo->HashAlgorithm.Parameters.pbData;
SignerEncodeInfo.pCertInfo=pCertContext->pCertInfo;
SignerEncodeInfo.cAuthAttr=pSignerInfo->AuthAttrs.cAttr;
SignerEncodeInfo.rgAuthAttr=pSignerInfo->AuthAttrs.rgAttr;
SignerEncodeInfo.cUnauthAttr=pSignerInfo->UnauthAttrs.cAttr;
SignerEncodeInfo.rgUnauthAttr=pSignerInfo->UnauthAttrs.rgAttr;

4) С помощью CryptMsgControl(CMSG_CTRL_ADD_SIGNER) добавляется подпись;
5) С помощью CryptMsgControl(CMSG_CTRL_ADD_CERT) добавляется сертификат подписанта;
6) С помощью CryptMsgGetParam(CMSG_ENCODED_MESSAGE) получается измененное сообщение, которое и сохраняется в файл;

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

С уважением,
Юрий Строжевский
Offline Юрий  
#28 Оставлено : 17 апреля 2013 г. 21:22:14(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Кстати рекомендую посмотреть в сторону CMSG_CTRL_ADD_CMS_SIGNER_INFO.
То есть тут тоже надо подписать "чистые данные", получить из них CMSG_SIGNER_INFO и сохранить всё, включая полученную подпись с помощью CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO).
С уважением,
Юрий Строжевский
Offline Boris@Serezhkin.com  
#29 Оставлено : 17 апреля 2013 г. 21:27:23(UTC)
Boris@Serezhkin.com

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

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Юрий Перейти к цитате
Нет, то что описали это только первый уровень этого сумрака :)
...
И вот уже потом пробовать добавлять подпись с другим алгоритмом.


Все как в сказке, дальше в сумрак, ближе свет.
Кстати CryptEncodeObject вместе с Decode - Unsupported.
Пройдем дальше, к ASN1. Тут все ясно.
Стоит задача получить пустую структуру содержащую в себе "digestAlgorithms"
Заполненый гостом и негостом. подложить заготовку и все вроде должно заработать.
Даже Detach на смеси сертификатов.
Замечательно что эта структура просто обязана быть константой.
И не надо ее каждый раз вычислять, достаточно хранить.
Offline Boris@Serezhkin.com  
#30 Оставлено : 17 апреля 2013 г. 21:35:10(UTC)
Boris@Serezhkin.com

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

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Юрий Перейти к цитате
Кстати рекомендую посмотреть в сторону CMSG_CTRL_ADD_CMS_SIGNER_INFO.
То есть тут тоже надо подписать "чистые данные", получить из них CMSG_SIGNER_INFO и сохранить всё, включая полученную подпись с помощью CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO).


Основная идея понятна.
Хочется учитывать "Unsupported"
Буду пробовать.

Стоп, стоп. О чем это я?
Подпись добавляется прекрасно.
Весь вопрос в добавлении первой подписи через CryptMsgControl
т.е. я заткнусь на первом шаге Angel

Отредактировано пользователем 17 апреля 2013 г. 21:41:24(UTC)  | Причина: понял что сказал не то

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