В ASN.1 спецификации тип NULL используется для явного обозначения отсутствия значения. Это не «пустая строка» и не «нулевой объект» в прикладном смысле, а строго определённый тип кодирования, который фиксирует факт отсутствия данных в структуре. В DER (Distinguished Encoding Rules) этот тип всегда кодируется одинаково и не содержит полезной нагрузки.
В библиотеке jsrsasign этот функционал реализован через класс
KJUR.asn1.DERNull, входящий в модуль построения ASN.1
структур. Он используется при формировании сертификатов, алгоритмических
идентификаторов и любых ASN.1 конструкций, где требуется строгое
соответствие стандарту X.690.
ASN.1 DER кодирование для NULL всегда детерминировано и неизменно:
0x050x00Итоговое HEX-представление:
05 00
Это означает, что каждый объект DERNull в любой структуре всегда занимает ровно 2 байта.
Класс располагается в пространстве имён:
KJUR.asn1.DERNull
Он наследуется от базового ASN.1 класса библиотеки, который обеспечивает стандартный интерфейс кодирования объектов в DER-формат.
Основная роль класса заключается не в хранении данных, а в участии в построении корректной ASN.1 иерархии.
DERNull не принимает параметров. Его создание максимально тривиально, поскольку тип NULL не имеет состояния.
var n = new KJUR.asn1.DERNull();
В отличие от других ASN.1 типов (INTEGER, UTF8String, SEQUENCE), здесь отсутствует необходимость задавать значение или параметры кодирования.
Основной метод, используемый для получения бинарного представления, наследуется от базового класса ASN.1:
n.getEncodedHex();
Результат вызова всегда одинаков:
0500
Это поведение гарантирует детерминированность, что критически важно для криптографических структур, где даже минимальное отклонение нарушает проверку подписи.
DERNull чаще всего встречается в следующих контекстах:
В структурах сертификатов алгоритмы иногда не требуют параметров. В этом случае параметр явно устанавливается как 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()
]
});
Некоторые алгоритмы требуют явного указания отсутствия параметров. Например:
DERNull используется как маркер отсутствия конфигурации алгоритма.
При включении DERNull в сложные структуры:
Это особенно важно для криптографических операций сравнения байтовых строк.
DERNull не содержит состояния и не выполняет вычислений. Его поведение можно свести к следующему:
Упрощённая логика:
Tag = 0x05
Length = 0x00
Value = (empty)
DERNull может использоваться внутри любых контейнеров библиотеки:
Пример вложенности:
var seq = new KJUR.asn1.DERSequence({
array: [
new KJUR.asn1.DERNull()
]
});
Важно различать:
null в JavaScript — примитив языкаDERNull — ASN.1 тип кодирования| Свойство | JavaScript null | DERNull |
|---|---|---|
| Тип | значение языка | ASN.1 объект |
| Кодирование | отсутствует | 0500 |
| Использование | логика приложения | криптография, ASN.1 |
При разборе DER-структур jsrsasign:
0x05 интерпретируется как DERNullDERNull обеспечивает:
В криптографических протоколах отсутствие NULL там, где он ожидается, может привести к:
Поскольку DERNull не содержит данных, все экземпляры эквивалентны на уровне кодирования:
DERNull == DERNull (по DER) → true
Сравнение происходит исключительно по байтовому представлению
0500.
Класс минималистичен и ориентирован на стандарты:
В X.509 сертификатах DERNull встречается в таких местах:
Пример фрагмента:
AlgorithmIdentifier {
algorithm: sha256WithRSAEncryption
parameters: NULL
}
В jsrsasign это отражается через:
new KJUR.asn1.DERNull()
DERNull не предназначен для:
Его роль строго синтаксическая — заполнение обязательного поля ASN.1, когда значение отсутствует по спецификации.