3.8.4.1 Общие атрибуты

В таблице приведены общие атрибуты для всех объектов PKCS #11.




CKA_CLASS1

CK_OBJECT_CLASS

Класс объекта.

1 – Указывается, когда объект создается с использованием C_CreateObject().

3.8.4.2 Объекты хранения

Это не класс объектов, поэтому не требуется определение CKO_. К объектам хранения относятся:

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




CKA_TOKEN

CK_BBOOL

CK_TRUE – объект принадлежит носителю, т.е. хранится только в памяти устройства и не удаляется после завершения сеанса;

CK_FALSE – объект принадлежит сеансу, т.е. хранится в оперативной памяти и может использоваться только в промежуток времени – с момента создания сеанса (см. C_OpenSession()) и до его закрытия (см. C_CloseSession() или C_CloseAllSessions()).

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

CKA_PRIVATE

CK_BBOOL

CK_TRUE – объект является секретным.

CK_FALSE – объект является открытым.

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

CKA_MODIFIABLE

CK_BBOOL

CK_TRUE – объект можно изменить.

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

CKA_LABEL

RFC2279 string
(массив CK_UTF8CHAR)

Описание объекта.

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

CKA_COPYABLE

CK_BBOOL

CK_TRUE – объект может быть скопирован с использованием C_CopyObject().

Невозможно установить значение CK_TRUE, если уже установлено значение CK_FALSE.

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

9 – Значение по умолчанию является специфическим для конкретного токена и может зависеть от значений других атрибутов.


Только атрибут CKA_LABEL можно изменять после создания объекта. Атрибуты CKA_TOKEN, CKA_PRIVATE и CKA_MODIFIABLE можно изменять в процессе копирования объекта.

Атрибут CKA_TOKEN указывает на то, является ли объект объектом носителя или сеанса.

Когда атрибут CKA_PRIVATE выставлен на CK_TRUE, пользователь не сможет получить доступ к объекту до тех пор, пока не пройдет аутентификацию в объекте.

Значение атрибута CKA_MODIFIABLE определяет, является ли объект объектом только для чтения или нет. Могут быть варианты, при которых неизменяемый объект можно удалить, однако есть варианты, когда его удалить нельзя.

Атрибут CKA_LABEL предназначен для оказания помощи пользователям при просмотре и редактировании.

3.8.4.3 Объекты данных

Объекты данных хранят информацию, заданную приложением.

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

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




CKA_APPLICATION

RFC2279 string
(массив CK_UTF8CHAR)

Описание приложения, которое управляет объектом.

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

CKA_OBJECT_ID

Byte Array
(массив CK_BYTE)

Идентификатор типа данных объекта в DER-формате.

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

CKA_VALUE

Byte Array
(массив CK_BYTE)

Значение объекта.

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

CKA_COMPRESSED

CK_BBOOL

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

Атрибут является разработкой Аладдин Р.Д. и не входит в стандарт PKCS #11.

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

Атрибут CKA_APPLICATION позволяет приложениям определять владельца объекта. Однако стандарт PKCS #11 не гарантирует, что только конкретное приложение имеет доступ к объекту данных.

Атрибут CKA_OBJECT_ID позволяет приложениям определять типы значений объектов данных. Однако стандарт PKCS #11 не гарантирует, что идентификатор типа данных соответствует значению данных.

Атрибут CKA_COMPRESSED позволяет управлять компрессией. Компрессии подвергается атрибут CKA_VALUE у объектов CKO_CERTIFICATE и CKO_DATA. Значение атрибута присваивается при создании объекта и не изменяется впоследствии.

Шаблон создания объекта данных

CK_OBJECT_CLASS class = CKO_DATA;
CK_UTF8CHAR label[] = "A data object";
CK_UTF8CHAR application[] = "An application";
CK_BYTE data[] = "Sample data";
 
CK_BBOOL bTrue = CK_TRUE;
 
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_APPLICATION, application, sizeof(application) - 1},
{CKA_VALUE, data, sizeof(data)}
};

3.8.4.4 Объекты сертификата

Объекты сертификатов хранят:

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

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




