Класс KJUR.asn1.DERSequence

ASN.1 (Abstract Syntax Notation One) используется для формального описания структур данных, применяемых в криптографии, сертификатах X.509, PKI и различных протоколах безопасности. Одним из базовых типов ASN.1 является SEQUENCE, представляющий упорядоченный набор элементов.

В кодировке DER (Distinguished Encoding Rules) структура SEQUENCE приобретает строго детерминированное бинарное представление, где:

  • порядок элементов фиксирован
  • каждый элемент кодируется строго определённым образом
  • отсутствуют неоднозначности представления

В библиотеке Jsrsasign работа с ASN.1-структурами реализована через пространство имён KJUR.asn1, где класс DERSequence является одним из ключевых строительных блоков.


Назначение класса KJUR.asn1.DERSequence

Класс KJUR.asn1.DERSequence представляет ASN.1 тип SEQUENCE, закодированный по правилам DER. Он служит контейнером для других ASN.1 объектов и используется при построении сложных структур:

  • X.509 сертификатов
  • RSA/EC ключевых структур
  • CMS/PKCS#7 сообщений
  • подписанных данных (PKCS#10, CSR)

Основная идея заключается в агрегации нескольких ASN.1 узлов в один упорядоченный блок.


Общая структура SEQUENCE в DER

SEQUENCE в DER состоит из трёх логических частей:

  1. Tag — идентификатор типа (0x30 для SEQUENCE)
  2. Length — длина закодированного содержимого
  3. Value — последовательность вложенных DER-элементов

Внутри Value находятся уже закодированные ASN.1 объекты.


Конструктор DERSequence

Класс создаётся через передачу массива ASN.1 объектов:

new KJUR.asn1.DERSequence(params)

Параметры обычно содержат:

  • array — массив ASN.1 объектов
  • explicit или optional настройки (в зависимости от версии jsrsasign)

Пример структуры:

var seq = new KJUR.asn1.DERSequence({
    array: [
        new KJUR.asn1.DERInteger({int: 1}),
        new KJUR.asn1.DERUTF8String({str: "test"})
    ]
});

Каждый элемент массива должен быть экземпляром ASN.1 класса библиотеки (DERInteger, DERBitString, DERObjectIdentifier и т.д.).


Внутреннее представление и композиция

DERSequence не хранит «сырые данные». Вместо этого он работает на уровне объектов:

  • каждый вложенный элемент имеет собственный DER-энкодинг
  • последовательность формируется динамически при сериализации
  • порядок элементов строго сохраняется

Структура можно представить следующим образом:

SEQUENCE
 ├── Element 1 (DERInteger)
 ├── Element 2 (DERUTF8String)
 ├── Element 3 (DERBitString)

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


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

Ключевая операция — преобразование в бинарный DER формат.

Основной метод, унаследованный от ASN1Object:

  • getEncodedHex() — возвращает HEX-представление DER-структуры

Пример:

var seq = new KJUR.asn1.DERSequence({
    array: [
        new KJUR.asn1.DERInteger({int: 10}),
        new KJUR.asn1.DERInteger({int: 20})
    ]
});

var hex = seq.getEncodedHex();

Результатом является строка HEX, представляющая полную DER-структуру.


Правила кодирования вложенных элементов

При формировании DERSequence действуют строгие правила:

1. Рекурсивное кодирование Каждый вложенный объект обязан быть полностью закодирован до объединения.

2. Canonical order Порядок элементов не изменяется и сохраняется как задано.

3. Полная длина вычисляется автоматически Length рассчитывается на основе суммарного размера всех вложенных DER-элементов.


Работа с пустыми последовательностями

SEQUENCE может быть пустым:

var emptySeq = new KJUR.asn1.DERSequence({
    array: []
});

Такой объект кодируется как:

  • Tag SEQUENCE
  • Length = 0
  • Empty Value

Вложенные структуры DERSequence

SEQUENCE может содержать другие SEQUENCE, формируя древовидные ASN.1 структуры:

var innerSeq = new KJUR.asn1.DERSequence({
    array: [
        new KJUR.asn1.DERInteger({int: 5})
    ]
});

var outerSeq = new KJUR.asn1.DERSequence({
    array: [
        innerSeq,
        new KJUR.asn1.DERUTF8String({str: "nested"})
    ]
});

Такая композиция широко применяется в сертификатах X.509, где структура может иметь несколько уровней вложенности.


Использование в криптографических структурах

DERSequence является фундаментом для многих криптографических форматов:

X.509 сертификат

  • TBSCertificate — это SEQUENCE
  • SubjectPublicKeyInfo — SEQUENCE
  • Extensions — SEQUENCE OF SEQUENCE

PKCS#10 (CSR)

  • CertificationRequest — SEQUENCE
  • атрибуты запроса также упакованы в SEQUENCE

PKCS#8

  • PrivateKeyInfo — SEQUENCE

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


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

Класс интегрирован в архитектуру KJUR.asn1 и наследует поведение базового ASN.1 объекта:

  • поддержка ленивого кодирования
  • автоматический расчёт длины
  • унифицированный интерфейс сериализации
  • совместимость с другими DER-классами

Внутренне Jsrsasign ориентирован на построение дерева ASN.1 объектов, где DERSequence играет роль узлового контейнера.


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

При работе с DERSequence часто возникают структурные ошибки:

Несоответствие типов элементов

  • попытка передать строку вместо ASN.1 объекта

Нарушение вложенности

  • использование некорректных или неинициализированных объектов

Проблемы кодирования

  • ручное вмешательство в уже сформированную DER-структуру

Корректная модель предполагает исключительно объектное построение дерева ASN.1.


Формирование сложных структур

DERSequence позволяет формировать произвольные ASN.1 модели:

var certStruct = new KJUR.asn1.DERSequence({
    array: [
        new KJUR.asn1.DERInteger({int: 3}),
        new KJUR.asn1.DERSequence({
            array: [
                new KJUR.asn1.DERObjectIdentifier({oid: "1.2.840.113549.1.1.1"}),
                new KJUR.asn1.DERNull()
            ]
        }),
        new KJUR.asn1.DERBitString({hex: "aabbcc"})
    ]
});

Такая конструкция демонстрирует вложенность и гибкость ASN.1 моделей.


Роль DERSequence в модели Jsrsasign ASN.1 дерева

В архитектуре библиотеки DERSequence выполняет функцию:

  • объединяющего узла
  • структурного контейнера
  • основы сериализации сложных объектов

Любая значимая криптографическая структура в конечном итоге сводится к комбинации SEQUENCE и простых ASN.1 типов.