Объекты закрытого ключа

Объекты открытых ключей содержат:

Общие атрибуты закрытых ключей

Класс объекта (CKA_CLASS) равен CKO_PRIVATE_KEY.

Таблица ниже описывает атрибуты объектов закрытых ключей, в дополнение к общим атрибутам ключей.

Атрибут Тип данных Значение
CKA_SUBJECT8
Byte Array
(массив CK_BYTE)
Имя субъекта сертификата в DER формате.
CKA_SENSITIVE8,11 CK_BBOOL

CK_TRUE – ключ является чувствительным, т.е. нельзя извлечь из токена в открытом виде.

По умолчанию – специфическое для конкретного носителя 9.

CKA_DECRYPT8 CK_BBOOL

CK_TRUE – ключ поддерживает расшифрование.

По умолчанию – специфическое для конкретного носителя 9.

CKA_SIGN8 CK_BBOOL

CK_TRUE – ключ поддерживает подпись данных. Подпись является приложением к данным.

По умолчанию – специфическое для конкретного носителя 9.

CKA_SIGN_RECOVER8 CK_BBOOL

CK_TRUE – ключ поддерживает подпись данных. Данные могут быть восстановлены из подписи.

По умолчанию – специфическое для конкретного носителя 9.

CKA_UNWRAP8 CK_BBOOL

CK_TRUE – ключ может использоваться для импорта других ключей.

По умолчанию – специфическое для конкретного носителя 9.

CKA_EXTRACTABLE8,12 CK_BBOOL

CK_TRUE – ключ извлекаемый и может быть экспортирован.

По умолчанию – специфическое для конкретного носителя 9.

CKA_ALWAYS_SENSITIVE2,4,6 CK_BBOOL CK_TRUE – атрибут CKA_SENSITIVE всегда будет выставлен в CK_TRUE.
CKA_NEVER_EXTRACTABLE2,4,6 CK_BBOOL CK_TRUE – атрибут CKA_EXTRACTABLE всегда будет выставлен в CK_FALSE.
CKA_WRAP_WITH_TRUSTED11 CK_BBOOL

CK_TRUE – ключ может экспортироваться только при помощи экспортного ключа, у которого атрибут CKA_TRUSTED равен CK_TRUE.

По умолчанию – CK_FALSE.

CKA_UNWRAP_TEMPLATE CK_ATTRIBUTE_PTR Для экспортных ключей. Шаблон атрибутов ключа для импорта. Ключи, совпадающие с шаблоном, могут импортироваться при помощи данного ключа. Количество атрибутов в массиве – параметр ulValueLen атрибута, разделенный на размер CK_ATTRIBUTE.
CKA_ALWAYS_AUTHENTICATE CK_BBOOL

CK_TRUE – необходимо всегда предъявлять PIN-код пользователя при подписи или расшифровки данных с помощью этого ключа.

По умолчанию – CK_FALSE.

2 – Не указывается, когда объект создается с использованием C_CreateObject().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
6 – Не указывается, когда объект импортируется с использованием C_UnwrapKey().
8 – Может изменяться после того как объект был создан с использованием C_SetAttributeValue() или в процессе копирования объекта с использованием C_CopyObject(). Однако в некоторых случаях определенный токен может и не разрешить изменение атрибута в процессе выполнения C_CopyObject().
9 – Значение по умолчанию является специфическим для конкретного токена и может зависеть от значений других атрибутов.
11 – Не может изменен после того, как выставлен в 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 содержат закрытые ключи RSA.

Тип ключа (CKA_KEY_TYPE) равен CKK_RSA.

Ключи RSA поддерживаются апплетами:
  • Laser.

Таблица ниже описывает атрибуты объектов закрытых ключей RSA, в дополнение к общим атрибутам закрытых ключей.

