KJUR.asn1 представляет собой одну из ключевых частей библиотеки jsrsasign, реализующую работу с ASN.1 структурой данных. ASN.1 (Abstract Syntax Notation One) используется в криптографии для описания и кодирования сложных структур, таких как сертификаты X.509, ключи, подписи и другие элементы PKI.
Внутри jsrsasign пространство имён KJUR.asn1 построено как набор базовых классов, которые формируют иерархию объектов DER/BER кодирования. Основная идея заключается в том, что каждый ASN.1 элемент представлен отдельным классом с единым интерфейсом сериализации в бинарный формат.
Основой является абстрактный класс ASN1Object, от которого наследуются все остальные ASN.1 типы. Он задаёт общий контракт для объектов, которые могут быть закодированы в DER.
Ключевая ответственность ASN1Object:
Типичная цепочка наследования:
KJUR.asn1.ASN1Object
├── KJUR.asn1.DERAbstractString
│ ├── DERUTF8String
│ ├── DERPrintableString
│ ├── DERIA5String
│
├── DERInteger
├── DERBitString
├── DEROctetString
├── DERNull
├── DERObjectIdentifier
├── DERSequence
├── DERSet
ASN1Object является фундаментом всей системы кодирования ASN.1.
Основные методы:
getEncodedHex() Возвращает DER-кодированное представление объекта в виде hex-строки.
getEncoded() Возвращает бинарное представление объекта.
toString() Возвращает человекочитаемое описание структуры (используется в отладке).
getLengthHexFromContent() Рассчитывает длину содержимого ASN.1 элемента.
getEncodedHex() (override в наследниках) Реализует конкретное кодирование типа.
ASN1Object не используется напрямую, но задаёт общую модель поведения для всех DER-типов.
DERAbstractString служит промежуточным уровнем для всех строковых ASN.1 типов. Он расширяет ASN1Object и добавляет работу со строковыми данными.
Основные особенности:
Методы:
getString() Возвращает исходную строку.
setString(newValue) Устанавливает новое значение строки.
Используется для кодирования UTF-8 строк.
Пример использования:
var s = new KJUR.asn1.DERUTF8String({str: "Пример"});
console.log(s.getEncodedHex());
Особенности:
Предназначен для ограниченного набора символов (A-Z, a-z, 0-9 и ограниченные знаки).
Используется в:
Ограничение символов делает этот тип более совместимым со старыми криптографическими системами.
Используется для ASCII-строк (7-bit). Часто применяется для:
DERInteger представляет целочисленные значения в ASN.1.
Ключевые особенности:
Пример:
var i = new KJUR.asn1.DERInteger({int: 12345});
Методы:
DERBitString используется для хранения битовых последовательностей.
Основное применение:
Структура включает:
DEROctetString представляет произвольные байтовые данные.
Используется для:
DERNull представляет ASN.1 NULL тип.
Используется как маркер отсутствия значения.
Пример применения:
DERObjectIdentifier (OID) — один из наиболее важных типов ASN.1.
Представляет иерархические идентификаторы:
Примеры OID:
Методы:
Особенность: OID кодируется в компактной форме с использованием base-128 encoding.
DERSequence представляет упорядоченную последовательность ASN.1 объектов.
Характеристики:
Методы:
Пример:
var seq = new KJUR.asn1.DERSequence({
array: [
new KJUR.asn1.DERInteger({int: 1}),
new KJUR.asn1.DERUTF8String({str: "test"})
]
});
DERSet аналогичен DERSequence, но элементы неупорядочены.
Особенности:
Помимо классов, существует набор утилитарных функций:
Обеспечивает:
Используется для:
Каждый ASN.1 объект кодируется по схеме:
[Tag][Length][Value]
KJUR.asn1 автоматически управляет всеми тремя уровнями.
ASN.1 объекты могут содержать другие ASN.1 объекты, формируя дерево:
SEQUENCE
├── INTEGER
├── UTF8String
├── SEQUENCE
│ ├── OID
│ ├── NULL
Каждый уровень кодируется рекурсивно через getEncodedHex().
KJUR.asn1 является основой для:
Например, сертификат X.509 полностью строится из ASN.1 SEQUENCE с вложенными объектами Subject, Issuer, Validity и PublicKeyInfo.
Архитектура KJUR.asn1 отличается следующими принципами:
При вызове getEncodedHex():
Результат всегда представляет валидную DER структуру.
KJUR.asn1 выполняет функцию низкоуровневого конструктора криптографических структур. Все более высокоуровневые модули библиотеки опираются на него как на фундамент кодирования и декодирования данных PKI.