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

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

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

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

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

Атрибут Тип данных Значение
CKA_SUBJECT8
Byte Array
(массив CK_BYTE)

Имя субъекта сертификата в DER формате.

По умолчанию – пусто.

CKA_ENCRYPT8 CK_BBOOL

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

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

CKA_VERIFY8 CK_BBOOL

CK_TRUE – ключ поддерживает верификацию, когда подпись является приложением к данным.

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

CKA_VERIFY_RECOVER8 CK_BBOOL

CK_TRUE – ключ поддерживает верификацию, когда данные восстанавливаются из подписи.

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

CKA_WRAP8 CK_BBOOL

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

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

CKA_TRUSTED10 CK_BBOOL CK_TRUE – ключ является доверенным для приложения, которое его создало. Экспортный ключ может использоваться для экспорта ключей, у которых атрибут CKA_WRAP_WITH_TRUSTED равен CK_TRUE.
CKA_WRAP_TEMPLATE CK_ATTRIBUTE_PTR Для экспортных ключей. Шаблон атрибутов ключа для экспорта. Ключи, совпадающие с шаблоном, могут экспортироваться при помощи данного ключа. Количество атрибутов в массиве – параметр ulValueLen атрибута, разделенный на размер CK_ATTRIBUTE.
8 – Может изменяться после того как объект был создан с использованием C_SetAttributeValue() или в процессе копирования объекта с использованием C_CopyObject(). Однако в некоторых случаях определенный токен может и не разрешить изменение атрибута в процессе выполнения C_CopyObject().
9 – Значение по умолчанию является специфическим для конкретного токена и может зависеть от значений других атрибутов.
10 – Может быть выставляться в CK_TRUE только пользователем с правами администратора (SO).

В интересах совместимости предусмотрено, что имя субъекта и идентификатор ключа для открытого ключа будут совпадать с такими же показателями соответствующего сертификата и секретного ключа. Однако Cryptoki не настаивает на такой привязке, и не требуется, чтобы сертификат и закрытый ключ также хранились на носителе. Для того, чтобы установить соответствие между флагами ISO/IEC 9594-8 (X.509) keyUsage для открытых ключей и атрибутами PKCS #11 для открытых ключей, необходимо воспользоваться таблицей ниже.

Флаги использования ключа для открытых ключей в сертификатах открытых ключей X.509 Соответствующие атрибуты Cryptoki для открытых ключей
dataEncipherment CKA_ENCRYPT
digitalSignature, keyCertSign, cRLSign CKA_VERIFY
digitalSignature, keyCertSign, cRLSign CKA_VERIFY_RECOVER
keyAgreement CKA_DERIVE
keyEncipherment CKA_WRAP
nonRepudiation CKA_VERIFY
nonRepudiation CKA_VERIFY_RECOVER

Ключи RSA

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

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

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

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

Атрибут Тип данных Значение
CKA_MODULUS1,4
Big integer
(массив CK_BYTE)
Модуль n.
CKA_MODULUS_BITS2,3 CK_ULONG Длина модуля n в байтах.
CKA_PUBLIC_EXPONENT1
Big integer
(массив CK_BYTE)
Открытая экспонента e.
1 – Указывается, когда объект создается с использованием C_CreateObject().
2 – Не указывается, когда объект создается с использованием C_CreateObject().
3 – Указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().

Шаблон создания объекта открытого ключа RSA

CK_OBJECT_CLASS class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_RSA;
CK_UTF8CHAR label[] = "An RSA public key object";
CK_BYTE modulus[] = {... };
CK_BYTE exponent[] = {... };

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_WRAP, &bTrue, sizeof(bTrue)},
  {CKA_ENCRYPT, &bTrue, sizeof(bTrue)},
  {CKA_MODULUS, modulus, sizeof(modulus)},
  {CKA_PUBLIC_EXPONENT, exponent, sizeof(exponent)}
};

Ключи ГОСТ Р 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
Byte array
(массив CK_BYTE)
Для ГОСТ Р 34.10–2001 и ГОСТ Р 34.10–2012 (длина ключа 256 бит):
тело ключа длиной 64 байта; координаты X и Y точки эллиптической кривой P(X,Y) длиной по 32 байта каждая.
Для ГОСТ Р 34.10–2012 (длина ключа 512 бит):
тело ключа длиной 128 байт; координаты X и Y точки эллиптической кривой P(X,Y) длиной по 64 байта каждая.

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

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

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

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

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

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

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

CKA_GOST28147_PARAMS8
Byte array
(массив CK_BYTE)

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

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

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

1 – Указывается, когда объект создается с использованием C_CreateObject().
3 – Указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
8 – Может изменяться после того как объект был создан с использованием C_SetAttributeValue() или в процессе копирования объекта с использованием C_CopyObject(). Однако в некоторых случаях определенный токен может и не разрешить изменение атрибута в процессе выполнения C_CopyObject().

Шаблон создания объекта открытого ключа ГОСТ Р 34.10–2001

CK_OBJECT_CLASS class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2001 public key object";
CK_BYTE id_GostR3410_2001_TestParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x00 };
CK_BYTE oid_GostR3411[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01 };
CK_BYTE value[64] = {... };

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_GOSTR3410PARAMS, id_GostR3410_2001_TestParamSet, sizeof(id_GostR3410_2001_TestParamSet)},
  {CKA_GOSTR3411PARAMS, oid_GostR3411, sizeof(oid_GostR3411)},
  {CKA_VALUE, value, sizeof(value)}
};

Шаблон создания объекта открытого ключа ГОСТ Р 34.10–2012 (длина ключа 256 бит)

CK_OBJECT_CLASS class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2001 256 public key object";
CK_BYTE id_GostR3410_2001_TestParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x00 };
CK_BYTE oid_GostR3411_256[] = { 0x06, 0x08, 0x2A, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };
CK_BYTE value[64] = {... };

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_GOSTR3410PARAMS, id_GostR3410_2001_TestParamSet, sizeof(id_GostR3410_2001_TestParamSet)},
  {CKA_GOSTR3411PARAMS, oid_GostR3411_256, sizeof(oid_GostR3411_256)},
  {CKA_VALUE, value, sizeof(value)}
};

Шаблон создания объекта открытого ключа ГОСТ Р 34.10–2012 (длина ключа 512 бит)

CK_OBJECT_CLASS class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2001 512 public key object";
CK_BYTE id_GostR3410_2001_TestParamSet[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x00 };
CK_BYTE oid_GostR3411_512[] = { 0x06, 0x08, 0x2A, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x03 };
CK_BYTE value[128] = {... };

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_GOSTR3410PARAMS, id_GostR3410_2001_TestParamSet, sizeof(id_GostR3410_2001_TestParamSet)},
  {CKA_GOSTR3411PARAMS, oid_GostR3411_512, sizeof(oid_GostR3411_512)},
  {CKA_VALUE, value, sizeof(value)}
};