(2019-07-15 19:26:34 отредактировано crazy_blu)

Создание неизвлекаемых ключей через PKCS#11

Модель "Rutoken ECP"
Hardware version v20.4
Firnware version v18.11

SDK version 280619
Система Windos 10 Pro x64
Приложение для x64/debug из-под VC 2017

Открыл сессию hSession, успешно залогинился.

  /* Набор параметров КриптоПро A алгоритма ГОСТ Р 34.10-2001 */
  CK_BYTE         paramsGostR3410[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
  static CK_UTF8CHAR publicKeyLabelGost2012_256_1[] = "test1";
  static CK_UTF8CHAR privateKeyLabelGost2012_256_1[] = "test2";
  static CK_BYTE     testName[] = "test3";

  CK_MECHANISM          genKeyMechanism = { CKM_GOSTR3410_KEY_PAIR_GEN, NULL_PTR, 0 };
  CK_OBJECT_CLASS       ocPrivKey       = CKO_PRIVATE_KEY;
  CK_OBJECT_CLASS       ocPubKey        = CKO_PUBLIC_KEY;
  CK_KEY_TYPE           keyType = CKK_GOSTR3410;

  CK_BBOOL              bTrue = CK_TRUE;
  CK_BBOOL              bFalse = CK_FALSE;
  /* Набор параметров КриптоПро алгоритма ГОСТ Р 34.11-2012(256) */
  CK_BYTE               paramsGostR3411[] = { 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
  CK_OBJECT_HANDLE      hPublicKey = NULL_PTR;    // Хэндл открытого ключа
  CK_OBJECT_HANDLE      hPrivateKey = NULL_PTR;    // Хэндл закрытого ключа
  CK_ATTRIBUTE          privKeyTemplate[] =
  {
    { CKA_CLASS, &ocPrivKey, sizeof(ocPrivKey) },
    { CKA_LABEL, privateKeyLabelGost2012_256_1, strlen(privateKeyLabelGost2012_256_1) },
    { CKA_ID, testName, strlen(testName) },
    { CKA_KEY_TYPE, &keyType, sizeof(keyType) },
    { CKA_TOKEN, &bTrue, sizeof(bTrue) },
    { CKA_PRIVATE, &bTrue, sizeof(bTrue) },
    { CKA_GOSTR3410_PARAMS, paramsGostR3410, sizeof(paramsGostR3410) },
    { CKA_GOSTR3411_PARAMS, paramsGostR3411, sizeof(paramsGostR3411) }
  };
  // шаблон открытого ключа
  CK_ATTRIBUTE           pubKeyTemplate[] =
  {
    { CKA_CLASS, &ocPubKey, sizeof(ocPubKey) },
    { CKA_ID, testName, strlen(testName) }, 
    { CKA_LABEL, publicKeyLabelGost2012_256_1, strlen(publicKeyLabelGost2012_256_1) },
    { CKA_KEY_TYPE, &keyType, sizeof(keyType) },
    { CKA_TOKEN, &bTrue, sizeof(bTrue) },
    { CKA_PRIVATE, &bFalse, sizeof(bFalse) },
    { CKA_GOSTR3410_PARAMS, paramsGostR3410, sizeof(paramsGostR3410) },
    { CKA_GOSTR3411_PARAMS, paramsGostR3411, sizeof(paramsGostR3411) }
  };
  CK_RV                 rv;


  if (CKR_OK != (rv = C_GenerateKeyPair( hSession
                                          , &genKeyMechanism
                                          , pubKeyTemplate, arraysize(pubKeyTemplate)
                                          , privKeyTemplate, arraysize(privKeyTemplate)
                                          , &hPublicKey, &hPrivateKey)))
  {
    printf("Token can't generate key. Code %08X\n", rv);
  }


По факту ошибка 0xD1 (CKR_TEMPLATE_INCONSISTENT).
Что тут не так?

PS. На более свежем Hardware version v20.5 / Firnware version v23.2 все работает. Как узнать/понять, где что можно, а где нет?

Re: Создание неизвлекаемых ключей через PKCS#11

Дополнительные эксперименты показали следующее:
1. "Рутокен ЭЦП" (старая модель hw20.4/fw18.11) формально не поддерживает алгоритмы 2012 года. Видимо поэтому передаваемый OID хеша 2012 года ему не нравится.
2. Узнать о поддержке 2012 года можно из разбора списка механизмов.
3. Фактически атрибут CKA_GOSTR3411_PARAMS можно выбросить из списка параметров, оба токена воспринимают запрос и создают неизвлекаемый ключ.

Теперь новый вопрос. Продукт (интересен новый, естественно, Рутокен ЭЦП 2.0) сертифицирован, в сертификате стоит ссылка на формуляр. В формуляре должна быть ссылка на документы, описывающие необходимый набор параметров для применения этой функциональности. Где можно увидеть такой документ?

Re: Создание неизвлекаемых ключей через PKCS#11

Здравствуйте.

crazy_blu пишет:

Теперь новый вопрос. Продукт (интересен новый, естественно, Рутокен ЭЦП 2.0) сертифицирован, в сертификате стоит ссылка на формуляр. В формуляре должна быть ссылка на документы, описывающие необходимый набор параметров для применения этой функциональности. Где можно увидеть такой документ?

По этому вопросу напишите, пожалуйста, на info@rutoken.ru

Re: Создание неизвлекаемых ключей через PKCS#11

Добрый день,
Вы совершенно правы. ГОСТы 2012-й серии поддерживаются только в Рутокен ECP 2.0 (микропрограмма 23 и выше).
Судя по вашему первому письму, у вас Рутокен ECP 1.0 микропрограмма 18.

Таблица поддержки функционала PKCS для разных моделей наших устройств представлена здесь.
Таблицу поддержки конкретных механизмов здесь

Мы постараемся актуализировать данную информацию в ближайшее время.

С уважением,
Алексей Лазарев

С уважением, Алексей Лазарев, Компания "Актив"