Статус: Новичок
Группы: Участники
Зарегистрирован: 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" Подскажите, пожалуйста, что не так делаю, или в какую сторону копать.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
а где CRYPT_NEXT ? Цитата: с ошибкой "Unknown error"
Это не ошибка.... а твоя строка ... GetLastError - в студию! что за велосипед такой интересный? Цитата: syserrormessage(getlasterror())
такую функцию разве нельзя использовать? Отредактировано пользователем 10 октября 2012 г. 13:34:31(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.10.2012(UTC) Сообщений: 2 Откуда: Moscow
|
Андрей * написал:а где CRYPT_NEXT ? Цитата: с ошибкой "Unknown error"
Это не ошибка.... а твоя строка ... GetLastError - в студию! что за велосипед такой интересный? Цитата: 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;
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.02.2012(UTC) Сообщений: 45
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 4 раз в 1 постах
|
Dnik написал:Андрей * написал:а где CRYPT_NEXT ? Цитата: с ошибкой "Unknown error"
Это не ошибка.... а твоя строка ... GetLastError - в студию! что за велосипед такой интересный? Цитата: 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)
| Причина: Не указана
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close