Создание неизвлекаемых ключей через 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 все работает. Как узнать/понять, где что можно, а где нет?