Atom Лента - Форум КриптоПро - Тема:А как работать с токенами ruToken / eSmart? - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Akakrabotat'stokenamiruToken/eSmart?-10:1Copyright 2024 Форум КриптоПро2024-03-28T14:11:55Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruGreyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=30581&name=GreyGreyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=30581&name=Greyseevvehttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60710&name=seevveGreyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=30581&name=Greyseevvehttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60710&name=seevveGreyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=30581&name=Greytwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansseevvehttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60710&name=seevveGreyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=30581&name=Greytwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansseevvehttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60710&name=seevveYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid130768:1А как работать с токенами ruToken / eSmart?<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130766#post130766"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</div></div><br />пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро.<br /><br />Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему. </div></div><br /><br />Пример кода я не дам, к сожалению.<br />Могу посоветовать посмотреть вот в какую сторону:<br />- получить сертификаты с правильными ссылками в сериализованном store: CryptGetProvParam(PP_USER_CERTSTORE, CP_CRYPT_SERIALIZED_STORE);<br />- открыть его с помощью CertOpenStore(CERT_STORE_PROV_SERIALIZED);<br />- пройтись в цикле с помощью CertEnumCertificatesInStore и ставить в хранилище CertAddCertificateContextToStore.<br /><br />Если получать PP_USER_CERTSTORE в контексте, открытом по имени считывателя, то туда попадут только сертификаты с токена.<br /><br />Обратите внимание, что для PKCS11-ключей в CSP 5.0.12000 нужно использовать другое имя считывателя! Не "Aktiv Rutoken ECP", а "PKCS11 Aktiv Rutoken ...". Это было исправлено в CSP 5.0 R3.</td></tr></table>2022-01-24T18:27:00+03:002022-01-24T18:27:00+03:00Grey<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130766#post130766"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</div></div><br />пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро.<br /><br />Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему. </div></div><br /><br />Пример кода я не дам, к сожалению.<br />Могу посоветовать посмотреть вот в какую сторону:<br />- получить сертификаты с правильными ссылками в сериализованном store: CryptGetProvParam(PP_USER_CERTSTORE, CP_CRYPT_SERIALIZED_STORE);<br />- открыть его с помощью CertOpenStore(CERT_STORE_PROV_SERIALIZED);<br />- пройтись в цикле с помощью CertEnumCertificatesInStore и ставить в хранилище CertAddCertificateContextToStore.<br /><br />Если получать PP_USER_CERTSTORE в контексте, открытом по имени считывателя, то туда попадут только сертификаты с токена.<br /><br />Обратите внимание, что для PKCS11-ключей в CSP 5.0.12000 нужно использовать другое имя считывателя! Не "Aktiv Rutoken ECP", а "PKCS11 Aktiv Rutoken ...". Это было исправлено в CSP 5.0 R3.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid130766:1А как работать с токенами ruToken / eSmart?<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</div></div><br />пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро.<br /><br />Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему. </td></tr></table>2022-01-24T17:49:53+03:002022-01-24T17:49:53+03:00seevve<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</div></div><br />пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро.<br /><br />Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему. </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid130764:1А как работать с токенами ruToken / eSmart?<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130756#post130756"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>про установку сертификатов интересно, команду использую, но она предполагает, что сертификат есть на файловой системе. Впринципе и через popen ожно дёрнуть.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\PKCS11 Aktiv Rutoken ECP - CP 00 00 0\ID_63727970746f76735f696e76697369626c655f74657374' -file test.cer</div></div><br /><br />есть программная возможность поставить сертификат с токена к контейнеру? <br />Нет уверенности, что крипто про вообще видит этот сертификат.<br />Так же интересна установка сертификата с носителя на который записывался ключ (и вероятно) сертификат средствами криптопро. Полагаю это может быть полезно. У меня пока такого токена нет под рукой, но если можно програмно доустановить сертификат я бы это реализовал.<br />На первый взгляд пример /opt/cprocsp/src/samples/CSP/InstallCert предполагает установку не с ключевого носителя.</div></div><br /><br />Честно говоря, не уверен, что до конца вас понял. Если стоит задача: установить сертификаты с токена в хранилище с правильной привязкой, наиболее простой способ - вызвать <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</code></pre>
</div></div><br /><br />В эту же команду при необходимости можно добавить фильтр по токенам и типам носителей. Например, чтобы ставить серты только с токенов и не трогать HDIMAGE, можно добавить<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">-pattern SCARD</code></pre>
</div></div></td></tr></table>2022-01-24T17:33:11+03:002022-01-24T17:33:11+03:00Grey<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130756#post130756"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>про установку сертификатов интересно, команду использую, но она предполагает, что сертификат есть на файловой системе. Впринципе и через popen ожно дёрнуть.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\PKCS11 Aktiv Rutoken ECP - CP 00 00 0\ID_63727970746f76735f696e76697369626c655f74657374' -file test.cer</div></div><br /><br />есть программная возможность поставить сертификат с токена к контейнеру? <br />Нет уверенности, что крипто про вообще видит этот сертификат.<br />Так же интересна установка сертификата с носителя на который записывался ключ (и вероятно) сертификат средствами криптопро. Полагаю это может быть полезно. У меня пока такого токена нет под рукой, но если можно програмно доустановить сертификат я бы это реализовал.<br />На первый взгляд пример /opt/cprocsp/src/samples/CSP/InstallCert предполагает установку не с ключевого носителя.</div></div><br /><br />Честно говоря, не уверен, что до конца вас понял. Если стоит задача: установить сертификаты с токена в хранилище с правильной привязкой, наиболее простой способ - вызвать <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov</code></pre>
</div></div><br /><br />В эту же команду при необходимости можно добавить фильтр по токенам и типам носителей. Например, чтобы ставить серты только с токенов и не трогать HDIMAGE, можно добавить<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">-pattern SCARD</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid130756:1А как работать с токенами ruToken / eSmart?<br />pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -p NNNNNNNN<br />Using slot 0 with a present token (0x0)<br />Data object 20511177<br /><br />Private Key Object; GOSTR3410-2012-256<br /> PARAMS OID: 06072a850302022301<br /> label: <br /> ID: 63727970746f76735f696e76697369626c655f7465737432<br /> Usage: sign<br /> Access: sensitive, always sensitive, never extractable, local<br />Certificate Object; type = X.509 cert<br /> label: <br /> subject: DN: CN=emailAddress=some@mail.ru, L=Moscow, C=RU, SN=..., GN=...<br /> ID: 63727970746f76735f696e76697369626c655f7465737432<br />2022-01-24T15:38:49+03:002022-01-24T15:38:49+03:00seevve<br />pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -p NNNNNNNN<br />Using slot 0 with a present token (0x0)<br />Data object 20511177<br /><br />Private Key Object; GOSTR3410-2012-256<br /> PARAMS OID: 06072a850302022301<br /> label: <br /> ID: 63727970746f76735f696e76697369626c655f7465737432<br /> Usage: sign<br /> Access: sensitive, always sensitive, never extractable, local<br />Certificate Object; type = X.509 cert<br /> label: <br /> subject: DN: CN=emailAddress=some@mail.ru, L=Moscow, C=RU, SN=..., GN=...<br /> ID: 63727970746f76735f696e76697369626c655f7465737432<br />urn:https:--www-cryptopro-ru:ftPosts:st1:meid130658:1А как работать с токенами ruToken / eSmart?<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130637#post130637"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи.<br />Есть ощущение, что можно это сделать параметрами функции <strong>CryptAcquireContext</strong>, но не очень понятно как именно. <br />С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами).<br />В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.</div></div><br /><br />Добрый день.<br />Есть два варианта. У каждого свои недостатки:<br />1) Перечислить сертификаты в хранилище и выбрать те, у которых есть ссылка на закрытый ключ. Ссылка включает в себя имя контейнера и имя провайдера, которым контейнер можно открыть.<br />Плюсы: вы сможете получить список контейнеров, даже если токен не вставлен.<br />Минусы: сертификаты в хранилище обычного никто не чистит, так что на пользовательской машине может быть много мусора.<br /><br />2) Перечислить контейнеры (PP_ENUMCONTAINERS) с флагом CRYPT_UNIQUE, выбрать те, у которых есть подстрока SCARD, последовательно их открывать и проверять сертификат (GetKeyParam(KP_CERTIFICATE)). В Windows есть специальная служба, которая автоматически ставит сертификат в Личное хранилище при подключении токена, так что с высокой вероятностью, если вы смогли перечислить токен с сертификатом, этот серт есть в хранилище. Ну а если нет, можете тут же сами кодом и установить.<br />Плюсы: никакого мусора<br />Минусы: медленнее; перечислятся только контейнеры с подключенных токенов</td></tr></table>2022-01-21T10:25:26+03:002022-01-21T10:25:26+03:00Grey<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=130637#post130637"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи.<br />Есть ощущение, что можно это сделать параметрами функции <strong>CryptAcquireContext</strong>, но не очень понятно как именно. <br />С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами).<br />В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.</div></div><br /><br />Добрый день.<br />Есть два варианта. У каждого свои недостатки:<br />1) Перечислить сертификаты в хранилище и выбрать те, у которых есть ссылка на закрытый ключ. Ссылка включает в себя имя контейнера и имя провайдера, которым контейнер можно открыть.<br />Плюсы: вы сможете получить список контейнеров, даже если токен не вставлен.<br />Минусы: сертификаты в хранилище обычного никто не чистит, так что на пользовательской машине может быть много мусора.<br /><br />2) Перечислить контейнеры (PP_ENUMCONTAINERS) с флагом CRYPT_UNIQUE, выбрать те, у которых есть подстрока SCARD, последовательно их открывать и проверять сертификат (GetKeyParam(KP_CERTIFICATE)). В Windows есть специальная служба, которая автоматически ставит сертификат в Личное хранилище при подключении токена, так что с высокой вероятностью, если вы смогли перечислить токен с сертификатом, этот серт есть в хранилище. Ну а если нет, можете тут же сами кодом и установить.<br />Плюсы: никакого мусора<br />Минусы: медленнее; перечислятся только контейнеры с подключенных токенов</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid130642:1А как работать с токенами ruToken / eSmart?Большинство плагинов решающих подобную задачу либо для каждого сертификата в хранилище перечисляют все токены либо для каждого токена перечисляют все сертификаты. Ну, строго говоря не ВСЕ, а в среднем половину, но это все равно дает почти квадратичную зависимость времени всего сопоставления от количества сертификатов/токенов. Если бы была возможность сделать флагом, думаю этим бы уже воспользовались. Хотя... кажется попадалось подобное в теме по Джаве и в итоге пришли к тому, что без разницы цикл что внутри криптопровайдера, что снаружи.<br /><br />Можно сделать чуть быстрее если перечислить отдельно сертификаты и их ссылки на контейнер, отдельно токены потом сравнить 2 списка. Другой вариант - дергать CryptAcquireCertificatePrivateKey для каждого сертификата в хранилище и ловить ошибки, но это тоже так себе удовольствие.2022-01-21T06:25:50+03:002022-01-21T06:25:50+03:00two_oceansБольшинство плагинов решающих подобную задачу либо для каждого сертификата в хранилище перечисляют все токены либо для каждого токена перечисляют все сертификаты. Ну, строго говоря не ВСЕ, а в среднем половину, но это все равно дает почти квадратичную зависимость времени всего сопоставления от количества сертификатов/токенов. Если бы была возможность сделать флагом, думаю этим бы уже воспользовались. Хотя... кажется попадалось подобное в теме по Джаве и в итоге пришли к тому, что без разницы цикл что внутри криптопровайдера, что снаружи.<br /><br />Можно сделать чуть быстрее если перечислить отдельно сертификаты и их ссылки на контейнер, отдельно токены потом сравнить 2 списка. Другой вариант - дергать CryptAcquireCertificatePrivateKey для каждого сертификата в хранилище и ловить ошибки, но это тоже так себе удовольствие.urn:https:--www-cryptopro-ru:ftPosts:st1:meid130637:1А как работать с токенами ruToken / eSmart?<table class="content postContainer_Alt" width="100%"><tr><td>Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи.<br />Есть ощущение, что можно это сделать параметрами функции <strong>CryptAcquireContext</strong>, но не очень понятно как именно. <br />С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами).<br />В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.</td></tr></table>2022-01-20T18:22:30+03:002022-01-20T18:22:30+03:00seevve<table class="content postContainer_Alt" width="100%"><tr><td>Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи.<br />Есть ощущение, что можно это сделать параметрами функции <strong>CryptAcquireContext</strong>, но не очень понятно как именно. <br />С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами).<br />В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid129912:1А как работать с токенами ruToken / eSmart?<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=129892#post129892"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).<br /></div></div><br />Добрый день.<br />Можно сначала вызвать CryptAcquireCertificatePrivateKey (с флагами CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_CACHE_FLAG) - он по PCCERT_CONTEXT вернет HCRYPTPROV, а в этот хэндл установить ПИН через PP_SIGNATURE_PIN.<br />Установка CRYPT_ACQUIRE_CACHE_FLAG упрощает работу с функцией: не нужно освобождать полученный хэндл - он сам закроется при освобождении PCCERT_CONTEXT.<br /><br />После этого вызовы CryptSignMessage должны подхватывать пароль из кэша. <br /></td></tr></table>2021-12-27T10:29:33+03:002021-12-27T10:29:33+03:00Grey<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=129892#post129892"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).<br /></div></div><br />Добрый день.<br />Можно сначала вызвать CryptAcquireCertificatePrivateKey (с флагами CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_CACHE_FLAG) - он по PCCERT_CONTEXT вернет HCRYPTPROV, а в этот хэндл установить ПИН через PP_SIGNATURE_PIN.<br />Установка CRYPT_ACQUIRE_CACHE_FLAG упрощает работу с функцией: не нужно освобождать полученный хэндл - он сам закроется при освобождении PCCERT_CONTEXT.<br /><br />После этого вызовы CryptSignMessage должны подхватывать пароль из кэша. <br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid129892:1А как работать с токенами ruToken / eSmart?<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>обычно первый вызов возвращал везде нужный размер</div></div>Действительно, чаще бывает так, но с функциями криптографии есть местами разночтения. Причем такие примечания к функциям указаны самой Майкрософт, то есть сложно грешить на автора криптопровайдера. Добавлю, что вышесказанное справедливо, когда возвращаются двоичные данные (например, хэш или двоичное значение параметра). <br /><br />Если та же функция возвращает текстовое значение параметра, то второй раз значение может быть не измениться, что означает "не установлено". Подробнее: записали на входе туда размер всего буфера, на выходе функции ничего не поменялось, но где-то в середине буфера функция записала символ 0, который символизирует конец строки.<br /><br />Если потом нужна длина значащих данных, этот 0 приходится выискивать. Конечно есть соответствующая функция нахождения длины в VC рантаймах или можно просто склеивать строки, не зная размера. Однако это все равно риск - как бы за буфер не вылететь в процессе склейки/установления длины, если 0 в буфере все-таки нет. Просто для профилактики полезно записывание 0 в начало текстового буфера перед вызовом и 0 в конец текстового буфера после возврата из функции.<div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>речь о <strong>CryptSetProvParam</strong> с параметром <strong>PP_SIGNATURE_PIN</strong></div></div>Да<div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно просто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать).</div></div>Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).<br /><br /></td></tr></table>2021-12-27T06:39:54+03:002021-12-27T06:39:54+03:00two_oceans<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>обычно первый вызов возвращал везде нужный размер</div></div>Действительно, чаще бывает так, но с функциями криптографии есть местами разночтения. Причем такие примечания к функциям указаны самой Майкрософт, то есть сложно грешить на автора криптопровайдера. Добавлю, что вышесказанное справедливо, когда возвращаются двоичные данные (например, хэш или двоичное значение параметра). <br /><br />Если та же функция возвращает текстовое значение параметра, то второй раз значение может быть не измениться, что означает "не установлено". Подробнее: записали на входе туда размер всего буфера, на выходе функции ничего не поменялось, но где-то в середине буфера функция записала символ 0, который символизирует конец строки.<br /><br />Если потом нужна длина значащих данных, этот 0 приходится выискивать. Конечно есть соответствующая функция нахождения длины в VC рантаймах или можно просто склеивать строки, не зная размера. Однако это все равно риск - как бы за буфер не вылететь в процессе склейки/установления длины, если 0 в буфере все-таки нет. Просто для профилактики полезно записывание 0 в начало текстового буфера перед вызовом и 0 в конец текстового буфера после возврата из функции.<div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>речь о <strong>CryptSetProvParam</strong> с параметром <strong>PP_SIGNATURE_PIN</strong></div></div>Да<div class="quote"><span class="quotetitle">Автор: seevve <a href="/forum2/default.aspx?g=posts&m=129847#post129847"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно просто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать).</div></div>Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).<br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid129847:1А как работать с токенами ruToken / eSmart?<table class="content postContainer" width="100%"><tr><td><strong>two_oceans</strong>, спасибо огромное с пунктом 2 помогло. (давно не писал, на C, но в тех API с которыми сталкивался обычно первый вызов возвращал везде нужный размер, даже не подумл смотреть на размер во втором вызове).<br /><br />А во по пункту 1 вопрос, <br />я так понимаю речь о <strong>CryptSetProvParam</strong> с параметром <strong>PP_SIGNATURE_PIN</strong>, однако в том месте где я делаю подпись у меня hProv нет, ка нет его ни в примерах кирпто про (SignUtility) и нет в этом примере от <a rel="nofollow" href="https://docs.microsoft.com/ru-ru/windows/win32/seccrypto/example-c-program-signing-a-message-and-verifying-a-message-signature" title="https://docs.microsoft.com/ru-ru/windows/win32/seccrypto/example-c-program-signing-a-message-and-verifying-a-message-signature">MS</a>. Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно посто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать).</td></tr></table>2021-12-24T13:51:28+03:002021-12-24T13:51:28+03:00seevve<table class="content postContainer" width="100%"><tr><td><strong>two_oceans</strong>, спасибо огромное с пунктом 2 помогло. (давно не писал, на C, но в тех API с которыми сталкивался обычно первый вызов возвращал везде нужный размер, даже не подумл смотреть на размер во втором вызове).<br /><br />А во по пункту 1 вопрос, <br />я так понимаю речь о <strong>CryptSetProvParam</strong> с параметром <strong>PP_SIGNATURE_PIN</strong>, однако в том месте где я делаю подпись у меня hProv нет, ка нет его ни в примерах кирпто про (SignUtility) и нет в этом примере от <a rel="nofollow" href="https://docs.microsoft.com/ru-ru/windows/win32/seccrypto/example-c-program-signing-a-message-and-verifying-a-message-signature" title="https://docs.microsoft.com/ru-ru/windows/win32/seccrypto/example-c-program-signing-a-message-and-verifying-a-message-signature">MS</a>. Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно посто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать).</td></tr></table>