Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Как проверить сертификат что он не отозван?
В документации нашел список функций про CRL:
https://docs.microsoft.com/ru-ru/windows/desktop/SecCrypto/cryptography-functions#certificate-revocation-list-functions

Как ими пользоваться могу только предполагать.

Видимо так:
1. CertOpenSystemStore - Какое хранилище тут нужно открыть, как оно называется?
2. В цикле выполнять CertGetCRLFromStore или CertEnumCRLsInStore чтобы перебрать все CRL. Видимо на каждом шаге в конце вызывать CertFreeCRLContext
3. В каждом CRL искать свой сертификат CertFindCertificateInCRL

Вроде все.

Не понял для чего нужна CertCreateCRLContext

Еще вопрос - можно ли всегда исходить что CRL всегда содержится в хранилище? Или нужно самому откуда-то выкачивать его и заливать в хранилище? Или есть еще какие-то варианты?
Я просто не представляю как вообще это все работает.
30 май 19, 19:17    [21897953]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker,

есть специальные функции для проверки статуса сертификата (цепочек сертификатов), в том числе на отзыв.
CertCreateCertificateChainEngine / CertGetCertificateChain / CertFreeCertificateChain / CertFreeCertificateChainEngine

SQL-Talker
CertOpenSystemStore - Какое хранилище тут нужно открыть, как оно называется?
"CA"
SQL-Talker
Не понял для чего нужна CertCreateCRLContext
чтобы прочитать файл с диска или памяти, а не из хранилища.

SQL-Talker
Еще вопрос - можно ли всегда исходить что CRL всегда содержится в хранилище?

не всегда. зато при использовании CertCreateCertificateChainEngine / CertGetCertificateChain с определенными параметрами (и при условии, что установлен корневой сертификат, в сертификате есть расширение Точки распространения списков отзыва (CRL) (2.5.29.31)) и URL доступен) это не важно.
30 май 19, 22:46    [21898078]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Ghost Writer
зато при использовании CertCreateCertificateChainEngine / CertGetCertificateChain ...
Стоп, я так-то думал, функции "Certificate Chain Verification Functions" со списками отзыва никак не связаны (проверка цепочки сертификатов это у меня следующая задача)

Можно подробнее про списки отзыва и CertCreateCertificateChainEngine / CertGetCertificateChain, плиз
31 май 19, 08:33    [21898198]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker,

CertGetCertificateChain параметр dwFlags
там даже экземпл есть, хоть и без флагов CERT_CHAIN_REVOCATION_CHECK_...
31 май 19, 09:12    [21898225]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Ghost Writer,

В описании функции CertGetCRLFromStore указано
https://docs.microsoft.com/en-us/windows/desktop/api/Wincrypt/nf-wincrypt-certgetcrlfromstore
The new Certificate Chain Verification Functions are recommended instead of this function.
Означает ли это что не нужно вообще проверять сертификат посредством функций которые я приводил в первом посте (CertGetCRLFromStore/CertEnumCRLsInStore , CertFindCertificateInCRL) , а достаточно проверить цепочку сертификатов?
31 май 19, 10:09    [21898283]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker,

да, если нужен только статус без времени и причины отзыва.
31 май 19, 10:17    [21898293]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Ghost Writer,

1. Т.е. достаточно просто вызвать CertGetCertificateChain и в случае если результат = True , то анализировать значение pChainContext->TrustStatus.dwErrorStatus ?

2. Перед вызовом CertGetCertificateChain нужно ли вызывать CertCreateCertificateChainEngine или это совершенно необязательно?
31 май 19, 10:34    [21898316]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker,

1. Да.
2. CertGetCertificateChain использует hChainEngine, полученный с помощью CertCreateCertificateChainEngine
31 май 19, 10:40    [21898322]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Ghost Writer,