CKA_CERTIFICATE_TYPE1

CK_CERTIFICATE_TYPE

Тип сертификата.

CKA_TRUSTED10

CK_BBOOL

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

CKA_CERTIFICATE_CATEGORY

CK_ULONG

Категория сертификата:

  • 0 – не указано;
  • 1 – пользователь носителя;
  • 2 – удостоверяющий центр;
  • 3 – иное лицо.

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

CKA_CHECK_VALUE

Byte Array
(массив CK_BYTE)

Контрольная сумма.

CKA_START_DATE

CK_DATE

Начальная дата сертификата.

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

CKA_END_DATE

CK_DATE

Конечная дата сертификата.

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

CKA_COMPRESSED

CK_BBOOL

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

Атрибут является разработкой Аладдин Р.Д. и не входит в стандарт PKCS #11.

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

1 – Указывается, когда объект создается с использованием C_CreateObject().
10 – Может быть выставляться в CK_TRUE только пользователем с правами администратора (SO).


Атрибут CKA_CERTIFICATE_TYPE не изменяется после создания объекта. Данная версия PKCS #11 поддерживает следующие типы сертификатов:

  • CKC_X_509 – сертификат открытого ключа X.509;
  • CKC_X_509_ATTR_CERT – сертификат атрибутов X.509.

Атрибут CKA_TRUSTED не может быть выставлен приложением на CK_TRUE. Он должен быть выставлен приложением, инициализирующим носитель или SO носителя. Доверенные сертификаты не могут быть изменены.

Атрибут CKA_CERTIFICATE_CATEGORY используется для указания того, является ли сохраняемый сертификат сертификатом пользователя, для которого соответствующий личный сертификат является доступным на носителе («пользователь носителя»), сертификатом УЦ («удостоверяющий центр») или конечным сертификатом («иного лица»). Данный атрибут не изменяется после создания объекта.

Атрибуты CKA_CERTIFICATE_CATEGORY и CKA_TRUSTED вместе будут использоваться для сопоставления с категориями сертификатов. В CDF-описании сертификатов сохраняемый сертификат помечен категорией «пользователь носителя». В CDF-описаниях «trustedCertificates» или «useful- Certificates» сохраняемый сертификат будет помечен категорией «удостоверяющий центр» или «иное лицо», в зависимости от того, указывают ли атрибуты CommonCertificateAttribute или CKA_TRUSTED на то, принадлежит он к CDF-описаниям trustedCertificates или usefulCertificates.

CKA_CHECK_VALUE: значение данного сертификата выводится из сертификата по первым трем байтам значения хэш-функции SHA-1 атрибута CKA_VALUE объекта сертификата.

Атрибуты CKA_START_DATE и CKA_END_DATE используются только для ссылки. Cryptoki не придает им никакого дополнительного значения. Когда они присутствуют, приложение отвечает за то, чтобы выставить их на значения, которые соответствуют полям сертификата «не до» и «не после» (если таковые существуют).

Атрибут CKA_COMPRESSED позволяет управлять компрессией. Компрессии подвергается атрибут CKA_VALUE у объектов CKO_CERTIFICATE и CKO_DATA. Значение атрибута присваивается при создании объекта и не изменяется впоследствии.

3.8.4.5 Объекты сертификата открытого ключа X.509

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

Тип сертификата (CKA_CERTIFICATE_TYPE) равен CKC_X_509.

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

Атрибут

Тип данных

Значение

CKA_SUBJECT1

Byte Array
(массив CK_BYTE)

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

CKA_ID

Byte Array
(массив CK_BYTE)

Идентификатор для ключевой пары.

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

CKA_ISSUER

Byte Array
(массив CK_BYTE)

Имя издателя сертификата в DER формате.

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

CKA_SERIAL_NUMBER

Byte Array
(массив CK_BYTE)

Серийный номер сертификата в DER формате.

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

CKA_VALUE2

Byte Array
(массив CK_BYTE)

Тело сертификата в BER формате.

CKA_URL3

RFC2279 string
(массив CK_UTF8CHAR)

URL, где можно получить полный сертификат.

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

