Класс KJUR.asn1.DERNull

В ASN.1 спецификации тип NULL используется для явного обозначения отсутствия значения. Это не «пустая строка» и не «нулевой объект» в прикладном смысле, а строго определённый тип кодирования, который фиксирует факт отсутствия данных в структуре. В DER (Distinguished Encoding Rules) этот тип всегда кодируется одинаково и не содержит полезной нагрузки.

В библиотеке jsrsasign этот функционал реализован через класс KJUR.asn1.DERNull, входящий в модуль построения ASN.1 структур. Он используется при формировании сертификатов, алгоритмических идентификаторов и любых ASN.1 конструкций, где требуется строгое соответствие стандарту X.690.


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

ASN.1 DER кодирование для NULL всегда детерминировано и неизменно:

  • тег: 0x05
  • длина: 0x00
  • значение: отсутствует

Итоговое HEX-представление:

05 00

Это означает, что каждый объект DERNull в любой структуре всегда занимает ровно 2 байта.


Место DERNull в структуре jsrsasign

Класс располагается в пространстве имён:

KJUR.asn1.DERNull

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

Основная роль класса заключается не в хранении данных, а в участии в построении корректной ASN.1 иерархии.


Конструктор и особенности инициализации

DERNull не принимает параметров. Его создание максимально тривиально, поскольку тип NULL не имеет состояния.

var n = new KJUR.asn1.DERNull();

В отличие от других ASN.1 типов (INTEGER, UTF8String, SEQUENCE), здесь отсутствует необходимость задавать значение или параметры кодирования.


Кодирование в DER

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

n.getEncodedHex();

Результат вызова всегда одинаков:

0500

Это поведение гарантирует детерминированность, что критически важно для криптографических структур, где даже минимальное отклонение нарушает проверку подписи.


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

DERNull чаще всего встречается в следующих контекстах:

1. AlgorithmIdentifier в X.509

В структурах сертификатов алгоритмы иногда не требуют параметров. В этом случае параметр явно устанавливается как NULL.

Пример ASN.1 структуры:

AlgorithmIdentifier ::= SEQUENCE {
    algorithm OBJECT IDENTIFIER,
    parameters ANY DEFINED BY algorithm OPTIONAL
}

Если параметры отсутствуют, используется DERNull:

var alg = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.11" }),
    new KJUR.asn1.DERNull()
  ]
});

2. Подписи и криптографические схемы

Некоторые алгоритмы требуют явного указания отсутствия параметров. Например:

  • RSA
  • SHA256withRSA
  • ECDSA в определённых профилях X.509

DERNull используется как маркер отсутствия конфигурации алгоритма.


Поведение в сериализации ASN.1

При включении DERNull в сложные структуры:

  • он не увеличивает вариативность результата
  • всегда даёт фиксированную длину
  • гарантирует стабильность DER-представления

Это особенно важно для криптографических операций сравнения байтовых строк.


Внутренняя логика класса

DERNull не содержит состояния и не выполняет вычислений. Его поведение можно свести к следующему:

  • возвращает фиксированный тег NULL
  • возвращает фиксированную длину 0
  • формирует неизменяемую DER-последовательность

Упрощённая логика:

Tag = 0x05
Length = 0x00
Value = (empty)

Совместимость с ASN.1 объектами jsrsasign

DERNull может использоваться внутри любых контейнеров библиотеки:

  • DERSequence
  • DERSet
  • DERExplicit
  • DERImplicit

Пример вложенности:

var seq = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERNull()
  ]
});

Отличие от JavaScript null

Важно различать:

  • null в JavaScript — примитив языка
  • DERNull — ASN.1 тип кодирования
Свойство JavaScript null DERNull
Тип значение языка ASN.1 объект
Кодирование отсутствует 0500
Использование логика приложения криптография, ASN.1

Поведение при декодировании

При разборе DER-структур jsrsasign:

  • тег 0x05 интерпретируется как DERNull
  • длина всегда должна быть 0
  • любые отклонения считаются ошибкой формата

Роль в строгой типизации ASN.1

DERNull обеспечивает:

  • явное отсутствие параметров
  • соблюдение X.690 DER правил
  • совместимость с PKI инфраструктурой

В криптографических протоколах отсутствие NULL там, где он ожидается, может привести к:

  • ошибке валидации сертификата
  • несоответствию подписи
  • отказу в интерпретации структуры

Поведение при сравнении объектов

Поскольку DERNull не содержит данных, все экземпляры эквивалентны на уровне кодирования:

DERNull == DERNull (по DER) → true

Сравнение происходит исключительно по байтовому представлению 0500.


Особенности реализации в jsrsasign

Класс минималистичен и ориентирован на стандарты:

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

Применение в реальных структурах сертификатов

В X.509 сертификатах DERNull встречается в таких местах:

  • подписи алгоритмов
  • публичные ключи RSA (OID + NULL)
  • параметры хэш-алгоритмов

Пример фрагмента:

AlgorithmIdentifier {
  algorithm: sha256WithRSAEncryption
  parameters: NULL
}

В jsrsasign это отражается через:

new KJUR.asn1.DERNull()

Ограничения использования

DERNull не предназначен для:

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

Его роль строго синтаксическая — заполнение обязательного поля ASN.1, когда значение отсутствует по спецификации.