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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline MasterEugene  
#1 Оставлено : 26 февраля 2013 г. 11:32:59(UTC)
MasterEugene

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

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

Offline MasterEugene  
#2 Оставлено : 26 февраля 2013 г. 12:11:39(UTC)
MasterEugene

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

Группы: Участники
Зарегистрирован: 26.02.2013(UTC)
Сообщений: 2
Российская Федерация

Сорри за беспокойство. Решил проблему.
Неверно указал тип для prov: PointerByReference вместо Pointer.
Код:

public boolean CryptGetProvParam(
         Pointer prov,
         int dwParam,
         byte[] pbData,
         IntByReference dwDataLen,
         int dwFlags
         );
}
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.