CKA_HASH_OF_SUBJECT_PUBLIC_KEY4

Byte Array
(массив CK_BYTE)

Хэш SHA-1 открытого ключа субъекта.

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

CKA_HASH_OF_ISSUER_PUBLIC_KEY4

Byte Array
(массив CK_BYTE)

Хэш SHA-1 открытого ключа издателя.

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

CKA_JAVA_MIDP_SECURITY_DOMAIN

CK_ULONG

Домен безопасности Java MIDP:

  • 0 – не указано;
  • 1 – пользователь;
  • 2 – оператор;
  • 3 – третье лицо.

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

CKA_NAME_HASH_ALGORITHM

CK_MECHANISM_TYPE

Определяет механизм, используемый для вычисления CKA_HASH_OF_SUBJECT_PUBLIC_KEY и CKA_HASH_OF_ISSUER_PUBLIC_KEY.

Если атрибут отсутствует, то по умолчанию используется SHA-1.

1 – Указывается, когда объект создается с использованием C_CreateObject().
2 – Не указывается, когда объект создается с использованием C_CreateObject().
3 – Указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().


Только атрибуты CKA_ID, CKA_ISSUER и CKA_SERIAL_NUMBER можно изменять после создания объекта.

Атрибут CKA_ID предназначен как средство распознавания множества пар открытый ключ/закрытый ключ, которые хранятся в одном и том же объекте (независимо от того, хранятся ли они в одном носителе или нет). Так как ключи распознаются по имени объекта, а также по идентификатору, возможно, что ключи к различным объектам могут иметь то же значение CKA_ID, не приводя к неоднозначности. В интересах совместимости предусмотрено, что имя объекта и идентификатор ключа сертификата будут совпадать с такими же показателями соответствующих секретных и открытых ключей (хотя и не требуется, чтобы все они хранились в одном и том же носителе). Однако Cryptoki не настаивает на такой привязке или даже на уникальности идентификатора ключа для конкретного субъекта; в частности, приложение может оставить идентификатор ключа пустым.

Атрибуты CKA_ISSUER и CKA_SERIAL_NUMBER предназначены для совместимости с PKCS #7 и со стандартом Privacy Enhanced Mail (RFC1421). В расширениях версии 3 к сертификатам X.509 идентификатор ключа может находиться в сертификате, значение CKA_ID будет являться идентичным идентификатору ключа в таком расширении сертификата, хотя Cryptoki на этом и не настаивает.

Атрибут CKA_URL обеспечивает поддержку хранения URL в том месте, где должен храниться сертификат вместо самого сертификата. Хранение URL вместо полного сертификата часто используется в мобильной среде.

Атрибуты CKA_HASH_OF_SUBJECT_PUBLIC_KEY и CKA_HASH_OF_ISSUER_PUBLIC_KEY используются для хранения хэшей, а также открытых ключей субъекта и органа, выдавшего сертификат. Они особенно важны, когда доступен только URL для сопоставления сертификата с личным ключом, а также при поиске сертификата органа, выдавшего сертификат.

Атрибут CKA_JAVA_MIDP_SECURITY_DOMAIN связывает сертификат с доменом безопасности Java MIDP.

Шаблон создания объекта сертификата X.509

CK_OBJECT_CLASS class = CKO_CERTIFICATE;
CK_CERTIFICATE_TYPE certType = CKC_X_509;
CK_UTF8CHAR label[] = "A certificate object";
CK_BYTE subject[] = {...};
CK_BYTE id[] = {123};
CK_BYTE certificate[] = {...};
 
CK_BBOOL bTrue = CK_TRUE;
 
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_CERTIFICATE_TYPE, &certType, sizeof(certType)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_VALUE, certificate, sizeof(certificate)}
};

3.8.4.6 Объекты сертификата атрибутов X.509

Объекты сертификата атрибутов X.509 содержат сертификаты атрибутов X.509.

Тип сертификата (CKA_CERTIFICATE_TYPE) равен CKC_X_509_ATTR_CERT.

Таблица ниже описывает атрибуты объектов сертификатов атрибутов X.509, в дополнение к общим атрибутам класса.

