ASN1HEX: полный список методов

Библиотека Jsrsasign предоставляет модуль ASN1HEX для низкоуровневого разбора ASN.1 структур, представленных в виде HEX-строк. Такой формат используется при работе с сертификатами X.509, ключами, подписями и другими криптографическими объектами, где данные кодируются в DER.

ASN1HEX не выполняет высокоуровневую декодировку в JavaScript-объекты. Его задача — предоставить инструменты для точной навигации по TLV-структурам (Tag-Length-Value), извлечения значений и анализа вложенных узлов.


Базовая модель работы ASN1HEX

ASN.1 в DER-представлении всегда строится по принципу:

  • T (Tag) — тип данных
  • L (Length) — длина значения
  • V (Value) — сами данные

ASN1HEX оперирует строкой HEX и индексами внутри неё. Почти все методы принимают:

  • hex — ASN.1 структура в HEX
  • idx — позиция начала узла

Проверка и базовые операции

ASN1HEX.isASN1HEX(hex)

Проверяет, является ли строка валидной ASN.1 HEX-структурой.

Поведение:

  • Проверяет минимальную корректность TLV
  • Не гарантирует семантическую валидность сертификата

ASN1HEX.getTLV(hex, idx)

Возвращает полный TLV-узел, начиная с позиции idx.

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

  • копирования узлов
  • извлечения вложенных структур целиком

ASN1HEX.getTLVLength(hex, idx)

Возвращает длину полного TLV-блока (включая Tag и Length).

Полезно при ручной итерации по структуре.


Методы извлечения значений

ASN1HEX.getHexOfV(hex, idx)

Возвращает только значение V без Tag и Length.

Применяется, когда нужно получить «сырые» данные узла.


ASN1HEX.getV(hex, idx)

Аналогично getHexOfV, но может использоваться в более старых сценариях API.


ASN1HEX.getString(hex, idx)

Декодирует значение ASN.1 STRING-типа в строку JavaScript.

Поддерживает:

  • UTF8String
  • PrintableString
  • IA5String (частично)

ASN1HEX.getIntHex(hex, idx)

Извлекает INTEGER значение в HEX-представлении.

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

  • serial number сертификатов
  • RSA/DSA параметров
  • числовых идентификаторов

ASN1HEX.getOIDHex(hex, idx)

Извлекает OID (Object Identifier) в HEX-форме.

Далее OID обычно декодируется в строковый вид через другие утилиты Jsrsasign.


Навигация по ASN.1 дереву

ASN.1 структура часто вложенная, поэтому ключевая часть ASN1HEX — навигация по дереву.


ASN1HEX.getPosArrayOfChildren(hex, idx)

Возвращает массив позиций всех дочерних элементов узла.

Используется для обхода SEQUENCE или SET.

Типичный сценарий:

  • сертификат X.509
  • SubjectPublicKeyInfo
  • extensions

ASN1HEX.getNthChildIndex(hex, idx, nth)

Возвращает позицию N-го дочернего элемента.

Позволяет обращаться к структуре как к массиву узлов.


ASN1HEX.getChildIdx(hex, idx)

Возвращает индекс первого дочернего элемента.

Используется как точка входа для обхода вложенной структуры.


ASN1HEX.getNextSiblingIdx(hex, idx)

Находит следующий соседний ASN.1 элемент на том же уровне вложенности.

Применяется при линейном обходе SEQUENCE.


Работа с длинами и структурой TLV

ASN1HEX.getVblen(hex, idx)

Возвращает длину значения V без учета Tag и Length.

Важно при работе с вложенными структурами фиксированной длины.


ASN1HEX.getBerLen(hex, idx)

Определяет длину BER-encoded элемента.

Используется для совместимости с BER, где длины могут быть неопределёнными.


ASN1HEX.getBerLengthOfL1(hex, idx)

Возвращает длину поля Length (L1), то есть сколько байт занимает описание длины.


Утилиты анализа структуры

ASN1HEX.dump(hex)

Генерирует текстовое представление ASN.1 структуры.

Вывод включает:

  • уровни вложенности
  • типы узлов
  • длины
  • HEX-значения

Применяется для:

  • отладки сертификатов
  • анализа неизвестных ASN.1 структур

ASN1HEX.getDecendantHexVByNthList(hex, startIdx, nthList)

Извлекает значение узла по пути индексов.

nthList — массив индексов, описывающий путь по дереву.

Пример логики:

  • 0 → первый SEQUENCE
  • 1 → второй элемент внутри
  • 2 → третий уровень вложенности

ASN1HEX.getVbyList(hex, startIdx, nthList)

Возвращает значение V по заданному пути.

Отличается от предыдущего метода тем, что возвращает только значение, а не узел.


ASN1HEX.getVbyListEx(hex, startIdx, nthList)

Расширенная версия getVbyList.

Добавляет:

  • более устойчивую обработку ошибок
  • поддержку сложных вложенных структур
  • улучшенную совместимость с DER/BER

Методы работы с типами ASN.1

Хотя ASN1HEX не выполняет полную типизацию, некоторые методы помогают интерпретировать данные.


ASN1HEX.hextooidstr(hex)

Преобразует HEX OID в строковый формат вида:

1.2.840.113549

ASN1HEX.intName(hex, idx)

Определяет тип INTEGER и возвращает его строковое представление.

Используется редко, в основном в отладочных сценариях.


Методы позиционирования и поиска

ASN1HEX.getIdxbyList(hex, startIdx, nthList)

Возвращает индекс узла по пути вложенности.

Является базовым методом навигации, используемым внутри других функций.


ASN1HEX.search(hex, targetHex, startIdx)

Ищет подстроку HEX внутри ASN.1 структуры.

Применяется для:

  • поиска OID
  • поиска конкретных полей сертификата

Работа с последовательностями (SEQUENCE / SET)

ASN1HEX активно используется для обхода структур SEQUENCE.

Типичный алгоритм:

  • определить начало SEQUENCE
  • получить детей через getPosArrayOfChildren
  • пройтись по индексам

SEQUENCE является основой:

  • X.509 сертификатов
  • PKCS#7 контейнеров
  • CMS структур

Особенности работы с индексами

ASN1HEX использует абсолютные индексы в HEX-строке, а не байтовые смещения.

Это означает:

  • 1 байт = 2 символа HEX
  • индексы указывают на позицию символа в строке
  • неправильное смещение ломает весь парсинг

При работе с вложенными структурами важно:

  • всегда использовать методы навигации
  • не вычислять смещения вручную

Типичные паттерны использования

Извлечение поля сертификата

  • найти SEQUENCE сертификата
  • перейти к Subject
  • извлечь OID и значения

Обход расширений X.509

  • найти extensions SEQUENCE
  • пройтись по каждому extension
  • извлечь OID и critical flag

Разбор подписи

  • определить AlgorithmIdentifier
  • извлечь параметры алгоритма
  • получить signature BIT STRING

Внутренняя логика работы ASN1HEX

Модуль не строит дерево объектов. Вместо этого:

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

Это делает его:

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