Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 170  Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Кода очень много, запостить целиком пока не могу. Вот пример: Код:
-- class GostR3410_2001
private byte[] signHash(byte[] hash, int hCryptProv, final int hCryptKey)
throws SignatureException {
// Acquire a hash object handle.
final int hashHandle = Advapi.cryptCreateHash(hCryptProv, digestAlgId);
if (hashHandle == 0)
throw new SignatureException("Error acquiring digest handle. Error code: " + Win32Api.getLastError());
try {
// Set hash value in the hash object
if (!Advapi.cryptSetHashParam(hashHandle, HP_HASHVAL, hash, 0))
throw new SignatureException("Error initializing hash value. Error code: " + Win32Api.getLastError());
// Determine key spec.
int dwKeySpec = AT_SIGNATURE;
final int dwAlgId = Win32Api.byteArrayToInt(Advapi.cryptGetKeyParam(hCryptKey, KP_ALGID));
if (dwAlgId == 0)
throw new SignatureException("Error getting key algorithm spec. Error code: " + Win32Api.getLastError());
if ((ALG_CLASS_KEY_EXCHANGE & dwAlgId) == ALG_CLASS_KEY_EXCHANGE) {
dwKeySpec = AT_KEYEXCHANGE;
}
return Advapi.cryptSignHash(hashHandle, dwKeySpec, 0);
} finally {
Advapi.cryptDestroyHash(hashHandle);
}
}
-- end of class GostR3410_2001
--class Advapi
public static byte[] cryptSignHash(int hashHandle, int keySpec, int flags) {
final IntByReference len = new IntByReference();
if (!lib.CryptSignHashA(hashHandle, keySpec, null, flags, null, len))
throw raiseError("CryptSignHash", getLastError());
final byte[] sign = new byte[len.getValue()];
if (!lib.CryptSignHashA(hashHandle, keySpec, null, flags, sign, len))
throw raiseError("CryptSignHash", getLastError());
return sign;
}
-- end of class Advapi
Похоже, проблема была в том, что я не передавал пароль на контейнер. С беспарольным контейнером все работает. Ошибка была со значением 0 - непонятно почему. Видимо, глючит JNA, проверю на досуге. Пришлось писать код на Си++ и смотреть на ошибки. Продолжу тестирование с другими сертификатами. ОФФТОПИК: Вот только я не понял, как создать несколько контейнеров. И правда ли, что в одном контейнере может быть только один ключ? И как импортировать ключи с созданием контейнера, если я например экспортировал их на дискетку под виндой? Буду курить мануалы, но если кто быстро ответит на вопросы - буду благодарен, так как ограничен во времени сильно :(
|