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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dnik  
#1 Оставлено : 10 октября 2012 г. 12:52:44(UTC)
Dnik

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

Группы: Участники
Зарегистрирован: 10.10.2012(UTC)
Сообщений: 2
Откуда: Moscow

Добрый день!
Работаю на DELPHI7, использую CryptoPro 3.6, JwaWinCrypt.pas
Есть 2 считывателя, дискета и флешка, имя контейнера на дискете "RaUser-685921dd-e75f-4c14-bcdc-d2f7709515d4", на флешке "key"
Нужно перечислить все ключевые контейнеры, чтобы дать пользователю возможность выбора, т.к. неизвестно чем будет пользоваться, возможно будет флешка или токен.

procedure TForm1.Button4Click(Sender: TObject);
var
pdwDatalen : Cardinal;
Cont : String;
pbData : PByte;
begin
if CryptAcquireContext(hProv, nil, nil, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT) then
begin
if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, nil, pdwDatalen, CRYPT_FIRST) then
begin
GetMem(pbData, pdwDatalen);
if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, CRYPT_FIRST) then
while True do
begin
if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, 0) then
begin
Cont := PChar(pbData);
FileMemo.Lines.Add(Cont);
end else
begin
ShowMessage(GetLastErrorText);
Break;
end;
end;
FreeMem(pbData);
end;
CryptReleaseContext(hProv, 0);
end;
end;

function GetLastErrorText: string;
begin;
case GetLastError of
ERROR_INVALID_HANDLE: Result:='ERROR_INVALID_HANDLE';
ERROR_MORE_DATA: Result:='ERROR_MORE_DATA';
ERROR_INVALID_PARAMETER: Result:='ERROR_INVALID_PARAMETER';
ERROR_NOT_ENOUGH_MEMORY: Result:='ERROR_NOT_ENOUGH_MEMORY';
cardinal(E_INVALIDARG): Result:='Invalid message and certificate encoding types. Currently only PKCS_7_ASN_ENCODING and X509_ASN_ENCODING_TYPE are supported. Invalid cbSize in *pVerifyPara.';
cardinal(NTE_BAD_FLAGS): Result:='NTE_BAD_FLAGS';
cardinal(NTE_BAD_KEYSET): Result:='NTE_BAD_KEYSET';
cardinal(NTE_BAD_KEYSET_PARAM): Result:='NTE_BAD_KEYSET_PARAM';
cardinal(NTE_BAD_PROV_TYPE): Result:='NTE_BAD_PROV_TYPE';
cardinal(NTE_BAD_SIGNATURE): Result:='NTE_BAD_SIGNATURE';
cardinal(NTE_EXISTS): Result:='NTE_EXISTS';
cardinal(NTE_KEYSET_ENTRY_BAD): Result:='NTE_KEYSET_ENTRY_BAD';
cardinal(NTE_KEYSET_NOT_DEF): Result:='NTE_KEYSET_NOT_DEF';
cardinal(NTE_NO_MEMORY): Result:='NTE_NO_MEMORY';
cardinal(NTE_PROV_DLL_NOT_FOUND): Result:='NTE_PROV_DLL_NOT_FOUND';
cardinal(NTE_PROV_TYPE_ENTRY_BAD): Result:='NTE_PROV_TYPE_ENTRY_BAD';
cardinal(NTE_PROV_TYPE_NO_MATCH): Result:='NTE_PROV_TYPE_NO_MATCH';
cardinal(NTE_PROV_TYPE_NOT_DEF): Result:='NTE_PROV_TYPE_NOT_DEF';
cardinal(NTE_PROVIDER_DLL_FAIL): Result:='NTE_PROVIDER_DLL_FAIL';
cardinal(NTE_SIGNATURE_FILE_BAD): Result:='NTE_SIGNATURE_FILE_BAD';
cardinal(NTE_BAD_ALGID): Result:='NTE_BAD_ALGID';
cardinal(NTE_BAD_HASH): Result:='NTE_BAD_HASH';
cardinal(NTE_BAD_UID): Result:='NTE_BAD_UID';
cardinal(NTE_BAD_KEY): Result:='NTE_BAD_KEY';
cardinal(NTE_NO_KEY): Result:='NTE_NO_KEY';
cardinal(NTE_FAIL): Result:='NTE_FAIL';

