Статус: Участник
Группы: Участники
Зарегистрирован: 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.
|