Статус: Новичок
Группы: Участники
Зарегистрирован: 26.02.2013(UTC) Сообщений: 2 
|
Необходимо получить список контейнеров из КриптоПРо CSP и передать их пользователю. Работаю через Advapi32. Почитал посвященные данной задаче темы на форуме, попытался повторить. Не выходит. Вот описание подключения библиотеки. Код:
public interface Advapi32 extends Library {
public Advapi32 INST = (Advapi32) Native.loadLibrary("advapi32", Advapi32.class);
...
public boolean CryptAcquireContextA(
PointerByReference prov,
String pszContainer,
String pszProvider,
int dwProvType,
int dwFlags);
public boolean CryptGetProvParam(
PointerByReference prov,
int dwParam,
byte[] pbData,
IntByReference dwDataLen,
int dwFlags
);
}
Вот сам код функции Код:
public Object[] GetReaderNames()
{
int BUFFSIZE = 512;
ArrayList readernames = new ArrayList();
IntByReference pdwDataLen = new IntByReference();
PointerByReference provRef = new PointerByReference();
boolean result = Advapi32.INST.CryptAcquireContextA(provRef, null, null, provType,
Advapi32.CRYPT_VERIFYCONTEXT);
int dwFlags = Advapi32.CRYPT_FIRST;
Advapi32.INST.CryptGetProvParam(provRef, 114, null, pdwDataLen, dwFlags);
BUFFSIZE = (int)(2 * pdwDataLen.getValue());
byte[] sb = new byte[BUFFSIZE];
/* ---------- Get KeyContainer Names ------------- */
while (Advapi32.INST.CryptGetProvParam(provRef, Advapi32.PP_ENUMREADERS, sb, pdwDataLen, dwFlags))
{
dwFlags = 0; //required to continue entire enumeration
readernames.add(sb.toString());
}
if (provRef.getValue() != Pointer.NULL){
Advapi32.INST.CryptReleaseContext(provRef.getValue(), 0);
}
if (readernames.size() == 0)
readernames.add("0 штук");
return readernames.toArray();
}
Функция CryptGetProvParam возвращает false. и pdwDataLen = 0. В целом механизм подписания/проверки подписи работает. Не могу понять в чем может быть проблема. Так же пробовал вызывать CryptGetProvParam(...PP_SELECT_CONTAINER...) для появления окна со списком контейнеров, результат тот же самый - никакой. Посмотрел последнюю ошибку через Kernel32.GetLastError(). Выдал 87 - The parameter is incorrect. Отредактировано пользователем 26 февраля 2013 г. 12:00:27(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.02.2013(UTC) Сообщений: 2 
|
Сорри за беспокойство. Решил проблему. Неверно указал тип для prov: PointerByReference вместо Pointer. Код:
public boolean CryptGetProvParam(
Pointer prov,
int dwParam,
byte[] pbData,
IntByReference dwDataLen,
int dwFlags
);
}
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close