Статус: Новичок
Группы: Участники
Зарегистрирован: 11.02.2019(UTC) Сообщений: 8  Откуда: Новосибирск
|
Благодарю Вас за столь развернутый ответ. Он сильно помог мне в понимании происходящего. Ваши советы я обязательно учту. Использую JwaWinCrypt версии 1.13 Однако, при указании AT_KEYEXCHANGE результат не изменился. Позволю себе привести код процедуры и результат выполнения. Код:
procedure TForm1.GetProvData(ProvNum: Cardinal);
var
ProvName, ContainerName: string;
I, ProvType, NameLen, hProv, DataLen, impType, Flag, Error: Cardinal;
Vers: array[0..3] of Byte;
Key: HCRYPTKEY;
begin
if not CryptEnumProviders(ProvNum, nil, 0, ProvType, nil, NameLen) then Exit;
SetLength(ProvName, NameLen);
if not CryptEnumProviders(ProvNum, nil, 0, ProvType, PChar(ProvName), NameLen) then Exit;
Memo1.Lines.Append(' Len: '+IntToStr(NameLen)+' '+ProvName);
Memo1.Lines.Append(' Provider type: '+ ProvTypeToStr(ProvType));
if not CryptAcquireContext(hProv, nil, PChar(ProvName), ProvType, CRYPT_VERIFYCONTEXT {+ CRYPT_MACHINE_KEYSET}) then Exit;
DataLen := 4;
if not CryptGetProvParam(hProv, PP_VERSION, @Vers, DataLen, 0) then Exit;
Memo1.Lines.Append(' Version: ' + IntToStr(Vers[1]) + '.' + IntToStr(Vers[0]));
if not CryptGetProvParam(hProv, PP_IMPTYPE, @impType, DataLen, 0) then Exit;
Memo1.Lines.Append(' Type: ' + ImpTypeToStr(impType));
Flag := CRYPT_FIRST;
CryptGetProvParam(hProv, PP_ENUMCONTAINERS, nil, DataLen, Flag);
Memo1.Lines.Append('Контейнеры: (Max size of container name: '+IntToStr(DataLen)+')');
SetLength(ContainerName, DataLen+1);
while True do
begin
if not CryptGetProvParam(hProv, PP_ENUMCONTAINERS, PByte(PChar(ContainerName)), DataLen, Flag) then
begin
Error := Cardinal(GetLastError);
if Error <> ERROR_NO_MORE_ITEMS then
Memo1.Lines.Append(' get container state: '+SysErrorMessage(Integer(Error)));
break;
end;
Memo1.Lines.Add(#13+ContainerName);
Flag := CRYPT_NEXT;
if not CryptGetUserKey(hProv, {AT_SIGNATURE} AT_KEYEXCHANGE, Key) then
begin
Error := Cardinal(GetLastError);
Memo1.Lines.Append(' get key handle: '+SysErrorMessage(Integer(Error)));
Key := 0;
end else
Memo1.Lines.Append(' get key handle: success ('+IntToStr(Key)+')');
if Key <> 0 then
CryptDestroyKey(Key);
end;
CryptReleaseContext(hProv, 0);
end;
Код:
Len: 60 Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
Provider type: Code: 75
Version: 4.0
Type: Code: 8
Контейнеры: (Max size of container name: 513)
b6835a3e-4885-4831-b070-d98129d0665d
get key handle: Ключ не существует
|