2. В примере в качестве параметра hChainEngine указан NULL, почему я и спросил про обязательность. Т.е., надо полагать, CertCreateCertificateChainEngine все-таки лучше вызывать, а в чем тогда идея кода в примере, где первым параметром CertGetCertificateChain идет NULL ?
31 май 19, 10:49    [21898337]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker
а в чем тогда идея кода в примере, где первым параметром CertGetCertificateChain идет NULL ?
сам не пойму, ведь hChainEngine предварительно создается при помощи CertCreateCertificateChainEngine но не используется )
ну написано NULL значит параметры по умолчанию. только какие они хз. так что лучше самому контролировать процесс.
31 май 19, 11:01    [21898360]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Вызываю CertGetCertificateChain - получаю Access violation.

Заголовки:
function CertCreateCertificateChainEngine(
  pConfig: PCERT_CHAIN_ENGINE_CONFIG;
  var phChainEngine: HCERTCHAINENGINE
): BOOL; stdcall;

function CertGetCertificateChain(
  hChainEngine: HCERTCHAINENGINE;
  pCertContext: PCCERT_CONTEXT;
  pTime: LPFILETIME;
  hAdditionalStore: HCERTSTORE;
  pChainPara: PCERT_CHAIN_PARA;
  dwFlags: DWORD;
  pvReserved: LPVOID;
  ppChainContext: PPCCERT_CHAIN_CONTEXT  // указатель на указатель
): BOOL; stdcall;


Процедура:
function GetCertificateChain_Status(pCertContext: PCCERT_CONTEXT): Boolean;
var
  ChainConfig: CERT_CHAIN_ENGINE_CONFIG;
  phChainEngine: HCERTCHAINENGINE;

  pChainPara: PCERT_CHAIN_PARA;
  dwFlags: DWORD;
  ppChainContext: PCCERT_CHAIN_CONTEXT;
begin
  Result := False;

  ChainConfig.cbSize := sizeof(CERT_CHAIN_ENGINE_CONFIG);
  ChainConfig.hRestrictedRoot := nil;
  ChainConfig.hRestrictedTrust := nil;
  ChainConfig.hRestrictedOther := nil;
  ChainConfig.cAdditionalStore := 0;
  ChainConfig.rghAdditionalStore := nil;
  ChainConfig.dwFlags := CERT_CHAIN_CACHE_END_CERT;
  ChainConfig.dwUrlRetrievalTimeout := 0;
  ChainConfig.MaximumCachedCertificates := 0;
  ChainConfig.CycleDetectionModulus := 0;

  if not CertCreateCertificateChainEngine(@ChainConfig, phChainEngine) then
    EXIT;

  dwFlags := CERT_CHAIN_CACHE_END_CERT;

  if CertGetCertificateChain(    // <--- Здесь происходит AV
      phChainEngine,
      pCertContext,
      nil,
      nil,
      pChainPara,
      dwFlags,
      nil,
      nil //@ppChainContext
    )
  then
    EXIT;

  Result := ppChainContext^.TrustStatus.dwErrorStatus = CERT_TRUST_NO_ERROR;
end;

В чем ошибка?
31 май 19, 18:05    [21899082]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Последний параметр в вызове конечно же раскомментирован должен быть. Это я уже пробовал по разному
31 май 19, 18:08    [21899089]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
alekcvp
Member

Откуда:
Сообщений: 1418
SQL-Talker,
CertCreateCertificateChainEngine
BOOL CertCreateCertificateChainEngine(
  PCERT_CHAIN_ENGINE_CONFIG pConfig,
  HCERTCHAINENGINE          *phChainEngine
);
phChainEngine - A pointer to the handle of the chain engine created.

CertGetCertificateChain
BOOL CertGetCertificateChain(
  HCERTCHAINENGINE     hChainEngine,
  PCCERT_CONTEXT       pCertContext,
  LPFILETIME           pTime,
  HCERTSTORE           hAdditionalStore,
  PCERT_CHAIN_PARA     pChainPara,
  DWORD                dwFlags,
  LPVOID               pvReserved,
  PCCERT_CHAIN_CONTEXT *ppChainContext
);
hChainEngine - A handle of the chain engine (namespace and cache) to be used. If hChainEngine is NULL, the default chain engine, HCCE_CURRENT_USER, is used. This parameter can be set to HCCE_LOCAL_MACHINE.