else Result:='Unknown error';
end;
end;

Вышеприведенный код возвращает только имя контейнера на дискете, флешку не видит с ошибкой "Unknown error"
Подскажите, пожалуйста, что не так делаю, или в какую сторону копать.
Offline Андрей Писарев  
#2 Оставлено : 10 октября 2012 г. 12:58:30(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
while True do
....


а где CRYPT_NEXT ?



Цитата:

с ошибкой "Unknown error"

Это не ошибка.... а твоя строка ...
GetLastError - в студию!


Цитата:
GetLastErrorText

что за велосипед такой интересный?

Цитата:

syserrormessage(getlasterror())

такую функцию разве нельзя использовать?

Отредактировано пользователем 10 октября 2012 г. 13:34:31(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Dnik  
#3 Оставлено : 10 октября 2012 г. 13:54:27(UTC)
Dnik

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

Группы: Участники
Зарегистрирован: 10.10.2012(UTC)
Сообщений: 2
Откуда: Moscow

Андрей * написал:
Цитата:
while True do
....


а где CRYPT_NEXT ?



Цитата:

с ошибкой "Unknown error"

Это не ошибка.... а твоя строка ...
GetLastError - в студию!


Цитата:
GetLastErrorText

что за велосипед такой интересный?

Цитата:

syserrormessage(getlasterror())

такую функцию разве нельзя использовать?



GetLastError возвращает ERROR_NO_MORE_ITEMS = 259;
Добавил CRYPT_NEXT, то же самое получается

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  pdwDatalen : Cardinal;
  Cont       : String;
  pbData     : PByte;
  dwFlags    : Cardinal;
begin
  if CryptAcquireContext(hProv, nil, nil, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT) then
  begin
    dwFlags:= CRYPT_FIRST;
    if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, nil, pdwDatalen, dwFlags) then
    begin
      GetMem(pbData, pdwDatalen);
      if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
      begin
        dwFlags:= 0;
        if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
        begin
          Cont := PChar(pbData);
          FileMemo.Lines.Add(Cont);
          dwFlags:= CRYPT_NEXT;
          while True do
          begin
            if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
            begin
              Cont := PChar(pbData);
              FileMemo.Lines.Add(Cont);
            end else
            begin
              ShowMessage(SysErrorMessage(GetLastError));
              Break;
            end;
          end;
        end;
      end;
      FreeMem(pbData);
    end;
    CryptReleaseContext(hProv, 0);
  end;
end;

Offline CAUse  
#4 Оставлено : 20 октября 2012 г. 3:30:06(UTC)
CAUse

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Dnik написал:
Андрей * написал:
Цитата:
while True do
....


а где CRYPT_NEXT ?



Цитата:

с ошибкой "Unknown error"

Это не ошибка.... а твоя строка ...
GetLastError - в студию!


Цитата:
GetLastErrorText

что за велосипед такой интересный?

Цитата:

syserrormessage(getlasterror())

такую функцию разве нельзя использовать?



GetLastError возвращает ERROR_NO_MORE_ITEMS = 259;
Добавил CRYPT_NEXT, то же самое получается

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  pdwDatalen : Cardinal;
  Cont       : String;
  pbData     : PByte;
  dwFlags    : Cardinal;
begin
  if CryptAcquireContext(hProv, nil, nil, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT) then
  begin
    dwFlags:= CRYPT_FIRST;
    if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, nil, pdwDatalen, dwFlags) then
    begin
      GetMem(pbData, pdwDatalen);
      if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
      begin
        dwFlags:= 0;
        if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
        begin
          Cont := PChar(pbData);
          FileMemo.Lines.Add(Cont);
          dwFlags:= CRYPT_NEXT;
          while True do
          begin
            if CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, pdwDatalen, dwFlags) then
            begin
              Cont := PChar(pbData);
              FileMemo.Lines.Add(Cont);
            end else
            begin
              ShowMessage(SysErrorMessage(GetLastError));
              Break;
            end;
          end;
        end;
      end;
      FreeMem(pbData);
    end;
    CryptReleaseContext(hProv, 0);
  end;
end;



Контейнеры точно не кончились?

Цитата:
When this function fails with the ERROR_NO_MORE_ITEMS error code, the end of the enumeration has been reached.

Отредактировано пользователем 20 октября 2012 г. 13:55:45(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.