...
Определение типа устройств
Открытие и закрытие сессии
Логин и логаут
Генерация ключевой пары
Атрибуты ключевых объектов
Все поддерживаемые устройствами Рутокен атрибуты объектов представлены в разделе Объекты PKCS #11.
Атрибуты ключевых объектов Рутокен PINPad
Рутокен PINPad имеет два специфических атрибута закрытого ключа, которые влияют на поведение устройства при осуществлении криптографических операций с использованием такого ключа: CKA_VENDOR_KEY_CONFIRM_OP
и CKA_VENDOR_KEY_PIN_ENTER
. Оба атрибута присваиваются закрытому ключу при генерации ключевой пары соответственно указанным в шаблоне значениям и поэтому не могут быть изменены после генерации. Помимо закрытого ключа, эти атрибуты могут быть присвоены также секретному ключу.
Если ключ был создан с флагом визуализации CKA_VENDOR_KEY_CONFIRM_OP
, то данные, которые подписываются с помощью такого ключа, перед подписью будут показаны на экране устройства и для их подписи потребуется подтверждение пользователя в виде нажатия специальной кнопки на тачскрине устройства.
Если ключ был создан с флагом повышенной защиты CKA_VENDOR_KEY_PIN_ENTER
, то для подписи таким ключом перед операцией потребуется ввести PIN-код на тачскрине устройства.
Поддерживаемые типы ключей
Устройства Рутокен поддерживают следующие типы ключей асимметричной криптографии (CK_KEY_TYPE
) :
...
CKK_GOSTR3410
для ключей ГОСТ Р 34.10-2001,
...
Code Block | ||||
---|---|---|---|---|
| ||||
CK_C_EX_GetFunctionListExtended pfGetFunctionListEx = NULL_PTR; // Указатель на функцию C_EX_GetFunctionListExtended
CK_FUNCTION_LIST_EXTENDED_PTR pFunctionListEx = NULL_PTR; // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED
CK_TOKEN_INFO_EXTENDED tokenInfoEx; // Структура данных типа CK_TOKEN_INFO_EXTENDED с информацией о токене
printf(" Determining token type");
/* Получить адрес функции запроса структуры с указателями на функции расширения */
pfGetFunctionListEx = (CK_C_EX_GetFunctionListExtended)GetProcAddress(hModule,
"C_EX_GetFunctionListExtended");
if (pfGetFunctionListEx == NULL_PTR)
{
printf(" -> Failed\n");
break;
}
/* Получить структуру с указателями на функции расширения */
rv = pfGetFunctionListEx(&pFunctionListEx);
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
memset(&tokenInfoEx,
0,
sizeof(CK_TOKEN_INFO_EXTENDED));
tokenInfoEx.ulSizeofThisStructure = sizeof(CK_TOKEN_INFO_EXTENDED);
/* Получить расширенную информацию о подключенном токене */
rv = pFunctionListEx->C_EX_GetTokenInfoExtended(aSlots[0],
&tokenInfoEx);
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
/* Определить класс токена */
if (tokenInfoEx.ulTokenClass == TOKEN_CLASS_S)
{
bIsRutokenPINPad = FALSE;
printf(": Rutoken / Rutoken S\n");
}
else if (tokenInfoEx.ulTokenClass == TOKEN_CLASS_ECP)
{
bIsRutokenPINPad = FALSE;
printf(": Rutoken ECP\n");
}
else if (tokenInfoEx.ulTokenClass == TOKEN_CLASS_LITE)
{
bIsRutokenPINPad = FALSE;
printf(": Rutoken Lite\n");
}
else if (tokenInfoEx.ulTokenClass == TOKEN_CLASS_WEB)
{
bIsRutokenPINPad = FALSE;
printf(": Rutoken WEB\n");
}
else if (tokenInfoEx.ulTokenClass == TOKEN_TYPE_RUTOKEN_PINPAD_FAMILY)
{
bIsRutokenPINPad = TRUE;
printf(": Rutoken PINPad\n");
}
else
{
bIsRutokenPINPad = FALSE;
printf(": undefined\n");
}
|
Открытие и закрытие сессии
Code Block | ||||
---|---|---|---|---|
| ||||
CK_SESSION_HANDLE hSession = NULL_PTR; // Хэндл открытой сессии
/* Открыть RW сессию в первом доступном слоте */
printf("Opening Session");
rv = pFunctionList->C_OpenSession(aSlots[0], // Идентификатор слота
CKF_SERIAL_SESSION | CKF_RW_SESSION, // Флаги сессии
NULL_PTR,
NULL_PTR,
&hSession); // Хэндл сессии
if (rv != CKR_OK)
printf(" -> Failed\n");
else
printf(" -> OK\n");
...
/* Закрыть все открытые сессии в слоте */
printf("C_CloseAllSession");
rv = pFunctionList->C_CloseAllSessions(aSlots[0]);
if (rvTemp != CKR_OK)
printf(" -> Failed\n");
else
printf(" -> OK\n");
hSession = NULL_PTR; |
Логин и логаут
Типы пользователя: CKU_USER -- пользователь Рутокен, CKU_SO -- администратор Рутокен.
Code Block | ||||
---|---|---|---|---|
| ||||
/* DEMO PIN-код Пользователя Рутокен */
CK_UTF8CHAR USER_PIN[] = {'1', '2', '3', '4', '5', '6', '7', '8'};
/* Выполнить аутентификацию Пользователя */
printf("Logging in");
rv = pFunctionList->C_Login(hSession, // Хэндл сессии
CKU_USER, // Тип пользователя
USER_PIN, // PIN-код пользователя
sizeof(USER_PIN)); // Длина PIN-кода
if (rv != CKR_OK)
printf(" -> Failed\n");
else
printf(" -> OK\n");
...
/*Сбросить права доступа */
printf("Logging out");
rv = pFunctionList->C_Logout(hSession);
if ((rv == CKR_OK) || (rv == CKR_USER_NOT_LOGGED_IN))
printf(" -> OK\n");
else
printf(" -> Failed\n"); |
Генерация ключевой пары
Атрибуты ключевых объектов
Все поддерживаемые устройствами Рутокен атрибуты объектов представлены в разделе Объекты PKCS #11.
Атрибуты ключевых объектов Рутокен PINPad
Рутокен PINPad имеет два специфических атрибута закрытого ключа, которые влияют на поведение устройства при осуществлении криптографических операций с использованием такого ключа: CKA_VENDOR_KEY_CONFIRM_OP
и CKA_VENDOR_KEY_PIN_ENTER
. Оба атрибута присваиваются закрытому ключу при генерации ключевой пары соответственно указанным в шаблоне значениям и поэтому не могут быть изменены после генерации. Помимо закрытого ключа, эти атрибуты могут быть присвоены также секретному ключу.
Если ключ был создан с флагом визуализации CKA_VENDOR_KEY_CONFIRM_OP
, то данные, которые подписываются с помощью такого ключа, перед подписью будут показаны на экране устройства и для их подписи потребуется подтверждение пользователя в виде нажатия специальной кнопки на тачскрине устройства.
Если ключ был создан с флагом повышенной защиты CKA_VENDOR_KEY_PIN_ENTER
, то для подписи таким ключом перед операцией потребуется ввести PIN-код на тачскрине устройства.
Поддерживаемые типы ключей
Устройства Рутокен поддерживают следующие типы ключей асимметричной криптографии (CK_KEY_TYPE
) :
CKK_GOSTR3410
для ключей ГОСТ Р 34.10-2001,CKK_GOSTR3410_512
для ключей ГОСТ Р 34.10-2012 ,CKK_RSA
для ключей RSA.
Примеры шаблонов ключей
Ниже представлены примеры шаблонов закрытого и открытого ключа ГОСТ Р 34.10-2001 с пояснениями.
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS ocPrivKey = CKO_PRIVATE_KEY;
CK_UTF8CHAR PrivKeyLabel[] = {"GOST Private Key"};
CK_BYTE KeyPairID[] = {"GOST keypair"};
CK_KEY_TYPE KeyType = CKK_GOSTR3410;
CK_BBOOL bTrue = CK_TRUE;
CK_BYTE GOST3410params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001
CK_ATTRIBUTE GOST34_10_2001PrivateKey[] = {
{ CKA_CLASS, &ocPrivKey, sizeof(ocPrivKey)}, // Объект закрытого ключа
{ CKA_LABEL, &PrivKeyLabel, sizeof(PrivKeyLabel) - 1}, // Метка ключа
{ CKA_ID, &KeyPairID, sizeof(KeyPairID) - 1}, // Идентификатор ключевой пары #1 (должен совпадать у открытого и закрытого ключей)
{ CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа
{ CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для расшифрования
{ CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена
{ CKA_PRIVATE, &bTrue, sizeof(bTrue)}, // Ключ доступен только после авторизации на токене
{ CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи)
{ CKA_VENDOR_KEY_CONFIRM_OP, &bTrue, sizeof(bTrue) }, // Операция подписи требует подтверждения на PINPad (только для Рутокен PINPad)
{ CKA_VENDOR_KEY_PIN_ENTER, &bTrue, sizeof(bTrue) }, // Операция подписи требует ввода PIN-кода на PINPad (только для Рутокен PINPad)
{ CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)} // Параметры алгоритма
}; |
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS ocPubKey = CKO_PUBLIC_KEY;
CK_UTF8CHAR PubKeyLabel[] = {"GOST Public Key"};
CK_BYTE KeyPairID[] = {"GOST keypair"};
CK_KEY_TYPE KeyType = CKK_GOSTR3410;
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
CK_BYTE GOST3410params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001
CK_BYTE GOST3411params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01 }; // Параметры алгоритма ГОСТ Р 34.11-1994
CK_ATTRIBUTE GOST34_10_2001PublicKey[] = {
{ CKA_CLASS, &ocPubKey, sizeof(ocPubKey)}, // Объект открытого ключа
{ CKA_LABEL, &PubKeyLabel, sizeof(PubKeyLabel)-1}, // Метка ключа
{ CKA_ID, &KeyPairID, sizeof(KeyPairID)-1}, // Идентификатор ключевой пары
{ CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа
{ CKA_ENCRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для зашифрования
{ CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена
{ CKA_PRIVATE, &bFalse, sizeof(bFalse)}, // Ключ доступен без авторизации на токене
{ CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи)
{ CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)},// Параметры алгоритма
{ CKA_GOSTR3411_PARAMS, GOST3411params, sizeof(GOST3411params)} // Параметры алгоритма
}; |
Поддерживаемые механизмы генерации ключей
Устройства Рутокен поддерживают следующие механизмы генерации ключевой пары:
CKM_GOSTR3410_KEY_PAIR_GEN
для генерации ключевой пары ГОСТ Р 34.10.2001,CKM_GOSTR3410_512_KEY_PAIR_GEN
для генерации ключевой пары ГОСТ Р 34.10.2012,CKM_RSA_PKCS_KEY_PAIR_GEN
для генерации ключевой пары RSA.
Пример генерации ключевой пары
Code Block | ||||
---|---|---|---|---|
| ||||
/* Вычисление размера массива */
#define arraysize(a) (sizeof(a)/sizeof(a[0]))
CK_MECHANISM KeyGenMech = {CKM_GOSTR3410_KEY_PAIR_GEN, NULL_PTR, 0}; // Генерация ключа ГОСТ Р 34.10-2001
CK_OBJECT_HANDLE hPublicKey = NULL_PTR; // Хэндл открытого ключа
CK_OBJECT_HANDLE hPrivateKey = NULL_PTR; // Хэндл закрытого ключа
printf("\n Generating key pair");
rv = pFunctionList->C_GenerateKeyPair(hSession, // Хэндл открытой сессии
&KeyGenMech, // Используемый механизм генерации ключевой пары
GOST34_10_2001PublicKey, // Шаблон открытого ключа
arraysize(GOST34_10_2001PublicKey), // Размер шаблона открытого ключа
GOST34_10_2001PrivateKey, // Шаблон закрытого ключа
arraysize(GOST34_10_2001PrivateKey), // Размер шаблона закрытого ключа
|
Примеры шаблонов ключей
Ниже представлены примеры шаблонов закрытого и открытого ключа ГОСТ Р 34.10-2001 с пояснениями.
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS ocPrivKey = CKO_PRIVATE_KEY;
CK_UTF8CHAR PrivKeyLabel[] = {"GOST Private Key"};
CK_BYTE KeyPairID[] = {"GOST keypair"};
CK_KEY_TYPE KeyType = CKK_GOSTR3410;
CK_BBOOL bTrue = CK_TRUE;
CK_BYTE GOST3410params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001
CK_ATTRIBUTE GOST34_10_2001PrivateKey[] = {
{ CKA_CLASS, &ocPrivKey, sizeof(ocPrivKey)}, // Объект закрытого ключа
{ CKA_LABEL, &PrivKeyLabel, sizeof(PrivKeyLabel) - 1}, // Метка ключа
{ CKA_ID, &KeyPairID, sizeof(KeyPairID) - 1}, // Идентификатор ключевой пары #1 (должен совпадать у открытого и закрытого ключей)
{ CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа
{ CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для расшифрования
{ CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена
{ CKA_PRIVATE, &bTrue, sizeof(bTrue)}, // Ключ доступен только после авторизации на токене
{ CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи)
{ CKA_VENDOR_KEY_CONFIRM_OP, &bTrue, sizeof(bTrue) }, // Операция подписи требует подтверждения на PINPad (только для Рутокен PINPad)
{ CKA_VENDOR_KEY_PIN_ENTER, &bTrue, sizeof(bTrue) }, // Операция подписи требует ввода PIN-кода на PINPad (только для Рутокен PINPad)
{ CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)} // Параметры алгоритма
}; |
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS ocPubKey = CKO_PUBLIC_KEY;
CK_UTF8CHAR PubKeyLabel[] = {"GOST Public Key"};
CK_BYTE KeyPairID[] = {"GOST keypair"};
CK_KEY_TYPE KeyType = CKK_GOSTR3410;
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
CK_BYTE GOST3410params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 }; // Параметры алгоритма ГОСТ Р 34.10-2001
CK_BYTE GOST3411params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01 }; // Параметры алгоритма ГОСТ Р 34.11-1994
CK_ATTRIBUTE GOST34_10_2001PublicKey[] = {
{ CKA_CLASS, &ocPubKey, sizeof(ocPubKey)}, // Объект открытого ключа
{ CKA_LABEL, &PubKeyLabel, sizeof(PubKeyLabel)-1}, // Метка ключа
{ CKA_ID, &KeyPairID, sizeof(KeyPairID)-1}, // Идентификатор ключевой пары
{ CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа
{ CKA_ENCRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для зашифрования
{ CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена
{ CKA_PRIVATE, &bFalse, sizeof(bFalse)}, // Ключ доступен без авторизации на токене
{ CKA_DERIVE, &bTrue, sizeof(bTrue)}, // Ключ поддерживает деривацию (из него могут быть получены другие ключи)
{ CKA_GOSTR3410_PARAMS, GOST3410params, sizeof(GOST3410params)},// Параметры алгоритма
{ CKA_GOSTR3411_PARAMS, GOST3411params, sizeof(GOST3411params)} // Параметры алгоритма
}; |
Поддерживаемые механизмы генерации ключей
Устройства Рутокен поддерживают следующие механизмы генерации ключевой пары:
CKM_GOSTR3410_KEY_PAIR_GEN
для генерации ключевой пары ГОСТ Р 34.10.2001,CKM_GOSTR3410_512_KEY_PAIR_GEN
для генерации ключевой пары ГОСТ Р 34.10.2012,CKM_RSA_PKCS_KEY_PAIR_GEN
для генерации ключевой пары RSA.
Пример генерации ключевой пары
Code Block | ||||
---|---|---|---|---|
| ||||
/* Вычисление размера массива */ #define arraysize(a) (sizeof(a)/sizeof(a[0])) CK_MECHANISM KeyGenMech = {CKM_GOSTR3410_KEY_PAIR_GEN, NULL_PTR, 0}; // Генерация ключа ГОСТ Р 34.10-2001 CK_OBJECT_HANDLE hPublicKey = NULL_PTR; // Хэндл открытого ключа CK_OBJECT_HANDLE hPrivateKey = NULL_PTR; // Хэндл закрытого ключа printf("\n Generating key pair"); rv = pFunctionList->C_GenerateKeyPair(hSession, // Хэндл открытой сессии &hPublicKey, // Хэндл открытого ключа &KeyGenMech, &hPrivateKey); // Используемый механизм генерации ключевой пары // Хэндл закрытого ключа if (rv != CKR_OK) printf(" -> Failed\n"); else printf(" GOST34_10_2001PublicKey, // Шаблон открытого ключа arraysize(GOST34_10_2001PublicKey), // Размер шаблона открытого ключа GOST34_10_2001PrivateKey, // Шаблон закрытого ключа arraysize(GOST34_10_2001PrivateKey), // Размер шаблона закрытого ключа &hPublicKey, // Хэндл открытого ключа &hPrivateKey); // Хэндл закрытого ключа if (rv != CKR_OK) printf(" -> Failed\n"); else printf(" -> OK\n"); |
Генерация секретного ключа
Атрибуты ключевых объектов
Все поддерживаемые устройствами Рутокен атрибуты объектов представлены в разделе Объекты секретных ключей.
Атрибуты ключевых объектов Рутокен PINPad
Рутокен PINPad имеет два специфических атрибута секретного ключа, которые влияют на поведение устройства при осуществлении криптографических операций с использованием такого ключа: CKA_VENDOR_KEY_CONFIRM_OP
и CKA_VENDOR_KEY_PIN_ENTER
. Оба атрибута присваиваются закрытому ключу при генерации ключевой пары соответственно указанным в шаблоне значениям и поэтому не могут быть изменены после генерации. Помимо закрытого ключа, эти атрибуты могут быть присвоены также секретному ключу.
Если ключ был создан с флагом визуализации CKA_VENDOR_KEY_CONFIRM_OP
, то данные, которые шифруются с помощью такого ключа, перед подписью будут показаны на экране устройства и для их шифрования потребуется подтверждение пользователя в виде нажатия специальной кнопки на тачскрине устройства.
Если ключ был создан с флагом повышенной защиты CKA_VENDOR_KEY_PIN_ENTER
, то для шифрования таким ключом перед операцией потребуется ввести PIN-код на тачскрине устройства.
Поддерживаемые типы ключей
Устройства Рутокен поддерживают следующие типы секретных ключей (CK_KEY_TYPE
) :
CKK_GENERIC_SECRET для абстрактных ключей произвольной длины,
- CKK_GOST28147 для ключей ГОСТ 28147-89.
Примеры шаблона секретного ключа
-> OK\n"); |
Генерация секретного ключа
Атрибуты ключевых объектов
Все поддерживаемые устройствами Рутокен атрибуты объектов представлены в разделе Объекты секретных ключей.
Атрибуты ключевых объектов Рутокен PINPad
Рутокен PINPad имеет два специфических атрибута секретного ключа, которые влияют на поведение устройства при осуществлении криптографических операций с использованием такого ключа: CKA_VENDOR_KEY_CONFIRM_OP
и CKA_VENDOR_KEY_PIN_ENTER
. Оба атрибута присваиваются закрытому ключу при генерации ключевой пары соответственно указанным в шаблоне значениям и поэтому не могут быть изменены после генерации. Помимо закрытого ключа, эти атрибуты могут быть присвоены также секретному ключу.
Если ключ был создан с флагом визуализации CKA_VENDOR_KEY_CONFIRM_OP
, то данные, которые шифруются с помощью такого ключа, перед подписью будут показаны на экране устройства и для их шифрования потребуется подтверждение пользователя в виде нажатия специальной кнопки на тачскрине устройства.
Если ключ был создан с флагом повышенной защиты CKA_VENDOR_KEY_PIN_ENTER
, то для шифрования таким ключом перед операцией потребуется ввести PIN-код на тачскрине устройства.
Поддерживаемые типы ключей
Устройства Рутокен поддерживают следующие типы секретных ключей (CK_KEY_TYPE
) :
CKK_GENERIC_SECRET для абстрактных ключей произвольной длины,
- CKK_GOST28147 для ключей ГОСТ 28147-89.
Примеры шаблона секретного ключа
Code Block | ||||
---|---|---|---|---|
| ||||
CK_OBJECT_CLASS ocPubKey = CKO_SECRET_KEY;
CK_UTF8CHAR SecKeyLabel[] = {"GOST Secret Key"};
CK_BYTE SecKeyID[] = {"GOST Secret Key"};
CK_KEY_TYPE KeyType = CKK_GOST28147;
CK_BBOOL bTrue = CK_TRUE;
CK_BBOOL bFalse = CK_FALSE;
CK_BYTE GOST28147params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 }; // Параметры алгоритма ГОСТ 28147-89
CK_ATTRIBUTE attrGOST28147_89SecKey[] =
{
{ CKA_CLASS, &ocSeckey, sizeof(ocSeckey)}, // Объект секретного ключа ГОСТ 28147-89
{ CKA_LABEL, &SecKeyLabel, sizeof(SecKeyLabel) - 1}, // Метка ключа
{ CKA_ID, &SecKeyID, sizeof(SecKeyID) - 1}, // Идентификатор ключа
{ CKA_KEY_TYPE, &KeyType, sizeof(KeyType)}, // Тип ключа
{ CKA_ENCRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для зашифрования
{ CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для расшифрования
{ CKA_TOKEN, &bTrue, sizeof(bTrue)}, | ||||
Code Block | ||||
| ||||
CK_OBJECT_CLASS ocPubKey = CKO_SECRET_KEY; CK_UTF8CHAR SecKeyLabel[] = {"GOST Secret Key"}; CK_BYTE SecKeyID[] = {"GOST Secret Key"}; CK_KEY_TYPE KeyType = CKK_GOST28147; CK_BBOOL bTrue = CK_TRUE; CK_BBOOL bFalse = CK_FALSE; CK_BYTE GOST28147params[] = { 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 }; // Параметры алгоритма ГОСТ 28147-89 CK_ATTRIBUTE attrGOST28147_89SecKey[] = { { CKA_CLASS, &ocSeckey, sizeof(ocSeckey)}, // ОбъектКлюч секретногоявляется ключа ГОСТ 28147-89объектом токена { CKA_LABELPRIVATE, &SecKeyLabelbFalse, sizeof(SecKeyLabelbFalse) - 1}, // Метка ключа { CKA_ID, &SecKeyID, sizeof(SecKeyID) - 1}, // Ключ доступен без авторизации // Идентификатор ключана токене { CKA_VENDOR_KEY_CONFIRM_TYPEOP, &KeyTypebTrue, sizeof(KeyTypebTrue) }, // Операция шифрования/расшифрования требует подтверждения на PINPad // Тип ключа(только для Рутокен PINPad) { CKA_ENCRYPT_VENDOR_KEY_PIN_ENTER, &bTrue, sizeof(bTrue) }, // Операция шифрования/расшифрования требует ввода PIN-кода на PINPad (только для Рутокен PINPad) { CKA_GOST28147_PARAMS, GOST28147params, sizeof(GOST28147params)} // Ключ предназначен для зашифрования { CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // Ключ предназначен для расшифрования { CKA_TOKEN, &bTrue, sizeof(bTrue)}, // Ключ является объектом токена { CKA_PRIVATE, &bFalse, sizeof(bFalse)},Параметры алгоритма }; |
Поддерживаемые механизмы генерации ключей
Устройства Рутокен поддерживают следующие механизмы генерации секретного ключа:
CKM_GOST28147_KEY_GEN
для генерации секретного ключа ГОСТ 28147-89 (библиотекой rtPKCS11ECP),CKM_GOST_KEY_GEN
для генерации секретного ключа ГОСТ 28147-89 (библиотекой rtPKCS11).
Пример генерации секретного ключа
Code Block | ||||
---|---|---|---|---|
| ||||
/* Вычисление размера массива */ #define arraysize(a) (sizeof(a)/sizeof(a[0])) CK_MECHANISM KeyGenMech = {CKM_GOST28147_KEY_GEN, NULL_PTR, 0}; // Генерация ключа ГОСТ 28147-89 CK_OBJECT_HANDLE hSecKey = NULL_PTR; // Хэндл cекретного ключа printf("\n Generating key"); rv = pFunctionList->C_GenerateKey(hSession, // Ключ доступен без авторизации на токене { CKA_VENDOR_KEY_CONFIRM_OP, &bTrue, sizeof(bTrue) }, // Операция шифрования/расшифрования требует подтверждения на PINPad (только для Рутокен PINPad) { CKA_VENDOR_KEY_PIN_ENTER, &bTrue, sizeof(bTrue) }, // Операция шифрования/расшифрования требует ввода PIN-кода на PINPad (только для Рутокен PINPad) { CKA_GOST28147_PARAMS, GOST28147params, sizeof(GOST28147params)} // Параметры алгоритма }; |
Поддерживаемые механизмы генерации ключей
Устройства Рутокен поддерживают следующие механизмы генерации секретного ключа:
CKM_GOST28147_KEY_GEN
для генерации секретного ключа ГОСТ 28147-89.
Пример генерации секретного ключа
Code Block | ||||
---|---|---|---|---|
| ||||
/* Вычисление размера массива */ #define arraysize(a) (sizeof(a)/sizeof(a[0])) CK_MECHANISM KeyGenMech = {CKM_GOST28147_KEY_GEN, NULL_PTR, 0}; // Генерация ключа ГОСТ 28147-89 CK_OBJECT_HANDLE hSecKey = NULL_PTR; // Хэндл cекретного ключа printf("\n Generating key"); rv = pFunctionList->C_GenerateKey(hSession, // Хэндл открытой сессии &KeyGenMech, // Используемый механизм генерации ключа attrGOST28147_89SecKey, // Шаблон для создания секретного ключа arraysize(attrGOST28147_89SecKey), // Размер Хэндлшаблона открытойсекретного сессииключа &KeyGenMech,hSecKey); // ИспользуемыйХэндл механизм генерациисекретного ключа if (rv attrGOST28147_89SecKey, // Шаблон для создания секретного ключа arraysize(attrGOST28147_89SecKey), // Размер шаблона секретного ключа &hSecKey); // Хэндл секретного ключа if (rv != CKR_OK) printf(" -> Failed\n"); else printf(" -> OK\n"); |
Импорт ключа
Удаление объектов
Вычисление значения хеш-функции
Поддерживаемые механизмы
Подпись и проверка подписи
!= CKR_OK)
printf(" -> Failed\n");
else
printf(" -> OK\n"); |
Импорт ключа
Удаление объектов
Вычисление значения хеш-функции
Поддерживаемые механизмы
Устройства Рутокен поддерживают следующие механизмы хеширования:
CKM_MD2
для алгоритма MD2,CKM_MD5
для алгоритма MD5,CKM_SHA_1
для алгоритма SHA-1,CKM_GOSTR3411
для алгоритма ГОСТ Р 34.11.94,CKM_GOSTR3411_12_256
для алгоритма ГОСТ Р 34.11.2012 с длиной значения 256 бит,CKM_GOSTR3411_12_512
для алгоритма ГОСТ Р 34.11.2012 с длиной закрытого ключа 512 бит.
Подпись и проверка подписи
Поддерживаемые механизмы
Устройства Рутокен поддерживают следующие механизмы подписи:
CKM_GOSTR3410
для алгоритма ГОСТ Р 34.10.2001,CKM_GOSTR3410_WITH_GOSTR3411
для совместного алгоритма хешированияCKM_GOSTR3411
и подписи CKM_GOSTR3410,CKM_GOSTR3410_512
для алгоритма ГОСТ Р 34.10.2012 с длиной закрытого ключа 512 бит,CKM_GOSTR3410_WITH_GOSTR3411_12_256
для совместного алгоритма хешированияCKM_GOSTR3411_12_256
и подписи на ключе длиной 256 бит,CKM_GOSTR3410_WITH_GOSTR3411_12_512
для совместного алгоритма хешированияCKM_GOSTR3411_12_512
и подписи на ключе длиной 512 бит,CKM_RSA_PKCS
для алгоритма RSA.
...
Сырая подпись
Подпись в формате CMS
...
Шифрование и расшифрование
Поддерживаемые механизмы
Устройства Рутокен поддерживают следующие механизмы шифрования:
CKM_GOST28147_ECB
для шифрования алгоритмом ГОСТ 28147-89 в режиме простой замены,CKM_GOST28147
для шифрования алгоритмом ГОСТ 28147-89 в режиме сцепления блоков,CKM_RSA_PKCS
для шифрования алгоритмом RSA.
Генерация запроса PKCS#10
...