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 представляет ASN.1 тип SEQUENCE, закодированный по правилам DER. Он служит контейнером для других ASN.1 объектов и используется при построении сложных структур:
Основная идея заключается в агрегации нескольких ASN.1 узлов в один упорядоченный блок.
SEQUENCE в DER состоит из трёх логических частей:
Внутри Value находятся уже закодированные ASN.1 объекты.
Класс создаётся через передачу массива 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 не хранит «сырые данные». Вместо этого он работает на уровне объектов:
Структура можно представить следующим образом:
SEQUENCE
├── Element 1 (DERInteger)
├── Element 2 (DERUTF8String)
├── Element 3 (DERBitString)
При кодировании каждый элемент сначала преобразуется в DER, затем объединяется в общий поток.
Ключевая операция — преобразование в бинарный 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: []
});
Такой объект кодируется как:
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 сертификат
PKCS#10 (CSR)
PKCS#8
Таким образом, DERSequence выступает универсальным контейнером для построения всех сложных ASN.1 моделей.
Класс интегрирован в архитектуру KJUR.asn1 и наследует
поведение базового ASN.1 объекта:
Внутренне Jsrsasign ориентирован на построение дерева ASN.1 объектов, где DERSequence играет роль узлового контейнера.
При работе с DERSequence часто возникают структурные ошибки:
Несоответствие типов элементов
Нарушение вложенности
Проблемы кодирования
Корректная модель предполагает исключительно объектное построение дерева 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 выполняет функцию:
Любая значимая криптографическая структура в конечном итоге сводится к комбинации SEQUENCE и простых ASN.1 типов.