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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dev-python-capilite  
#1 Оставлено : 9 апреля 2020 г. 17:55:09(UTC)
dev-python-capilite

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.04.2020(UTC)
Сообщений: 4
Российская Федерация
Откуда: Ханты-Мансийск

Сказал(а) «Спасибо»: 2 раз
Добрый день, уважаемые разработчики Крипто Про.
Прежде чем написать здесь, перечитал документацию по продукту, как пользовательскую так и для разработчиков.

Подскажите пожалуйста, какие корректные значения аргументов для вызова функции CryptGetProviderDll должны быть?

WINADVAPI BOOL WINAPI CryptGetProviderDll(
LPCTSTR pszProvName,
LPTSTR pszProvPath,
DWORD * pcbProvPath
);

Если я всё правильно понял, то:

pszProvName - указатель на массив wchar_t с именем провайдера (в тестовом коде это указатель на "Crypto-Pro GOST R 34.10-2012 KC1 CSP")
pszProvPath - указатель на массив wchar_t с путём до библиотеки libcsp.so (в тестовом коде это указатель на "/opt/cprocsp/lib/amd64/libcsp.so")
pcbProvPath - не до конца понял что это, размер в байтах массива, на который указывает pszProvPath? Прошу пояснить.

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

Linux Ubuntu 19.10, Крипто Про 5.0

P.S. В разработке я новичок, потому прошу отнестись к вопросу лояльно.

С уважением, Виталий.
Offline two_oceans  
#2 Оставлено : 10 апреля 2020 г. 5:08:48(UTC)
two_oceans

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

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: dev-python-capilite Перейти к цитате
WINADVAPI BOOL WINAPI CryptGetProviderDll(
LPCTSTR pszProvName,
LPTSTR pszProvPath,
DWORD * pcbProvPath
);
pszProvName - указатель на массив wchar_t с именем провайдера (в тестовом коде это указатель на "Crypto-Pro GOST R 34.10-2012 KC1 CSP")
pszProvPath - указатель на массив wchar_t с путём до библиотеки libcsp.so (в тестовом коде это указатель на "/opt/cprocsp/lib/amd64/libcsp.so")
pcbProvPath - не до конца понял что это, размер в байтах массива, на который указывает pszProvPath? Прошу пояснить.
Хотя я и не разработчик из КриптоПро, но попробую пояснить по аналогии с другими функциями WINAPI: назначение переменных вы поняли верно, но есть стандартные нюансы как их вызывать. При первом вызове функций указываете имя провайдера в первом параметре, null во втором параметре, указатель на переменную DWORD в третьем параметре (пусть это переменная Len1). При этом WINAPI обнаружив что указатель на буфер равен null запишет в переменную по указателю из третьего параметра необходимый размер буфера. Если конечно с именем провайдера все в порядке.

Далее Вы выделяете буфер (Buf) длины Len2 (то есть длину запомните в переменной Len2 типа DWORD), значение Len2 должно быть более или равно значению Len1 (в некоторых средах программирования можно выделять только блоками допустим по 8 или 16 байт, поэтому фактическая длина буфера может быть больше чем Len1). Можете записать в буфер пустую строку на всякий случай.

Наконец, вызываете функцию второй раз указав тоже значение имени провайдера что и в первом вызове, выделенный буфер Buf во втором параметре, указатель на Len2 в третьем параметре. После успешного вызова в Len2 будет длина данных в буфере.

Если вернулось False при любом вызове WinApi, то нужно вызвать функцию GetLastError для получения более информативного кода ошибки. На заметку:если вернулось True, то GetLastError возвращает мусор (как говорят "не определено") - то есть там не обязательно 0, поэтому перед отладкой некоторых вызовов полезно вызвать SetLastError (0), чтобы потом в GetLastError не получить мусор оставшийся от прошлых вызовов WinApi.

В дальнейшем Вы можете уже не записывать пустую строку в буфер для получения данных или Len1 использовать вместо Len2 или вообще сразу выделить достаточно большой буфер, пропустить первый вызов и перейти ко второму вызову. Однако рекомендую первый (учебный) раз сделать все по всем правилам. Такие же правила применяются к большинству функцию у которых есть один параметр psz + "Что-то" и следом другой pcb + "Что-то" (одинаковое название после префикса показывает что это связанная пара параметров - как правило буфер и его длина для получения данных из WinApi). Указываете вместо буфера null и возвращается длина, но не данные. Указываете буфер не null - получаете и данные и их длину.

С именем провайдера тоже могут быть нюансы кодировки - заканчиваться должно символом 0, но на Линухе возможно нужен UTF-8 вместо Unicode.

Отредактировано пользователем 10 апреля 2020 г. 6:00:55(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
dev-python-capilite оставлено 10.04.2020(UTC)
Offline dev-python-capilite  
#3 Оставлено : 10 апреля 2020 г. 9:14:39(UTC)
dev-python-capilite

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.04.2020(UTC)
Сообщений: 4
Российская Федерация
Откуда: Ханты-Мансийск

Сказал(а) «Спасибо»: 2 раз
to two_oceans
Огромное вам спасибо за разъяснения!
Никогда не приходилось работать с WINAPI, теперь стало понятно почему ни как не удавалось получить корректные результаты.
Буду изучать данное направление.

Ещё раз спасибо!
Offline Максим Коллегин  
#4 Оставлено : 10 апреля 2020 г. 10:30:15(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
А зачем вам понадобилась эта функция?
Знания в базе знаний, поддержка в техподдержке
Offline dev-python-capilite  
#5 Оставлено : 10 апреля 2020 г. 14:19:01(UTC)
dev-python-capilite

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.04.2020(UTC)
Сообщений: 4
Российская Федерация
Откуда: Ханты-Мансийск

Сказал(а) «Спасибо»: 2 раз
Автор: Максим Коллегин Перейти к цитате
А зачем вам понадобилась эта функция?


Просто первая попавшаяся функция в документации по CAPILite, изучаю возможность использования (вызова) функций из библиотеки.
Задача стоит использовать продукт Крипто Про CSP из Python 3, вызовом функций из libcapi20.so.
Пока успехов не достиг, вероятно не хватает знаний в С/С++ и WINAPI.
Ещё как вариант использовать вызов стандартных консольных утилит в коде программы, но это крайне не желательно.
Offline Андрей *  
#6 Оставлено : 10 апреля 2020 г. 14:48:31(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
dev-python-capilite оставлено 13.04.2020(UTC)
Offline dev-python-capilite  
#7 Оставлено : 13 апреля 2020 г. 8:11:23(UTC)
dev-python-capilite

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.04.2020(UTC)
Сообщений: 4
Российская Федерация
Откуда: Ханты-Мансийск

Сказал(а) «Спасибо»: 2 раз
Андрей, благодарю вас за ссылки! Постараюсь разобраться в работе данных проектов, чтоб использовать у себя.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.