<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Не ищет ключевую пару. SDK/pkcs11/samples/std/SignGOST34.10-2012-256]]></title>
		<link>https://forum.rutoken.ru/topic/3041/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/3041/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Не ищет ключевую пару. SDK/pkcs11/samples/std/SignGOST34.10-2012-256».]]></description>
		<lastBuildDate>Mon, 30 Sep 2019 08:44:58 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Не ищет ключевую пару. SDK/pkcs11/samples/std/SignGOST34.10-2012-256]]></title>
			<link>https://forum.rutoken.ru/post/13323/#p13323</link>
			<description><![CDATA[<p>Огромное спасибо за помощь. Всё получилось после добавления контейнера Рутокен</p>]]></description>
			<author><![CDATA[null@example.com (Binger)]]></author>
			<pubDate>Mon, 30 Sep 2019 08:44:58 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/13323/#p13323</guid>
		</item>
		<item>
			<title><![CDATA[Re: Не ищет ключевую пару. SDK/pkcs11/samples/std/SignGOST34.10-2012-256]]></title>
			<link>https://forum.rutoken.ru/post/13315/#p13315</link>
			<description><![CDATA[<p>Здравствуйте! Пример отрабатывает корректно.<br />Причина в том, что вы пытаетесь работать с контейнером КриптоПро CSP через PKCS#11. Так работать не будет.<br />Если нужно работать именно с таким контейнером, вам нужен SDK КриптоПро CSP.<br />Чтобы работать через PKCS#11, нужно сгенерировать ключи и сертификат через PKCS#11. Например на ra.rutoken.ru</p>]]></description>
			<author><![CDATA[null@example.com (Vladimir Ivanov)]]></author>
			<pubDate>Fri, 27 Sep 2019 14:59:14 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/13315/#p13315</guid>
		</item>
		<item>
			<title><![CDATA[Не ищет ключевую пару. SDK/pkcs11/samples/std/SignGOST34.10-2012-256]]></title>
			<link>https://forum.rutoken.ru/post/13314/#p13314</link>
			<description><![CDATA[<p>Здравствуйте. Вставил в компьютер токен рутокен ЭЦП 2.0, запускаю изложенный пример, а там выводит следующее:<br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/09/fdfd7ab05eb449f665d00c445fb4df0f.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/09/fdfd7ab05eb449f665d00c445fb4df0f.png" alt="" /></a></span><br />В коде ничего не менял. В чём может быть причина? На пк скачал драйвера для windows с вашего сайта, установил панель управления рутокен. Получил сертификат от тестового УЦ CryptoPro с парой ключей на токен.<br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/09/f9bcf678ef4cb237677877cac01d0750.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/09/f9bcf678ef4cb237677877cac01d0750.png" alt="" /></a></span><br />Запарывается программа на этом месте:<br /></p><div class="codebox"><pre><code>/*************************************************************************
    * Получить массив хэндлов закрытых ключей                                *
    *************************************************************************/
    printf(&quot; Getting signing key...\n&quot;);
r = findObjects(functionList, session, privateKeyTemplate, arraysize(privateKeyTemplate),
        &amp;objects, &amp;objectCount);
    CHECK(&quot; findObjects&quot;, r == 0, logout);</code></pre></div><p>Если рассмотреть шаблон privateKeyTemplate<br /></p><div class="codebox"><pre><code>CK_ATTRIBUTE privateKeyTemplate[] =
{
    { CKA_ID, &amp;keyPairIdGost2012_256_1, sizeof(keyPairIdGost2012_256_1) - 1 },   // ID пары
    { CKA_CLASS, &amp;privateKeyObject, sizeof(privateKeyObject) }                   // Класс - закрытый ключ
};</code></pre></div><p>то можно увидеть использование ID пары, может её надо мне подправить? Стандартное определение:</p><div class="codebox"><pre><code>/* DEMO ID пары ключей #1 ГОСТ Р 34.10-2012(256) */
static CK_BYTE keyPairIdGost2012_256_1[] = { &quot;GOST R 34.10-2012 (256 bits) sample key pair 1 ID (Aktiv Co.)&quot; };</code></pre></div><p>Пробовал заменить на имя ключа, которое отображается в панели управления Рутокен, но ничего не изменилось: </p><div class="codebox"><pre><code>static CK_BYTE keyPairIdGost2012_256_1[] = { &quot;te-3dadf386-fdf2-4a01-b888-8726b8f9adb8&quot; }</code></pre></div><p><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/09/270705d0bfd3217c8f20dc77095245be.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/09/270705d0bfd3217c8f20dc77095245be.png" alt="" /></a></span> </p><p>Что нужно мне сделать, чтобы пример заработал? Спасибо за Ваше внимание.</p><p>Если вдруг нужен код примера всего то вставлю, мало ли:<br /></p><div class="codebox"><pre><code>/*************************************************************************
* Rutoken                                                                *
* Copyright (c) 2003-2019, CJSC Aktiv-Soft. All rights reserved.         *
* Подробная информация:  http://www.rutoken.ru                           *
*------------------------------------------------------------------------*
* Пример работы с Рутокен при помощи библиотеки PKCS#11 на языке C       *
*------------------------------------------------------------------------*
* Использование команд вычисления/проверки ЭП на ключах                  *
* ГОСТ Р 34.10-2012 для длины ключа 256 бит:                             *
*  - установление соединения с Рутокен в первом доступном слоте;         *
*  - выполнение аутентификации Пользователя;                             *
*  - внутреннее хэширование и подпись сообщения                          *
*    на демонстрационном ключе;                                          *
*  - сброс прав доступа Пользователя на Рутокен и закрытие соединения    *
*    с Рутокен.                                                          *
*------------------------------------------------------------------------*
* Пример использует объекты, созданные в памяти Рутокен примером         *
* CreateGOST34.10-2012-256.                                              *
*************************************************************************/
#include &quot;stdafx.h&quot;
#include &lt;Common.h&gt;

/*************************************************************************
* Данные для цифровой подписи                                            *
*************************************************************************/
CK_BYTE data[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

/*************************************************************************
* Шаблон для поиска закрытого ключа для цифровой подписи                 *
*************************************************************************/

CK_ATTRIBUTE privateKeyTemplate[] =
{
    { CKA_ID, &amp;keyPairIdGost2012_256_1, sizeof(keyPairIdGost2012_256_1) - 1 },   // ID пары
    { CKA_CLASS, &amp;privateKeyObject, sizeof(privateKeyObject) }                   // Класс - закрытый ключ
};

int main(void)
{
    HMODULE module;                                  // Хэндл загруженной библиотеки PKCS#11
    CK_SESSION_HANDLE session;                       // Хэндл открытой сессии

    CK_FUNCTION_LIST_PTR functionList;               // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
    CK_C_GetFunctionList getFunctionList;            // Указатель на функцию C_GetFunctionList

    CK_SLOT_ID_PTR slots;                            // Массив идентификаторов слотов
    CK_ULONG slotCount;                              // Количество идентификаторов слотов в массиве

    CK_MECHANISM_TYPE_PTR mechanisms;                // Массив поддерживаемых механизмов
    CK_ULONG mechanismCount;                         // Количество поддерживаемых механизмов

    CK_OBJECT_HANDLE_PTR objects;                    // Массив хэндлов объектов, соответствующих критериям поиска
    CK_ULONG objectCount;                            // Количество хэндлов объектов в массиве

    CK_BYTE_PTR signature;                           // Указатель на буфер, содержащий цифровую подпись для данных
    CK_ULONG signatureSize;                          // Размер буфера, содержащего цифровую подпись для данных, в байтах

    CK_RV rv;                                        // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
    int r;                                           // Код возврата для функций, возвращающих int

    CK_ULONG i;                                      // Вспомогательная переменная-счетчик в циклах

    int isGostR3410w3411_256Supported = 0;           // Флаги для проверки поддержки токеном CKM_GOSTR3410_WITH_GOSTR3411_12_256

    int errorCode = 1;                               // Флаг ошибки

                                                     /*************************************************************************
                                                     * Выполнить действия для начала работы с библиотекой PKCS#11             *
                                                     *************************************************************************/
    printf(&quot;Initialization...\n&quot;);

    /*************************************************************************C
    * Загрузить библиотеку                                                   *
    *************************************************************************/
    module = LoadLibrary(PKCS11ECP_LIBRARY_NAME);
    CHECK(&quot; LoadLibrary&quot;, module != NULL, exit);

    /*************************************************************************
    * Получить адрес функции запроса структуры с указателями на функции      *
    *************************************************************************/
    getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, &quot;C_GetFunctionList&quot;);
    CHECK(&quot; GetProcAddress&quot;, getFunctionList != NULL, unload_pkcs11);

    /*************************************************************************
    * Получить структуру с указателями на функции                            *
    *************************************************************************/
    rv = getFunctionList(&amp;functionList);
    CHECK_AND_LOG(&quot; Get function list&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Инициализировать библиотеку                                            *
    *************************************************************************/
    rv = functionList-&gt;C_Initialize(NULL_PTR);
    CHECK_AND_LOG(&quot; C_Initialize&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Получить количество слотов c подключенными токенами                    *
    *************************************************************************/
    rv = functionList-&gt;C_GetSlotList(CK_TRUE, NULL_PTR, &amp;slotCount);
    CHECK_AND_LOG(&quot; C_GetSlotList (number of slots)&quot;, rv == CKR_OK, rvToStr(rv), finalize_pkcs11);

    CHECK_AND_LOG(&quot; Checking available tokens&quot;, slotCount &gt; 0, &quot; No tokens available&quot;, finalize_pkcs11);

    /*************************************************************************
    * Получить список слотов c подключенными токенами                        *
    *************************************************************************/
    slots = (CK_SLOT_ID_PTR)malloc(slotCount * sizeof(CK_SLOT_ID));
    CHECK(&quot; Memory allocation for slots&quot;, slots != NULL, finalize_pkcs11);

    rv = functionList-&gt;C_GetSlotList(CK_TRUE, slots, &amp;slotCount);
    CHECK_AND_LOG(&quot; C_GetSlotList&quot;, rv == CKR_OK, rvToStr(rv), free_slots);
    printf(&quot; Slots available: %d\n&quot;, (int)slotCount);

    /*************************************************************************
    * Получить список поддерживаемых токеном механизмов                      *
    *************************************************************************/
    rv = functionList-&gt;C_GetMechanismList(slots[0], NULL_PTR, &amp;mechanismCount);
    CHECK_AND_LOG(&quot; C_GetMechanismList (number of mechanisms)&quot;, rv == CKR_OK, rvToStr(rv), free_slots);

    CHECK_AND_LOG(&quot; Checking mechanisms available&quot;, mechanismCount &gt; 0, &quot; No mechanisms available&quot;, free_slots);

    mechanisms = (CK_MECHANISM_TYPE_PTR)malloc(mechanismCount * sizeof(CK_MECHANISM_TYPE));
    CHECK(&quot; Memory allocation for mechanisms&quot;, mechanisms != NULL_PTR, free_slots);

    rv = functionList-&gt;C_GetMechanismList(slots[0], mechanisms, &amp;mechanismCount);
    CHECK_AND_LOG(&quot; C_GetMechanismList&quot;, rv == CKR_OK, rvToStr(rv), free_mechanisms);

    /*************************************************************************
    * Определение поддерживаемых токеном механизмов                          *
    *************************************************************************/
    for (i = 0; i &lt; mechanismCount; ++i) {
        if (mechanisms[i] == CKM_GOSTR3410_WITH_GOSTR3411_12_256) {
            isGostR3410w3411_256Supported = 1;
            break;
        }
    }

    CHECK_AND_LOG(&quot; Checking CKM_GOSTR3410_WITH_GOSTR3411_12_256 support&quot;, isGostR3410w3411_256Supported,
        &quot;CKM_GOSTR3410_WITH_GOSTR3411_12_256 isn`t supported!\n&quot;, free_mechanisms);

    /*************************************************************************
    * Открыть RW сессию в первом доступном слоте                             *
    *************************************************************************/
    rv = functionList-&gt;C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &amp;session);
    CHECK_AND_LOG(&quot; C_OpenSession&quot;, rv == CKR_OK, rvToStr(rv), free_mechanisms);


    /*************************************************************************
    * Выполнить аутентификацию Пользователя                                  *
    *************************************************************************/
    rv = functionList-&gt;C_Login(session, CKU_USER, USER_PIN, USER_PIN_LEN);
    CHECK_AND_LOG(&quot; C_Login&quot;, rv == CKR_OK, rvToStr(rv), close_session);
    printf(&quot;Initialization has been completed successfully.\n&quot;);

    /*************************************************************************
    * Сформировать цифровую подпись данных по алгоритму                      *
    * ГОСТ Р 34.10-2012(256)                                                 *
    *************************************************************************/
    printf(&quot;\nSigning data...\n&quot;);

    /*************************************************************************
    * Получить массив хэндлов закрытых ключей                                *
    *************************************************************************/
    printf(&quot; Getting signing key...\n&quot;);

    r = findObjects(functionList, session, privateKeyTemplate, arraysize(privateKeyTemplate),
        &amp;objects, &amp;objectCount);
    CHECK(&quot; findObjects&quot;, r == 0, logout);

    CHECK_AND_LOG(&quot; Checking number of keys found&quot;, objectCount &gt; 0, &quot;No objects found\n&quot;, logout);

    /*************************************************************************
    * Сформировать цифровую подпись данных по алгоритму                      *
    * ГОСТ Р 34.10-2012(256)                                                 *
    *************************************************************************/
    printf(&quot; Signing data...\n&quot;);

    /*************************************************************************
    * Инициализировать операцию подписи данных                               *
    *************************************************************************/
    rv = functionList-&gt;C_SignInit(session, &amp;gostR3410_2012_256SigVerMech_WithInternalHash, objects[0]);
    CHECK_AND_LOG(&quot;  C_SignInit&quot;, rv == CKR_OK, rvToStr(rv), free_objects);

    /*************************************************************************
    * Определить размер данных подписи                                       *
    *************************************************************************/
    rv = functionList-&gt;C_Sign(session, data, sizeof(data), NULL_PTR, &amp;signatureSize);
    CHECK_AND_LOG(&quot;  C_Sign (get size)&quot;, rv == CKR_OK, rvToStr(rv), free_objects);

    /*************************************************************************
    * Подписать данные                                                      *
    ************************************************************************/
    signature = (CK_BYTE*)malloc(signatureSize * sizeof(CK_BYTE));
    CHECK(&quot;  Memory allocation for signature&quot;, signature != NULL, free_objects);

    rv = functionList-&gt;C_Sign(session, data, sizeof(data), signature, &amp;signatureSize);
    CHECK_AND_LOG(&quot;  C_Sign (signing)&quot;, rv == CKR_OK, rvToStr(rv), free_signature);

    /*************************************************************************
    * Распечатать буфер, содержащий подпись                                  *
    *************************************************************************/
    printf(&quot;  Signature buffer is: \n&quot;);
    printHex(signature, signatureSize);
    printf(&quot;Data has been signed successfully.\n&quot;);

    /*************************************************************************
    * Выставить признак успешного завершения программы                       *
    *************************************************************************/
    errorCode = 0;

    /*************************************************************************
    * Выполнить действия для завершения работы с библиотекой PKCS#11         *
    *************************************************************************/
    printf(&quot;\nFinalizing... \n&quot;);

    /*************************************************************************
    * Очистить память, выделенную под хэш-коды, подпись и объекты            *
    *************************************************************************/

free_signature:
    free(signature);

free_objects:
    free(objects);

    /*************************************************************************
    * Сбросить права доступа                                                 *
    *************************************************************************/
logout:
    rv = functionList-&gt;C_Logout(session);
    CHECK_RELEASE_AND_LOG(&quot; C_Logout&quot;, rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Закрыть открытую сессию в слоте                                        *
    *************************************************************************/
close_session:
    rv = functionList-&gt;C_CloseSession(session);
    CHECK_RELEASE_AND_LOG(&quot; C_CloseSession&quot;, rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Очистить память, выделенную под механизмы и слоты                      *
    *************************************************************************/
free_mechanisms:
    free(mechanisms);

free_slots:
    free(slots);

    /*************************************************************************
    * Деинициализировать библиотеку                                          *
    *************************************************************************/
finalize_pkcs11:
    rv = functionList-&gt;C_Finalize(NULL_PTR);
    CHECK_RELEASE_AND_LOG(&quot; C_Finalize&quot;, rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Выгрузить библиотеку из памяти                                         *
    *************************************************************************/
unload_pkcs11:
    CHECK_RELEASE(&quot; FreeLibrary&quot;, FreeLibrary(module), errorCode);

exit:
    if (errorCode) {
        printf(&quot;\n\nSome error occurred. Sample failed.\n&quot;);
    }
    else {
        printf(&quot;\n\nSample has been completed successfully.\n&quot;);
    }

    return errorCode;
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Binger)]]></author>
			<pubDate>Fri, 27 Sep 2019 14:18:32 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/13314/#p13314</guid>
		</item>
	</channel>
</rss>