Атрибут Тип данных Значение
CKA_MODULUS1,4,6
Big integer
(массив CK_BYTE)
Модуль n.
CKA_PUBLIC_EXPONENT4,6
Big integer
(массив CK_BYTE)
Открытая экспонента e.
CKA_PRIVATE_EXPONENT1,4,6,7
Big integer
(массив CK_BYTE)
Закрытая экспонента d.
CKA_PRIME_14,6,7
Big integer
(массив CK_BYTE)
Простое число p.
CKA_PRIME_24,6,7
Big integer
(массив CK_BYTE)
Простое число q.
CKA_EXPONENT_14,6,7
Big integer
(массив CK_BYTE)
Закрытая экспонента d по модулю p-1
CKA_EXPONENT_24,6,7
Big integer
(массив CK_BYTE)
Закрытая экспонента d по модулю q-1
CKA_COEFFICIENT4,6,7
Big integer
(массив CK_BYTE)
Коэффициент CRT q-1 по модулю p
1 – Указывается, когда объект создается с использованием C_CreateObject().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
6 – Не указывается, когда объект импортируется с использованием C_UnwrapKey().
7 – Не может быть открыт в открытом виде, если у объекта атрибут 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)}
};

Ключи ГОСТ Р 34.10

Объекты закрытых ключей ГОСТ Р 34.10 содержат закрытые ключи:
  • ГОСТ Р 34.10–2001;
  • ГОСТ Р 34.10–2012 (длина ключа 256 бит);
  • ГОСТ Р 34.10–2012 (длина ключа 512 бит).

Тип ключа (CKA_KEY_TYPE) равен CKK_GOSTR3410.

Ключи ГОСТ Р 34.10–2001 поддерживаются апплетами:
  • Криптотокен;
  • Криптотокен 2 ЭП.
Ключи ГОСТ Р 34.10–2012 (длина ключа 256 бит) и ГОСТ Р 34.10–2012 (длина ключа 512 бит) поддерживаются апплетами:
  • Криптотокен 2 ЭП.

Таблица ниже описывает атрибуты объектов закрытых ключей ГОСТ Р 34.10–2001, ГОСТ Р 34.10–2012 (длина ключа 256 бит) и ГОСТ Р 34.10–2012 (длина ключа 512 бит), в дополнение к общим атрибутам закрытых ключей.

Атрибут Тип данных Значение
CKA_VALUE1,4,6,7
Byte array
(массив CK_BYTE)
Закрытый ключ длиной:
  • 32 байта – для ГОСТ Р 34.10–2001 и ГОСТ Р 34.10–2012 (длина ключа 256 бит);
  • 64 байта – для ГОСТ Р 34.10–2012 (длина ключа 512 бит).

Порядок байтов – от младшего к старшему (little endian).

CKA_GOSTR3410_PARAMS1,4,6
Byte array
(массив CK_BYTE)

Идентификатор типа объекта данных ГОСТ Р 34.10–2001 в DER формате. Когда ключ используется, у объекта параметров домена с типом CKK_GOSTR3410 должен быть указан тот же атрибут CKA_OBJECT_ID.

Доступные значения описаны в разделе Значения CKA_GOSTR3410_PARAMS.

CKA_GOSTR3411_PARAMS1,4,6,8
Byte array
(массив CK_BYTE)

Идентификатор типа объекта данных ГОСТ Р 34.10–2001 / ГОСТ Р 34.10–2012 в DER формате. Когда ключ используется, у объекта параметров домена с типом CKK_GOSTR3411 должен быть указан тот же атрибут CKA_OBJECT_ID.

Доступные значения описаны в разделе Значения CKA_GOSTR3411_PARAMS.

CKA_GOST28147_PARAMS4,6,8
Byte array
(массив CK_BYTE)

Идентификатор типа объекта данных ГОСТ 28147–89 в DER формате. Когда ключ используется, у объекта параметров домена с типом CKK_GOST28147 должен быть указан тот же атрибут CKA_OBJECT_ID.

Доступные значения описаны в разделе Значения CKA_GOST28147_PARAMS.

Атрибут можно не указывать.

1 – Указывается, когда объект создается с использованием C_CreateObject().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
6 – Не указывается, когда объект импортируется с использованием C_UnwrapKey().
7 – Не может быть открыт в открытом виде, если у объекта атрибут CKA_SENSITIVE равен CK_TRUE или атрибут CKA_EXTRACTABLE равен CK_FALSE.
8 – Может изменяться после того как объект был создан с использованием 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)}
};