C_GenerateKey
¶C_GenerateKey
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey, CKA_VALUE pSecretKey)¶Параметры: |
|
---|
Генерирует секретный ключ.
Поддерживаются следующие механизмы:
CKM_GOST28147_KEY_GEN
(0x00001220
) – механизм генерации ключей, соответствующий стандарту ГОСТ 28147-89.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.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример генерации сессионного ключа на языке С:
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// механизм генерации ключей
CK_MECHANISM pkcs11GenKeyMechanism = {CKM_GOST28147_KEY_GEN, NULL, 0};
// шаблон ключа
CK_ATTRIBUTE pkcs11SessionKeyTemplate[] =
{
{CKA_GOST28147_PARAMS, STR_CRYPTO_PRO_GOST28147_A, sizeof(STR_CRYPTO_PRO_GOST28147_A)}
};
// дескриптор сессионного ключа PKCS#11
CK_OBJECT_HANDLE pkcs11SessionKeyHandle;
// функция генерирует ключ, используя заданный шаблон
rv = C_GenerateKey(pkcs11SessionHandle,
&pkcs11GenKeyMechanism,
pkcs11SessionKeyTemplate,
sizeof(pkcs11SessionKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pkcs11SessionKeyHandle);
if(rv != CKR_OK)
{
throw runtime_error("C_GenerateKey failed.");
}
Возможные значения атрибута CKA_GOST28147_PARAMS
смотри в приложении.
Более полную информацию о работе с объектами смотри в приложении.
Пример генерации сессионного ключа на языке Java под ОС Android:
// дескриптор сессии
LongRef session = new LongRef();
// переменные атрибута, определяющего место сохранения объекта
boolean bToken = true;
boolean bSession = !bToken;
// дескриптор сессионного ключа
LongRef sessionKeyHandle = new LongRef();
// механизм для генерации сессионного ключа
CKM sessionKeyGenMech = new CKM(CKM.GOST28147_KEY_GEN, null);
// атрибуты сессионного ключа
CKA[] sessionKeyAttribs = new CKA[3];
sessionKeyAttribs[0] = new CKA(CKA.CLASS, CKO.SECRET_KEY); // сессионный ключ
sessionKeyAttribs[1] = new CKA(CKA.TOKEN, bSession); // как сессионный объект
sessionKeyAttribs[2] = new CKA(CKA.GOST28147_PARAMS, Default.STR_CRYPTO_PRO_GOST_28147_A); // тип ключа согласно rfc 4357
// генерация сессионного ключа
rv = C.GenerateKey(session.value, sessionKeyGenMech, sessionKeyAttribs, sessionKeyHandle);
if(rv != CKR.OK)
{
throw new CKRException("C.GenerateKey", rv);
}
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.CKM_RSA_PKCS_KEY_PAIR_GEN
(0x00000000
) – механизм генерации ключевой пары для алгоритма RSA.CKM_ECDSA_KEY_PAIR_GEN
(0x00001040
) – механизм генерации ключевой пары для алгоритма
ECDSA.CKM_EC_KEY_PAIR_GEN
(0x00001040
) – механизм генерации ключевой пары для алгоритма
EC.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Пример генерации ключевой пары на языке С:
// открытый ключ должен храниться в памяти устройства
CK_BBOOL pkcs11KeyGenToken = TRUE;
// дескриптор сессии
CK_SESSION_HANDLE pkcs11SessionHandle;
// механизм генерации ключевой пары
CK_MECHANISM pkcs11GenKeyPairMechanism = {CKM_GOSTR3410_KEY_PAIR_GEN, NULL, 0};
// шаблон закрытого ключа
CK_ATTRIBUTE pkcs11PrivKeyTemplate[] =
{
{CKA_TOKEN, &pkcs11KeyGenToken, sizeof(pkcs11KeyGenToken)},
{CKA_GOSTR3410_PARAMS, STR_CRYPTO_PRO_A, sizeof(STR_CRYPTO_PRO_A)}
};
// шаблон открытого ключа
CK_ATTRIBUTE pkcs11PubKeyTemplate[] =
{
{CKA_TOKEN, &pkcs11KeyGenToken, sizeof(pkcs11KeyGenToken)},
{CKA_GOSTR3410_PARAMS, STR_CRYPTO_PRO_A, sizeof(STR_CRYPTO_PRO_A)}
};
// дескрипторы открытого и закрытого ключа ключевой пары PKCS#11
CK_OBJECT_HANDLE pkcs11PubKeyHandle, pkcs11PrivKeyHandle;
// функция генерирует ключевую пару
rv = C_GenerateKeyPair(pkcs11SessionHandle,
&pkcs11GenKeyPairMechanism,
pkcs11PubKeyTemplate, sizeof(pkcs11PubKeyTemplate)/sizeof(CK_ATTRIBUTE),
pkcs11PrivKeyTemplate, sizeof(pkcs11PrivKeyTemplate)/sizeof(CK_ATTRIBUTE),
&pkcs11PubKeyHandle,
&pkcs11PrivKeyHandle);
if(rv != CKR_OK)
{
throw runtime_error("C_GenerateKeyPair failed.");
}
Значения атрибута CKA_GOSTR3410_PARAMS
смотри в приложении.
Более полную информацию о работе с объектами смотри в приложении.
Пример генерации ключевой пары на языке Java:
// дескриптор сессии
LongRef session = new LongRef();
// механизм для генерации ключевой пары
CKM mech = new CKM(CKM.GOSTR3410_KEY_PAIR_GEN, null);
// атрибуты открытого ключа
CKA[] pubKeyAttribs = new CKA[5];
pubKeyAttribs[0] = new CKA(CKA.CLASS, CKO.PUBLIC_KEY); // открытый ключ
pubKeyAttribs[1] = new CKA(CKA.TOKEN, bToken); // в токене
pubKeyAttribs[2] = new CKA(CKA.LABEL, "Public key"); // метка для отображения
pubKeyAttribs[3] = new CKA(CKA.GOSTR3410_PARAMS, Default.STR_CRYPTO_PRO_A); // тип ключевой пары согласно rfc 4357
pubKeyAttribs[4] = new CKA(CKA.ID, relatedID); // общий идентификатор
// атрибуты закрытого ключа
CKA[] prKeyAttribs = new CKA[5];
prKeyAttribs[0] = new CKA(CKA.CLASS, CKO.PRIVATE_KEY); // закрытый ключ
prKeyAttribs[1] = new CKA(CKA.TOKEN, bToken); // в токене
prKeyAttribs[2] = new CKA(CKA.LABEL, "Private key"); // метка для отображения
prKeyAttribs[3] = new CKA(CKA.GOSTR3410_PARAMS, Default.STR_CRYPTO_PRO_A); // тип ключевой пары согласно rfc 4357
prKeyAttribs[4] = new CKA(CKA.ID, relatedID); // общий идентификатор
// дескрипторы создаваемых объектов
LongRef pubKeyHandle = new LongRef();
LongRef prKeyHandle = new LongRef();
// генерация ключевой пары
rv = C.GenerateKeyPair(session.value, mech, pubKeyAttribs, prKeyAttribs, pubKeyHandle, prKeyHandle);
if(rv != CKR.OK)
{
throw new CKRException("C.GenerateKeyPair", rv);
}
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.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.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
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.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.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
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
) – механизм для генерации псевдослучайных данных
произвольной длины защищенным образом, соответствующий стандарту ГОСТ.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
) – механизм для генерации ключа согласования, основывающийся на
эллиптических кривых и алгоритме Диффи-Хеллмана.Запускается в режимах
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Предупреждение
Данный раздел актуален только при работе с апплетом Криптотокен.
Пример выработки ключа согласования на языке С:
// механизм выработки ключа согласования
CK_MECHANISM pkcs11DeriveKeyMechanism;
// дескрипторы открытого и закрытого ключа ключавой пары PKCS#11
CK_OBJECT_HANDLE pkcs11PubKeyHandle, pkcs11PrivKeyHandle;
// шаблон ключа согласования
CK_ATTRIBUTE pkcs11DerivedKeyTemplate[] =
{
{CKA_GOST28147_PARAMS, STR_CRYPTO_PRO_GOST28147_A, sizeof(STR_CRYPTO_PRO_GOST28147_A)}
};
// дескриптор ключа согласования 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)
{
throw runtime_error("C_DeriveKey failed.");
}
Возможные значения атрибута CKA_GOST28147_PARAMS
смотри в приложении.
Более полную информацию о работе с объектами смотри в приложении.
Пример выработки ключа согласования на языке Java:
// дескриптор сессии
LongRef session = new LongRef();
// атрибуты ключа согласования
CKA[] deriveKeyAttribs = new CKA[5];
deriveKeyAttribs[0] = new CKA(CKA.CLASS, CKO.SECRET_KEY); // ключ согласования
deriveKeyAttribs[1] = new CKA(CKA.TOKEN, bSession); // как сессионный объект
deriveKeyAttribs[2] = new CKA(CKA.ENCRYPT, true); // использование ключа для шифрования
deriveKeyAttribs[3] = new CKA(CKA.DECRYPT, true); // использование ключа для расшифрования
deriveKeyAttribs[4] = new CKA(CKA.GOST28147_PARAMS, Default.STR_CRYPTO_PRO_GOST_28147_A); // тип ключа согласно rfc 4357
// параметры механизма для создания ключа согласования
CK_PARAMS deriveParams = null;
// механизм для создания ключа согласования
CKM deriveKeyMech = null;
// дескрипторы объектов
LongRef pubKeyHandle = new LongRef();
LongRef prKeyHandle = new LongRef();
LongRef drvKeyHandle = new LongRef();
// формирование ключа согласования
rv = C.DeriveKey(session.value, deriveKeyMech, prKeyHandle.value, deriveKeyAttribs, drvKeyHandle);
if(rv != CKR.OK)
{
throw new CKRException("C.DeriveKey", rv);
}