Атрибут

Тип данных

Значение

CKA_OWNER1

Byte Array
(массив CK_BYTE)

Поле субъекта сертификата атрибутов в DER формате. Значение отличается от CKA_SUBJECT, из в сертификата CKC_X_509, синтаксисом ASN.1 и кодировкой.

CKA_AC_ISSUER

Byte Array
(массив CK_BYTE)

Поле издателя сертификата атрибутов в DER формате. Значение отличается от CKA_ISSUER, из в сертификата CKC_X_509, синтаксисом ASN.1 и кодировкой.

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

CKA_SERIAL_NUMBER

Byte Array
(массив CK_BYTE)

Серийный номер сертификата в DER формате.

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

CKA_ATTR_TYPES

Byte Array
(массив CK_BYTE)

Последовательность значений идентификаторов объектов, соответствующим типам атрибутов сертификата, в BER формате. При помощи этого поля можно искать заданный атрибут сертификата без его извлечения и разбора.

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

CKA_VALUE1

Byte Array
(массив CK_BYTE)

Тело сертификата в BER формате.

1 – Указывается, когда объект создается с использованием C_CreateObject().


Только атрибуты CKA_AC_ISSUER, CKA_SERIAL_NUMBER и CKA_ATTR_TYPES можно изменять после создания объекта.

Шаблон создания объекта сертификата атрибутов X.509

CK_OBJECT_CLASS class = CKO_CERTIFICATE;
CK_CERTIFICATE_TYPE certType = CKC_X_509_ATTR_CERT;
CK_UTF8CHAR label[] = "An attribute certificate object";
CK_BYTE owner[] = {...};
CK_BYTE certificate[] = {...};
 
CK_BBOOL bTrue = CK_TRUE;
 
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_CERTIFICATE_TYPE, &certType, sizeof(certType)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_LABEL, label, sizeof(label) - 1},
{CKA_OWNER, owner, sizeof(owner)},
{CKA_VALUE, certificate, sizeof(certificate)}
};

3.8.4.7 Объекты ключей

Это не класс объектов, поэтому не требуется определение CKO_. В объектах ключей хранятся ключи шифрования и аутентификации, которые могут быть:

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




CKA_KEY_TYPE1,5

CK_KEY_TYPE

Тип ключа.

CKA_ID8

Byte Array
(массив CK_BYTE)

Идентификатор ключа.

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

CKA_START_DATE8

CK_DATE

Дата начала действия ключа.

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

CKA_END_DATE8

CK_DATE

Дата истечения действия ключа.

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

CKA_DERIVE8

CK_BBOOL

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

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

CKA_LOCAL2,4,6

CK_BBOOL

Устанавливается в CK_TRUE, если выполняется одно из условий:

  • ключ сгенерирован на токене, при помощи функций C_GenerateKey() или C_GenerateKeyPair();
  • ключ создан при помощи функции C_CopyObject(), как копия ключа, атрибут которого CKA_LOCAL равен CK_TRUE.

CKA_KEY_GEN_MECHANISM2,4,6

CK_MECHANISM_TYPE

Идентификатор механизма, который используется для генерации материала ключа.

CKA_ALLOWED_MECHANISMS

CK_MECHANISM_TYPE_PTR

Список механизмов, которые можно использовать с данным ключом. Количество механизмов в массиве – параметр ulValueLen атрибута, разделенный на размер CK_MECHANISM_TYPE.

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


Поле CKA_ID предназначено для различения нескольких ключей. В случае с открытыми и секретными ключами данное поле предназначено для управления различными ключами, которые принадлежат одному субъекту; идентификатор для открытого ключа и для соответствующего ему секретного ключа должны быть одинаковыми. Идентификатор ключа также должен быть одинаковым и для соответствующего сертификата, если таковой существует. Однако Cryptoki не настаивает на таких привязках. В случае с секретными ключами значение атрибута CKA_ID зависит от приложения.

Атрибуты CKA_START_DATE и CKA_END_DATE используются только для ссылки на них; Cryptoki не придает им никакого особого значения. В частности, он не ограничивает использование ключа в соответствии с датами; этим занимается приложение.

