Подписание GOST
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2

ТЕМА: Подписание GOST

Подписание GOST 2 года, 5 мес. назад #3007

  • simakvladimir
  • Новый участник
  • Постов: 9
  • Репутация: 0
Доброго времени суток!

Возникла следующая проблема: подписание тестовыми GOST ключами (из sdk) завершается с ошибкой, в то время, как подписание с тестовыми RSA ключами проходит успешно.

Для проверки подписи на серверной стороне используется следующий С# код:
private VerifyDataStruct VerifyContOrAttr(byte[] inData, byte[] signedData, bool verifySignatureOnly)
        {
            X509Certificate2 signerCertificate = null;

            try
            {               
                var signedCms = new SignedCms(new ContentInfo(inData), true);
                signedCms.Decode(signedData);
                
                /* .... */

                try
                {
                    signedCms.CheckSignature(true);
                }
                catch
                {
                    const IOLACOM_OPERFLAGS flagsVerify = IOLACOM_OPERFLAGS.SF_WITH_CERTS | IOLACOM_OPERFLAGS.CF_IN2_BASE64 | IOLACOM_OPERFLAGS.CF_IN_BASE64 | IOLACOM_OPERFLAGS.SF_DETACHED_DATA; 

                    var iolaCom = new IolaCOM2();

                    var inDataStr = Convert.ToBase64String(inData);
                    var signedDataStr = Convert.ToBase64String(signedData);

                    try
                    {
                        iolaCom.VerifyData2("", (int)flagsVerify, inDataStr, signedDataStr);
                    }
                    catch (Exception e)
                    {
                        return VerifyDataStruct.Fail(signerCertificate, e.Message);
                    }
                }

                return VerifyDataStruct.Success(signerCertificate);
            }
            catch (Exception e)
            {
                return VerifyDataStruct.Fail(signerCertificate, e.Message);
            }
        }


Исключение выбрасывается при декодировании detached сигнатуры сформированной GOST ключом на строчке:
signedCms.Decode(signedData);

со следующим сообщением: "Неизвестный криптографический алгоритм"

Для подписания используется C# обертка Interop.IolaCOM версии 6.0.0.0. Судя по описанию ошибки не находится реализация гостовского алгоритма формирования хеша, которая, если я правильно понимаю, должна была быть добавлена Interop.IolaCOM, но это всего лишь мои догадки.

1) Возможно, я что-то упускаю из виду?
2) Насколько я понимаю IolaCOM больше не поддерживается? Но в любом случае поддержка гостовского алгоритма формирования хеша должна же быть в IolaCOM? Или в последнее время в тестовых сертификатах/софте были какие-то изменения касательно госта?
3) Достаточно ли простого размещения библиотек Interop.IolaCOM.dll и IolaCOM.dll в каталоге исполняемого приложения? Или все-таки процедура регистрации IolaCOM.dll обязательна? Хотя если процедура регистрации обязательна, то почему вышеприведенный метод для rsa отрабатывает корректно, т.е. IolaCOM2 объект создается и вызов его методов не приводит к исключениям?

Заранее, большое спасибо за помощь!
Изменено: 2 года, 5 мес. назад от simakvladimir.

Re: Подписание GOST 2 года, 5 мес. назад #3009

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

Библиотека IolaCOM больше не поддерживается.
В рамках модернизации НУЦ РК был реализован переход на использование национальных единых объектных идентификаторов (OID). Так что прежние библиотеки (включая IolaCOM) не смогут работать с новыми ключами НУЦ.
Модератор
Спасибо сказали: simakvladimir

Re: Подписание GOST 2 года, 5 мес. назад #3015

  • simakvladimir
  • Новый участник
  • Постов: 9
  • Репутация: 0
Спасибо большое за скорый ответ.

Тогда такой вопрос: нативная реализация Kalkan библиотеки, как я понял на С? Поставляется ли с последним sdk С# обертка для Kalkan? Или данная обертка должна разрабатываться своими силами?

Re: Подписание GOST 2 года, 5 мес. назад #3017

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
В состав SDK НУЦ РК входит библиотека KalkanCryptCOM, которая позиционируется нами как замена библиотеки IolaCOM.
В проектах на C# Вы можете использовать KalkanCryptCOM.
Модератор

Re: Подписание GOST 2 года, 5 мес. назад #3019

  • simakvladimir
  • Новый участник
  • Постов: 9
  • Репутация: 0
Я обновился, заменив IolaCOM на KalkanCryptoCOM. Но ошибка, указанная в первом посте не исчезла.

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

Согласно статье rsdn.org/article/crypto/cspsecrets.xml при реализации собственного криптопровайдера первым делом необходимо выстроить соответствующую структуру веток реестра системы, где как раз указывается oid алгоритма хэширования и точка входа в провайдере, именно oid используется системой как метка, по которой осуществляется поиск реализации алгоритма хэширования. Но, посмотрев данную ветку реестра (HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Cryptography\OID\EncodingType 0\CryptDllFindOIDInfo), я не обнаружил oid гостовского хэша (1.2.398.3.10.1.1.1.2). Переустановка NCALayer проблему не решила.

Возможно, я что-то делаю не так?

Извиняюсь за свою глупость, но также возникли проблемы при использовании скомпилированной под delphi тестовой утилиты из состава sdk. Программа KNCA Kalkan Crypt Test Project (x32) успешно запустилась (KalkanCryptCOM библ-ка также успешно зарегистрирована (x32)), но при выполнении следующей последовательности действий:
1. Выбор личного тестового rsa сертификата (Путь к ключу)
2. Установка Формата вх/вых данных как IN Base64 и OUT Base64 соответственно, установка "Сырая подпись", все остальные поля по умолчанию
3. Далее нажатие на кнопку "Показать сертификат ключа" - ключ успешно отображается
4. Далее нажатие на кнопку "Информация о сертификате" - информация отображается успешно
5. Подписание - "Sign Data" - успешно подписывается, отображается сигнатура подписи
6. Верификация - "Verify Data" - возникает ошибка:
Error: 0x04091077
Verify - FAILED.
error:04091077:rsa routines:func(145):reason(119)
Возможно, я выполняю неправильный порядок действий?

В общем, у меня складывается впечатление, что криптопровайдер как будто был неправильно установлен или не до конца, или что-то в этом роде.

Буду рад любой помощи, спасибо.
Изменено: 2 года, 5 мес. назад от simakvladimir.

Re: Подписание GOST 2 года, 5 мес. назад #3020

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

Для работы нашего криптопровайдера нет необходимости регистрации OID'ов в ОС.

Какую ошибку выдает KalkanCryptCOM?

Проверьте Ваши ключи на нашем онлайн сервисе.

По подписи:
Проверил у себя. Все отрабатывает. Но у меня последняя версия библиотеки, в SDK ее должны добавить на днях. Опять таки, рекомендую проверить используемые Вами ключи. Или выслать нам сертификат.
Модератор
  • Страница:
  • 1
  • 2
FaLang translation system by Faboba