Это то, что я навскидку вижу.
31 май 19, 19:58    [21899174]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker
Процедура:
function GetCertificateChain_Status(pCertContext: PCCERT_CONTEXT): Boolean;
var
  ChainConfig: CERT_CHAIN_ENGINE_CONFIG;
  phChainEngine: HCERTCHAINENGINE;

  pChainPara: PCERT_CHAIN_PARA; // заменить на ChainPara: CERT_CHAIN_PARA
  dwFlags: DWORD;
  ppChainContext: PCCERT_CHAIN_CONTEXT;
begin
  Result := False;

  ChainConfig.cbSize := sizeof(CERT_CHAIN_ENGINE_CONFIG);
  ChainConfig.hRestrictedRoot := nil;
  ChainConfig.hRestrictedTrust := nil;
  ChainConfig.hRestrictedOther := nil;
  ChainConfig.cAdditionalStore := 0;
  ChainConfig.rghAdditionalStore := nil;
  ChainConfig.dwFlags := CERT_CHAIN_CACHE_END_CERT;
  ChainConfig.dwUrlRetrievalTimeout := 0;
  ChainConfig.MaximumCachedCertificates := 0;
  ChainConfig.CycleDetectionModulus := 0;

  if not CertCreateCertificateChainEngine(@ChainConfig, phChainEngine) then
    EXIT;

  dwFlags := CERT_CHAIN_CACHE_END_CERT;

  if CertGetCertificateChain(    // <--- Здесь происходит AV
      phChainEngine,
      pCertContext,
      nil,
      nil,
      pChainPara, // заменить на @ChainPara
      dwFlags,
      nil,
      nil //@ppChainContext 
    )
  then
    EXIT;

  Result := ppChainContext^.TrustStatus.dwErrorStatus = CERT_TRUST_NO_ERROR;
end;


В чем ошибка?
31 май 19, 21:15    [21899210]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
и еще строчку добавить ChainPara.cbSize := SizeOf(CERT_CHAIN_PARA);
31 май 19, 21:18    [21899214]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Внес изменения, вроде работает, но явно все равно что-то не так.

Вот код:
//----- Найти сертификат в хранилище 'MY' по SHA1 HASH ---------------
function Cert_FindCertificate_BySHA1(SHA1: PWideChar; aCertStore: Pointer): PCCERT_CONTEXT; stdcall;
var
  blob: CRYPT_HASH_BLOB;
begin
  blob.cbData := 20;
  blob.pbData := GetMemory(blob.cbData);
  HexToBin(PWideChar(SHA1), blob.pbData, blob.cbData);

  try
    Result := CertFindCertificateInStore(
      aCertStore,
      X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
      0,
      CERT_FIND_SHA1_HASH,
      @blob,
      nil
    );
  finally
    FreeMemory(blob.pbData);
  end;
end;

//----- Проверить цепочку сертификатов ---------------
function GetCertificateChain_Status(pCertContext: PCCERT_CONTEXT): Boolean;
var
  ChainConfig: CERT_CHAIN_ENGINE_CONFIG;
  phChainEngine: HCERTCHAINENGINE;

  vChainPara: CERT_CHAIN_PARA;
  dwFlags: DWORD;
  pChainContext: PCCERT_CHAIN_CONTEXT;
  flgChainCreated: Boolean;

  vCertStore: Pointer;