Атрибут CKA_DERIVE имеет значение CK_TRUE тогда и только тогда, когда из данного ключа можно вывести другие ключи.

Атрибут CKA_LOCAL имеет значение CK_TRUE тогда и только тогда, когда значение ключа было изначально сгенерировано на носителе с использованием вызова функции C_GenerateKey() или C_GenerateKeyPair().

Атрибут CKA_KEY_GEN_MECHANISM определяет механизм генерации ключа, который используется для генерации материала ключа. Он содержит действительное значение только в том случае, если атрибут CKA_LOCAL имеет значение CK_TRUE. Если CKA_LOCAL имеет значение CK_FALSE, то атрибут CKA_KEY_GEN_MECHANISM принимает значение CK_UNAVAILABLE_INFORMATION.

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

Класс объекта (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

3.8.4.9 Открытые ключи RSA

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

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

Ключи RSA поддерживаются приложением PKI.

Таблица ниже описывает атрибуты объектов открытых ключей 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)}
};

3.8.4.10 Открытые ключи ГОСТ Р 34.10

Объекты открытых ключей ГОСТ Р 34.10 содержат открытые ключи:

  • ГОСТ Р 34.10–2001;
  • ГОСТ Р 34.10–2012 (длина ключа 256 бит);
  • ГОСТ Р 34.10–2012 (длина ключа 512 бит).

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

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

  • GOST версии 2.5.5, 2.5.9, 2.5.13

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

  • GOST версии 2.5.13

Таблица ниже описывает атрибуты объектов открытых ключей ГОСТ Р 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–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)}
};

3.8.4.11 Открытые ключи ECC

Ключи на эллиптических кривых поддерживаются приложением PKI.

Атрибут CK_KEY_TYPE для объектов открытого ключа на эллиптических кривых принимает значения CKK_EC (рекомендуемое) и CKK_ECDSA (устаревшее).

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

Атрибут

Тип данных

значение

CKA_EC_PARAMS1,3 

(CKA_ECDSA_PARAMS)

Big integer (массив CK_BYTE)

Представление параметров ANSI X9.62 в кодировке DER

CKA_EC_POINT1,4

Big integer (массив CK_BYTE)

Закодированное в формате DER значения точки Q по стандарту ANSI X9.62

1 - Должен указываться при создании объекта с помощью функции C_CreateObject()
3 - Должен указываться при генерации объекта с помощью функций C_GenerateKey() или C_GenerateKeyPair()
4 - Не должен указываться при генерации объекта с помощью функций C_GenerateKey() или C_GenerateKeyPair()

Шаблон создания объекта открытого ключа CKK_EC
CK_OBJECT_CLASS class = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_EC;
CK_UTF8CHAR label[] = “An EC public key object”;
CK_BYTE ecParams[] = {...};
CK_BYTE ecPoint[] = {...};
CK_BBOOL true = CK_TRUE;
 
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_LABEL, label, sizeof(label)-1},
{CKA_EC_PARAMS, ecParams, sizeof(ecParams)},
{CKA_EC_POINT, ecPoint, sizeof(ecPoint)}
};

В следующие таблице представлены поддерживаемы значения параметра CKA_EC_PARAMS:

Значение параметра CKA_EC_PARAMS

OID

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x02}

1.2.840.100045.3.1.2, prime192v2

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x03}

1.2.840.100045.3.1.3, prime192v3

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x04}

1.2.840.100045.3.1.4, prime239v1

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x05}

1.2.840.10045.3.1.5, prime239v2

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x06}

1.2.840.100045.3.1.6, prime239v3

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}

1.2.840.10045.3.1.7, prime256v1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x19}

1.3.132.0.31, secp192k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x20}

1.3.132.0.32, secp224k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x21}

1.3.132.0.33, secp224r1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x0A}

1.3.132.0.10, secp256k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22}

1.3.132.0.34, secp384r1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23}

1.3.132.0.35, secp521r1

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

