Класс KJUR.asn1.DEROctetString

OCTET STRING в ASN.1 представляет собой базовый тип данных для хранения произвольной последовательности байтов. В контексте DER (Distinguished Encoding Rules) этот тип кодируется строго по фиксированным правилам: тег 0x04, длина и сами байты значения.

В библиотеке jsrsasign класс KJUR.asn1.DEROctetString инкапсулирует логику формирования ASN.1 структуры OCTET STRING в DER-формате и используется как строительный блок для более сложных структур (например, сертификатов X.509, CMS, PKCS#7, SPKI).


Структура класса KJUR.asn1.DEROctetString

Класс относится к пространству имен KJUR.asn1 и наследует базовые возможности ASN.1 объектов библиотеки jsrsasign.

Основная задача класса — преобразование входных данных (строк, hex-последовательностей или бинарного содержимого) в корректно закодированный DER OCTET STRING.


Конструктор и входные параметры

Создание объекта выполняется через конструктор:

new KJUR.asn1.DEROctetString(params)

Параметр params представляет собой объект конфигурации, в котором наиболее часто используются следующие поля:

  • str — строка, которая будет интерпретирована как текстовые данные (обычно UTF-8 или ASCII в зависимости от контекста использования)
  • hex — строка в шестнадцатеричном формате, представляющая уже готовые байты
  • obj — вложенный ASN.1 объект (используется реже, для композиции структур)

Приоритет обработки обычно следующий: hex имеет более высокий приоритет, чем str, поскольку считается уже бинарным представлением.


Принцип кодирования DER OCTET STRING

DER-кодирование OCTET STRING строится по строгому шаблону:

[0x04][length][value-bytes]

Где:

  • 0x04 — ASN.1 тег OCTET STRING
  • length — длина полезной нагрузки
  • value-bytes — сами данные

Класс DEROctetString автоматически вычисляет длину и формирует корректную последовательность байтов без необходимости ручного вмешательства.


Работа с текстовыми данными

При использовании поля str строка преобразуется в байтовое представление. В jsrsasign это обычно UTF-8 кодировка.

Пример создания:

var o = new KJUR.asn1.DEROctetString({
  str: "Hello"
});

Внутри происходит преобразование символов в байты и последующее DER-кодирование.

Особенность: результат зависит от интерпретации строки на уровне библиотеки, поэтому для бинарно-критичных задач предпочтительнее использовать hex.


Работа с hex-данными

Поле hex позволяет задавать уже готовые байты без преобразования из строки:

var o = new KJUR.asn1.DEROctetString({
  hex: "01020304ff"
});

В этом случае библиотека:

  • не выполняет текстовую интерпретацию
  • напрямую вставляет байтовую последовательность
  • только добавляет ASN.1 заголовок (тег и длину)

Это основной режим при работе с криптографическими структурами.


Вложенные ASN.1 объекты

DEROctetString может использоваться для упаковки других ASN.1 элементов.

Пример концепции:

  • формируется ASN.1 структура
  • она кодируется в DER
  • результат помещается как содержимое OCTET STRING

Это часто применяется в сложных форматах, где OCTET STRING выступает контейнером для сериализованных структур.


Получение DER-кодированного результата

После создания объекта можно получить итоговое представление в DER:

  • через наследуемые методы ASN.1 объектов jsrsasign
  • наиболее распространённый метод — получение hex-представления

Типичный вызов:

o.getEncodedHex()

Результат — строка hex, представляющая полностью закодированный ASN.1 объект.


Внутреннее поведение и особенности реализации

DEROctetString не хранит данные в виде “сырого массива байтов” в открытом виде. Вместо этого:

  • входные данные нормализуются
  • вычисляется длина payload
  • формируется ASN.1 TLV (Tag-Length-Value)
  • результат кэшируется при кодировании

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


Использование в криптографических структурах

OCTET STRING является одним из наиболее часто используемых типов ASN.1 в криптографии:

  • хранение подписанных данных
  • упаковка хэшей (SHA-256, SHA-1)
  • вложение сертификатов
  • транспортировка ключевых параметров

В jsrsasign DEROctetString часто используется как промежуточный слой при построении:

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

Кодирование больших данных

При работе с большими бинарными данными важны следующие особенности:

  • длина может кодироваться в short form или long form
  • библиотека автоматически выбирает формат длины
  • память под строковое представление может увеличиваться при hex-конвертации

OCTET STRING не накладывает ограничений на размер, кроме ограничений среды выполнения JavaScript.


Типичные ошибки при использовании

1. Передача строки вместо hex при бинарных данных

Если бинарные данные интерпретируются как str, возможна потеря информации из-за кодировки.

2. Неверный hex-формат

Строка hex должна содержать только валидные символы [0-9a-fA-F] и иметь чётную длину.

3. Двойное кодирование

Ошибочная ситуация возникает, когда DER-структура уже закодирована, но снова помещается как str, приводя к некорректной вложенности.


Сравнение режимов str и hex

Режим Назначение Особенности
str Текстовые данные Автоматическое преобразование в байты
hex Бинарные данные Прямое включение байтов без преобразования

Роль DEROctetString в композиции ASN.1

В сложных структурах DEROctetString часто выступает как контейнер:

  • хранит DER-представление других объектов
  • используется для encapsulation
  • обеспечивает совместимость с RFC-форматами

Это делает его одним из фундаментальных классов ASN.1 в jsrsasign.