begin
  Result := False;
  pChainContext := nil;

  ChainConfig.cbSize := sizeof(CERT_CHAIN_ENGINE_CONFIG);
  ChainConfig.hRestrictedRoot := nil;
  ChainConfig.hRestrictedTrust := nil;
  ChainConfig.hRestrictedOther := nil;
  ChainConfig.cAdditionalStore := 0;
  ChainConfig.rghAdditionalStore := nil;
  ChainConfig.dwFlags := CERT_CHAIN_CACHE_END_CERT;
  ChainConfig.dwUrlRetrievalTimeout := 0;
  ChainConfig.MaximumCachedCertificates := 0;
  ChainConfig.CycleDetectionModulus := 0;

  vChainPara.cbSize := SizeOf(CERT_CHAIN_PARA);

  if not CertCreateCertificateChainEngine(@ChainConfig, phChainEngine) then
    EXIT;

  dwFlags := CERT_CHAIN_CACHE_END_CERT;

  flgChainCreated := CertGetCertificateChain(    // <--- Здесь происходит AV
    phChainEngine,
    pCertContext,
    nil,
    nil,
    @vChainPara,
    dwFlags,
    nil,
    @pChainContext
  );

  if flgChainCreated then
    Result := pChainContext^.TrustStatus.dwErrorStatus = CERT_TRUST_NO_ERROR;

  if pChainContext <> nil then
    CertFreeCertificateChain(pChainContext);

  CertFreeCertificateChainEngine(phChainEngine);
end;

//----- Проверим работу функции проверки цепочки сертификтов ---------------
procedure TfrmMain.Button1Click(Sender: TObject);
var
  vCertStore: Pointer;
  vCertContext: PCCERT_CONTEXT;
begin
  // откроем хранилище и найдем сертификат
  vCertStore := CertOpenSystemStore( 0, PChar( 'MY' ));
  vCertContext := Cert_FindCertificate_BySHA1(PWideChar( edtSHA1FingerPrint.Text ), vCertStore);

  Memo1.Lines.Append(''); // <-- если удалить эту строку, то проискходит AV в GetCertificateChain_Status()

  if GetCertificateChain_Status(vCertContext) then
    ShowMessage('Ok')
  else
    ShowMessage('ERROR !');

  CertFreeCertificateContext( vCertContext );
  CertCloseStore( vCertStore, CERT_CLOSE_STORE_CHECK_FLAG );
end;


Первое - если кликнуть на кнопку Button1 - AV при втором вызове CertGetCertificateChain
Второе - вообще бред - если удалить строку
Memo1.Lines.Append('');
получаем AV при ПЕРВОМ же вызове CertGetCertificateChain
Т.е. явно где-то лажа, но где?
3 июн 19, 19:24    [21900854]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Первое - если кликнуть на кнопку Button1 два раза - получим AV при втором вызове CertGetCertificateChain
3 июн 19, 19:26    [21900856]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
SQL-Talker
Т.е. явно где-то лажа, но где?
Импорты функций покажи. Похоже на разрушение стека из-за кривого импорта.
3 июн 19, 19:43    [21900871]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
_Vasilisk_,

Вот:
unit JwaWinCrypt;
...
function CertFindCertificateInStore(
  hCertStore: HCERTSTORE;
  dwCertEncodingType, dwFindFlags, dwFindType: DWORD;
  pvFindPara: Pointer;
  pPrevCertContext: PCCERT_CONTEXT
): PCCERT_CONTEXT; stdcall;

function CertCreateCertificateChainEngine(
  pConfig: PCERT_CHAIN_ENGINE_CONFIG;
  var phChainEngine: HCERTCHAINENGINE
): BOOL; stdcall;

function CertGetCertificateChain(
  hChainEngine: HCERTCHAINENGINE;
  pCertContext: PCCERT_CONTEXT;
  pTime: LPFILETIME;
  hAdditionalStore: HCERTSTORE;
  pChainPara: PCERT_CHAIN_PARA;
  dwFlags: DWORD;
  pvReserved: LPVOID;
  ppChainContext: PPCCERT_CHAIN_CONTEXT
): BOOL; stdcall;

procedure CertFreeCertificateChain(pChainContext: PCCERT_CHAIN_CONTEXT); stdcall;

procedure CertFreeCertificateChainEngine(hChainEngine: HCERTCHAINENGINE); stdcall;

function CertOpenSystemStore(hProv: HCRYPTPROV; szSubsystemProtocol: LPCTSTR): HCERTSTORE; stdcall;

function CertFreeCertificateContext(pCertContext: PCCERT_CONTEXT): BOOL; stdcall;

