(2017-04-22 18:50:01 отредактировано uzater)

Не получается создать открытый ключ на токене

Использую Рутокен ЭЦП 2.0 Flash.
Не получается создать на устройстве открытый ключ.
В документации (ссылка: https://developer.rutoken.ru/pages/view … Id=3178529) описан шаблон создания открытого ключа ГОСТ Р 34.10-2001

CK_OBJECT_CLASS your_class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = “A GOST R34.10-2001 public_key object”;
CK_BYTE gostR3410params_oid[] = {0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x00};
CK_BYTE gostR3411params_oid[] = {0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x00};
CK_BYTE gost28147params_oid[] = {0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x00};
CK_BYTE value[64] = {...};
CK_BBOOL IsTrue = CK_TRUE;

CK_ATTRIBUTE template[] = {
    {CKA_CLASS, &your_class, sizeof(your_class)},
    {CKA_KEY_TYPE, &keyType, sizeof(keyType)},
    {CKA_TOKEN, &IsTrue, sizeof(IsTrue)},
    {CKA_LABEL, label, sizeof(label)-1},
    {CKA_GOSTR3410PARAMS, gostR3410params_oid, sizeof(gostR3410params_oid)},
    {CKA_GOSTR3411PARAMS, gostR3411params_oid, sizeof(gostR3411params_oid)},
    {CKA_GOST28147_PARAMS, gost28147params_oid, sizeof(gost28147params_oid)},
    {CKA_VALUE, value, sizeof(value)}
};

При создании - ошибка CKR_TEMPLATE_INCONSISTENT. Аналогично и при использовании ГОСТ 34.10-2012. При задании в false значения атрибута CKA_TOKEN ключ создается без ошибки. Подскажите, в чем может быть проблема?

Re: Не получается создать открытый ключ на токене

Добрый день.
Попробуйте запустить наш пример из SDK - sdk\pkcs11\samples\Standard\CreateGOST34.10-2001
Получится создать пару?

(2017-04-25 17:22:11 отредактировано uzater)

Re: Не получается создать открытый ключ на токене

Добрый день.
Генерация ключевой пары при помощи вызова C_GenerateKeyPair происходит успешно (34.10-01, 34.10-12, RSA). Далее возникает необходимость извлечь значение открытого ключа и записать его на другой токен. Получение значения ключа (CKA_VALUE, вызов функции C_GetAttributeValue) также происходит без проблем. Но вот создание объекта типа ключ с таким значением на другом токене (функция C_CreateObject) завершается с описанной выше ошибкой (но как объект сессии ключ создается успешно).
Если сторонники средствами (например, OpenSSL) создать сертификат, затем через утилиту Панель управления Рутокен импортировать этот сертификат на токен и программно найти содержащиеся на нем ключи, то открытый ключ из сертификата будет присутствовать на устройстве, и значение атрибута CKA_TOKEN у него будет равняться True. Как я предполагаю, происходит как раз создание объекта типа сертификат и объекта типа открытый ключ, привязанного к созданному сертификату. Из этого можно сделать вывод, что создать открытый ключ с заданным значением как объект токена возможно. Но при использовании описанного вами в документации шаблона параметров создания ключа возникает ошибка (аналогично и при создании ключа RSA).
По сути, есть неудобный способ генерации ключевой пары, извлечения открытого ключа, создания сертификата с этом ключом, импорт сертификата на другое устройство с помощью вашей утилиты. Но хотелось бы следать все программно, и без создания сертификатов. Тем более, этот способ описан в документации. Надеюсь, эту проблему можно решить.

Re: Не получается создать открытый ключ на токене

Добрый день, uzater.

Как создавали сертификат с помощью OpenSSL?
Я правильно понимаю, что вы хотите сгенерировать ключевую пару на одном токене, а затем создать копию открытого ключа? Нам очень поможет, если Вы расскажете подробнее, что у Вас за проект и что Вы хотите сделать. Возможно есть более простые варианты.

(2017-04-26 21:53:06 отредактировано uzater)

Re: Не получается создать открытый ключ на токене

По поводу сертификатов - тут я наврал немного. Для его создания необходим и закрытый ключ, просто из извлеченного с токена открытого ключа его создать не получится.
Но суть в том, что у меня был готовый контейнер PKCS#12, созданный ранее при помощи OpenSSL, я его импортировал на токен, на нем появился открытый ключ RSA с атрибутом CKA_TOKEN = true, то есть возможность создать ключ как объект токена присутствует.

Я правильно понимаю, что вы хотите сгенерировать ключевую пару на одном токене, а затем создать копию открытого ключа?

Да, генерировать пару на одном устройстве и перенести открытый ключ на другой токен (точно такой же Рутокен ЭЦП 2.0 Flash). Например, для создания подписи при помощи одного устройства и ее проверки при помощи другого, или для выработки общего ключа и дальнейшего шифрования данных.
В общем, можно задать вопрос проще. Как распространять открытые ключи между устройствами? Может быть и правда есть другие варианты и Вы их подскажете.

Update. Немного покопался, почитал стандарт pkcs11, взял оттуда шаблон создания публичного ключа RSA, и все заработало. Видимо, возившись с 34.10 не все правильно делал с RSA. (В вашей документации шаблон аналогичный, только небольшая неточность, параметр CKK_RSA указан как CKK_GENERIC_RSA, остальное аналогично стандарту). В общем, создать открытый ключ RSA как объект токена получилось. А вот с ГОСТ 34.10-01 и ГОСТ 34.10-12 по прежнему все та же ошибка.

Re: Не получается создать открытый ключ на токене

Добрый день, uzater.

Импорт ключей (даже открытой части) ГОСТ 34.10-01 и ГОСТ 34.10-12 запрещен регулятором - ФСБ.

Если Ваша цель выработка общего ключа и дальнейшего шифрования данных, то специально для Вас был создан алгоритм VKO (https://ru.wikipedia.org/wiki/ГОСТ_Р_34.10-2012). Он позволяет сделать общие ключи без импорта открытого ключа. Смотрите наш пример - sdk\pkcs11\samples\Standard\VKO-GOST34.10-2001 или sdk\pkcs11\samples\Standard\VKO-GOST34.10-2012

Что касается сценарий - создания подписи при помощи одного устройства и ее проверки при помощи другого - к сожалению, проверку можно сделать только программно. Это достаточно странно, но это не наше желание, а требование регулятора.

Re: Не получается создать открытый ключ на токене

Добрый день, Владимир. На данный момент все стало понятно. Благодарю за помощь.