AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
129 stars 41 forks source link

Support for GOST_R_34.10-2012 #2

Closed alexus1024 closed 7 years ago

alexus1024 commented 7 years ago

Current version lacks support for GOST 34.10-2012 (aka Streebog) signatures.

About signature algoritm

There are VipNet and CryptoPro implementations. But I have tested only VipNet. Rumors say that they are not compatible with each other. For me VipNet implementation is most important by now.

UPD: update algoritm info

(кстати, отвечать можно и на русском, если так удобнее)

AlexMAS commented 7 years ago

Thanks. I will think how I can fix it.

alexus1024 commented 7 years ago

Не подскажете, откуда берут идентификаторы алгоритмов? которые заданы у вас тут: https://github.com/AlexMAS/GostCryptography/blob/master/Source/GostCryptography/Native/Constants.cs public const int CALG_GR3411 = 0x801e;

Не нашёл документации по этому вопросу нигде.

AlexMAS commented 7 years ago

Точно уже не помню, из каких-то примеров и форумов КриптоПро.

AlexMAS commented 7 years ago

В общем, ситуация на данный момент следующая. Сейчас в качестве алгоритма хэширования жестко используется ГОСТ Р 34.11-94, а подпись делается жестко по ГОСТ Р 34.10-2001. В текущей версии часть кода использует статические настройки, часть оперирует жестко прошитыми константами, на которые полагается логика. Все это мне крайне не нравится и требует рефакторинга. Заинтересованности в этом не было достаточно долго, контекст немного потерян, поэтому есть вероятность дестабилизировать работоспособность кода.

Технически поддержка хэширования по стандартам 2012 года осуществима, я проверил (достаточно изменить вышеуказанный идентификатор алгоритма на нужный). С подписью должно быть аналогично, но там все требует тщательного тестирования.

Пока думаю, как помочь вам, не делая глобальные переделки в коде, после буду думать, как избавиться от глобальных контекстов. Если я правильно понял, вы хотите осуществить подпись по стандартам 2012 года. Или только вычислить хэш? Если только вычислить хэш, можно было бы решить проблему достаточно быстро. Если подпись, тогда большая просьба сгенерировать мне сертификат, который я бы мог использовать при тестировании.

P.s. Относительно одновременной установки VipNet и CryptoPro. Пробовал, вроде, получалось, но не с первого раза точно. Во-первых, их нужно устанавливать друг за другом в каком-то особом порядке (сейчас уже не вспомню). Во-вторых, при установке CryptoPro нельзя ставить какие-то компоненты. Однако, это было достаточно давно (2 года назад), поэтому текущее положение дел я не знаю. Более того, VipNet и CryptoPro стараются ничего не говорить друг о друге, тем более обсуждать технические аспекты друг друга. Что касается VipNet, там вообще не привыкли делиться какой-либо информацией, тем более отвечать на вопросы по работе с их CSP из кода.

alexus1024 commented 7 years ago

В общем да, мой интерес, в идеале, проверить подпись по стандарту 2012 года, переданную в виде подписанного документа XML в формате xmldsig. (Для этого в дотнете есть тип SignedXml, который как раз полагается на дотнетовские провайдеры.) А потом и иметь возможность создавать такие документы (это уже подписывание). Причём именно на VipNet.

В принципе, это решаемо через работу с API (MS CryptoApi) напрямую, но в этом случае всю логику стандартов (вроде xmldsig) приходится велосипедить у себя.

Что касается доработок, на мой взгляд добавить пару алгоритмов хеширования довольно безопасно и это легче проверить на корректность (в том же госте есть контрольные примеры в конце концов). Зарегистрировать их в GostCryptoConfig.cs и всё. Даже одно это, думаю, будет полезно проекту и худшее что может случиться - это новые алгоритмы не будут работать корректно. Но они и так сейчас не работают :)

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

У меня тут есть боевые примеры и хэши я смогу проверить на корреткность на этих сообщениях.

Кстати, спасибо за ответы.

AlexMAS commented 7 years ago

Да, сначала хотелось бы пойти по пути расширения. Пока добавил два класса Gost34112012256HashAlgorithm and Gost34112012512HashAlgorithm. И банальные тесты к ним. В NuGet выложил версию 1.1.0-alpha1. Если у вас будет время, попробуйте проверить корректность этих методов и дайте, пожалуйста, обратную связь, все ли получилось. Если все нормально, я выпущу релизную версию. С подписью, да, там сложней, нужно будет дольше разбираться. P.s. Также сделал часть низкоуровневого API публичным, чтобы была возможность ставить свои собственные эксперименты.

AlexMAS commented 7 years ago

Здравствуйте, @alexus1024. Получилось ли решить проблему? Можно ли считать данную задачу закрытой?

alexus1024 commented 7 years ago

да, закрывайте. У меня внезапно потеряла актуальность это тема. А так же и больше нет доступа у стенду где я это всё тестировал. Спасибо вам!