Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
CryptoPro 3.6 x64 (beta Август,15) и Windows Server 2003 x64 SP2 RC2
Статус: Эксперт
Группы: Администраторы, Участники Зарегистрирован: 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).
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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-минутным таймером на это действие. Вобщем, очень был бы признателен за раъяснение или "отсылающие ссылки" по первому вопросу.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
1. Да, джедаем быть необязательно, на алгоритмы хэширования стоит отличать от алгоритмов подписи (у MS бывают ошибки, и не только в документации :) Нормальный код чуть сложнее - но этот пока работает ;) А лучшая документация, что видел - это wincrypt.h - там много занятных комментариев (CRYPT_OID_INFO) 2. За ошибку спасибо - посмотрим. Отредактировано пользователем 2 декабря 2008 г. 2:42:04(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Эксперт
Группы: Администраторы, Участники Зарегистрирован: 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;
через перебор всех зарегистрированных алгоритмов хеша, но код будет еще длиннее.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
2. Воспроизвести не удалось. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.09.2008(UTC) Сообщений: 20 Откуда: Н.Новгород
|
А вы как воспроизводили? На Windows 2003 x64 c последней сборкой КП 3.6? Ошибку воспроизводит код с CryptSignMessage ,указанный чуть выше, если участвует запароленный контейнер. (Ну соответвенно, если указать правильный алгоритм.) Если у вас так не получается , то мне остаётся вам только дать ссылку на виртуалку где не работают оба примера. (этот и самый первый со страничкой - он тоже так и не работает) Отредактировано пользователем 2 декабря 2008 г. 16:22:02(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.09.2008(UTC) Сообщений: 20 Откуда: Н.Новгород
|
2 pavelvn. Спасибо большое, попробую.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.09.2008(UTC) Сообщений: 20 Откуда: Н.Новгород
|
Профиль юзера, контейнер скопирован в реестр. Виртуалку прям щас не дам. Какие то трудности у админов сделать 64битную виртуалку. Решают. Отредактировано пользователем 2 декабря 2008 г. 18:06:03(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.09.2008(UTC) Сообщений: 20 Откуда: Н.Новгород
|
Кстати, по поводу алгоритмов, я просто измучился одним вопросом...
Как же всё таки и почему , а так же чем и каким алгоритмом работает тот пример майкрософтовский , когда на машине нету крипто-про 3.6. бетты, которое может этого дурня майкрософтовсого образумить и сказать, что брось бяку - это вовсе не алгоритм хеширования .....
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
CryptoPro 3.6 x64 (beta Август,15) и Windows Server 2003 x64 SP2 RC2
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close