DERSet представляет собой реализацию ASN.1-типа SET, закодированного по правилам DER (Distinguished Encoding Rules). В контексте криптографической библиотеки Jsrsasign этот класс используется для формирования структур, где требуется неупорядоченное множество ASN.1-элементов с обязательной детерминированной сериализацией.
ASN.1 SET в логическом смысле допускает отсутствие порядка элементов. Однако DER накладывает строгое правило: все элементы SET должны быть отсортированы по их DER-байтовому представлению. Именно это поведение и реализует KJUR.asn1.DERSet — при создании объекта элементы автоматически приводятся к каноническому порядку перед кодированием.
SET в ASN.1 используется для хранения коллекции однотипных или разнотипных структур без фиксированного порядка. В отличие от SEQUENCE, где порядок элементов имеет смысл, SET определяется как математическое множество.
В DER (Distinguished Encoding Rules) ситуация меняется:
В Jsrsasign этот механизм инкапсулирован в
KJUR.asn1.DERSet.
Класс принадлежит пространству имён:
KJUR.asn1.DERSet
Он наследуется от базового ASN.1-узла библиотеки и использует общую инфраструктуру кодирования DER.
Основная задача — принять набор ASN.1-объектов и сформировать корректную DER-структуру SET.
Типичная сигнатура создания:
new KJUR.asn1.DERSet(params)
где params — объект конфигурации.
Основные поля:
Пример:
var set = new KJUR.asn1.DERSet({
array: [
new KJUR.asn1.DERUTF8String({str: "A"}),
new KJUR.asn1.DERUTF8String({str: "B"})
]
});
Ключевая особенность DERSet заключается в том, что порядок элементов в исходном массиве не гарантируется в итоговом кодировании.
Перед сериализацией выполняется:
Это критически важно для криптографических структур, где любое расхождение в байтах приводит к различию хэшей и подписи.
Несмотря на схожую структуру, DERSet и DERSequence имеют принципиальные различия.
DERSet часто встречается в расширениях сертификатов X.509, например:
Пример построения набора атрибутов:
var attrSet = new KJUR.asn1.DERSet({
array: [
new KJUR.asn1.DERUTF8String({str: "role:admin"}),
new KJUR.asn1.DERUTF8String({str: "department:IT"})
]
});
Такой объект может быть включён в более сложные ASN.1-конструкции, например в DERSequence.
DERSet не является изолированным элементом. Он активно комбинируется с другими классами Jsrsasign:
Пример вложенной структуры:
var complex = new KJUR.asn1.DERSequence({
array: [
new KJUR.asn1.DERInteger({int: 1}),
new KJUR.asn1.DERSet({
array: [
new KJUR.asn1.DERUTF8String({str: "value1"}),
new KJUR.asn1.DERUTF8String({str: "value2"})
]
})
]
});
Любой объект DERSet может быть преобразован в DER-hex строку:
var hex = set.getEncodedHex();
Результат:
Внутри Jsrsasign DERSet опирается на базовую ASN.1-архитектуру:
Сортировка — ключевой этап, обеспечивающий детерминированность результата.
Если массив array не задан или пуст:
var emptySet = new KJUR.asn1.DERSet({});
DERSet критически важен в сценариях, где требуется:
Любое несоответствие порядка элементов привело бы к изменению итогового хэша, что делает DERSet обязательным элементом канонической сериализации.
DERSet допускает вложение уже готовых ASN.1-объектов. Каждый элемент должен быть экземпляром класса Jsrsasign ASN.1:
Неподдерживаемые типы приводят к ошибкам кодирования или некорректному DER-выводу.
В инфраструктуре открытых ключей DERSet используется при:
Например, в структуре SignedAttributes PKCS#7 часто применяется SET OF атрибутов, реализуемый через DERSet.
Если элементы SET сами содержат SET или SEQUENCE:
Это обеспечивает строгую каноничность всей ASN.1-структуры независимо от глубины вложенности.