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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline pavelvn  
#11 Оставлено : 1 декабря 2008 г. 18:03:34(UTC)
pavelvn

Статус: Эксперт

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 14 раз в 9 постах
В общем случае код примера http://msdn.microsoft.com/en-us/library/aa904939 не будет работать и без Крипто Про CSP. В этом можно убедиться, добавив к сообщению хотя бы один (произвольный) подписанный атрибут, например так:

BYTE nullDer[] = { 0x05, 0x00 };

CRYPT_ATTR_BLOB attrValue;
attrValue.cbData = sizeof(nullDer);
attrValue.pbData = nullDer;

CRYPT_ATTRIBUTE attr;
attr.pszObjId = "1.2.3.4.5.6.7";
attr.cValue = 1;
attr.rgValue = &attrValue;

// Initialize the signature structure.
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;
...
SigParams.cAuthAttr = 1;
SigParams.rgAuthAttr = &attr;

Так что если в коде появляются подписанные атрибуты, простое копирование алгоритма подписи не работает. Правильным подходом будет поиск алгоритма хеша, соответствующего данному алгоритму подписи. Это довольно просто:

SigParams.HashAlgorithm.pszObjId=(LPSTR)CertAlgIdToOID( CertOIDToAlgId(szOID_RSA_SHA1RSA) );

Если подписанных атрибутов нет (и не предвидится), то вместо этого можно указать флаг CPCRYPT_MESSAGE_CADES_DISABLE, который определён в файле WinCryptEx.h:

SigParams.dwFlags = CPCRYPT_MESSAGE_CADES_DISABLE;

Еще один момент - получать алгоритм подписи/хэширования исходя из алгоритма подписи сертификата некорректно, поскольку, например, сертификат на ГОСТовый ключ может быть подписан на ключе RSA и наоборот. Алгоритм хеширования должен подаваться отдельным параметром и быть совместимым с алгоритмом открытого ключа (pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId).
Offline gopNick  
#12 Оставлено : 2 декабря 2008 г. 0:13:45(UTC)
gopNick

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

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

Спасибо за ответ, стало понятнее.
Но возникли ряд других вопросов:

1. Что это за уличная магия?

(LPSTR)CertAlgIdToOID( CertOIDToAlgId(szOID_RSA_SHA1RSA) ) != szOID_RSA_SHA1RSA ?
Выглядит как
arcsin(sin(x)) <> x
или
a = b; b = a; // Не стирать , а то работать не будет!

Ну а если серьёзно , то я так и не понял почему это приводит к "поиск алгоритма хеша, соответствующего данному алгоритму подписи". И каким образом, можно было дойти до такого преобразования самому, без помощи ордена рыцарей -джедаев.

Это справедливо для любых хешей\алгоритмов подписи?
Следует ли из этого, что вот таким образом
Код:

SigParams.HashAlgorithm.pszObjId=(LPSTR)CertAlgIdToOID( CertOIDToAlgId(pSignerCert->pCertInfo->SignatureAlgorithm.pszObjId) );  

я решу "все свои проблемы" ? (Т.е. вобщем то я попробовал это для тех сертификатов "гост" и "не-гост" которые у меня были и всё вобщем то заработало).

2. Пока пробовал , нашел ошибку:
Если контейнер запаролен, то пароль от него никто не спросит , а выдаст ошибку 2148073485 - это последняя сборка.
На предыдущих версиях было симпатичное окошко с предложением ввести пароль и 10-минутным таймером на это действие.


Вобщем, очень был бы признателен за раъяснение или "отсылающие ссылки" по первому вопросу.




Offline Максим Коллегин  
#13 Оставлено : 2 декабря 2008 г. 2:38:13(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
1. Да, джедаем быть необязательно, на алгоритмы хэширования стоит отличать от алгоритмов подписи (у MS бывают ошибки, и не только в документации :) Нормальный код чуть сложнее - но этот пока работает ;)
А лучшая документация, что видел - это wincrypt.h - там много занятных комментариев (CRYPT_OID_INFO)
2. За ошибку спасибо - посмотрим.

