Класс KJUR.asn1.DERUTF8String

Класс KJUR.asn1.DERUTF8String представляет ASN.1 тип данных UTF8String, закодированный в формате DER (Distinguished Encoding Rules). Этот тип используется для хранения текстовых строк в кодировке UTF-8 внутри ASN.1 структур, которые широко применяются в криптографии: сертификатах X.509, запросах CSR, криптографических токенах и протоколах обмена ключами.

UTF8String является одним из базовых строковых типов ASN.1 и поддерживает полный набор символов Unicode, в отличие от более ограниченных типов вроде PrintableString или IA5String.


ASN.1 и роль UTF8String

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

  • PrintableString — ограниченный набор ASCII-символов
  • IA5String — расширенный ASCII (7-bit)
  • BMPString — Unicode BMP (UCS-2)
  • UTF8String — полный Unicode через UTF-8

DERUTF8String в jsrsasign реализует именно последний вариант, обеспечивая корректное представление международных символов.


Представление в DER

В DER-кодировке каждый ASN.1 элемент состоит из трёх частей:

  1. Tag — идентификатор типа (для UTF8String это 0x0C)
  2. Length — длина содержимого
  3. Value — UTF-8 байты строки

DERUTF8String отвечает за корректное формирование этих компонентов и преобразование строки в бинарное представление.


Конструктор класса

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

new KJUR.asn1.DERUTF8String({
    str: "значение строки"
})

Параметры конструктора

  • str — исходная строка в JavaScript (UTF-16 внутри движка, преобразуется в UTF-8 при кодировании DER)

Дополнительно через наследуемую инфраструктуру ASN.1 могут использоваться параметры управления DER-структурой, но основной рабочий параметр — именно str.


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

При создании экземпляра выполняются следующие шаги:

  1. Строка JavaScript интерпретируется как Unicode

  2. Производится преобразование в UTF-8 байтовую последовательность

  3. Формируется DER-структура:

    • тег UTF8String (0x0C)
    • длина
    • значение в UTF-8

Пример внутреннего представления:

0C 0B 48 65 6C 6C 6F 20 D0 9C D0 B8 D1 80

Здесь строка содержит латиницу и кириллицу.


Наследование и архитектура

DERUTF8String является частью иерархии ASN.1 объектов библиотеки jsrsasign:

  • KJUR.asn1.ASN1Object

    • KJUR.asn1.DERAbstractString

      • KJUR.asn1.DERUTF8String

Базовый класс DERAbstractString предоставляет общую логику работы со строковыми ASN.1 типами, включая:

  • хранение значения строки
  • кодирование длины
  • генерацию DER-hex представления

Основные методы

getString()

Возвращает исходное строковое значение:

obj.getString()

Результат — обычная JavaScript-строка.


getEncodedHex()

Возвращает DER-кодировку в виде hex-строки:

obj.getEncodedHex()

Результат включает tag + length + value.


toString()

Часто используется для отладки и возвращает строковое представление объекта:

obj.toString()

Пример использования

Создание UTF8String

var utf8 = new KJUR.asn1.DERUTF8String({
    str: "Hello Мир"
});

Получение строки

console.log(utf8.getString());
// Hello Мир

Получение DER-кода

console.log(utf8.getEncodedHex());

Результат будет содержать DER-последовательность с тегом UTF8String (0x0C).


Использование в ASN.1 структурах

DERUTF8String часто применяется внутри сложных ASN.1 конструкций:

Пример Subject в X.509

var subject = new KJUR.asn1.x509.X500Name({
    array: [
        ["CN", new KJUR.asn1.DERUTF8String({ str: "example.com" })],
        ["O",  new KJUR.asn1.DERUTF8String({ str: "Компания" })]
    ]
});

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


Отличие от других строковых классов jsrsasign

Класс ASN.1 тип Особенности
DERUTF8String UTF8String Полный Unicode
DERPrintableString PrintableString Ограниченный ASCII
DERIA5String IA5String 7-bit ASCII
DERBMPString BMPString UCS-2 (2 байта на символ)

DERUTF8String является наиболее универсальным вариантом и предпочтителен для современных систем.


Кодировка UTF-8 внутри DERUTF8String

Особенности преобразования:

  • символы ASCII кодируются одним байтом
  • кириллица и прочие символы — несколькими байтами
  • emoji и редкие символы кодируются 4 байтами

Это обеспечивает совместимость с международными сертификатами и современными TLS-реализациями.


Поведение при некорректных данных

Так как JavaScript строки уже Unicode-совместимы, DERUTF8String не требует предварительной нормализации, однако:

  • суррогатные пары обрабатываются как единые символы
  • некорректные Unicode-последовательности могут привести к ошибкам при кодировании

Внутреннее представление в jsrsasign

При вызове getEncodedHex() происходит:

  1. генерация UTF-8 байтов через внутренний encoder библиотеки
  2. вычисление длины
  3. добавление ASN.1 тега 0x0C
  4. конкатенация в итоговый hex

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

DERUTF8String активно используется в:

  • X.509 сертификатах (CN, O, OU поля)
  • PKCS#10 CSR запросах
  • CMS/PKCS#7 контейнерах
  • S/MIME сообщениях

Его использование критично для корректного представления интернациональных данных в криптографических системах.


Особенности совместимости

  • полностью совместим с RFC 5280 (X.509)
  • поддерживается всеми современными TLS-стеками
  • предпочтителен для новых сертификатов вместо PrintableString

Ограничения

  • не оптимален для строго ASCII-ограниченных систем (где требуется PrintableString)
  • увеличивает размер DER-структуры при использовании многобайтовых символов
  • требует корректной UTF-8 обработки на всех этапах цепочки