Класс объекта (CKA_CLASS) равен CKO_PRIVATE_KEY
.
Таблица ниже описывает атрибуты объектов закрытых ключей, в дополнение к общим атрибутам ключей.
Атрибут | Тип данных | Значение |
---|---|---|
CKA_SUBJECT 8 |
Byte Array
(массив
CK_BYTE ) |
Имя субъекта сертификата в DER формате. |
CKA_SENSITIVE 8,11 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_DECRYPT 8 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_SIGN 8 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_SIGN_RECOVER 8 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_UNWRAP 8 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_EXTRACTABLE 8,12 |
CK_BBOOL |
По умолчанию – специфическое для конкретного носителя 9. |
CKA_ALWAYS_SENSITIVE 2,4,6 |
CK_BBOOL |
CK_TRUE – атрибут CKA_SENSITIVE всегда будет выставлен в CK_TRUE . |
CKA_NEVER_EXTRACTABLE 2,4,6 |
CK_BBOOL |
CK_TRUE – атрибут CKA_EXTRACTABLE всегда будет выставлен в CK_FALSE . |
CKA_WRAP_WITH_TRUSTED 11 |
CK_BBOOL |
По умолчанию – |
CKA_UNWRAP_TEMPLATE |
CK_ATTRIBUTE_PTR |
Для экспортных ключей. Шаблон атрибутов ключа для импорта.
Ключи, совпадающие с шаблоном, могут импортироваться при помощи данного ключа.
Количество атрибутов в массиве – параметр ulValueLen атрибута, разделенный на размер CK_ATTRIBUTE . |
CKA_ALWAYS_AUTHENTICATE |
CK_BBOOL |
По умолчанию – |
C_CreateObject()
.C_GenerateKey()
или C_GenerateKeyPair()
.C_UnwrapKey()
.C_SetAttributeValue()
или в процессе копирования объекта с использованием C_CopyObject()
.
Однако в некоторых случаях определенный токен может и не разрешить
изменение атрибута в процессе выполнения C_CopyObject()
.CK_TRUE
.
Становится атрибутом только для чтения.В интересах совместимости предусмотрено, что имя субъекта и идентификатор ключа для закрытого ключа будут совпадать с такими же показателями соответствующего сертификата и открытого ключа. Однако Cryptoki не настаивает на такой привязке, и не требуется, чтобы сертификат и закрытый ключ также хранились на носителе.
Если атрибут CKA_SENSITIVE
равен CK_TRUE
или атрибут CKA_EXTRACTABLE
равен CK_FALSE
,
то определенные атрибуты закрытого ключа не смогут открываться в незашифрованном тексте вне носителя.
Указание на то, какие это атрибуты, для каждого типа личных ключей приводится в таблице атрибутов в разделе,
который содержит описание данного типа ключа.
Атрибут CKA_ALWAYS_AUTHENTICATE
может использоваться для востребования повторной аутентификации
(чтобы заставить пользователя предоставить PIN) при каждом использовании закрытого ключа.
«Использование» в данном случае означает криптографическую операцию, такую как постановка подписи или расшифрование.
Данный атрибут может быть выставлен только на CK_TRUE
, когда CKA_PRIVATE
также выставлен на CK_TRUE
.
Повторная аутентификация происходит при вызове C_Login()
, при этом userType выставляется на CKU_CONTEXT_SPECIFIC
сразу после начала криптографической операции, использующей ключ (например, после C_SignInit()
).
При таком вызове фактический тип пользователя неявно задается требованиями к использованию активного ключа.
Если функция C_Login()
выдает значение CKR_OK
, значит, пользователь успешно прошел аутентификацию и
активный ключ выставляется в зарегистрированное состояние, которое продолжается до тех пор,
пока не будет успешно или неудачно завершена криптографическая операция
(например, через C_Sign()
, C_SignFinal()
, ...).
Возвращаемое значение CKR_PIN_INCORRECT функции C_Login()
означает, что пользователю
отказано в разрешении использовать данный ключ, а продолжение криптографической операции приведет
к такому поведению системы, как будто функция C_Login()
и не вызывалась.
В обоих этих случаях состояние сеанса остается одинаковым, однако повторные неудачные попытки пройти аутентификацию
могут привести к тому, что PIN будет заблокирован. C_Login()
в данном случае выдаст сообщение CKR_PIN_LOCKED
,
что приведет к выходу пользователя из носителя.
Неудачные попытки или отказ произвести повторную аутентификацию в случае,
когда CKA_ALWAYS_AUTHENTICATE
выставлен на CK_TRUE
, приведет к тому,
что после вызовов с использованием этого ключа будет выдаваться сообщение CKR_USER_NOT_LOGGED_IN
.
C_Login()
выдаст сообщение CKR_OPERATION_NOT_INITIALIZED
, однако это не повлияет на
активную криптографическую операцию, если делается попытка повторно пройти аутентификацию,
а атрибут CKA_ALWAYS_AUTHENTICATE
выставлен на CK_FALSE
.
Объекты закрытых ключей RSA содержат закрытые ключи RSA.
Тип ключа (CKA_KEY_TYPE
) равен CKK_RSA
.
Таблица ниже описывает атрибуты объектов закрытых ключей RSA, в дополнение к общим атрибутам закрытых ключей.
Атрибут | Тип данных | Значение |
---|---|---|
CKA_MODULUS 1,4,6 |
Big integer
(массив
CK_BYTE ) |
Модуль n. |
CKA_PUBLIC_EXPONENT 4,6 |
Big integer
(массив
CK_BYTE ) |
Открытая экспонента e. |
CKA_PRIVATE_EXPONENT 1,4,6,7 |
Big integer
(массив
CK_BYTE ) |
Закрытая экспонента d. |
CKA_PRIME_1 4,6,7 |
Big integer
(массив
CK_BYTE ) |
Простое число p. |
CKA_PRIME_2 4,6,7 |
Big integer
(массив
CK_BYTE ) |
Простое число q. |
CKA_EXPONENT_1 4,6,7 |
Big integer
(массив
CK_BYTE ) |
Закрытая экспонента d по модулю p-1 |
CKA_EXPONENT_2 4,6,7 |
Big integer
(массив
CK_BYTE ) |
Закрытая экспонента d по модулю q-1 |
CKA_COEFFICIENT 4,6,7 |
Big integer
(массив
CK_BYTE ) |
Коэффициент CRT q-1 по модулю p |
C_CreateObject()
.C_GenerateKey()
или C_GenerateKeyPair()
.C_UnwrapKey()
.CKA_SENSITIVE
равен CK_TRUE
или атрибут CKA_EXTRACTABLE
равен CK_FALSE
.Шаблон создания объекта закрытого ключа RSA
CK_OBJECT_CLASS class = CKO_PRIVATE_KEY;
CK_KEY_TYPE keyType = CKK_RSA;
CK_UTF8CHAR label[] = "An RSA private key object";
CK_BYTE subject[] = {... };
CK_BYTE id[] = { 123 };
CK_BYTE modulus[] = {... };
CK_BYTE publicExponent[] = {... };
CK_BYTE privateExponent[] = {... };
CK_BYTE prime1[] = {... };
CK_BYTE prime2[] = {... };
CK_BYTE exponent1[] = {... };
CK_BYTE exponent2[] = {... };
CK_BYTE coefficient[] = {... };
CK_BBOOL bTrue = CK_TRUE;
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_DECRYPT, &bTrue, sizeof(bTrue)},
{CKA_SIGN, &bTrue, sizeof(bTrue)},
{CKA_MODULUS, modulus, sizeof(modulus)},
{CKA_PUBLIC_EXPONENT, publicExponent, sizeof(publicExponent)},
{CKA_PRIVATE_EXPONENT, privateExponent, sizeof(privateExponent)},
{CKA_PRIME_1, prime1, sizeof(prime1)},
{CKA_PRIME_2, prime2, sizeof(prime2)},
{CKA_EXPONENT_1, exponent1, sizeof(exponent1)},
{CKA_EXPONENT_2, exponent2, sizeof(exponent2)},
{CKA_COEFFICIENT, coefficient, sizeof(coefficient)}
};
Тип ключа (CKA_KEY_TYPE
) равен CKK_GOSTR3410
.
Таблица ниже описывает атрибуты объектов закрытых ключей ГОСТ Р 34.10–2001, ГОСТ Р 34.10–2012 (длина ключа 256 бит) и ГОСТ Р 34.10–2012 (длина ключа 512 бит), в дополнение к общим атрибутам закрытых ключей.
Атрибут | Тип данных | Значение |
---|---|---|
CKA_VALUE 1,4,6,7 |
Byte array
(массив
CK_BYTE ) |
Порядок байтов – от младшего к старшему (little endian). |
CKA_GOSTR3410_PARAMS 1,4,6 |
Byte array
(массив
CK_BYTE ) |
Идентификатор типа объекта данных ГОСТ Р 34.10–2001 в DER формате.
Когда ключ используется, у объекта параметров домена с типом Доступные значения описаны в разделе Значения CKA_GOSTR3410_PARAMS. |
CKA_GOSTR3411_PARAMS 1,4,6,8 |
Byte array
(массив
CK_BYTE ) |
Идентификатор типа объекта данных ГОСТ Р 34.10–2001 / ГОСТ Р 34.10–2012 в DER формате.
Когда ключ используется, у объекта параметров домена с типом Доступные значения описаны в разделе Значения CKA_GOSTR3411_PARAMS. |
CKA_GOST28147_PARAMS 4,6,8 |
Byte array
(массив
CK_BYTE ) |
Идентификатор типа объекта данных ГОСТ 28147–89 в DER формате.
Когда ключ используется, у объекта параметров домена с типом Доступные значения описаны в разделе Значения CKA_GOST28147_PARAMS. Атрибут можно не указывать. |
C_CreateObject()
.C_GenerateKey()
или C_GenerateKeyPair()
.C_UnwrapKey()
.CKA_SENSITIVE
равен CK_TRUE
или атрибут CKA_EXTRACTABLE
равен CK_FALSE
.C_SetAttributeValue()
или в процессе копирования объекта с использованием C_CopyObject()
.
Однако в некоторых случаях определенный токен может и не разрешить
изменение атрибута в процессе выполнения C_CopyObject()
.При генерации закрытого ключа доменные параметры не указываются в шаблоне ключа. Это обусловливается тем, что закрытые ключи ГОСТ Р 34.10 генерируются только как часть ключевой пары и доменные параметры для пары указываются в шаблоне открытого ключа.
Шаблон создания объекта закрытого ключа ГОСТ Р 34.10–2001
CK_OBJECT_CLASS class = CKO_PRIVATE_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2001 private key object";
CK_BYTE subject[] = {... };
CK_BYTE id[] = { 123 };
CK_BYTE id_GostR3410_2001_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
CK_BYTE id_GostR3411_94_CryptoProParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01 };
CK_BYTE value[32] = {... };
CK_BBOOL bTrue = CK_TRUE;
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_SIGN, &bTrue, sizeof(bTrue)},
{CKA_GOSTR3410_PARAMS, id_GostR3410_2001_CryptoPro_A_ParamSet, sizeof(id_GostR3410_2001_CryptoPro_A_ParamSet)},
{CKA_GOSTR3411_PARAMS, id_GostR3411_94_CryptoProParamSet, sizeof(id_GostR3411_94_CryptoProParamSet)},
{CKA_VALUE, value, sizeof(value)}
};
Шаблон создания объекта закрытого ключа ГОСТ Р 34.10–2012 (длина ключа 256 бит)
CK_OBJECT_CLASS class = CKO_PRIVATE_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2012 256 private key object";
CK_BYTE subject[] = {... };
CK_BYTE id[] = { 123 };
CK_BYTE id_GostR3410_2001_CryptoPro_A_ParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
CK_BYTE id_tc26_gost3411_12_256[] = { 0x06, 0x08, 0x2A, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
CK_BYTE value[32] = {... };
CK_BBOOL bTrue = CK_TRUE;
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_SIGN, &bTrue, sizeof(bTrue)},
{CKA_GOSTR3410_PARAMS, id_GostR3410_2001_CryptoPro_A_ParamSet, sizeof(id_GostR3410_2001_CryptoPro_A_ParamSet)},
{CKA_GOSTR3411_PARAMS, id_tc26_gost3411_12_256, sizeof(id_tc26_gost3411_12_256)},
{CKA_VALUE, value, sizeof(value)}
};