В этом разделе приведен перевод стандарта PKCS #11 в части касающейся объектов, поддерживаемых устройствами Рутокен, а также информация об объектах и атрибутах, определенных производителем устройств Рутокен.
Стандарт PKCS #11 различает несколько классов объектов, определяемых типом данных CK_OBJECT_CLASS. Объекты содержат набор атрибутов, каждый из которых имеет определенное значение. Каждый атрибут, которым обладает объект, имеет только одно значение. Следующий рисунок отображает высокоуровневую иерархию объектов стандарта и некоторых поддерживаемых ими атрибутов (рисунок 1).
Рисунок 2.1 – Иерархия атрибутов объектов
Стандарт PKCS #11 предоставляет функции для создания, уничтожения и копирования самих объектов, а также для получения и изменения значений их атрибутов. Некоторые из криптографических функций (например, C_GenerateKey) также создают ключевые объекты, содержащие результаты их выполнения.
Объекты стандарта всегда четко определены – т.е. объект всегда содержит все требуемые атрибуты, и атрибуты всегда согласуются друг с другом с момента создания объекта. Это является отличием от объектно-ориентированной парадигмы, где объект не имеет других атрибутов, кроме, может быть, класса, которым был создан, и некоторые время продолжает быть неинициализированным. В PKCS #11 объекты всегда инициализируются.
Таблицы на протяжении большей части этого раздела определяют для каждого атрибута тип данных значения атрибута и значение (смысл) атрибута, который может включать начальное значение по умолчанию. Некоторые типы данных определены подробно стандартом (например, CK_OBJECT_CLASS). Значения атрибутов могут быть следующих типов:
Byte array случайная строка (массив) данных типа CK_BYTE
Big integer строка данных типа CK_BYTE, состоящая из беззнаковых целых чисел произвольной длины со наиболее значимым первым байтом
(например, число 32768 представляется как 2-байтовая строка 0x80 0x00)
Local string незаполненная строка данных типа CK_CHAR без завершающего нуля
RFC2279 string незаполненная строка данных типа CK_UTF8CHAR без завершающего нуля
Токен может содержать несколько идентичных объектов, то есть разрешается иметь одинаковые значения для всех атрибутов двум и более объектам.
В большинстве случаев каждый тип объекта стандарта PKCS#11 содержит полный набор атрибутов. Некоторые из этих атрибутов имеют значения по умолчанию, и не нуждаются в определении при создании объекта; некоторые из значений по умолчанию могут даже содержать пустые строки (“”). Тем не менее, объект содержит эти атрибуты. Объект может иметь только одно значение для каждого атрибута, даже если атрибут определяется производителем и его цель его использования выходит за рамки стандарта.
Кроме атрибутов стандарта PKCS#11, объект также может обладать определяемыми производителем атрибутами, смысл и значения которых не описаны в PKCS#11.
Все функции, которые создают, изменяют или копируют объекты, используют в качестве одного из своих аргументов шаблон, который специфицирует значения атрибутов. Криптографические функции, которые создают объекты, также могут сами вносить значения некоторых дополнительных атрибутов; какие именно атрибуты будут задаваться вызовом криптографической функции зависит от того, какой используется механизм. В любом случае все требуемые атрибуты, поддерживаемые классом объектов и не имеющие значений по умолчанию, должны быть указаны при создании объекта в шаблоне или самой функцией.
Объекты могут быть созданы с помощью функций стандарта PKCS#11 C_CreateObject, C_GenerateKey, C_GenerateKeyPair, C_UnwrapKey и C_DeriveKey. Кроме того, копирование уже существующих объектов (с помощью функции C_CopyObject) также создает новый объект, но этот тип создания объектов на данный момент не поддерживается устройствами Рутокен.
Для создания объекта этими функциями необходимо предоставить соответствующий шаблон.
Если при попытке создать объект возникает несколько перечисленных ситуаций одновременно, то возвращаемый код ошибки может быть любым из вышеперечисленных.
Объекты могут изменяться с помощью функции C_SetAttributeValue стандарта PKCS#11. Шаблон, предоставляемый для функции C_SetAttributeValue, может содержать новые значения для атрибутов, которыми объект уже обладает; значения для атрибутов, которыми объект еще не обладает; или и те и другие сразу.
Некоторые атрибуты объекта могут изменяться после создания объекта; некоторые, наоборот, не могут. Кроме того, атрибуты, которые определяются стандартом как изменяемые, могут на самом деле для некоторых видов токенов не быть изменяемыми. То есть, если атрибут в стандарте PKCS#11 описан как изменяемый, то это в действительно означает, что атрибут является изменяемым в рамках спецификации самого стандарта. Токен может в действительности не поддерживать изменение некоторых атрибутов. Является ли какой-то атрибут объекта на данном токене изменяемым, зависит от значений определенных атрибутов объекта. Например, значение атрибута объекта секретного ключа CKA_SENSITIVE может быть изменено с CK_FALSE на CK_TRUE, но не наоборот.
Все сценарии, описанные в части «Создание объектов», включая коды возвращаемых ошибок, применимы для изменения объектов с помощью функции C_SetAttributeValue, кроме ситуации с неполным шаблоном.