<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/3126/" />
	<updated>2020-02-07T10:43:06Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/3126/</id>
		<entry>
			<title type="html"><![CDATA[Re: Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13916/#p13916" />
			<content type="html"><![CDATA[<p><strong>Алексей Лазарев</strong>, именно это и искал. Спасибо))</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2020-02-07T10:43:06Z</updated>
			<id>https://forum.rutoken.ru/post/13916/#p13916</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13915/#p13915" />
			<content type="html"><![CDATA[<p>Вот так, например:</p><br /><p>#include &lt;Common.h&gt;</p><p>int main(void)<br />{<br />&nbsp; &nbsp; HMODULE module;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Хэндл загруженной библиотеки PKCS#11<br />&nbsp; &nbsp; CK_SESSION_HANDLE session;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Хэндл открытой сессии</p><p>&nbsp; &nbsp; CK_FUNCTION_LIST_PTR functionList;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST<br />&nbsp; &nbsp; CK_C_GetFunctionList getFunctionList;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Указатель на функцию C_GetFunctionList</p><p>&nbsp; &nbsp; CK_FUNCTION_LIST_EXTENDED_PTR functionListEx;&nbsp; &nbsp; &nbsp; // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED<br />&nbsp; &nbsp; CK_C_EX_GetFunctionListExtended getFunctionListEx; // Указатель на функцию C_EX_GetFunctionListExtended</p><p>&nbsp; &nbsp; CK_SLOT_ID_PTR slots;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Массив идентификаторов слотов<br />&nbsp; &nbsp; CK_ULONG slotCount;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Количество идентификаторов слотов в массиве</p><p>&nbsp; &nbsp; CK_TOKEN_INFO_EXTENDED tokenInfoEx;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Структура данных типа CK_TOKEN_INFO_EXTENDED с информацией о токене</p><p>&nbsp; &nbsp; CK_CHAR_PTR tokenName;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Указатель на метку токена<br />&nbsp; &nbsp; CK_ULONG tokenNameLength;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Размер метки токена</p><p>&nbsp; &nbsp; CK_RUTOKEN_INIT_PARAM initParam;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Структура данных типа CK_RUTOKEN_INIT_PARAM, содержащая параметры для работы функции C_EX_InitToken</p><p>&nbsp; &nbsp; CK_RV rv;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11</p><p>&nbsp; &nbsp; CK_ULONG i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Вспомогательная переменная-счетчик в циклах</p><p>&nbsp; &nbsp; int isRutokenS;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Вспомогательная переменная для хранения признака типа токена</p><p>&nbsp; &nbsp; int errorCode = 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Флаг ошибки</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Выполнить действия для начала работы с библиотекой PKCS#11&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; printf(&quot;Initialization...\n&quot;);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Загрузить библиотеку&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; module = LoadLibrary(PKCS11_LIBRARY_NAME);<br />&nbsp; &nbsp; CHECK(&quot; LoadLibrary&quot;, module != NULL, exit);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить адрес функции запроса структуры с указателями на функции&nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, &quot;C_GetFunctionList&quot;);<br />&nbsp; &nbsp; CHECK(&quot; GetProcAddress&quot;, getFunctionList != NULL, unload_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить адрес функции запроса структуры с указателями на&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; * расширенные функции&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; getFunctionListEx = (CK_C_EX_GetFunctionListExtended)GetProcAddress(module, &quot;C_EX_GetFunctionListExtended&quot;);<br />&nbsp; &nbsp; CHECK(&quot; GetProcAddress&quot;, getFunctionListEx != NULL, unload_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить структуру с указателями на функции&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; rv = getFunctionList(&amp;functionList);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; Get function list&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить структуру с указателями на расширенные функции&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; rv = getFunctionListEx(&amp;functionListEx);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; Get function list extended&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Инициализировать библиотеку&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; rv = functionList-&gt;C_Initialize(NULL_PTR);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; C_Initialize&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить количество слотов c подключенными токенами&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; rv = functionList-&gt;C_GetSlotList(CK_TRUE, NULL_PTR, &amp;slotCount);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; C_GetSlotList (number of slots)&quot;, rv == CKR_OK, rvToStr(rv), finalize_pkcs11);</p><p>&nbsp; &nbsp; CHECK_AND_LOG(&quot; Checking available tokens&quot;, slotCount &gt; 0, &quot; No tokens available&quot;, finalize_pkcs11);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить список слотов c подключенными токенами&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; slots = (CK_SLOT_ID_PTR)malloc(slotCount * sizeof(CK_SLOT_ID));<br />&nbsp; &nbsp; CHECK(&quot; Memory allocation for slots&quot;, slots != NULL_PTR, finalize_pkcs11);</p><p>&nbsp; &nbsp; rv = functionList-&gt;C_GetSlotList(CK_TRUE, slots, &amp;slotCount);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; C_GetSlotList&quot;, rv == CKR_OK, rvToStr(rv), free_slots);<br />&nbsp; &nbsp; printf(&quot; Slots available: %d\n&quot;, (int)slotCount);</p><p>&nbsp; &nbsp; printf(&quot;Initialization has been completed successfully.\n&quot;);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Получить расширенную информацию о подключенном токене&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; printf(&quot;\nGetting extended token information...\n&quot;);</p><p>&nbsp; &nbsp; tokenInfoEx.ulSizeofThisStructure = sizeof(tokenInfoEx);<br />&nbsp; &nbsp; rv = functionListEx-&gt;C_EX_GetTokenInfoExtended(slots[0], &amp;tokenInfoEx);<br />&nbsp; &nbsp; CHECK_AND_LOG(&quot; C_EX_GetTokenInfoExtended&quot;, rv == CKR_OK, rvToStr(rv), free_slots);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Определить класс токена&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; if (tokenInfoEx.ulTokenClass == TOKEN_CLASS_S) {<br />&nbsp; &nbsp; &nbsp; &nbsp; isRutokenS = 1;<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; isRutokenS = 0;<br />&nbsp; &nbsp; }</p><p>&nbsp; &nbsp; printf(&quot;Extended token information has been got successfully.\n&quot;);</p><p>&nbsp; &nbsp; <br />&nbsp; &nbsp; printf(&quot; Max admin retry counter:&nbsp; &nbsp; &nbsp;0x%8.8x \n&quot;, (int)tokenInfoEx.ulMaxAdminRetryCount);<br />&nbsp; &nbsp; printf(&quot; Admin retry counter:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0x%8.8x \n&quot;, (int)tokenInfoEx.ulAdminRetryCountLeft);<br />&nbsp; &nbsp; printf(&quot; Max user retry counter:&nbsp; &nbsp; &nbsp; 0x%8.8x \n&quot;, (int)tokenInfoEx.ulMaxUserRetryCount);<br />&nbsp; &nbsp; printf(&quot; User retry counter:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x%8.8x \n&quot;, (int)tokenInfoEx.ulUserRetryCountLeft);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; printf(&quot;\nExtended info test has been completed successfully.\n&quot;);</p><p>&nbsp; &nbsp; <br />&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Выставить признак успешного завершения программы&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; errorCode = 0;</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Выполнить действия для завершения работы с библиотекой PKCS#11&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />&nbsp; &nbsp; *************************************************************************/<br />&nbsp; &nbsp; printf(&quot;\nFinalizing... \n&quot;);</p><br /><br /><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Очистить память, выделенную под слоты&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />free_slots:<br />&nbsp; &nbsp; free(slots);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Деинициализировать библиотеку&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<br />&nbsp; &nbsp; *************************************************************************/<br />finalize_pkcs11:<br />&nbsp; &nbsp; rv = functionList-&gt;C_Finalize(NULL_PTR);<br />&nbsp; &nbsp; CHECK_RELEASE_AND_LOG(&quot; C_Finalize&quot;, rv == CKR_OK, rvToStr(rv), errorCode);</p><p>&nbsp; &nbsp; /*************************************************************************<br />&nbsp; &nbsp; * Выгрузить библиотеку из памяти&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />&nbsp; &nbsp; *************************************************************************/<br />unload_pkcs11:<br />&nbsp; &nbsp; CHECK_RELEASE(&quot; FreeLibrary&quot;, FreeLibrary(module), errorCode);</p><p>exit:<br />&nbsp; &nbsp; if (errorCode) {<br />&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;\n\nSome error occurred. Sample failed.\n&quot;);<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;\n\nSample has been completed successfully.\n&quot;);<br />&nbsp; &nbsp; }</p><p>&nbsp; &nbsp; return errorCode;<br />}</p>]]></content>
			<author>
				<name><![CDATA[Алексей Лазарев]]></name>
				<uri>https://forum.rutoken.ru/user/9383/</uri>
			</author>
			<updated>2020-02-07T10:35:38Z</updated>
			<id>https://forum.rutoken.ru/post/13915/#p13915</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13914/#p13914" />
			<content type="html"><![CDATA[<p><strong>Алексей Лазарев</strong>, меня интересует именно программный вариант. Я пишу программу на C++ и мне нужно на этом уровне как-то получить информацию. Не из терминала</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2020-02-07T09:56:34Z</updated>
			<id>https://forum.rutoken.ru/post/13914/#p13914</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13913/#p13913" />
			<content type="html"><![CDATA[<p>Добрый день. </p><p>Можно отправить APDU-команду в токен, например через opensc-tool из пакета opensc.<br />- для пользователя<br />&gt;opensc-tool.exe -r 3 -s 00200002 <br />- для администратора<br />&gt;opensc-tool.exe -r 3 -s 00200001</p><p>Параметр -r 3 - это номер ридера, который можно получить через <br />&gt; opensc-tool.exe -l</p><p>В выводе должны быть следующие строки<br />Sending: 00 20 00 02 <br />Received (SW1=0x63, SW2=0xCA)</p><p>последний полубайт в в байте 0xCA - A - и есть количество оставшихся попыток ввода PIN-кода. В данном случае это 10dec.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Лазарев]]></name>
				<uri>https://forum.rutoken.ru/user/9383/</uri>
			</author>
			<updated>2020-02-07T09:53:45Z</updated>
			<id>https://forum.rutoken.ru/post/13913/#p13913</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Как получить кол-во оставшихся попыток на ввод пин-кода от токена?]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13912/#p13912" />
			<content type="html"><![CDATA[<p>Доброго времени суток! Подскажите, пожалуйста, как я могу программно получить кол-во оставшихся попыток на ввод пин-кода? Если в Панели управления Рутокен вводить неверный пароль то окно с ошибкой оповещает пользователя об оставшихся попыток до блокировки токена, как получить эту цифру? Хотелось бы с помощью PKCS11 или OpenSSL(программно).</p><p>Спасибо</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2020-02-07T08:26:34Z</updated>
			<id>https://forum.rutoken.ru/post/13912/#p13912</id>
		</entry>
</feed>