Отредактировано пользователем 2 декабря 2008 г. 2:42:04(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline pavelvn  
#14 Оставлено : 2 декабря 2008 г. 14:25:45(UTC)
pavelvn

Статус: Эксперт

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 14 раз в 9 постах
1. Тонкость здесь в том, что для OIDов алгоритмов подписи нет соответствующего ALG_ID. Вызов CertOIDToAlgId(OID алгоритма подписи) возвращает ALG_ID хеша. В свою очередь CertAlgIdToOID(ALG_ID алгоритма хеша) возвращает OID алгоритма хеша. Чтобы дойти до этого преобразования самому, действительно надо знать как у Microsoft соотносятся OIDы и ALG_IDы. Но этот способ - короткий. На самом деле, если изучить документацию на CryptEnumOIDInfo()/CryptFindOIDInfo(), CRYPT_OID_INFO (и желательно комментарии к этим функциям/структурам в WinCrypt.h) можно написать более правильный код для определения алгоритма хеша, но он будет чуть подлиннее:

PCCRYPT_OID_INFO pSignatureAlgOidInfo = CryptFindOIDInfo(... OID алгоритма подписи ..., CRYPT_SIGN_ALG_OID_GROUP_ID);
ALG_ID aiHashAlg = pSignatureAlgOidInfo->Algid; // к сожалению о том, что здесь лежит алгоритм хеша из доков следует только косвенно
PCCRYPT_OID_INFO pHashAlgOidInfo = CryptFindOIDInfo(... aiHashAlg ..., CRYPT_HASH_ALG_OID_GROUP_ID);
SigParams.HashAlgorithm.pszObjId = pHashAlgOidInfo->pszOID;

Для краткости писал без проверки возвращаемых значений.

В принципе, можно написать и не закладываясь на

ALG_ID aiHashAlg = pSignatureAlgOidInfo->Algid;

через перебор всех зарегистрированных алгоритмов хеша, но код будет еще длиннее.
Offline Максим Коллегин  
#15 Оставлено : 2 декабря 2008 г. 15:12:58(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
2. Воспроизвести не удалось.
Знания в базе знаний, поддержка в техподдержке
Offline gopNick  
#16 Оставлено : 2 декабря 2008 г. 16:19:37(UTC)
gopNick

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

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

А вы как воспроизводили? На Windows 2003 x64 c последней сборкой КП 3.6?
Ошибку воспроизводит код с CryptSignMessage ,указанный чуть выше, если участвует запароленный контейнер. (Ну соответвенно, если указать правильный алгоритм.)
Если у вас так не получается , то мне остаётся вам только дать ссылку на виртуалку где не работают оба примера. (этот и самый первый со страничкой - он тоже так и не работает)

Отредактировано пользователем 2 декабря 2008 г. 16:22:02(UTC)  | Причина: Не указана

Offline gopNick  
#17 Оставлено : 2 декабря 2008 г. 16:28:39(UTC)
gopNick

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

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

2 pavelvn. Спасибо большое, попробую.
Offline Максим Коллегин  
#18 Оставлено : 2 декабря 2008 г. 18:03:49(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
где находится ключ?
И виртуалку давайте.

Отредактировано пользователем 2 декабря 2008 г. 18:04:25(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline gopNick  
#19 Оставлено : 2 декабря 2008 г. 18:04:34(UTC)
gopNick

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

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

Профиль юзера, контейнер скопирован в реестр.

Виртуалку прям щас не дам. Какие то трудности у админов сделать 64битную виртуалку. Решают.

Отредактировано пользователем 2 декабря 2008 г. 18:06:03(UTC)  | Причина: Не указана

Offline gopNick  
#20 Оставлено : 2 декабря 2008 г. 20:44:18(UTC)
gopNick

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

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

Кстати, по поводу алгоритмов, я просто измучился одним вопросом...

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