Класс объекта (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.

3.8.4.13 Закрытые ключи RSA

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

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

Ключи RSA поддерживаются приложением PKI:

Таблица ниже описывает атрибуты объектов закрытых ключей 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)}
};

3.8.4.14 Закрытые ключи ГОСТ Р 34.10

Объекты закрытых ключей ГОСТ Р 34.10 содержат закрытые ключи:

  • ГОСТ Р 34.10–2001;
  • ГОСТ Р 34.10–2012 (длина ключа 256 бит);
  • ГОСТ Р 34.10–2012 (длина ключа 512 бит).

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

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

  • GOST версии 2.5.5, 2.5.9, 2.5.13

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

  • GOST версии 2.5.13

Таблица ниже описывает атрибуты объектов закрытых ключей ГОСТ Р 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–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)}
};

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

CK_OBJECT_CLASS class = CKO_PRIVATE_KEY;
CK_KEY_TYPE keyType = CKK_GOSTR3410;
CK_UTF8CHAR label[] = "A GOST R34.10-2001 512 private 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_BYTE id[] = { 123 };
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_ID, id, sizeof(id)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_SIGN, &bTrue, sizeof(bTrue)},
  {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)}
};

3.8.4.15 Закрытые ключи ECC

Ключи на эллиптических кривых поддерживаются приложением PKI.

Атрибут CK_KEY_TYPE для объектов закрытого ключа на эллиптических кривых принимает значения CKK_EC (рекомендуемое) и CKK_ECDSA (устаревшее).

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

Атрибут

Тип данных 

Значение

CKA_EC_PARAMS1,4,6

(CKA_ECDSA_PARAMS)

Big integer (массив CK_BYTE)

Представление параметров ANSI X9.62 в кодировке DER

CKA_VALUE1,4,6,7

Big integer (массив CK_BYTE)

Значение закрытого ключа

1 – Указывается, когда объект создается с использованием C_CreateObject()
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair()
6 – Не указывается, когда объект импортируется с использованием C_UnwrapKey()
7 – Не может быть открыт в открытом виде, если у объекта атрибут CKA_SENSITIVE равен CK_TRUE или атрибут CKA_EXTRACTABLE равен CK_FALSE

Шаблон создания объекта закрытого ключа CKK_EC
CK_OBJECT_CLASS class = CKO_PRIVATE_KEY;
CK_KEY_TYPE keyType = CKK_EC;
CK_UTF8CHAR label[] = “An EC private key object”;
CK_BYTE subject[] = {...};
CK_BYTE id[] = {123};
CK_BYTE ecParams[] = {...};
CK_BYTE value[] = {...};
CK_BBOOL true = CK_TRUE;
 
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &class, sizeof(class)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_LABEL, label, sizeof(label)-1},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &true, sizeof(true)},
{CKA_DERIVE, &true, sizeof(true)},
{CKA_EC_PARAMS, ecParams, sizeof(ecParams)},
{CKA_VALUE, value, sizeof(value)}
};

В следующие таблице представлены поддерживаемы значения параметра CKA_EC_PARAMS:

Значение параметра CKA_EC_PARAMS
 

OID

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x02}

1.2.840.100045.3.1.2, prime192v2

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x03}

1.2.840.100045.3.1.3, prime192v3

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x04}

1.2.840.100045.3.1.4, prime239v1

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x05}

1.2.840.10045.3.1.5, prime239v2

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x06}

1.2.840.100045.3.1.6, prime239v3

{0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}

1.2.840.10045.3.1.7, prime256v1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x19}

1.3.132.0.31, secp192k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x20}

1.3.132.0.32, secp224k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x21}

1.3.132.0.33, secp224r1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x0A}

1.3.132.0.10, secp256k1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22}

1.3.132.0.34, secp384r1

{0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23}

1.3.132.0.35, secp521r1

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

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

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

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

Атрибут

Тип данных

Значение

CKA_SENSITIVE8,11

CK_BBOOL

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

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

CKA_ENCRYPT8

CK_BBOOL

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

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

CKA_DECRYPT8

CK_BBOOL

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

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

CKA_SIGN8

CK_BBOOL

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

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

CKA_VERIFY8

