Статус: Участник
Группы: Участники
Зарегистрирован: 16.02.2021(UTC) Сообщений: 21  Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Добрый день. Почему может быть так, что csptest видит контейнеры на подключенных Рутокен, а наш CryptoApi-код не видит эти контейнеры. Сам код: Код:
AcquireContext(@FCryptProv, nil, CRYPT_VERIFYCONTEXT, '');
try
I := 0;
FEnumFlag := CRYPT_FIRST;
if FCryptGetProvParam(FCryptProv, PP_ENUMCONTAINERS, nil, @FKeyLenNeed, FEnumFlag) then
begin
SetLength(FKeyData, FKeyLenNeed);
while FCryptGetProvParam(FCryptProv, PP_ENUMCONTAINERS, @FKeyData[1], @FKeyLenNeed, FEnumFlag) do
begin
FItem := TCustomCryptoContainerItem.Create;
FItem.KeyID := PAnsiChar(FKeyData);
// открытие исходного контейнера ключей
AcquireContext(@FSourceCryptProv, PWideChar(WideString(FItem.KeyID)), CRYPT_SILENT, '');
try
// инициализация параметров алгоритмов
SetAlgorithmParams(FSourceCryptProv);
// полный путь к контейнеру
if FCryptGetProvParam(FSourceCryptProv, PP_UNIQUE_CONTAINER, nil, @FKeyLenNeed, 0) then
begin
SetLength(FKeyData, FKeyLenNeed);
if not FCryptGetProvParam(FSourceCryptProv, PP_UNIQUE_CONTAINER, @FKeyData[1], @FKeyLenNeed, 0) then
RaiseLastCryptoApiError;
FItem.ContainerName := UnicodeString(PAnsiChar(FKeyData));
end;
CryptoLogMessageFmt(CLM_SEARCH_PUBLIC_KEY, [FItem.KeyID]);
// проверяем наличие ключей в контейнере
if FCryptGetUserKey(FSourceCryptProv, AT_KEYEXCHANGE, @FSourceKey) then
try
// получение исходного сертификата
if FCryptGetKeyParam(FSourceKey, KP_CERTIFICATE, nil, @FKeyLenNeed, 0) then
begin
SetLength(FKeyData, FKeyLenNeed);
if not FCryptGetKeyParam(FSourceKey, KP_CERTIFICATE, @FKeyData[1], @FKeyLenNeed, 0) then
RaiseLastCryptoApiError;
FItem.CertData := UnicodeString(EncodePEM(FKeyData, 'BEGIN CERTIFICATE', 'END CERTIFICATE'));
end;
finally
if not FCryptDestroyKey(FSourceKey) then
RaiseLastCryptoApiError;
end
finally
ReleaseContext(FSourceCryptProv);
end;
Result.Add(FItem);
FEnumFlag := CRYPT_NEXT;
Inc(I);
end;
end;
CryptoLogMessageFmt(CLM_CONTAINER_LIST, [I]);
finally
ReleaseContext(FCryptProv);
end;
|