Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте.
Использую Рутокен ЭЦП, с которым взаимодействует программа собственной разработки через библиотеку rtPKCS11ECP. Цель - выработка ЭЦП в формате PKCS#7. Однако, на пути к конечному результату возникли проблемы с использованием отдельных функций. Проблемы буду озвучивать последовательно и по отдельности, т.к. решение очередной может быть аналогичным предыдущему.
На токене сгенерирована пара ключей ГОСТ 34.10-2001 и импортирован соответствующий этой паре сертификат. Программно, как объекты, они находятся функцией поиска, вот только, извлекая дополнительную информацию из них с помощью функции C_GetAttributeValue, заметил, что атрибут CKA_ID у ключей извлекается таким, каким был указан при генерации, а у сертификата - в формате GUID (например, {4FC977FC-C683-4BC5-94C6-F28DB20537FF}). Подскажите, пожалуйста, как добиться однозначного соответствия объектов по идентификатору?

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый день.

А не смотрели ли вы в направлении вот этой библиотеки http://habrahabr.ru/company/aktiv-company/blog/249723/?
В некоторых случаях она экономит время.

Re: Работа с функциями библиотеки rtPKCS11ECP

Очень заинтересовало! И насторожило тоже... В частности фраза для встраивания в С++ приложения. А если пишу на C#?

Re: Работа с функциями библиотеки rtPKCS11ECP

На почту отправил переходник к C#

Re: Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте!
Спасибо за библиотеку (см. переписку выше), удобно, понятно и время сэкономила. Хотелось бы озвучить пожелание, если его реализация возможна, было бы здорово! Суть вопроса такова: сама библиотека в своем "нутре" использует интерфейс PKCS#11, вызывая функционал, собранный в rtPKCS11ECP.dll. При этом местоположение rtPKCS11ECP.dll жестко определено - в папке с EXE-шником программы. Есть ли возможность поиск и использование этой DLL возложить на операционную систему (например, используя переменные среды или конфиги приложения)?

Re: Работа с функциями библиотеки rtPKCS11ECP

Сделать так можно. Сделаем. Полагаю в первой половине июля будет.

Re: Работа с функциями библиотеки rtPKCS11ECP

Буду ждать с нетерпением, спасибо!
Кстати, новый день наступил, здравствуйте!
А с новым днем в посвежевшей голове новый вопрос возник по использованию вышестоящей замечательной библиотеки. Прошу прояснить следующий момент: при использовании функции подписания в формате CMS sign и проверки verify экспериментировал с параметром useHardwareHash из набора опций. Значение true этого параметра, как я понял, реализует аппаратный алгоритм вычисления хэша, false - быстрый программный. Но я не ожидал, что НАСТОЛЬКО БЫСТРО! Файл определенного размера в первом случае подписывался чуть ли не минуту, а во втором случае - не более двух секунд. А результат один и тот же. Конечно, счастью не было предела, но все же одолевают сомнения, насколько это нормально и законно. Не вызовет ли использование столь быстрых алгоритмов скептицизм со стороны роспотребнадзорных и прочих контролирующих органов, с которыми шутки плохи?

Re: Работа с функциями библиотеки rtPKCS11ECP

А вам бы хотелось, чтобы файл подписывался сколько времени? Ну, чтобы ни у кого не возникало никаких сомнений? )

Re: Работа с функциями библиотеки rtPKCS11ECP

Просто наша программа рано или поздно будет запущена в массы, а значит требует сертифицированного своего содержания. Если сертифицированный рутокен использует только алгоритмы сертифицированного источника, то вопросов нет, я спокоен. Просто такая альтернатива - использовать быстрый или медленный алгоритм - сразу зажгла в голове сигнальную лампочку: "где-то подвох"! )))

(2015-06-25 09:33:31 отредактировано Sergeant)

Re: Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте снова!
И снова вопросы по Библиотека для встраивания электронной подписи в приложения С++.

