Atom Лента - Форум КриптоПро - Тема:Поиск сертификата в хранилище - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Poisksertifikatavkhranilishche-10:1Copyright 2024 Форум КриптоПро2024-03-29T16:23:18Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruAlexEr81https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=27805&name=AlexEr81AlexEr81https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=27805&name=AlexEr81Андрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *two_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansАндрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *AlexEr81https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=27805&name=AlexEr81MotoArhangelhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35747&name=MotoArhangeltwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansАндрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *MotoArhangelhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35747&name=MotoArhangelYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid100684:1Поиск сертификата в хранилище<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: AlexEr81 <a href="/forum2/default.aspx?g=posts&m=100665#post100665"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </div></div><br /><br /><br />имел ввиду, что без прав администратора в локальный компьютер не ставится<br /></td></tr></table>2019-02-22T10:47:12+03:002019-02-22T10:47:12+03:00AlexEr81<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: AlexEr81 <a href="/forum2/default.aspx?g=posts&m=100665#post100665"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </div></div><br /><br /><br />имел ввиду, что без прав администратора в локальный компьютер не ставится<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100680:1Поиск сертификата в хранилище<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=100679#post100679"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Код ошибки = GetLastError - вызывать, если функции вернули false</div></div>Только не все функции возвращают логические результаты. </div></div><br /><br />Вроде понятно написано условие, нет?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />, если функции вернули false</div></div><br /><br /><br />А какие функции возвращают true\false, кроме логических?</td></tr></table>2019-02-22T09:05:14+03:002019-02-22T09:05:14+03:00Андрей *<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=100679#post100679"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Код ошибки = GetLastError - вызывать, если функции вернули false</div></div>Только не все функции возвращают логические результаты. </div></div><br /><br />Вроде понятно написано условие, нет?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />, если функции вернули false</div></div><br /><br /><br />А какие функции возвращают true\false, кроме логических?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100679:1Поиск сертификата в хранилище<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Код ошибки = GetLastError - вызывать, если функции вернули false</div></div>Только не все функции возвращают логические результаты. В частности CertFindCertificateInStore возвращает указатель на контекст сертификата, поэтому совет не подходит.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Как его запихнуть в локальное хранилище, а не в хранилище пользователя? </div></div>Может быть использовать полный синтаксис открытия хранилища без флага чтения чтобы не зависеть от неявной интерпретации прав, что-то вроде: <div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">hStore:=CertOpenStore(CERT_STORE_PROV_SYSTEM_W,0,0,CERT_STORE_OPEN_EXISTING_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE,PWidechar('MY'));</code></pre>
</div></div></td></tr></table>2019-02-22T08:13:10+03:002019-02-22T08:13:10+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Код ошибки = GetLastError - вызывать, если функции вернули false</div></div>Только не все функции возвращают логические результаты. В частности CertFindCertificateInStore возвращает указатель на контекст сертификата, поэтому совет не подходит.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Как его запихнуть в локальное хранилище, а не в хранилище пользователя? </div></div>Может быть использовать полный синтаксис открытия хранилища без флага чтения чтобы не зависеть от неявной интерпретации прав, что-то вроде: <div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">hStore:=CertOpenStore(CERT_STORE_PROV_SYSTEM_W,0,0,CERT_STORE_OPEN_EXISTING_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE,PWidechar('MY'));</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100674:1Поиск сертификата в хранилище<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: AlexEr81 <a href="/forum2/default.aspx?g=posts&m=100665#post100665"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </div></div><br /><br />или "нажать" ОК в системном диалоге ОС и установить в корневые текущего пользователя, "без диалога и повышения прав" </td></tr></table>2019-02-21T21:40:42+03:002019-02-21T21:40:42+03:00Андрей *<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: AlexEr81 <a href="/forum2/default.aspx?g=posts&m=100665#post100665"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </div></div><br /><br />или "нажать" ОК в системном диалоге ОС и установить в корневые текущего пользователя, "без диалога и повышения прав" </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100665:1Поиск сертификата в хранилище<table class="content postContainer_Alt" width="100%"><tr><td>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </td></tr></table>2019-02-21T16:36:01+03:002019-02-21T16:36:01+03:00AlexEr81<table class="content postContainer_Alt" width="100%"><tr><td>тут где-то было. Если "запустить от имени Администратора" ставится в локальный компьютер, иначе в текущего пользователя. </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100661:1Поиск сертификата в хранилище<table class="content postContainer" width="100%"><tr><td>Всем спасибо.<br /><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />Вернуть текст сообщения: SysErrorMessage(код ошибки)<br /><br />Код ошибки = GetLastError - вызывать, если функции вернули false<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> RaiseLastOSError - если только для себя код пишите...</div></div></div></div><br />Сразу не подумал) Решил вопрос.<br /><br />Задам в этой же ветке. Ставлю корневой сертификат так:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-python"> cert := GetCertContext(FileName);
Store := CertOpenSystemStore(0, PWideChar(TypeCert));
begin
.....
CertAddCertificateContextToStore(Store, cert,CERT_STORE_ADD_ALWAYS, nil)
.....
</code></pre>
</div></div><br />Как его запихнуть в локальное хранилище, а не в хранилище пользователя?</td></tr></table>2019-02-21T17:10:33+03:002019-02-21T17:10:33+03:00MotoArhangel<table class="content postContainer" width="100%"><tr><td>Всем спасибо.<br /><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=100413#post100413"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />Вернуть текст сообщения: SysErrorMessage(код ошибки)<br /><br />Код ошибки = GetLastError - вызывать, если функции вернули false<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> RaiseLastOSError - если только для себя код пишите...</div></div></div></div><br />Сразу не подумал) Решил вопрос.<br /><br />Задам в этой же ветке. Ставлю корневой сертификат так:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-python"> cert := GetCertContext(FileName);
Store := CertOpenSystemStore(0, PWideChar(TypeCert));
begin
.....
CertAddCertificateContextToStore(Store, cert,CERT_STORE_ADD_ALWAYS, nil)
.....
</code></pre>
</div></div><br />Как его запихнуть в локальное хранилище, а не в хранилище пользователя?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100418:1Поиск сертификата в хранилище<table class="content postContainer_Alt" width="100%"><tr><td>На вид все в порядке. Ну своеобразно конечно ищете - весь контекст передаете, по идее отпечатка сертификата достаточно для однозначной идентифицикации сертификата. Отпечаток можно получить из свойства CERT_HASH_PROP_ID (или CERT_SHA1_HASH_PROP_ID) контекста сертификата (buffer это указатель на память, вместо pchar у меня другой тип, соль в том что pchar содержит #0 в конце, а тут возвращается значение двоичное):<div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertGetCertificateContextProperty(pCertCont,param, PByte(buffer), DataLen)</code></pre>
</div></div><br />и заполнить блоб хэша:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">c.cbData:=DataLen;
c.pbData:=buffer;</code></pre>
</div></div><br />искать по блобу хэша<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup"> CertCont:=CertFindCertificateInStore(hCStore,X509_ASN_ENCODING or PKCS_7_ASN_ENCODING{enc},0{flag},CERT_FIND_HASH,@c,nil);
res:=GetLastError();
writeln(stderr,inttohex(res,8));
// CRYPT_E_NOT_FOUND $80092004
if res=$80092004 then CertCont:=nil;</code></pre>
</div></div><br />Другой вопрос, что меня тоже приколы с нахождением функцией CertFindCertificateInStore: 1) уже в какой-то теме расписывал - по поготовленной записи о ExtenededKeyUsage с поиском CERT_FIND_ENHKEY_USAGE вообще ничего не находит (такая же ошибка $80092004), хоть одно назначение указываю, хоть все что есть в сертификате. Хотел автоматом подхватывать новую ЭП-ОВ на ту же организацию после замены сертификата, но пришлось сохранять отпечаток и искать по нему.<br /><br />2) по отпечатку внезапно отказывается находить в режиме запуска программы от системы (из php в сервисе Apache), в хранилище My компьютера сертификат установлен, причем перечисление сразу же после поиска на том же самом хендле хранилища сертификат показывает, свойства контекста сертификата читаются - значит и сертификат есть и права есть. Отпечаток из перечисленного сертификата побайтово идентичен данным для поиска. В режиме запуска от обычного пользователя по эти данным находит, то есть данные для поиска отпечатка подготовлены верно. НО от системы не находит - флаг для чтения при открытии хранилища как-то мешает поиску? Вот как открываю хранилище для обычного пользователя и для системы:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertOpenSystemStore(0,'MY');
CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,0,CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE,Pchar('MY'));</code></pre>
</div></div>Для системы по первому варианту тоже открывается, но там конечно ничего нет.<br /><br />В итоге плюнул, переделал через перечисление сертификатов в хранилище и сравнение нужных полей самой программой - в итоге и ExtenededKeyUsage в перечисленном сертификате совпадает с поисковой записью (разница только что CryptoAPI возвращает все в одном куске памяти, а я запрашиваю запись с указателями на другие куски памяти, причем все адреса кусочков памяти проверяю IsBadReadPtr и везде ложь).</td></tr></table>2019-02-18T07:40:56+03:002019-02-18T07:40:56+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td>На вид все в порядке. Ну своеобразно конечно ищете - весь контекст передаете, по идее отпечатка сертификата достаточно для однозначной идентифицикации сертификата. Отпечаток можно получить из свойства CERT_HASH_PROP_ID (или CERT_SHA1_HASH_PROP_ID) контекста сертификата (buffer это указатель на память, вместо pchar у меня другой тип, соль в том что pchar содержит #0 в конце, а тут возвращается значение двоичное):<div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertGetCertificateContextProperty(pCertCont,param, PByte(buffer), DataLen)</code></pre>
</div></div><br />и заполнить блоб хэша:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">c.cbData:=DataLen;
c.pbData:=buffer;</code></pre>
</div></div><br />искать по блобу хэша<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup"> CertCont:=CertFindCertificateInStore(hCStore,X509_ASN_ENCODING or PKCS_7_ASN_ENCODING{enc},0{flag},CERT_FIND_HASH,@c,nil);
res:=GetLastError();
writeln(stderr,inttohex(res,8));
// CRYPT_E_NOT_FOUND $80092004
if res=$80092004 then CertCont:=nil;</code></pre>
</div></div><br />Другой вопрос, что меня тоже приколы с нахождением функцией CertFindCertificateInStore: 1) уже в какой-то теме расписывал - по поготовленной записи о ExtenededKeyUsage с поиском CERT_FIND_ENHKEY_USAGE вообще ничего не находит (такая же ошибка $80092004), хоть одно назначение указываю, хоть все что есть в сертификате. Хотел автоматом подхватывать новую ЭП-ОВ на ту же организацию после замены сертификата, но пришлось сохранять отпечаток и искать по нему.<br /><br />2) по отпечатку внезапно отказывается находить в режиме запуска программы от системы (из php в сервисе Apache), в хранилище My компьютера сертификат установлен, причем перечисление сразу же после поиска на том же самом хендле хранилища сертификат показывает, свойства контекста сертификата читаются - значит и сертификат есть и права есть. Отпечаток из перечисленного сертификата побайтово идентичен данным для поиска. В режиме запуска от обычного пользователя по эти данным находит, то есть данные для поиска отпечатка подготовлены верно. НО от системы не находит - флаг для чтения при открытии хранилища как-то мешает поиску? Вот как открываю хранилище для обычного пользователя и для системы:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertOpenSystemStore(0,'MY');
CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,0,CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE,Pchar('MY'));</code></pre>
</div></div>Для системы по первому варианту тоже открывается, но там конечно ничего нет.<br /><br />В итоге плюнул, переделал через перечисление сертификатов в хранилище и сравнение нужных полей самой программой - в итоге и ExtenededKeyUsage в перечисленном сертификате совпадает с поисковой записью (разница только что CryptoAPI возвращает все в одном куске памяти, а я запрашиваю запись с указателями на другие куски памяти, причем все адреса кусочков памяти проверяю IsBadReadPtr и везде ложь).</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100413:1Поиск сертификата в хранилище<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br /><br />Ошибка возникает на строке 35?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> else RaiseLastOSError;</div></div><br /><br /><br /><br />Error number 0x80092004 (-2146885628).<br />Объект или свойство не найдено.<br /><br /> <br />Вернуть текст сообщения: SysErrorMessage(код ошибки)<br /><br />Код ошибки = GetLastError - вызывать, если функции вернули false<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> RaiseLastOSError - если только для себя код пишите...</div></div></td></tr></table>2019-02-18T01:22:30+03:002019-02-18T01:22:30+03:00Андрей *<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br /><br />Ошибка возникает на строке 35?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> else RaiseLastOSError;</div></div><br /><br /><br /><br />Error number 0x80092004 (-2146885628).<br />Объект или свойство не найдено.<br /><br /> <br />Вернуть текст сообщения: SysErrorMessage(код ошибки)<br /><br />Код ошибки = GetLastError - вызывать, если функции вернули false<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /> RaiseLastOSError - если только для себя код пишите...</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid100407:1Поиск сертификата в хранилище<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день. <br />Столкнулся с проблемой при проверке наличия сертификата. Представленная ниже функция работает, но иногда выдает ошибку<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>[ 9:03:49 ] При проверке сертификата guts_2012(Root).cer произошла ошибка:-2146885628</div></div>. <br />Что то не доделал или излишне извратился?<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-python">function FindCert(const Store, FileName: string): Integer;
var
CertFile: file;
hStore: HCERTSTORE;
PKCS7Length: Integer;
Buf: Pointer;
pFindCon, pCertCon: PCCERT_CONTEXT;
leng: Integer;
begin
Result := -1;
try
try
AssignFile(CertFile, FileName);
ReSet(CertFile, 1);
PKCS7Length := FileSize(CertFile);
Buf := AllocMem(PKCS7Length);
if not Assigned(Buf) then
Abort;
blockread(CertFile, Buf^, PKCS7Length, leng);
if PKCS7Length <> leng then
RaiseLastOSError;
hStore := CertOpenSystemStore(0, pChar(Store));
pCertCon := CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, Buf, PKCS7Length);
if not Assigned(pCertCon) then
RaiseLastOSError;
pFindCon := CertFindCertificateInStore(hStore, X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, 0, CERT_FIND_EXISTING, pCertCon, nil);
if Assigned(pFindCon) then
begin
CertFreeCertificateContext(pFindCon);
Result := 0;
Exit;
end
else RaiseLastOSError;
finally
if Assigned(Buf)
then FreeMem(Buf);
CloseFile(CertFile);
if Assigned(pCertCon)
then CertFreeCertificateContext(pCertCon);
CertCloseStore(hStore, 0);
end;
except
on E: EOSError do
Result := E.ErrorCode;
on E: EInOutError do
Result := E.ErrorCode;
end;
end;</code></pre>
</div></div></td></tr></table>2019-02-17T05:38:21+03:002019-02-17T05:38:21+03:00MotoArhangel<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день. <br />Столкнулся с проблемой при проверке наличия сертификата. Представленная ниже функция работает, но иногда выдает ошибку<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>[ 9:03:49 ] При проверке сертификата guts_2012(Root).cer произошла ошибка:-2146885628</div></div>. <br />Что то не доделал или излишне извратился?<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-python">function FindCert(const Store, FileName: string): Integer;
var
CertFile: file;
hStore: HCERTSTORE;
PKCS7Length: Integer;
Buf: Pointer;
pFindCon, pCertCon: PCCERT_CONTEXT;
leng: Integer;
begin
Result := -1;
try
try
AssignFile(CertFile, FileName);
ReSet(CertFile, 1);
PKCS7Length := FileSize(CertFile);
Buf := AllocMem(PKCS7Length);
if not Assigned(Buf) then
Abort;
blockread(CertFile, Buf^, PKCS7Length, leng);
if PKCS7Length <> leng then
RaiseLastOSError;
hStore := CertOpenSystemStore(0, pChar(Store));
pCertCon := CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, Buf, PKCS7Length);
if not Assigned(pCertCon) then
RaiseLastOSError;
pFindCon := CertFindCertificateInStore(hStore, X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, 0, CERT_FIND_EXISTING, pCertCon, nil);
if Assigned(pFindCon) then
begin
CertFreeCertificateContext(pFindCon);
Result := 0;
Exit;
end
else RaiseLastOSError;
finally
if Assigned(Buf)
then FreeMem(Buf);
CloseFile(CertFile);
if Assigned(pCertCon)
then CertFreeCertificateContext(pCertCon);
CertCloseStore(hStore, 0);
end;
except
on E: EOSError do
Result := E.ErrorCode;
on E: EInOutError do
Result := E.ErrorCode;
end;
end;</code></pre>
</div></div></td></tr></table>