Пространство имён ASN1HEX в библиотеке Jsrsasign
предназначено для работы с ASN.1-структурами, представленными в виде
HEX-строк. Оно предоставляет низкоуровневые функции для разбора,
навигации и извлечения данных из DER-кодированных объектов.
ASN.1 (Abstract Syntax Notation One) широко используется в
криптографии — в сертификатах X.509, ключах RSA/ECDSA, PKCS-структурах.
В библиотеке Jsrsasign большинство криптографических операций опираются
на корректное извлечение и интерпретацию ASN.1-данных, поэтому
ASN1HEX играет фундаментальную роль.
ASN.1-объект в DER-кодировке имеет следующую структуру:
[Tag][Length][Value]
В HEX-строке это выглядит как последовательность байтов:
Пример:
30 0A 02 01 01 02 01 02
Расшифровка:
30 — SEQUENCE0A — длина (10 байт)ASN1HEX.getVblen(hex, idx)
Возвращает длину значения (Value) ASN.1-объекта по позиции
idx.
ASN1HEX.getL(hex, idx)
Возвращает HEX-представление поля Length.
ASN1HEX.getVidx(hex, idx)
Возвращает индекс начала Value.
ASN1HEX.getV(hex, idx)
Возвращает Value как HEX-строку.
ASN1HEX.getTLV(hex, idx)
Возвращает полный TLV-блок (Tag + Length + Value).
ASN.1-структуры часто вложены. Для работы с ними используются:
ASN1HEX.getChildIdx(hex, idx)
Возвращает массив индексов дочерних элементов.
Пример:
var children = ASN1HEX.getChildIdx(hex, 0);
Результат:
[4, 10, 16]
Каждое число — позиция дочернего элемента.
ASN1HEX.getNthChildIdx(hex, idx, nth)
Возвращает индекс nth-дочернего элемента.
ASN1HEX.getIdxbyList(hex, currentIndex, indexList)
Позволяет пройти по дереву ASN.1 с помощью массива индексов.
Пример:
ASN1HEX.getIdxbyList(hex, 0, [0, 1])
Означает:
Один из наиболее удобных механизмов — извлечение значений по пути:
ASN1HEX.getVbyList(hex, currentIndex, nthList, tag)
Параметры:
hex — исходная строкаcurrentIndex — начальный индексnthList — путь (массив индексов)tag — ожидаемый тег (опционально)Пример:
ASN1HEX.getVbyList(hex, 0, [0, 1], "02")
Извлекает INTEGER по заданному пути.
ASN1HEX.getTLVbyList(hex, currentIndex, nthList, tag)
Позволяет извлечь TLV, проверяя соответствие тегу.
Если тег не совпадает — выбрасывается ошибка.
SEQUENCE — один из самых распространённых типов.
Пример структуры:
30 0A
02 01 01
02 01 02
Разбор:
var children = ASN1HEX.getChildIdx(hex, 0);
var first = ASN1HEX.getV(hex, children[0]);
var second = ASN1HEX.getV(hex, children[1]);
INTEGER кодируется тегом 02.
Пример:
02 01 01
Извлечение:
var idx = ASN1HEX.getIdxbyList(hex, 0, [0]);
var valueHex = ASN1HEX.getV(hex, idx);
BIT STRING имеет тег 03.
Особенность — первый байт внутри Value указывает количество неиспользуемых бит.
ASN1HEX.getV(hex, idx)
Возвращает значение, включая этот байт.
Для извлечения “чистых” данных:
var bitString = ASN1HEX.getV(hex, idx);
var unusedBits = parseInt(bitString.substr(0, 2), 16);
var data = bitString.substr(2);
OID кодируется тегом 06.
ASN1HEX.getV(hex, idx)
Возвращает HEX-представление, которое затем можно преобразовать в строковый OID через другие утилиты Jsrsasign.
DER-кодированный сертификат X.509:
var certHex = ...;
Извлечение версии:
ASN1HEX.getVbyList(certHex, 0, [0, 0, 0], "a0");
Извлечение серийного номера:
ASN1HEX.getVbyList(certHex, 0, [0, 1], "02");
Функции ASN1HEX часто выбрасывают исключения:
Поэтому при работе с неизвестными ASN.1-данными рекомендуется
использовать try/catch.
ASN1HEX ориентирован именно на DER:
BER или CER могут частично не поддерживаться.
Разбор сертификатов
Работа с ключами
PKCS#7 / PKCS#12
Отладка ASN.1
ASN1HEX часто используется совместно с:
X509 — высокоуровневый разбор сертификатовKEYUTIL — работа с ключамиKJUR.asn1 — генерация ASN.1ASN1HEX остаётся инструментом низкого уровня, когда
требуется полный контроль над структурой.
getVbyList для удобной навигацииvar hex = "300a020101020102";
var rootChildren = ASN1HEX.getChildIdx(hex, 0);
var firstIdx = rootChildren[0];
var secondIdx = rootChildren[1];
var firstValue = ASN1HEX.getV(hex, firstIdx);
var secondValue = ASN1HEX.getV(hex, secondIdx);
Результат:
firstValue = "01"
secondValue = "02"
ASN1HEX — это фундаментальный слой:
Без него невозможно реализовать корректный разбор криптографических структур.