function CertCloseStore(hCertStore: HCERTSTORE; dwFlags: DWORD): BOOL; stdcall;
3 июн 19, 19:52    [21900879]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
SQL-Talker
Вот:
Криминала не видно. Посмотри еще значение регистра ESP до вызова каждой функции и после. Они должны совпадать.

Ну и вот это
SQL-Talker
function Cert_FindCertificate_BySHA1(SHA1: PWideChar; aCertStore: Pointer): PCCERT_CONTEXT; stdcall;
var
  blob: CRYPT_HASH_BLOB;
begin
  blob.cbData := 20;
  blob.pbData := GetMemory(blob.cbData);
  HexToBin(PWideChar(SHA1), blob.pbData, blob.cbData);

  try
    Result := CertFindCertificateInStore(
лучше переписать так
function Cert_FindCertificate_BySHA1(SHA1: PWideChar; aCertStore: Pointer): PCCERT_CONTEXT; stdcall;
var
  blob: CRYPT_HASH_BLOB;
begin
  blob.cbData := StrLen(SHA1) div 2;
  blob.pbData := GetMemory(blob.cbData);
  try
    HexToBin(SHA1, blob.pbData, blob.cbData);
    Result := CertFindCertificateInStore(


и хорошо бы коды ошибок анализировать
3 июн 19, 20:23    [21900897]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 802
SQL-Talker
  ChainConfig.cbSize := sizeof(CERT_CHAIN_ENGINE_CONFIG);
  ChainConfig.hRestrictedRoot := nil;
  ChainConfig.hRestrictedTrust := nil;
  ChainConfig.hRestrictedOther := nil;
  ChainConfig.cAdditionalStore := 0;
  ChainConfig.rghAdditionalStore := nil;
  ChainConfig.dwFlags := CERT_CHAIN_CACHE_END_CERT;
  ChainConfig.dwUrlRetrievalTimeout := 0;
  ChainConfig.MaximumCachedCertificates := 0;
  ChainConfig.CycleDetectionModulus := 0;

видимо, этого куска недостаточно.
копируй всё из примера:
// Initialize data structures.

EnhkeyUsage.cUsageIdentifier = 0;
EnhkeyUsage.rgpszUsageIdentifier=NULL;
CertUsage.dwType = USAGE_MATCH_TYPE_AND;
CertUsage.Usage  = EnhkeyUsage;
ChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
ChainPara.RequestedUsage=CertUsage;

ChainConfig.cbSize = sizeof(CERT_CHAIN_ENGINE_CONFIG);
ChainConfig.hRestrictedRoot= NULL ;
ChainConfig.hRestrictedTrust= NULL ;
ChainConfig.hRestrictedOther= NULL ;
ChainConfig.cAdditionalStore=0 ;
ChainConfig.rghAdditionalStore = NULL ;
ChainConfig.dwFlags = CERT_CHAIN_CACHE_END_CERT;
ChainConfig.dwUrlRetrievalTimeout= 0 ;
ChainConfig.MaximumCachedCertificates=0 ;
ChainConfig.CycleDetectionModulus = 0;
3 июн 19, 20:34    [21900903]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
Ghost Writer
копируй всё из примера:
А еще лучше
FillChar(ChainConfig, SizeOf(ChainConfig), 0);
ChainConfig.cbSize := sizeof(CERT_CHAIN_ENGINE_CONFIG);
ChainConfig.dwFlags := CERT_CHAIN_CACHE_END_CERT;
3 июн 19, 20:54    [21900920]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Ghost Writer,

Взлетело, черт возьми )) Спасибо
3 июн 19, 20:57    [21900925]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
_Vasilisk_,

При вызове CertFindCertificateInStore значение регистра ESP изменяется. Это плохо?
3 июн 19, 20:58    [21900926]     Ответить | Цитировать Сообщить модератору
 Re: CryptoAPI - как проверить сертификат на вхождение в список отозванных  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4813
SQL-Talker
_Vasilisk_,

При вызове CertFindCertificateInStore значение регистра ESP изменяется. Это плохо?
ну как бы да, значит декларация написана неправильно
4 июн 19, 00:15    [21901029]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить