Данные в формате ASN.1 (DER/BER) внутри криптографических структур в Jsrsasign представлены в виде последовательности TLV-элементов:
Каждый сложный объект (например, SEQUENCE) содержит
вложенные элементы, образующие иерархическое дерево.
При работе с такими структурами возникает необходимость извлекать значения:
Jsrsasign предоставляет инструменты для навигации по ASN.1 без полного парсинга в объектную модель.
SEQUENCE в DER-кодировке — это упорядоченный набор элементов. Каждый элемент внутри имеет позицию, начиная с нуля.
Пример структуры:
SEQUENCE
├── INTEGER (0)
├── UTF8String (1)
├── SEQUENCE (2)
│ ├── OBJECT IDENTIFIER (0)
│ └── OCTET STRING (1)
Доступ по индексу означает обращение к элементу на конкретной позиции внутри текущего уровня вложенности.
В Jsrsasign работа с ASN.1 HEX представлением чаще всего выполняется
через модуль ASN1HEX.
Ключевая функция для получения значения:
ASN1HEX.getV(asn1hex, idx)
asn1hex — строка DER в hex-форматеidx — позиция элемента в структуреФункция возвращает значение V выбранного элемента без тегов и длины.
Пример:
const hex = "3082010a020103...";
const value = ASN1HEX.getV(hex, 1);
Такой подход используется, когда структура проста и известен фиксированный порядок элементов.
Индекс работает только на текущем уровне вложенности. При наличии
вложенных SEQUENCE прямой индекс не позволяет «провалиться»
глубже.
Пример проблемы:
SEQUENCE
├── SEQUENCE
│ ├── INTEGER
│ └── INTEGER
├── INTEGER
Попытка получить второй INTEGER через один индекс
невозможна без перехода внутрь вложенной структуры.
Для работы со сложными ASN.1 деревьями используется механизм пути, представляющий собой массив индексов.
Функция:
ASN1HEX.getVbyList(asn1hex, start, path)
Параметры:
asn1hex — DER в hexstart — начальная позиция (обычно 0)path — массив индексов вложенностиПуть описывает маршрут по дереву:
[0, 2, 1]
означает:
Рассмотрим ASN.1 структуру:
SEQUENCE
├── SEQUENCE
│ ├── INTEGER (serial)
│ └── INTEGER (version)
└── SEQUENCE
├── OBJECT IDENTIFIER
└── BIT STRING
Получение значения version:
const versionHex = ASN1HEX.getVbyList(hex, 0, [0, 1]);
Здесь:
[0] — первый SEQUENCE[1] — второй элемент внутри него (INTEGER version)| Метод | Назначение |
|---|---|
getV |
доступ по одному уровню |
getVbyList |
доступ по вложенной структуре |
getVbyList является универсальным инструментом для
сложных ASN.1 объектов.
При анализе сертификатов X.509 структура становится глубокой:
Certificate
├── TBSCertificate
│ ├── Version
│ ├── SerialNumber
│ ├── Signature
│ ├── Issuer
│ ├── Validity
│ ├── Subject
│ └── SubjectPublicKeyInfo
Пример извлечения serial number:
const serialHex = ASN1HEX.getVbyList(hex, 0, [0, 1]);
Здесь:
0 — TBSCertificate1 — SerialNumberВ некоторых случаях структура содержит повторяющиеся элементы одного
типа, например несколько SET или SEQUENCE.
Тогда индекс становится единственным способом различения элементов, поскольку тег не уникален.
Пример:
SEQUENCE
├── SET
│ ├── Attribute
├── SET
│ ├── Attribute
Получение второго SET:
const set2 = ASN1HEX.getVbyList(hex, 0, [1]);
Jsrsasign не преобразует ASN.1 в объектную модель заранее. Вместо этого:
Это позволяет:
Если путь уходит глубже, чем существует структура, результатом будет
null или пустое значение.
ASN1HEX.getVbyList(hex, 0, [0, 5, 2]);
Ошибка возникает при попытке обращения к несуществующему индексу.
SEQUENCE и SET могут визуально казаться одинаковыми, но порядок элементов в SET не гарантирован.
Поэтому индексация внутри SET менее предсказуема.
В X.509 сертификатах первый уровень часто содержит оболочку
Certificate, внутри которой лежит
TBSCertificate. Пропуск этого уровня приводит к смещению
всей цепочки индексов.
Jsrsasign также позволяет находить позицию элемента по пути через:
ASN1HEX.getIdxbyList(asn1hex, start, path)
Эта функция возвращает индекс начала элемента в hex-строке, а не его значение.
Применение:
Работа с ASN.1 в Jsrsasign сводится к двум операциям:
Упрощённо:
дерево → путь → элемент → значение
При разборе X.509 сертификатов механизм индексации используется для доступа к:
Пример доступа к Subject:
const subjectHex = ASN1HEX.getVbyList(hex, 0, [0, 5]);
Все операции выполняются над строкой hex без промежуточного декодирования в JSON или объект.
Это накладывает особенности:
При работе с неизвестной структурой используется последовательный анализ:
Путь является более устойчивым, чем прямые смещения, поскольку:
Однако устойчивость сохраняется только при неизменной схеме ASN.1.