Вопрос №1: реализована ли в ней отдельно функция вычисления хэша по ГОСТ Р 34.11-94 быстрая программная, как внутри функции sign или verify с параметром calculateHash = true, useHardwareHash= false? В некоторых случаях мне необходимо иметь предвычисленный хэш с последующим его подписанием функцией sign с параметром calculateHash = false.

Вопрос №2: функция подписания в формате CMS Sign отработала, вернула подпись. Использую для контроля функцию Verify, она информирует о корректной подписи. А вот если проверку сделать, используя инструменты, например, VipNet, то вижу "подпись не верна". И наоборот, сформированная в VipNet CryptoFile подпись не проходит проверку средствами Рутокен... Сравнивал содержимое подписей, выработанных на Рутокен и VipNet, начальный большой кусок (видимо, соответствующий сертификату) один в один, а вот в конце, возможно в части зашифрованного хэша, есть отличия. Подозреваю, что проблема в формате предоставления данных для подписи. Это третий параметр функции Sign, который, как указано в ее описании, должен быть строкой в шестнадцатиричном представлении. Вот код формирования такой строки:

string data = "";
using (FileStream fs = new FileStream(docpath, FileMode.Open, FileAccess.Read))
{
   byte[] buffer = new byte[fs.Length];
   fs.Read(buffer, 0, buffer.Length);
   data = BitConverter.ToString(buffer);
}

Строка формируется вида: 6D-61-6E-20-0D-0A-20-0D-0A-...-20, может, надо 6D 61 6E 20 0D 0A 20 0D 0A ... 20 или 6D616E200D0A200D0A...20 или еще как иначе?

Re: Работа с функциями библиотеки rtPKCS11ECP

Программный хеш - очень быстрый. На данный момент его реализация в нашем софте находится на сертификации в ФСБ. Поэтому у регуляторов претензий не возникнет.

1. Функция вычисления хеша реализована, но в версии библиотеки, которая будет выпущена в ближайшее время.
2. Я вам рекомендую байт-массив закодировать в base64 и полученную строку передать в sign, установив опцию isBase64

Re: Работа с функциями библиотеки rtPKCS11ECP

Эта библиотека будет включена в SDK или отдельно по запросу будет предоставляться?

Re: Работа с функциями библиотеки rtPKCS11ECP

Я ее вам пришлю по факту выхода

(2015-06-26 15:13:10 отредактировано Sergeant)

Re: Работа с функциями библиотеки rtPKCS11ECP

Спасибо, буду ждать.
И снова к вопросам... ))) Их два:

  1. Не помог Ваш совет: 2. Я вам рекомендую байт-массив закодировать в base64 и полученную строку передать в sign, установив опцию isBase64. Пробовал даже исходные данные только из цифр, чтоб проверить зависимость от кодировки, не срабатывает... На сервере проверки ЭЦП у Крипто PRO проверял с выводом детального отчета - рознятся ЭЦП в части их значений. Забыл еще указать, что подпись отсоединенная, может, есть особенности работы с ней?

  2. Ключевая пара на рутокене сгенерирована в VIPNet CSP, по запросу УЦ прислал сертификат. Если привязывать сертификат к ключевой паре средствами того же самого VIPNet, то функция вида enumerateCertificates(Device, 0) его видит как объект. Если же сертификат привязать к паре с помощью кнопки "Импортировать" в Панели управления Рутокена, то не видит. Пробовал при различных значениях второго параметра, указывающего на категорию сертификата, не помогло... Также не видит и самоподписанный импортированный сертификат, изготовленный по рецепту https://forum.rutoken.ru/topic/1639/

(2015-06-26 15:12:28 отредактировано Sergeant)

Re: Работа с функциями библиотеки rtPKCS11ECP

К вопросу №1. Вот используемый на данный момент набор опций для функции Sign

options.Add("addUserCertificate", true);
options.Add("addSignTime", true);
options.Add("detached", true);
options.Add("calculateHash", true);
options.Add("isBase64", true);
options.Add("useHardwareHash", false);

Может чего не хватает?..