CK_BBOOL

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

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

CKA_WRAP8

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_CHECK_VALUE

Byte Array
(массив CK_BYTE)

Контрольная сумма.

CKA_WRAP_WITH_TRUSTED11

CK_BBOOL

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

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

CKA_TRUSTED10

CK_BBOOL

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

CKA_WRAP_TEMPLATE

CK_ATTRIBUTE_PTR

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

CKA_UNWRAP_TEMPLATE

CK_ATTRIBUTE_PTR

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

2 – Не указывается, когда объект создается с использованием C_CreateObject().
4 – Не указывается, когда объект генерируется с использованием C_GenerateKey() или C_GenerateKeyPair().
6 – Не указывается, когда объект импортируется с использованием C_UnwrapKey().
8 – Может изменяться после того как объект был создан с использованием C_SetAttributeValue() или в процессе копирования объекта с использованием C_CopyObject(). Однако в некоторых случаях определенный токен может и не разрешить изменение атрибута в процессе выполнения C_CopyObject().
9 – Значение по умолчанию является специфическим для конкретного токена и может зависеть от значений других атрибутов.
10 – Может быть выставляться в CK_TRUE только пользователем с правами администратора (SO).
11 – Не может изменен после того, как выставлен в CK_TRUE. Становится атрибутом только для чтения.


Если атрибут CKA_SENSITIVE равен CK_TRUE или атрибут CKA_EXTRACTABLE равен CK_FALSE, то определенные атрибуты секретного ключа не смогут открываться в открытом тексте вне носителя. Указание на то, какие это атрибуты, для каждого типа секретных ключей приводится в таблице атрибутов в разделе, который содержит описание данного типа ключа.

Атрибут контрольной суммы (Key Check Value, KCV) ключа для объектов симметричных ключей вызывается как CKA_CHECK_VALUE, тип – совокупность байтов (байтовый массив), длина 3 байта и действует как «отпечаток» файла или контрольная сумма ключа. Они предназначены для перекрестной проверки симметричных ключей с использованием других систем, которые совместно используют такой же ключ, а также в качестве проверки достоверности после ручного ввода с клавиатуры или восстановления из резервной копии.

Свойства:

  1. Для двух ключей, которые криптографически идентичны, величина данного атрибута должна быть одинаковой.
  2. Атрибут CKA_CHECK_VALUE не должен быть пригоден для получения любой части значения ключа.
  3. Неуникальность. Два разных ключа могут иметь одно и то же значение CKA_CHECK_VALUE. Это маловероятно, но возможно. Вероятность легко вычисляется.

Данные атрибуты являются необязательными, но, если они поддерживаются, то значение атрибута всегда предоставляется библиотекой, независимо от того, как создавался или выводился объект ключа. Это значение должно предоставляться, даже если операция шифрования для данного ключа запрещена (т. е., когда CKA_ENCRYPT выставлен на CK_FALSE). Если значение предоставляется в шаблоне приложения (разрешается, но абсолютно необязательно), то, если оно поддерживается, оно должно совпадать со значением, вычисленным для данного атрибута библиотекой, или библиотека выдаст сообщение CKR_ATTRIBUTE_VALUE_INVALID – недопустимое значение атрибута.

Если библиотека не поддерживает данный атрибут, она должна его игнорировать. Такое отношение к атрибуту из шаблона не навредит процессу и позволит рассматривать данный атрибут, как и любой другой атрибут при упаковке и распаковке ключей, где атрибуты также сохраняются. Генерации KCV может помешать приложение, если оно предоставит атрибут в шаблоне в качестве записи без значения (длина 0). Приложение может запросить это значение в любое время, как и любой другой атрибут с использованием C_GetAttributeValue(). C_SetAttributeValue() может использоваться для уничтожения атрибута путем наделения его пустым значением.

Если иное не указано в определении объекта, значение данного атрибута выводится из объекта ключа, для чего берутся три первых байта одного зашифрованного блока нулевых (0x00) байтов, с использованием шифра по умолчанию и режима (например, электронной кодовой книги), связанного с типом ключа объекта секретного ключа.