<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Не удаляется контейнер 'Aktiv ruToken CSP v1.0' на Rutoken Lite]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/2383/" />
	<updated>2016-03-04T11:21:14Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/2383/</id>
		<entry>
			<title type="html"><![CDATA[Re: Не удаляется контейнер 'Aktiv ruToken CSP v1.0' на Rutoken Lite]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/9389/#p9389" />
			<content type="html"><![CDATA[<p>Спасибо за ваш репорт. Ошибку нашли.<br />В следующей версии библиотеки pkcs11ecp будет исправлено.</p>]]></content>
			<author>
				<name><![CDATA[Кирилл Мещеряков]]></name>
				<uri>https://forum.rutoken.ru/user/6786/</uri>
			</author>
			<updated>2016-03-04T11:21:14Z</updated>
			<id>https://forum.rutoken.ru/post/9389/#p9389</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Не удаляется контейнер 'Aktiv ruToken CSP v1.0' на Rutoken Lite]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/9380/#p9380" />
			<content type="html"><![CDATA[<p>Мда, простите, вообще неправильно понял, о чем вы пишете. <br />Теперь понятно - будем смотреть.</p>]]></content>
			<author>
				<name><![CDATA[Кирилл Мещеряков]]></name>
				<uri>https://forum.rutoken.ru/user/6786/</uri>
			</author>
			<updated>2016-03-02T11:34:12Z</updated>
			<id>https://forum.rutoken.ru/post/9380/#p9380</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Не удаляется контейнер 'Aktiv ruToken CSP v1.0' на Rutoken Lite]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/9379/#p9379" />
			<content type="html"><![CDATA[<p>Я использую функцию C_EX_InitToken из библиотеки rtPKCS11ECP.dll, как указано в тесте. Запустите тест и вы увидите, что проблема не в том, что инициализация не проходит, а в том, что провайдер не может своими функциями удалить свой же контейнер. Очевидно, что у вас что-то сломалось на драйверах начиная с версии v.2.100.00.0542_20.11.2014. На более ранних версиях драйверов пример будет работать.</p>]]></content>
			<author>
				<name><![CDATA[cryptoktulhu]]></name>
				<uri>https://forum.rutoken.ru/user/9987/</uri>
			</author>
			<updated>2016-03-02T06:46:53Z</updated>
			<id>https://forum.rutoken.ru/post/9379/#p9379</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Не удаляется контейнер 'Aktiv ruToken CSP v1.0' на Rutoken Lite]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/9376/#p9376" />
			<content type="html"><![CDATA[<p>Доброго времени суток.<br />После форматирования Rutoken Lite с помощью rtPKCS11ECP.dll невозможно удалить контейнер с помощью криптопровайдера &#039;Aktiv ruToken CSP v1.0&#039;. Проблемы нет, если форматирование производить с помощью библиотеки rtPKCS11.dll.<br />При вызове &#039;CryptAcquireContext(&amp;prov2, full_container_name.c_str(), g_prov_name, g_prov_type, CRYPT_SILENT | CRYPT_DELETEKEYSET)&#039; возникает ошибка 0x8007001f.</p><p>Проблема воспроизводится на драйверах:<br />v.2.100.00.0542_20.11.2014<br />v.4.0.0.0_31.08.2015<br />v.4.0.1.0_14.10.2015<br />v.4.0.2.0_23.10.2015<br />v.4.0.5.0_30.12.2015</p><p>На более ранних версиях ошибка не воспроизводится.</p><p>Проверено на операционных системах: windows 7 x64, windows 8.1 x64 и&nbsp; windows 8.1 x86</p><p>В примере файл Common.h взят из SDK</p><p>Пример:<br /></p><div class="codebox"><pre><code>#include &lt;Windows.h&gt;
#include &lt;WinCrypt.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

#include &quot;Common.h&quot;

#define MAX_ADMIN_RETRY_COUNT 10
#define MAX_USER_RETRY_COUNT 10

DWORD g_prov_type = 0x1;
LPCSTR g_prov_name = &quot;Aktiv ruToken CSP v1.0&quot;;
LPCSTR g_token_pass = &quot;12345678&quot;;

bool InitTokenEx();
bool InitToken();
bool DeleteContainer(LPCSTR container_name, LPCSTR reader_name);
bool GenerateKeyPair(LPCSTR container_name, LPCSTR reader_name);

int main()
{
    LPCSTR container_name = &quot;Test container!&quot;;
    LPCSTR reader_name = &quot;\\\\.\\Aktiv Rutoken lite 0\\&quot;;
    //LPCSTR reader_name = &quot;\\\\.\\Aktiv Rutoken ECP 0\\&quot;;
    //LPCSTR reader_name = &quot;\\\\.\\Aktiv Co. ruToken 0\\&quot;;

    if (!InitTokenEx())
    {
        return 0;
    }

    if (!GenerateKeyPair(container_name, reader_name))
    {
        return 0;
    }

    if (!DeleteContainer(container_name, reader_name))
    {
        return 0;
    }

    std::cout &lt;&lt; &quot;Success!&quot; &lt;&lt; std::endl;

    return 0;
}

bool InitTokenEx()
{
    HMODULE module = NULL_PTR;
    CK_SESSION_HANDLE session = NULL_PTR;
    CK_FUNCTION_LIST_PTR function_list = NULL_PTR;
    CK_C_GetFunctionList get_function_list_func = NULL_PTR;
    CK_FUNCTION_LIST_EXTENDED_PTR function_list_ex = NULL_PTR;
    CK_C_EX_GetFunctionListExtended get_function_list_func_ex = NULL_PTR;
    CK_SLOT_ID_PTR slots = NULL_PTR;
    CK_ULONG slot_count = 0;

    CK_RV rv = CKR_OK;

    module = LoadLibrary(PKCS11ECP_LIBRARY_NAME);
    if (module == NULL_PTR)
    {
        std::cout &lt;&lt; &quot;Function &#039;LoadLibrary&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    get_function_list_func = (CK_C_GetFunctionList)GetProcAddress(module, &quot;C_GetFunctionList&quot;);
    if (get_function_list_func == NULL_PTR)
    {
        std::cout &lt;&lt; &quot;Function &#039;GetProcAddress&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    rv = get_function_list_func(&amp;function_list);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetFunctionList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    get_function_list_func_ex = (CK_C_EX_GetFunctionListExtended)GetProcAddress(module, &quot;C_EX_GetFunctionListExtended&quot;);
    if (get_function_list_func == NULL_PTR)
    {
        std::cout &lt;&lt; &quot;Function &#039;GetProcAddress&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    rv = get_function_list_func(&amp;function_list);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetFunctionList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = get_function_list_func_ex(&amp;function_list_ex);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;CK_C_EX_GetFunctionList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_Initialize(NULL_PTR);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_Initialize&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_GetSlotList(CK_TRUE, NULL_PTR, &amp;slot_count);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    if (slot_count == 0)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    slots = (CK_SLOT_ID*)malloc(slot_count * sizeof(CK_SLOT_ID));
    memset(slots, 0, (slot_count * sizeof(CK_SLOT_ID)));

    rv = function_list-&gt;C_GetSlotList(CK_TRUE, slots, &amp;slot_count);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    static CK_UTF8CHAR NEW_USER_PIN[] = {&#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;};
    static CK_UTF8CHAR SO_PIN[] = {&#039;8&#039;, &#039;7&#039;, &#039;6&#039;, &#039;5&#039;, &#039;4&#039;, &#039;3&#039;, &#039;2&#039;, &#039;1&#039;};
    static CK_CHAR TOKEN_STD_LABEL[] = {&quot;!!!Sample Rutoken label!!!&quot;};

    CK_RUTOKEN_INIT_PARAM initInfo_st;
    CK_BBOOL bIsRutokenECP = TRUE;

    ::memset(&amp;initInfo_st, 0, sizeof(CK_RUTOKEN_INIT_PARAM));

    initInfo_st.ulSizeofThisStructure = sizeof(CK_RUTOKEN_INIT_PARAM);
    initInfo_st.UseRepairMode = 0;
    initInfo_st.pNewAdminPin = SO_PIN;
    initInfo_st.ulNewAdminPinLen = sizeof(SO_PIN);
    initInfo_st.pNewUserPin = NEW_USER_PIN;
    initInfo_st.ulNewUserPinLen = sizeof(NEW_USER_PIN);
    initInfo_st.ulMinAdminPinLen = bIsRutokenECP ? 6 : 1;
    initInfo_st.ulMinUserPinLen = bIsRutokenECP ? 6 : 1;
    initInfo_st.ChangeUserPINPolicy = (TOKEN_FLAGS_ADMIN_CHANGE_USER_PIN | TOKEN_FLAGS_USER_CHANGE_USER_PIN);
    initInfo_st.ulMaxAdminRetryCount = MAX_ADMIN_RETRY_COUNT;
    initInfo_st.ulMaxUserRetryCount = MAX_USER_RETRY_COUNT;
    initInfo_st.pTokenLabel = TOKEN_STD_LABEL;
    initInfo_st.ulLabelLen = sizeof(TOKEN_STD_LABEL);

    rv = function_list_ex-&gt;C_EX_InitToken(slots[0], SO_PIN, arraysize(SO_PIN), &amp;initInfo_st);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_EX_InitToken&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_CloseAllSessions(slots[0]);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_CloseAllSessions&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    return true;
}

bool InitToken()
{
    HMODULE module = NULL_PTR;
    CK_SESSION_HANDLE session = NULL_PTR;

    CK_FUNCTION_LIST_PTR function_list = NULL_PTR;
    CK_C_GetFunctionList get_function_list_func = NULL_PTR;

    CK_SLOT_ID_PTR slots = NULL_PTR;
    CK_ULONG slot_count = 0;

    CK_RV rv = CKR_OK;

    module = LoadLibrary(PKCS11_LIBRARY_NAME);
    if (module == NULL_PTR)
    {
        std::cout &lt;&lt; &quot;Function &#039;LoadLibrary&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    get_function_list_func = (CK_C_GetFunctionList)GetProcAddress(module, &quot;C_GetFunctionList&quot;);
    if (get_function_list_func == NULL_PTR)
    {
        std::cout &lt;&lt; &quot;Function &#039;GetProcAddress&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    rv = get_function_list_func(&amp;function_list);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetFunctionList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_Initialize(NULL_PTR);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_Initialize&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_GetSlotList(CK_TRUE, NULL_PTR, &amp;slot_count);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    if (slot_count == 0)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    slots = (CK_SLOT_ID*)malloc(slot_count * sizeof(CK_SLOT_ID));
    memset(slots, 0, (slot_count * sizeof(CK_SLOT_ID)));

    rv = function_list-&gt;C_GetSlotList(CK_TRUE, slots, &amp;slot_count);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_GetSlotList&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_InitToken(slots[0], SO_PIN, sizeof(SO_PIN), TOKEN_LABEL);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_InitToken&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &amp;session);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_OpenSession&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_Login(session, CKU_SO, SO_PIN, sizeof(SO_PIN));
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_OpenSession&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_InitPIN(session, USER_PIN, sizeof(USER_PIN));
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_OpenSession&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_Logout(session);
    if ((rv != CKR_OK) &amp;&amp; (rv != CKR_USER_NOT_LOGGED_IN))
    {
        std::cout &lt;&lt; &quot;Function &#039;C_Logout&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    rv = function_list-&gt;C_CloseAllSessions(slots[0]);
    if (rv != CKR_OK)
    {
        std::cout &lt;&lt; &quot;Function &#039;C_CloseAllSessions&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; rv &lt;&lt; std::endl;
        return false;
    }

    return true;
}

bool DeleteContainer(LPCSTR container_name, LPCSTR reader_name)
{
    std::string full_container_name = std::string(reader_name) + std::string(container_name);
    HCRYPTPROV prov = 0;

    if (!::CryptAcquireContext(&amp;prov, reader_name, g_prov_name, g_prov_type, CRYPT_DEFAULT_CONTAINER_OPTIONAL | CRYPT_SILENT))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptAcquireContext&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    if (!::CryptSetProvParam(prov, PP_KEYEXCHANGE_PIN, (BYTE*)g_token_pass, 0))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptSetProvParam&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    HCRYPTPROV prov2 = 0;
    if (!::CryptAcquireContext(&amp;prov2, full_container_name.c_str(), g_prov_name, g_prov_type, CRYPT_SILENT | CRYPT_DELETEKEYSET))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptAcquireContext&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    ::CryptReleaseContext(prov2, 0);
    ::CryptReleaseContext(prov, 0);

    return true;
}

bool GenerateKeyPair(LPCSTR container_name, LPCSTR reader_name)
{
    std::string full_container_name = std::string(reader_name) + std::string(container_name);
    HCRYPTPROV prov = 0;

    if (!::CryptAcquireContext(&amp;prov, reader_name, g_prov_name, g_prov_type, CRYPT_DEFAULT_CONTAINER_OPTIONAL | CRYPT_SILENT))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptAcquireContext&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    if (!::CryptSetProvParam(prov, PP_KEYEXCHANGE_PIN, (BYTE*)g_token_pass, 0))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptSetProvParam&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    HCRYPTPROV prov2 = 0;
    HCRYPTKEY key = 0;

    if (!::CryptAcquireContext(&amp;prov2, full_container_name.c_str(),    g_prov_name, g_prov_type, CRYPT_NEWKEYSET | CRYPT_SILENT))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptAcquireContext&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    if (!::CryptGenKey(prov2, AT_KEYEXCHANGE, 0, &amp;key))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptGenKey&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    ::CryptDestroyKey(key);
    key = 0;

    if (!::CryptGetUserKey(prov2, AT_KEYEXCHANGE, &amp;key))
    {
        std::cout &lt;&lt; &quot;Function &#039;CryptGetUserKey&#039; failed! Error: 0x&quot; &lt;&lt; std::hex &lt;&lt; HRESULT_FROM_WIN32(::GetLastError()) &lt;&lt; std::endl;
        return false;
    }

    ::CryptDestroyKey(key);
    ::CryptReleaseContext(prov2, 0);
    ::CryptReleaseContext(prov, 0);

    return true;
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[cryptoktulhu]]></name>
				<uri>https://forum.rutoken.ru/user/9987/</uri>
			</author>
			<updated>2016-03-01T14:32:28Z</updated>
			<id>https://forum.rutoken.ru/post/9376/#p9376</id>
		</entry>
</feed>
