Класс KJUR.asn1.DERObjectIdentifier

Object Identifier (OID) используется в ASN.1 для однозначной идентификации алгоритмов, расширений сертификатов, атрибутов и других структурированных элементов криптографических протоколов. OID представляет собой последовательность чисел, разделённых точками, например:

  • 1.2.840.113549.1.1.11 (sha256WithRSAEncryption)
  • 2.5.4.3 (commonName)

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


Представление DERObjectIdentifier в jsrsasign

В библиотеке jsrsasign класс KJUR.asn1.DERObjectIdentifier предназначен для создания ASN.1 структуры OID в DER-формате. Он является частью модуля KJUR.asn1 и наследует поведение базового ASN.1 объекта, поддерживающего кодирование в DER.

Основная задача класса — преобразовать строковое представление OID в корректную ASN.1 структуру, пригодную для включения в сертификаты, запросы PKCS#10, CMS и другие криптографические контейнеры.


Концепция работы класса

Объект OID в jsrsasign строится вокруг одной ключевой сущности — строки идентификатора.

Пример:

new KJUR.asn1.DERObjectIdentifier({
  oid: "1.2.840.113549.1.1.1"
});

Эта строка интерпретируется как последовательность чисел, которые затем кодируются в DER.


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

KJUR.asn1.DERObjectIdentifier наследуется от базового класса ASN.1 объектов, таких как KJUR.asn1.ASN1Object. Это означает, что объект:

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

Основной смысл — интеграция OID в более крупные структуры, например:

  • X.509 сертификаты
  • алгоритмические идентификаторы подписей
  • расширения сертификатов (extensions)

Конструктор и параметры

Конструктор принимает объект конфигурации:

  • oid — строка OID в точечной нотации

Пример:

const oid = new KJUR.asn1.DERObjectIdentifier({
  oid: "2.5.4.3"
});

Значение должно быть валидным ASN.1 Object Identifier. Валидация обычно происходит на этапе кодирования.


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

При вызове методов сериализации объект преобразуется в DER-последовательность байтов.

OID кодируется следующим образом:

  1. Первые два числа объединяются по формуле:

    • (first * 40) + second
  2. Остальные числа кодируются в base-128 с продолжением (continuation bit)

Пример:

OID 1.2.840.113549

будет преобразован в байтовую последовательность, где:

  • 1.2 → 42
  • 840 → многобайтовое представление
  • 113549 → многобайтовое представление

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

getEncodedHex()

Возвращает DER-представление объекта в виде hex-строки.

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

const oid = new KJUR.asn1.DERObjectIdentifier({
  oid: "1.2.840.113549.1.1.11"
});

const hex = oid.getEncodedHex();

Результат — строка шестнадцатеричного представления ASN.1 DER.


toString()

Возвращает строковое представление объекта. Обычно используется для отладки и логирования.

oid.toString();

getString() (в некоторых версиях через наследование)

Может возвращать исходную строку OID, если поддерживается реализацией базового класса.


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

DERObjectIdentifier часто применяется внутри сертификатов, например для указания алгоритма подписи.

Пример RSA с SHA-256:

const algOid = new KJUR.asn1.DERObjectIdentifier({
  oid: "1.2.840.113549.1.1.11"
});

Этот объект затем помещается в структуру AlgorithmIdentifier:

const algId = new KJUR.asn1.x509.AlgorithmIdentifier({
  name: "sha256WithRSAEncryption"
});

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


Применение в расширениях сертификатов

OID используется для идентификации расширений X.509:

  • Subject Key Identifier
  • Authority Key Identifier
  • Key Usage
  • Extended Key Usage

Пример:

const keyUsageOid = new KJUR.asn1.DERObjectIdentifier({
  oid: "2.5.29.15"
});

Вложенность в ASN.1 структуры

DERObjectIdentifier часто используется внутри:

  • SEQUENCE
  • SET
  • AlgorithmIdentifier
  • AttributeTypeAndValue

Пример вложенной структуры:

const seq = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERObjectIdentifier({
      oid: "2.5.4.3"
    }),
    new KJUR.asn1.DERUTF8String({
      str: "Common Name"
    })
  ]
});

Типичные ошибки при работе с OID

Некорректный формат строки

OID должен состоять только из чисел и точек:

  • допустимо: “1.2.3.4”
  • недопустимо: “1.2.a.4”

Использование несуществующих OID

Библиотека не всегда проверяет существование OID в глобальных регистрах, поэтому ошибка проявляется только в контексте криптографической операции.


Потеря контекста в ASN.1 дереве

OID без правильного включения в SEQUENCE не имеет смысла в DER-структуре, так как ASN.1 требует строгой иерархии.


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

DERObjectIdentifier является фундаментальным элементом следующих протоколов:

  • TLS (идентификация алгоритмов)
  • PKI (сертификаты X.509)
  • CMS (Cryptographic Message Syntax)
  • PKCS#7 / PKCS#10

Без корректного OID невозможно однозначно определить криптографический алгоритм или структуру данных.


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

Класс KJUR.asn1.DERObjectIdentifier оптимизирован для:

  • быстрого кодирования OID в DER
  • интеграции с другими ASN.1 объектами библиотеки
  • минимальной зависимости от внешних валидаторов

При этом вся работа сосредоточена на преобразовании строки в бинарное ASN.1 представление.


Взаимодействие с другими ASN.1 классами

DERObjectIdentifier часто используется совместно с:

  • DERSequence
  • DERSet
  • DERInteger
  • DERBitString
  • DERUTF8String
  • X.509 генераторами

Эта связка формирует основу всех структур в jsrsasign, связанных с сертификатами и криптографическими сообщениями.