ASN.1 в криптографических структурах чаще всего представляется в бинарном виде (DER/BER), где каждый элемент кодируется как последовательность байтов: тип, длина и значение. В библиотеке Jsrsasign для работы с таким представлением используется модуль ASN1HEX, который позволяет разбирать ASN.1 напрямую из шестнадцатеричной строки без предварительного преобразования в сложные объекты.
Любой ASN.1 элемент в DER-кодировке имеет форму:
В HEX-представлении это выглядит как непрерывная строка, например:
30 0a 02 01 01 02 01 05
где:
30 — SEQUENCE0a — длинаASN1HEX работает именно с такими строками, игнорируя необходимость предварительного декодирования.
Основной метод для анализа вложенной структуры:
ASN1HEX.getPosArrayOfChildren(hex, pos)
Функция возвращает массив позиций дочерних элементов внутри ASN.1 структуры.
hex — строка ASN.1 в HEXpos — позиция текущего элементаПример:
var hex = "300a020101020105";
var childPos = ASN1HEX.getPosArrayOfChildren(hex, 0);
Результат содержит индексы начала дочерних элементов внутри SEQUENCE.
Этот механизм позволяет рекурсивно обходить ASN.1 дерево без преобразования в объектную модель.
Для навигации по ASN.1 структуре используются методы определения границ узлов.
ASN1HEX.getPosOfNextSibling(hex, pos)
Возвращает позицию следующего элемента на том же уровне вложенности.
Принцип работы:
Пример использования:
var nextPos = ASN1HEX.getPosOfNextSibling(hex, pos);
Этот метод особенно полезен при линейном обходе структуры без построения дерева.
ASN1HEX предоставляет низкоуровневые функции для извлечения параметров элемента.
Позволяет получить значение байта в позиции.
ASN1HEX.getHexOfTLV(hex, pos)
Возвращает полный TLV-блок (Tag-Length-Value) элемента.
Это важно при копировании или пересборке ASN.1 структуры.
ASN.1 по своей природе рекурсивен. Каждый SEQUENCE может содержать другие SEQUENCE, SET или примитивные типы.
Типичный алгоритм обхода:
getPosArrayOfChildrenПример:
function parseASN1(hex, pos) {
var children = ASN1HEX.getPosArrayOfChildren(hex, pos);
if (children.length === 0) {
return ASN1HEX.getHexOfTLV(hex, pos);
}
var result = [];
for (var i = 0; i < children.length; i++) {
result.push(parseASN1(hex, children[i]));
}
return result;
}
Такой подход позволяет восстановить логическую структуру сертификатов X.509, ключей и других криптографических объектов.
ASN.1 использует TAG для идентификации типа данных. Jsrsasign позволяет извлекать тег через анализ первого байта:
02 — INTEGER03 — BIT STRING04 — OCTET STRING30 — SEQUENCEПроверка типа часто выполняется вручную:
var tag = hex.substr(pos * 2, 2);
Далее логика ветвится в зависимости от значения тега.
Для получения только значения без TLV используется:
ASN1HEX.getHexOfV(hex, pos)
Результат:
Это особенно полезно при работе с:
ASN1HEX поддерживает навигацию по структуре через индексные пути.
Метод:
ASN1HEX.getVbyList(hex, pos, [index1, index2, ...])
Позволяет извлечь значение по цепочке вложенности.
Пример:
var value = ASN1HEX.getVbyList(hex, 0, [0, 1]);
Это означает:
Подход упрощает доступ к глубоко вложенным структурам без ручного обхода дерева.
ASN1HEX.getLengthOfL_AtObj(hex, pos)
Возвращает длину поля Length, что важно для корректного смещения при парсинге.
ASN.1 использует переменную длину кодирования, поэтому длина может занимать 1 или несколько байтов.
ASN1HEX часто применяется для разбора сертификатов:
var certHex = "30...";
var tbsCertPos = ASN1HEX.getPosArrayOfChildren(certHex, 0)[0];
Далее:
Каждый блок представляет собой вложенный SEQUENCE, доступный через позиционную навигацию.
ASN1HEX ориентирован на DER-представление, где структура однозначна:
BER допускает вариативность, что усложняет парсинг. В контексте Jsrsasign обычно предполагается DER.
Типичные проблемы:
Для диагностики используется:
ASN1HEX.dump(hex)
Он выводит структурное представление ASN.1 дерева, облегчая отладку.
Библиотека не строит объектное дерево. Вместо этого используется:
Это делает ASN1HEX эффективным для больших структур, таких как сертификаты и ключевые контейнеры, где построение полноценного дерева было бы избыточным.
ASN1HEX оптимизирован для минимальных операций:
При глубоком анализе криптографических структур рекурсия остаётся основным инструментом, но контролируемая глубина обхода предотвращает избыточные вычисления.
ASN1HEX применяется при:
Каждый из этих форматов основан на ASN.1, что делает ASN1HEX универсальным инструментом низкоуровневого анализа.
SEQUENCE является базовым контейнером ASN.1. Его разбор через ASN1HEX:
SEQUENCE может содержать:
Гибкость структуры требует строгого контроля позиций, так как отсутствует именованная навигация.
Вся работа ASN1HEX строится вокруг концепции:
Такая модель ближе к работе с бинарными потоками, чем к объектной модели данных, что обеспечивает высокую производительность при минимальном уровне абстракции.