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

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline Andrey Zhilov  
#21 Оставлено : 11 июня 2020 г. 6:38:45(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Автор: Андрей * Перейти к цитате
Автор: Andrey Zhilov Перейти к цитате
Вроде бы заработало. Получил 64 байта в подписи.


а "почему" заработало, что исправлено было?



Что я добавил: вычисление размера подписи с помощью CryptSignHash. Но проблема была не в этом. Я передавал в качестве параметра длинны подписи число типа int, а необходимо было передавать указатель на int используя тип переменной IntByReference.

Код принял вид:
Код:

IntByReference hProv = new IntByReference(0);
IntByReference hHash = new IntByReference(0);

String containerName = config().getString("csp.container.name");
LPWSTR ntContainerName = new LPWSTR(containerName);

String containerPassword = config().getString("csp.container.password");
byte[] ntContainerPassword = new byte[containerPassword.length() + 1];
byte[] password = containerPassword.getBytes(StandardCharsets.US_ASCII);
System.arraycopy(password, 0, ntContainerPassword, 0, containerPassword.length());

String provider = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
LPWSTR ntProvider = new LPWSTR(provider);

Advapi32.INSTANCE.CryptAcquireContext(hProv, ntContainerName, ntProvider, Advapi32.PROV_GOST_2012_256, 0);
Advapi32.INSTANCE.CryptSetProvParam(hProv.getValue(), Advapi32.PP_KEYEXCHANGE_PIN, ntContainerPassword, 0);
Advapi32.INSTANCE.CryptCreateHash(hProv.getValue(), Advapi32.CALG_GR3411_2012_256, 0, 0, hHash);
Advapi32.INSTANCE.CryptHashData(hHash.getValue(), data, data.length(), 0);

IntByReference signLen = new IntByReference(0);
Advapi32.INSTANCE.CryptSignHash(hHash.getValue(), Advapi32.AT_KEYEXCHANGE, null, 0, null, signLen);

byte[] sign = new byte[signLen.getValue()];
Advapi32.INSTANCE.CryptSignHash(hHash.getValue(), Advapi32.AT_KEYEXCHANGE, null, 0, sign, signLen);



Указание провайдера при создании контекста (ntProvider)в моём случае тоже можно опустить. Работает и без него.
Вопрос почему он выдавал ошибку "Ключ не найден" вместо "Неверный параметр" (ERROR_INVALID_PARAMETER) =\

Ну и не забыл добавить, как и писали, CryptDestroyHash, CryptReleaseContext. Хотя есть ли в этом смысл в Java, есть же Garbage Collection.
Offline Andrey Zhilov  
#22 Оставлено : 18 ноября 2020 г. 18:44:30(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Не буду плодить темы, через некоторое время возникла необходимость доработать данный проект. Win10 x64, CryptoPro CSP 5, openjdk-15(jdk-1.8). После разворачивания проекта и его пробного запуска появилась странная проблема связанная с ошибкой "Параметр задан неверно" при попытке задать пин для ключа обмена следующим образом:

Код:

IntByReference hProv = new IntByReference(0);
LPWSTR ntContainerName = new LPWSTR("FAT12\\AE4CBB28\\thn-2020.000\\6E9D");
LPWSTR ntProvider = new LPWSTR("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider");
int PROV_GOST_2012_256 = 80;
int PP_KEYEXCHANGE_PIN = 0x20;
String containerPassword = "12345678";
byte[] ntContainerPassword = new byte[containerPassword.length() + 1];
byte[] password = containerPassword.getBytes(StandardCharsets.US_ASCII);
System.arraycopy(password, 0, ntContainerPassword, 0, containerPassword.length());

Advapi32.INSTANCE.CryptAcquireContext(hProv, ntContainerName, ntProvider, PROV_GOST_2012_256, 0);
Advapi32.INSTANCE.CryptSetProvParam(hProv.getValue(), Advapi32.PP_KEYEXCHANGE_PIN, ntContainerPassword, 0);


Я склоняюсь к тому, что как-то неверно передаётся пароль. Но по факту изменений в коде никаких не происходило и данный код работал. Возможно кто-то может что-то ещё посоветовать? В какую сторону смотреть? Возможно проблема в самом CSP? Тестирование контейнер проходит без ошибок. Имя контейнера перепроверял, пароль тоже. Переустанавливал CSP.
Offline two_oceans  
#23 Оставлено : 19 ноября 2020 г. 5:13:48(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Если работало и перестало, то скорее всего дело в контейнере. Либо имя контейнера (правильное количество слешей?) либо ключ не AT_KEYEXCHANGE. При успешном тестировании должно писать какой ключ нашло: ключ обмена AT_KEYEXCHANGE или ключ подписи AT_SIGNATURE.

Параметр пароля технически должен быть ссылкой на строку с 0 в конце. LPSTR напрямую не получается использовать? Как я понял (суть копирований строчки с места на место), в Вашем коде полагаетесь, что в ntContainerPassword при выделении памяти на 1 байт больше уже записаны нули. Если же там попадется не нулевой символ в конце, то выйдет полная ерунда, так как при копировании последний символ не попадает в копируемую длину и (предположу, так как не специалист в этой среде) не перезаписывается. Для надежности было бы неплохо его явным образом присвоить.

Отредактировано пользователем 19 ноября 2020 г. 5:14:27(UTC)  | Причина: Не указана

Offline Andrey Zhilov  
#24 Оставлено : 19 ноября 2020 г. 7:23:48(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Вся проблема в том, что копирую собранный у себя jar-файл и запускаю на сервере с win serv x32 и там этот же код с этими же ключами работает)Разница м-у окружениями только в версии ОС и разрядности. Попробую с LPSTR поколдовать. Явно пробывал присваивать паролю значение {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x0}. Слэши перепроверил, контекст создаётся успешно и возвращает ссылку. Ключ обмена присутствует исходя из тестирования через CSP.
Offline Andrey Zhilov  
#25 Оставлено : 19 ноября 2020 г. 7:25:24(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
LPSTR не дал результатов, та же ошибка.
Offline Andrey Zhilov  
#26 Оставлено : 19 ноября 2020 г. 7:25:50(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Может это быть связано с разрядностью системы?
Offline Andrey Zhilov  
#27 Оставлено : 19 ноября 2020 г. 10:16:46(UTC)
Andrey Zhilov

Статус: Участник

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Так, моя версия с разрядностью систем подтвердилась. Вроде запустил. Для этого собрал с использованием jdk 32 битного проект. В проекте используется либа Advapi32.dll. В 64 битной Windows она присутствует в 2-х версих 32 (Windows\system32) и 64 (Windows\SysWOW64). Собственно при сборке проекта на jdk 64 использовалась первая, в противном случае вторая. При использовании 64 версии CSP упорно выдавал эту ошибку при попытке передать пин для ключей обмена. Предполагаю, что пароль, который должен являться ASCII-сторокой с нулевым байтом на конце, надо в 64 версии формировать как-то иначе, не так как указанно выше в примере. Может кто-то подскажет с данным вопросом?
Offline two_oceans  
#28 Оставлено : 20 ноября 2020 г. 12:57:11(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Вариантов не так много. Скорее всего LPWSTR (Unicode, то есть после каждого байта первой кодовой полустраницы (где цифры) нулевой байт, а в конце два нулевых; вероятнее для Windows) или UTF-8 (для capi lite на *nix).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.