Класс KJUR.asn1.DERTaggedObject

KJUR.asn1.DERTaggedObject представляет собой механизм формирования ASN.1 тегированных структур в кодировке DER, используемый в библиотеке jsrsasign для построения сложных криптографических данных, соответствующих стандартам X.509, PKCS и другим спецификациям ASN.1.

Тегированные объекты ASN.1 позволяют оборачивать существующие структуры данных в дополнительный уровень идентификации, расширяя семантику без изменения внутреннего содержимого. В DER-кодировке такие конструкции используются для явного или неявного уточнения типа данных внутри последовательностей (SEQUENCE), выборок (CHOICE) и других контейнеров.

Класс KJUR.asn1.DERTaggedObject реализует оба варианта тегирования:

  • explicit tagging (явное тегирование)
  • implicit tagging (неявное тегирование)

Эти режимы определяют, будет ли исходный объект вложен как самостоятельная ASN.1 структура или его тег будет заменять исходный тип на уровне кодировки.


ASN.1 тегирование и его роль в DER

ASN.1 (Abstract Syntax Notation One) определяет способ описания структурированных данных. В этом контексте тегирование используется для:

  • различения альтернативных вариантов в CHOICE
  • расширения схем без нарушения обратной совместимости
  • явного указания контекста поля

DER (Distinguished Encoding Rules) накладывает строгие правила кодирования ASN.1, где каждая структура имеет однозначное бинарное представление.

Тегированные объекты в ASN.1 записываются в форме:

  • [n] EXPLICIT Type
  • [n] IMPLICIT Type

где n — числовой тег.

KJUR.asn1.DERTaggedObject формирует именно такие конструкции.


Конструктор класса

Базовая сигнатура:

new KJUR.asn1.DERTaggedObject(params)

или в устаревшем стиле:

new KJUR.asn1.DERTaggedObject(tagNo, explicit, obj)

Параметры

  • tagNo — числовой идентификатор тега (INTEGER)
  • explicit — логическое значение, определяющее тип тегирования
  • obj — ASN.1 объект, который будет обёрнут

В современном использовании чаще применяется объектная форма параметров, где поля передаются через словарь.


Логика explicit и implicit тегирования

Explicit tagging

При явном тегировании исходный объект полностью сохраняется внутри новой ASN.1 обёртки.

Структура:

[Tag]
  └── Original ASN.1 Object

Это означает дополнительный уровень вложенности. В DER-кодировке сохраняется исходный тип объекта.

Применение:

  • расширение структур без изменения внутренней схемы
  • совместимость с ASN.1 спецификациями, требующими явной вложенности

Implicit tagging

При неявном тегировании исходный тип заменяется тегом.

Структура:

[Tag] (содержимое оригинального объекта без явного типа)

В этом случае тип внутреннего объекта не кодируется явно, а заменяется контекстным тегом.

Применение:

  • оптимизация длины DER-структур
  • соответствие ASN.1 схемам, где тип определяется контекстом

Внутреннее представление объекта

KJUR.asn1.DERTaggedObject хранит:

  • tagNo — номер контекстного тега
  • explicit — режим кодирования
  • obj — вложенный ASN.1 объект

Объект obj может быть любым ASN.1 типом:

  • SEQUENCE
  • INTEGER
  • BIT STRING
  • OCTET STRING
  • UTCTime
  • другие DER*-классы jsrsasign

Кодирование DER

Основная функция класса заключается в формировании корректного DER-представления.

Процесс кодирования включает:

  1. Получение DER-представления вложенного объекта
  2. Определение режима tagging (explicit / implicit)
  3. Формирование нового заголовка с контекстным тегом
  4. Сборка финального бинарного потока

В результате создаётся корректная ASN.1 структура, совместимая с криптографическими стандартами X.509 и CMS.


Использование в jsrsasign ASN.1 деревьях

KJUR.asn1.DERTaggedObject часто используется внутри более сложных конструкций:

  • X.509 сертификаты
  • расширения сертификатов (extensions)
  • структуры PKCS#7
  • ASN.1 CHOICE поля

Типичный сценарий — формирование альтернативных полей внутри SEQUENCE, где конкретный элемент определяется тегом.


Пример формирования tagged object

Explicit пример

var obj = new KJUR.asn1.DERInteger({int: 123});

var tagged = new KJUR.asn1.DERTaggedObject({
    tagNo: 2,
    explicit: true,
    obj: obj
});

Результирующая структура будет содержать дополнительный уровень вложенности, где INTEGER сохраняет собственный тип внутри тега [2].


Implicit пример

var obj = new KJUR.asn1.DERInteger({int: 123});

var tagged = new KJUR.asn1.DERTaggedObject({
    tagNo: 2,
    explicit: false,
    obj: obj
});

В этом случае тип INTEGER не кодируется явно, а заменяется контекстным тегом [2], а значение остаётся в сыром виде.


Поведение при вложенных структурах

DERTaggedObject может содержать сложные ASN.1 деревья:

  • SEQUENCE внутри tagged object
  • nested tagging (двойное тегирование)
  • комбинации explicit + implicit на разных уровнях

При множественном тегировании важно учитывать порядок обработки:

  • внутренний ASN.1 объект кодируется первым
  • затем применяется внешний тег

Методы класса

Хотя класс в основном используется как структурный контейнер, он наследует функциональность базовых ASN.1 объектов jsrsasign.

getEncodedHex

Возвращает DER-представление объекта в шестнадцатеричном формате.

Используется для:

  • передачи в криптографические функции
  • включения в сертификаты
  • отладки ASN.1 структуры

toString / toPrettyString

Используются для человекочитаемого представления структуры ASN.1 дерева.

Отображают:

  • номер тега
  • режим explicit/implicit
  • вложенный объект

Роль в построении X.509 структур

В X.509 сертификатах tagged objects применяются для:

  • расширений (extensions)
  • альтернативных идентификаторов
  • параметров алгоритмов

Например, поля AuthorityKeyIdentifier или SubjectAlternativeName могут содержать контекстно-зависимые ASN.1 структуры, где DERTaggedObject играет ключевую роль.


Особенности реализации в jsrsasign

Класс интегрирован в пространство KJUR.asn1 и работает совместно с другими DER-классами:

  • DERSequence
  • DERInteger
  • DERBitString
  • DEROctetString

DERTaggedObject не является самостоятельной структурой данных, а служит модификатором ASN.1 представления.


Поведение при сериализации

При вызове кодирования:

  • объект obj сначала сериализуется в DER
  • затем применяется тегирование
  • формируется итоговый байтовый поток

Различие explicit/implicit влияет на наличие внутреннего type tag в финальной структуре.


Типичные ошибки использования

Некорректное применение DERTaggedObject обычно связано с:

  • неверным выбором explicit/implicit
  • передачей неподдерживаемого объекта obj
  • несоответствием ASN.1 схемы

Особенно критично несоответствие тегов при взаимодействии с внешними криптографическими системами.


Взаимодействие с ASN.1 схемами

ASN.1 спецификации часто определяют tagged fields как:

fieldName [0] EXPLICIT INTEGER OPTIONAL

KJUR.asn1.DERTaggedObject напрямую реализует подобные конструкции, позволяя программно формировать ASN.1 схемы без ручного построения бинарного представления.