C_GenerateKey
¶C_GenerateKey
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)¶Параметры: |
|
---|
Генерирует секретный ключ.
Особенности апплетов:
Криптотокен
Поддерживаемые механизмы:
CKM_GOST28147_KEY_GEN
(0x00001220
) – механизм генерации ключей,
соответствующий стандарту ГОСТ 28147–89.Криптотокен 2 ЭП
Предупреждение
Laser
Поддерживаемые механизмы:
CKM_DES2_KEY_GEN
(0x00000130
) – механизм генерации ключей DES двойной длины.CKM_DES3_KEY_GEN
(0x00000131
) – механизм генерации ключей для алгоритма triple-DES.CKM_TLS_PRE_MASTER_KEY_GEN
(0x00000374
) – механизм генерации 48-байтных секретных ключей, используемых
при создании pre_master
ключей для протокола TLS 1.0.CKM_AES_KEY_GEN
(0x00001080
) – механизм генерации ключей для алгоритма AES.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример генерации сессионного ключа на языке C:
static CK_BYTE id_Gost28147_89_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1F, 0x01 };
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// механизм генерации ключей
CK_MECHANISM pkcs11GenKeyMechanism = {CKM_GOST28147_KEY_GEN, NULL, 0};
// шаблон ключа
CK_ATTRIBUTE pkcs11SessionKeyTemplate[] =
{
{CKA_GOST28147_PARAMS, id_Gost28147_89_CryptoPro_A_ParamSet, sizeof(id_Gost28147_89_CryptoPro_A_ParamSet)}
};
// дескриптор сессионного ключа PKCS#11
CK_OBJECT_HANDLE pkcs11SessionKeyHandle;
// функция генерирует ключ, используя заданный шаблон
rv = C_GenerateKey(pkcs11SessionHandle,
&pkcs11GenKeyMechanism,
pkcs11SessionKeyTemplate,
sizeof(pkcs11SessionKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pkcs11SessionKeyHandle);
if(rv != CKR_OK)
{
PrintError("C_GenerateKey", rv);
return;
}
CKA_GOST28147_PARAMS
описаны в приложении.C_GenerateKeyPair
¶C_GenerateKeyPair
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey)¶Параметры: |
|
---|
Генерирует ключевую пару и возвращает идентификаторы закрытого и открытого ключей.
Поддерживаются следующие механизмы:
Криптотокен
CKM_GOSTR3410_KEY_PAIR_GEN
(0x00001200
) – механизм генерации ключевой пары
в соответствии со стандартом ГОСТ Р 34.10–2001.Криптотокен 2 ЭП
CKM_GOSTR3410_KEY_PAIR_GEN
(0x00001200
) – механизм генерации ключевой пары
в соответствии со стандартом ГОСТ Р 34.10–2001.CKM_GOSTR3410_256_KEY_PAIR_GEN
(0x00001200
идентичен CKM_GOSTR3410_KEY_PAIR_GEN
) –
механизм генерации ключевой пары в соответствии со стандартом ГОСТ Р 34.10–2012 (длина ключа 256 бит).Для генерации ключевых пар конкретного стандарта, помимо указания механизма,
необходимо передавать соответствующее значение в атрибут CKA_GOSTR3411_PARAMS
шаблона открытого ключа.
Стандарт ключевой пары | Механизм | Значение CKA_GOSTR3411_PARAMS |
---|---|---|
ГОСТ Р 34.10–2001 | CKM_GOSTR3410_KEY_PAIR_GEN |
id-GostR3411-94-CryptoProParamSet |
ГОСТ Р 34.10–2012 (длина ключа 256 бит) | CKM_GOSTR3410_256_KEY_PAIR_GEN |
id-tc26-gost3411-12-256 |
Совет
Значения атрибута CKA_GOSTR3411_PARAMS
см. в приложении.
Laser
CKM_RSA_PKCS_KEY_PAIR_GEN
(0x00000000
) – механизм генерации ключевой пары для алгоритма RSA.CKM_ECDSA_KEY_PAIR_GEN
(0x00001040
) – механизм генерации ключевой пары для алгоритма ECDSA.CKM_EC_KEY_PAIR_GEN
(0x00001040
) – механизм генерации ключевой пары для алгоритма EC.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример генерации ключевой пары ГОСТ Р 34.10–2001 на языке C:
static CK_BYTE id_GostR3410_2001_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
static CK_BYTE id_GostR3411_94_CryptoProParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01 };
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE session;
// механизм генерации ключевой пары
CK_MECHANISM mechanism = {CKM_GOSTR3410_KEY_PAIR_GEN, NULL, 0};
// параметры шаблона закрытого ключа
CK_OBJECT_CLASS privKeyClass = CKO_PRIVATE_KEY;
CK_UTF8CHAR privKeyLabel[] = "Private Key GOST R 34.10-2001";
CK_KEY_TYPE privKeyType = CKK_GOSTR3410;
// шаблон закрытого ключа
CK_ATTRIBUTE privKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) privKeyLabel, (CK_ULONG) strlen(privKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bTrue, sizeof(bTrue) }, // не виден без ввода PIN-кода пользователя
};
// параметры шаблона открытого ключа
CK_OBJECT_CLASS pubKeyClass = CKO_PUBLIC_KEY;
CK_UTF8CHAR pubKeyLabel[] = "Public Key GOST R 34.10-2001";
CK_KEY_TYPE pubKeyType = CKK_GOSTR3410;
// шаблон открытого ключа
CK_ATTRIBUTE pubKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) pubKeyLabel, (CK_ULONG) strlen(pubKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bFalse, sizeof(bFalse) }, // виден без ввода PIN-кода пользователя
{
CKA_GOSTR3410_PARAMS,
(CK_VOID_PTR) id_GostR3410_2001_CryptoPro_A_ParamSet,
sizeof(id_GostR3410_2001_CryptoPro_A_ParamSet)
}, // тип ключевой пары
{
CKA_GOSTR3411_PARAMS,
(CK_VOID_PTR) id_GostR3411_94_CryptoProParamSet,
sizeof(id_GostR3411_94_CryptoProParamSet)
} // стандарт алгоритма хэширования
};
// дескрипторы открытого и закрытого ключа ключевой пары PKCS#11
CK_OBJECT_HANDLE pubKeyHandle, privKeyHandle;
// функция генерирует ключевую пару
rv = C_GenerateKeyPair(session,
&mechanism,
pubKeyTemplate, sizeof(pubKeyTemplate)/sizeof(CK_ATTRIBUTE),
privKeyTemplate, sizeof(privKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pubKeyHandle,
&privKeyHandle);
if(rv != CKR_OK)
{
PrintError("C_GenerateKeyPair", rv);
return;
}
CKA_GOSTR3410_PARAMS
описаны в приложении.CKA_GOSTR3411_PARAMS
описаны в приложении.Пример генерации ключевой пары ГОСТ Р 34.10–2001 на языке C:
static CK_BYTE id_GostR3410_2001_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
static CK_BYTE id_GostR3411_94_CryptoProParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01 };
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE session;
// механизм генерации ключевой пары
CK_MECHANISM mechanism = {CKM_GOSTR3410_KEY_PAIR_GEN, NULL, 0};
// параметры шаблона закрытого ключа
CK_OBJECT_CLASS privKeyClass = CKO_PRIVATE_KEY;
CK_UTF8CHAR privKeyLabel[] = "Private Key GOST R 34.10-2001";
CK_KEY_TYPE privKeyType = CKK_GOSTR3410;
// шаблон закрытого ключа
CK_ATTRIBUTE privKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) privKeyLabel, (CK_ULONG) strlen(privKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bTrue, sizeof(bTrue) }, // не виден без ввода PIN-кода пользователя
};
// параметры шаблона открытого ключа
CK_OBJECT_CLASS pubKeyClass = CKO_PUBLIC_KEY;
CK_UTF8CHAR pubKeyLabel[] = "Public Key GOST R 34.10-2001";
CK_KEY_TYPE pubKeyType = CKK_GOSTR3410;
// шаблон открытого ключа
CK_ATTRIBUTE pubKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) pubKeyLabel, (CK_ULONG) strlen(pubKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bFalse, sizeof(bFalse) }, // виден без ввода PIN-кода пользователя
{
CKA_GOSTR3410_PARAMS,
(CK_VOID_PTR) id_GostR3410_2001_CryptoPro_A_ParamSet,
sizeof(id_GostR3410_2001_CryptoPro_A_ParamSet)
}, // тип ключевой пары
{
CKA_GOSTR3411_PARAMS,
(CK_VOID_PTR) id_GostR3411_94_CryptoProParamSet,
sizeof(id_GostR3411_94_CryptoProParamSet)
} // стандарт алгоритма хэширования
};
// дескрипторы открытого и закрытого ключа ключевой пары PKCS#11
CK_OBJECT_HANDLE pubKeyHandle, privKeyHandle;
// функция генерирует ключевую пару
rv = C_GenerateKeyPair(session,
&mechanism,
pubKeyTemplate, sizeof(pubKeyTemplate)/sizeof(CK_ATTRIBUTE),
privKeyTemplate, sizeof(privKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pubKeyHandle,
&privKeyHandle);
if(rv != CKR_OK)
{
PrintError("C_GenerateKeyPair", rv);
return;
}
Пример генерации ключевой пары ГОСТ Р 34.10–2012 (длина ключа 256 бит) на языке C:
static CK_BYTE id_GostR3410_2001_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
static CK_BYTE id_tc26_gost3411_12_256[] = { 0x06, 0x08, 0x2A, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE session;
// механизм генерации ключевой пары
CK_MECHANISM mechanism = {CKM_GOSTR3410_256_KEY_PAIR_GEN, NULL, 0};
// параметры шаблона закрытого ключа
CK_OBJECT_CLASS privKeyClass = CKO_PRIVATE_KEY;
CK_UTF8CHAR privKeyLabel[] = "Private Key GOST R 34.10-2001 256";
CK_KEY_TYPE privKeyType = CKK_GOSTR3410;
// шаблон закрытого ключа
CK_ATTRIBUTE privKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) privKeyLabel, (CK_ULONG) strlen(privKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bTrue, sizeof(bTrue) }, // не виден без ввода PIN-кода пользователя
};
// параметры шаблона открытого ключа
CK_OBJECT_CLASS pubKeyClass = CKO_PUBLIC_KEY;
CK_UTF8CHAR pubKeyLabel[] = "Public Key GOST R 34.10-2001 256";
CK_KEY_TYPE pubKeyType = CKK_GOSTR3410;
// шаблон открытого ключа
CK_ATTRIBUTE pubKeyTemplate[] =
{
{CKA_CLASS, &privKeyClass, sizeof(privKeyClass)}, // класс
{CKA_KEY_TYPE, &privKeyType, sizeof(privKeyType)}, // тип ключа
{CKA_TOKEN, (CK_VOID_PTR) &bTrue, sizeof(bTrue)}, // объект хранится в токене
{CKA_LABEL, (CK_VOID_PTR) pubKeyLabel, (CK_ULONG) strlen(pubKeyLabel)}, // метка закрытого ключа
{CKA_PRIVATE, &bFalse, sizeof(bFalse) }, // виден без ввода PIN-кода пользователя
{
CKA_GOSTR3410_PARAMS,
(CK_VOID_PTR) id_GostR3410_2001_CryptoPro_A_ParamSet,
sizeof(id_GostR3410_2001_CryptoPro_A_ParamSet)
}, // тип ключевой пары
{
CKA_GOSTR3411_PARAMS,
(CK_VOID_PTR) id_tc26_gost3411_12_256,
sizeof(id_tc26_gost3411_12_256)
} // стандарт алгоритма хэширования
};
// дескрипторы открытого и закрытого ключа ключевой пары PKCS#11
CK_OBJECT_HANDLE pubKeyHandle, privKeyHandle;
// функция генерирует ключевую пару
rv = C_GenerateKeyPair(session,
&mechanism,
pubKeyTemplate, sizeof(pubKeyTemplate)/sizeof(CK_ATTRIBUTE),
privKeyTemplate, sizeof(privKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pubKeyHandle,
&privKeyHandle);
if(rv != CKR_OK)
{
PrintError("C_GenerateKeyPair", rv);
return;
}
CKA_GOSTR3410_PARAMS
описаны в приложении.CKA_GOSTR3411_PARAMS
описаны в приложении.C_WrapKey
¶C_WrapKey
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen)¶Параметры: |
|
---|
Производит экспорт симметричного сессионного ключа (сгенерированного программно) на симметричном ключе согласования.
Поддерживаются следующие механизмы:
Криптотокен
CKM_GOST28147_KEY_WRAP
(0x00001224
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ 28147–89.Криптотокен 2 ЭП
CKM_GOST28147_KEY_WRAP
(0x00001224
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ 28147–89.
CKM_GOSTR3410_KEY_WRAP
(0x00001203
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ Р 34.10–2001.
Особенности механизма
Используется аппаратный и программный экспорт ключа.
Аппаратный экспорт ключа
При аппаратном экспорте функция позволяет генерировать и экспортировать сессионный ключ для преобразований по ГОСТ 28147–89 с параметрами id-tc26-gost-28147-param-Z.
Для апплета Криптотокен 2 ЭП вводится понятие «виртуального секретного ключа», под которым понимается ключ, который может присутствовать (но не обязательно) в оперативной памяти изделия.
Вызову функции должно предшествовать получение дескриптора «виртуального секретного ключа»,
который потом передается в качестве параметра функции. Поиск объекта виртуального ключа осуществляется по шаблону,
содержащему атрибуты CKA_CLASS
= CKO_SECRET_KEY
, CKA_ID
= ”VSKO_ID”.
После экспорта ключа атрибут CKA_KT2_KEY_ACTIVE
принимает значение CK_TRUE
.
Апплет версии 2.5.5 позволяет также экспортировать сгенерированный ранее секретный ключ. После завершения операции преобразования ключ удаляется из памяти изделия.
Программный экспорт ключа
CKA_KT2_KEY_WRAP
(CKA_VENDOR_DEFINED | 0x0024
) – если атрибут имеет значение CK_TRUE
,
используется алгоритм шифрования ключа содержимого по RFC 4357 п.6.1/6.2;
в противном случае используется RFC 4357 п.6.3/6.4.CKA_KT2_AUTOGENERATE_KEY
(CKA_VENDOR_DEFINED | 0x0026
) – если атрибут имеет значение CK_TRUE
,
будет сгенерирован случайный секретный ключ. По умолчанию принимается значение CK_TRUE
.Laser
CKM_RSA_PKCS
(0x00000001
) – механизм для импорта и экспорта ключей с использованием ключевой пары и
алгоритма RSA.CKM_DES3_ECB
(0x00000132
) – механизм для импорта и экспорта ключей в режиме ECB с использованием
алгоритма triple-DES.CKM_DES3_CBC
(0x00000133
) – механизм для импорта и экспорта ключей в режиме CBC с использованием
алгоритма triple-DES.CKM_AES_ECB
(0x00001081
) – механизм для импорта и экспорта ключей в режиме ECB с использованием
алгоритма AES.CKM_AES_CBC
(0x00001082
) – механизм для импорта и экспорта ключей в режиме CBC с использованием
алгоритма AES.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример экспорта ключа с использованием CKM_GOSTR3410_KEY_WRAP и виртуального секретного ключа на языке C++:
// получаем дескриптор сессии
CK_SESSION_HANDLE hSession = … ;
// режим Пользователя
CK_UTF8CHAR pin[] = "1234567890";
C_Login(hSession, CKU_USER, pin, strlen(pin));
// получаем дескрипторы приватного ключа Отправителя и публичного ключа Получателя
CK_OBJECT_HANDLE hReceiverPublicKey = … ;
CK_OBJECT_HANDLE hSenderPrivateKey = … ;
CK_OBJECT_CLASS ckaClass = CKO_SECRET_KEY;
CK_BYTE ckaId[] = "VSKO_ID"; // "VSKO_ID"
// атрибуты поиска виртуального ключа
CK_ATTRIBUTE searchAtt[] = {
{CKA_CLASS, &ckaClass, sizeof(ckaClass)},
{CKA_ID, ckaId, sizeof(ckaId) - 1}
};
CK_OBJECT_HANDLE hVirtualSecretKey = CK_INVALID_HANDLE; // дескриптор виртуального секретного ключа
CK_ULONG ulObjectsCount = 5;
// поиск виртуального ключа
C_FindObjectsInit(hSession, searchAtt, 2);
C_FindObjects(hSession, &hVirtualSecretKey, 1, &ulObjectsCount);
C_FindObjectsFinal(hSession);
// параметры экспорта ключа
CK_GOSTR3410_KEY_WRAP_PARAMS wrapParams;
memset(&wrapParams, 0, sizeof(wrapParams));
wrapParams.hKey = hSenderPrivateKey;
CK_MECHANISM ckWrapMechanism;
ckWrapMechanism.mechanism = CKM_GOSTR3410_KEY_WRAP;
ckWrapMechanism.pParameter = &wrapParams;
ckWrapMechanism.ulParameterLen = sizeof(wrapParams);
// получаем требуемый размер для экспортированного представления
CK_ULONG wrappedKeySize = 0;
C_WrapKey(hSession, &ckWrapMechanism, hReceiverPublicKey, hVirtualSecretKey, NULL, &wrappedKeySize);
// генерируем и экспортируем ключ hVirtualSecretKey
std::vector<CK_BYTE> wrappedKey(wrappedKeySize);
C_WrapKey(hSession, &ckWrapMechanism, hReceiverPublicKey, hVirtualSecretKey, &wrappedKey[0], &wrappedKeySize);
C_UnwrapKey
¶C_UnwrapKey
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey)¶Параметры: |
|
---|
Производит импорт сессионного ключа на ключе согласования.
Поддерживаются следующие механизмы:
Криптотокен
CKM_GOST28147_KEY_WRAP
(0x00001224
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ 28147–89.Криптотокен 2 ЭП
CKM_GOST28147_KEY_WRAP
(0x00001224
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ 28147–89.
CKM_GOSTR3410_KEY_WRAP
(0x00001203
) – механизм для импорта и экспорта ключей,
соответствующий стандарту ГОСТ Р 34.10–2001.
Особенности механизма
Используется аппаратный и программный экспорт ключа.
Аппаратный экспорт ключа
Программный экспорт ключа
CKA_KT2_KEY_WRAP
(CKA_VENDOR_DEFINED | 0x0024
) – если атрибут имеет значение CK_TRUE
,
используется алгоритм шифрования ключа содержимого по RFC 4357 п.6.1/6.2;
в противном случае используется RFC 4357 п.6.3/6.4.Laser
CKM_RSA_PKCS
(0x00000001
) – механизм для импорта и экспорта ключей с использованием ключевой пары и
алгоритма RSA.CKM_DES3_ECB
(0x00000132
) – механизм для импорта и экспорта ключей в режиме ECB с использованием
алгоритма triple-DES.CKM_DES3_CBC
(0x00000133
) – механизм для импорта и экспорта ключей в режиме CBC с использованием
алгоритма triple-DES.CKM_AES_ECB
(0x00001081
) – механизм для импорта и экспорта ключей в режиме ECB с использованием
алгоритма AES.CKM_AES_CBC
(0x00001082
) – механизм для импорта и экспорта ключей в режиме CBC с использованием
алгоритма AES.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример импорта ключа с использованием CKM_GOSTR3410_KEY_WRAP на языке C++:
// экспортное представление ключа
CK_BYTE wrappedKey[] = {0x30, 0x41, 0x30, 0x28, 0x04, 0x20, 0x65, 0xB2, 0xD5, 0x22, 0xD7, 0x74, 0xEF, 0x34, 0x39, 0xD2, 0xAC , 0x98, 0x65, 0x8B, 0xFA, 0xB5, 0x4A, 0xE7, 0xDE, 0xA2, 0x98, 0x25, 0x8E, 0xAA, 0xC6, 0x0D, 0x26, 0x17, 0x0C , 0x2C, 0xCB, 0x24, 0x04, 0x04, 0xA6, 0x2B, 0x37, 0xF0, 0xA0, 0x15, 0x06, 0x09, 0x2A, 0x85, 0x03, 0x07, 0x01 , 0x02, 0x05, 0x01, 0x01, 0x04, 0x08, 0x1F, 0x41, 0xBD, 0x67, 0x24, 0x48, 0xBF, 0x55};
CK_BYTE STR_CRYPTO_PRO_GOST28147_Z[] = {0x06, 0x09, 0x2A, 0x85, 0x03, 0x07, 0x01, 0x02, 0x05, 0x01, 0x01};
const CK_ULONG STR_CRYPTO_PRO_GOST28147_Z_SIZE = sizeof(STR_CRYPTO_PRO_GOST28147_Z);
CK_OBJECT_HANDLE receiverPrivateKey= … ; // дескриптор приватного ключа Получателя
CK_OBJECT_HANDLE senderPublicKey = … ; // дескриптор публичного ключа Отправителя
CK_BBOOL s_TrueValue = CK_TRUE;
CK_BBOOL s_FalseValue = CK_FALSE;
// шаблон секретного ключа
CK_OBJECT_CLASS objectClass = CKO_SECRET_KEY;
CK_KEY_TYPE keyType = CKK_GOST28147;
CK_ATTRIBUTE secretKeyTemplate[] = {
{CKA_GOST28147_PARAMS, STR_CRYPTO_PRO_GOST28147_Z, STR_CRYPTO_PRO_GOST28147_Z_SIZE},
{CKA_TOKEN, &s_TrueValue, sizeof(s_TrueValue)},
{CKA_PRIVATE, &s_TrueValue, sizeof(s_TrueValue)},
{CKA_CLASS, &objectClass, sizeof(objectClass)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_DECRYPT, &s_TrueValue, sizeof(s_TrueValue)}
};
// параметры импорта ключа
CK_GOSTR3410_KEY_WRAP_PARAMS wrapParams;
memset(&wrapParams, 0, sizeof(wrapParams));
CK_MECHANISM mechanism;
mechanism.mechanism = CKM_GOSTR3410_KEY_WRAP;
mechanism.pParameter = &wrapParams;
mechanism.ulParameterLen = sizeof(wrapParams);
CK_OBJECT_HANDLE hCEK = CK_INVALID_HANDLE;
// импорт ключа в память изделия
wrapParams.hKey = hSenderPublicKey;
C_UnwrapKey(hSession, &mechanism, hReceiverPrivateKey, &wrappedKey[0], sizeof(wrappedKey), secretKeyTemplate, 6, &hCEK);
C_DeriveKey
¶C_DeriveKey
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey)¶Параметры: |
|
---|
Вырабатывает ключ согласования или сессионный ключ (в зависимости от апплета, с которым происходит работа и используемого механизма).
Особенности апплетов:
Криптотокен
Поддерживаемые механизмы:
CKM_GOSTR3410_DERIVE
(0x00001204
) – механизм для выработки ключа согласования,
соответствующий стандарту ГОСТ Р 34.10–2001.CKM_TLS_GOST_MASTER_KEY_DERIVE
(NSSCK_VENDOR_PKSC11_RU_TEAM | 0x101
) – механизм для выработки
48-байтного ключа из 32-байтного ключа, используемый при создании master_secret
ключей для протокола TLS 1.0.CKM_TLS_GOST_KEY_AND_MAC_DERIVE
(NSSCK_VENDOR_PKSC11_RU_TEAM | 0x102
) – механизм для выработки ключа
согласования из master_secret
и случайных данных.CKM_TLS_GOST_PRF
(NSSCK_VENDOR_PKSC11_RU_TEAM | 0x103
) – механизм для генерации псевдослучайных данных
произвольной длины защищенным образом, соответствующий стандарту ГОСТ.Криптотокен 2 ЭП
Для выработки ключа с использованием дескриптора может использоваться структура JC_KT2_GOSTR3410_DERIVE_PARAMS
.
Поддерживаемые механизмы:
CKM_GOSTR3410_DERIVE
(0x00001204
) – механизм для выработки ключа согласования,
соответствующий стандарту ГОСТ Р 34.10–2001.CKM_GOSTR3410_2012_DERIVE
(CK_VENDOR_PKCS11_RU_TEAM_TC26 | 0x007
) – механизм для выработки ключа согласования,
соответствующий стандарту ГОСТ Р 34.10–2012.CKM_GOSTR3410_12_DERIVE
– псевдоним для CKM_GOSTR3410_2012_DERIVE
.Laser
Поддерживаемые механизмы:
CKM_TLS_MASTER_KEY_DERIVE
(0x00000375
) – механизм для выработки 48-байтного ключа из другого
48-байтного ключа, используемый при создании master_secret
ключей для протокола TLS 1.0.CKM_TLS_KEY_AND_MAC_DERIVE
(0x00000376
) – механизм для выработки ключа согласования из
master_secret
и случайных данных.CKM_TLS_MASTER_KEY_DERIVE_DH
(0x00000377
) – механизм для выработки 48-байтного ключа из другого ключа
произвольного размера, используемый при создании master_secret
ключей для протокола TLS 1.0.CKM_TLS_PRF
(0x00000378
) – механизм для генерации псевдослучайных данных произвольной длины.CKM_ECDH1_DERIVE
(0x00001050
) – механизм для генерации ключа согласования, основывающийся на
эллиптических кривых и алгоритме Диффи-Хеллмана.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример выработки ключа согласования на языке C:
static CK_BYTE id_Gost28147_89_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1F, 0x01 };
// результат выполнения функции
CK_RV rv = CKR_OK;
// механизм выработки ключа согласования
CK_MECHANISM pkcs11DeriveKeyMechanism;
// дескрипторы открытого и закрытого ключа ключавой пары PKCS#11
CK_OBJECT_HANDLE pkcs11PubKeyHandle, pkcs11PrivKeyHandle;
// шаблон ключа согласования
CK_ATTRIBUTE pkcs11DerivedKeyTemplate[] =
{
{CKA_GOST28147_PARAMS, id_Gost28147_89_CryptoPro_A_ParamSet, sizeof(id_Gost28147_89_CryptoPro_A_ParamSet)}
};
// дескриптор ключа согласования PKCS#11
CK_OBJECT_HANDLE pkcs11DerivedKeyHandle;
// параметры для выработки ключа согласования
CK_GOSTR3410_DERIVE_PARAMS pkcs11DeriveParams;
// устанавливаем параметры для создания ключа согласования
pkcs11DeriveParams.kdf = NULL;
pkcs11DeriveParams.pPublicData = cpPubKeyValue;
pkcs11DeriveParams.ulPublicDataLen = 64;
pkcs11DeriveParams.pUKM = ukm;
pkcs11DeriveParams.ulUKMLen = 8;
// устанавливаем механизм создания ключа согласования
pkcs11DeriveKeyMechanism.mechanism = CKM_GOSTR3410_DERIVE;
pkcs11DeriveKeyMechanism.pParameter = &pkcs11DeriveParams;
pkcs11DeriveKeyMechanism.ulParameterLen = sizeof(pkcs11DeriveParams);
// создаем ключ согласования
rv = C_DeriveKey(pkcs11SessionHandle,
&pkcs11DeriveKeyMechanism,
pkcs11PrivKeyHandle,
pkcs11DerivedKeyTemplate, sizeof(pkcs11DerivedKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pkcs11DerivedKeyHandle);
if(rv != CKR_OK)
{
PrintError("C_DeriveKey", rv);
return;
}
CKA_GOST28147_PARAMS
описаны в приложении.Пример выработки ключа согласования с использованием дескриптора открытого ключа Получателя для ключей ГОСТ Р 34.10–2001, ГОСТ Р 34.10–2012 на языке C:
static CK_BYTE id_Gost28147_89_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1F, 0x01 };
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// дескриптор закрытого ключа ключевой пары Отправителя
CK_OBJECT_HANDLE hPrivateKey;
// дескриптор открытого ключа Получателя
CK_OBJECT_HANDLE hPublicKey;
// механизм диверсификации ключа
CK_EC_KDF_TYPE kdf = CKD_NULL;
CK_BYTE ukm[] = {1, 2, 3, 4, 5, 6, 7, 8};
// дескриптор ключа согласования PKCS#11
CK_OBJECT_HANDLE hDerivedKey;
// ...
// генерация ключевой пары Отправителя
// получение дескриптора открытого ключа Получателя
// ...
// параметры для создания ключа согласования
JC_KT2_GOSTR3410_DERIVE_PARAMS jcCT2DeriveParams;
jcCT2DeriveParams.kdf = kdf;
jcCT2DeriveParams.hPublicKey = hPublicKey;
jcCT2DeriveParams.pUKM = CK_BYTE_PTR(&ukm[0]);
jcCT2DeriveParams.ulUKMLen = 8;
CK_MECHANISM ckDeriveMechanism = {CKM_GOSTR3410_DERIVE, &jcCT2DeriveParams, sizeof(jcCT2DeriveParams)};
// шаблон ключа согласования
CK_ULONG secretKeyClass = CKO_SECRET_KEY;
CK_KEY_TYPE keyType = CKK_GOST28147;
CK_ATTRIBUTE derivedKeyTemplate[] = {
{CKA_CLASS, &secretKeyClass, sizeof(secretKeyClass)},
{CKA_TOKEN, &bFalse, sizeof(bFalse)},
{CKA_GOST28147_PARAMS, id_Gost28147_89_CryptoPro_A_ParamSet, sizeof(id_Gost28147_89_CryptoPro_A_ParamSet)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_WRAP, &bTrue, sizeof(bTrue)},
{CKA_UNWRAP, &bTrue, sizeof(bTrue)}
};
rv = C_DeriveKey(pkcs11SessionHandle,
&ckDeriveMechanism,
hPrivateKey,
derivedKeyTemplate, sizeof(derivedKeyTemplate)/sizeof(CK_ATTRIBUTE),
&hDerivedKey);
if(rv != CKR_OK)
{
PrintError("C_DeriveKey", rv);
return;
}
Пример выработки ключа с использованием значения открытого ключа Получателя для ключей ГОСТ Р 34.10–2001 на языке C:
static CK_BYTE id_Gost28147_89_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1F, 0x01 };
// значение открытого ключа Получателя, ГОСТР 34.10-2001
CK_BYTE publicKeyValue2001[] =
{
0xA9, 0x4E, 0x0C, 0x00, 0xD7, 0x19, 0x5E, 0x14, 0x6E, 0xA0, 0x4B, 0x43, 0x80, 0x57, 0xAA, 0x8E,
0x59, 0x08, 0xF8, 0x0A, 0x92, 0x12, 0xF0, 0xAC, 0x02, 0x1D, 0xC0, 0x56, 0x47, 0x31, 0xB1, 0xC0,
0x00, 0xB9, 0x77, 0x43, 0x16, 0x34, 0xD1, 0xFA, 0x58, 0x46, 0x1F, 0x37, 0xA3, 0xFD, 0x38, 0xDC,
0x0B, 0xA0, 0x54, 0xC3, 0x51, 0x65, 0xCF, 0x26, 0x2A, 0x13, 0x99, 0x57, 0xD3, 0x2E, 0xF1, 0xC2
};
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// дескриптор закрытого ключа ключевой пары Отправителя
CK_OBJECT_HANDLE hPrivateKey;
// механизм диверсификации ключа
CK_EC_KDF_TYPE kdf = CKD_NULL;
CK_BYTE ukm[] = {1, 2, 3, 4, 5, 6, 7, 8};
// дескриптор ключа согласования PKCS#11
CK_OBJECT_HANDLE hDerivedKey;
// ...
// генерация ключевой пары Отправителя
// ...
// параметры для создания ключа согласования
CK_GOSTR3410_DERIVE_PARAMS deriveParams;
deriveParams.kdf = kdf;
deriveParams.pPublicData = CK_BYTE_PTR(&publicKeyValue2001[0]);
deriveParams.ulPublicDataLen = sizeof(publicKeyValue2001);
deriveParams.pUKM = CK_BYTE_PTR(&ukm[0]);
deriveParams.ulUKMLen = 8;
CK_MECHANISM ckDeriveMechanism = {CKM_GOSTR3410_DERIVE, &deriveParams, sizeof(deriveParams)};
// шаблон ключа согласования
CK_ULONG secretKeyClass = CKO_SECRET_KEY;
CK_KEY_TYPE keyType = CKK_GOST28147;
CK_ATTRIBUTE derivedKeyTemplate[] =
{
{CKA_CLASS, &secretKeyClass, sizeof(secretKeyClass)},
{CKA_TOKEN, &bFalse, sizeof(bFalse)},
{CKA_GOST28147_PARAMS, id_Gost28147_89_CryptoPro_A_ParamSet, sizeof(id_Gost28147_89_CryptoPro_A_ParamSet)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_WRAP, &bTrue, sizeof(bTrue)},
{CKA_UNWRAP, &bTrue, sizeof(bTrue)}
};
rv = C_DeriveKey(pkcs11SessionHandle,
&ckDeriveMechanism,
hPrivateKey,
derivedKeyTemplate, sizeof(derivedKeyTemplate)/sizeof(CK_ATTRIBUTE),
&hDerivedKey);
if(rv != CKR_OK)
{
PrintError("C_DeriveKey", rv);
return;
}
Пример выработки ключа с использованием значения открытого ключа Получателя для ключей ГОСТ Р 34.10–2012 на языке C:
static CK_BYTE id_Gost28147_89_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1F, 0x01 };
// значение открытого ключа Получателя, ГОСТР 34.10-2012
CK_BYTE publicKeyValue[] =
{
0x41, 0x40, 0x90, 0x36, 0x0E, 0x5E, 0x61, 0x82, 0x1C, 0xC6, 0xD6, 0x91, 0x11, 0x04, 0x71, 0xBB,
0xF0, 0xE3, 0x5F, 0x31, 0xDF, 0x94, 0x79, 0x7E, 0xE9, 0x5D, 0x24, 0xEB, 0x67, 0xC4, 0x38, 0xA1,
0xC5, 0xAA, 0x23, 0xC2, 0xFF, 0x33, 0xBA, 0x95, 0x27, 0x79, 0x36, 0x6E, 0x9A, 0x9F, 0xC6, 0x76,
0xF2, 0x8C, 0x2B, 0x6A, 0xC2, 0x5D, 0x61, 0x7F, 0xC1, 0xF3, 0x10, 0x50, 0x34, 0x35, 0x67, 0x1B
};
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
// результат выполнения функции
CK_RV rv = CKR_OK;
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// дескриптор закрытого ключа ключевой пары Отправителя
CK_OBJECT_HANDLE hPrivateKey;
// механизм диверсификации ключа
CK_EC_KDF_TYPE kdf = CKD_NULL;
CK_BYTE ukm[] = {1, 2, 3, 4, 5, 6, 7, 8};
// дескриптор ключа согласования PKCS#11
CK_OBJECT_HANDLE hDerivedKey;
// ...
// генерация ключевой пары Отправителя
// ...
// параметры для создания ключа согласования
// представлены в соответствии с рекомендациями ТК26
uint32_t tc26DeriveParams[21] = {0};
tc26DeriveParams[0] = kdf;
tc26DeriveParams[1] = sizeof(publicKeyValue);
memcpy(tc26DeriveParams + 2, &publicKeyValue[0], sizeof(publicKeyValue));
tc26DeriveParams[18] = 8;
memcpy(tc26DeriveParams + 19, &ukm[0], 8);
CK_MECHANISM deriveMechanism = {CKM_GOSTR3410_2012_DERIVE, &tc26DeriveParams, sizeof(tc26DeriveParams)};
// шаблон ключа согласования
CK_ULONG secretKeyClass = CKO_SECRET_KEY;
CK_KEY_TYPE keyType = CKK_GOST28147;
CK_ATTRIBUTE derivedKeyTemplate[] = {
{CKA_CLASS, &secretKeyClass, sizeof(secretKeyClass)},
{CKA_TOKEN, &bFalse, sizeof(bFalse)},
{CKA_GOST28147_PARAMS, id_Gost28147_89_CryptoPro_A_ParamSet, sizeof(id_Gost28147_89_CryptoPro_A_ParamSet)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_WRAP, &bTrue, sizeof(bTrue)},
{CKA_UNWRAP, &bTrue, sizeof(bTrue)}
};
rv = C_DeriveKey(pkcs11SessionHandle,
&ckDeriveMechanism,
hPrivateKey,
derivedKeyTemplate, sizeof(derivedKeyTemplate)/sizeof(CK_ATTRIBUTE),
&hDerivedKey);
if(rv != CKR_OK)
{
PrintError("C_DeriveKey", rv);
return;
}