KJUR.asn1.cms: классы и методы

CMS (Cryptographic Message Syntax) представляет собой стандарт ASN.1-структур, описывающий формат защищённых сообщений: подписанных, зашифрованных, а также комбинированных конструкций. В рамках библиотеки Jsrsasign реализация CMS сосредоточена в пространстве имён KJUR.asn1.cms, где представлены классы для построения и разбора структур уровня ContentInfo, SignedData, EnvelopedData и связанных с ними компонентов.

CMS базируется на иерархии вложенных ASN.1-структур. Центральным элементом выступает контейнер ContentInfo, внутри которого размещается один из типов содержимого:

  • SignedData — данные с цифровой подписью
  • EnvelopedData — зашифрованные данные с использованием публичных ключей получателей
  • EncryptedData — симметрически зашифрованные данные
  • Data — сырые данные без защиты

Каждый из этих типов в Jsrsasign реализуется через соответствующие классы KJUR.asn1.cms.*, формирующие корректные ASN.1 DER-структуры.


KJUR.asn1.cms.ContentInfo

ContentInfo является корневым контейнером CMS-сообщения.

Основная роль

  • инкапсуляция любого CMS-объекта
  • установка OID типа содержимого
  • сериализация в DER/PEM формат

Конструктор

new KJUR.asn1.cms.ContentInfo(params)

Параметры:

  • contentType — OID типа содержимого
  • content — ASN.1 объект содержимого (SignedData, EnvelopedData и т.д.)

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

toASN1Object() Формирует ASN.1 структуру ContentInfo.

getEncodedHex() Возвращает DER-представление в hex-формате.

getPEM() Генерирует PEM-строку с заголовками CMS.


KJUR.asn1.cms.SignedData

SignedData реализует структуру цифровой подписи, позволяющую подтвердить целостность и подлинность данных.

Структура SignedData

SignedData включает:

  • version
  • digestAlgorithms
  • encapContentInfo
  • certificates (опционально)
  • crls (опционально)
  • signerInfos

Создание SignedData

new KJUR.asn1.cms.SignedData(params)

Основные параметры

  • contentType — тип подписываемого контента
  • content — исходные данные
  • signerInfos — массив подписантов
  • certs — сертификаты X.509
  • crls — списки отзыва сертификатов

Методы SignedData

setContent(dataHex) Устанавливает данные для подписи.

addSigner(params) Добавляет информацию о подписанте.

Параметры подписанта:

  • cert — сертификат
  • privateKey — приватный ключ
  • hashAlg — алгоритм хеширования (SHA-256, SHA-512 и др.)

getContentInfo() Возвращает объект ContentInfo, содержащий SignedData.


Логика формирования подписи

  1. Вычисление digest от содержимого
  2. Формирование структуры SignedData
  3. Создание SignatureValue через приватный ключ
  4. Упаковка в ContentInfo

KJUR.asn1.cms.SignerInfo

SignerInfo описывает одного подписанта в структуре SignedData.

Основные поля

  • version
  • issuerAndSerialNumber
  • digestAlgorithm
  • signedAttrs (опционально)
  • signatureAlgorithm
  • signatureValue

Методы

setSignerCert(cert) Устанавливает сертификат подписанта.

setPrivateKey(prvKey) Назначает приватный ключ.

sign() Выполняет вычисление подписи.


KJUR.asn1.cms.EnvelopedData

EnvelopedData используется для шифрования данных для одного или нескольких получателей.

Общая структура

  • version
  • recipientInfos
  • encryptedContentInfo
  • unprotectedAttrs

Создание EnvelopedData

new KJUR.asn1.cms.EnvelopedData(params)

Параметры

  • content — исходные данные
  • recipientCerts — сертификаты получателей
  • encAlg — симметрический алгоритм (AES-256-CBC и др.)

Методы EnvelopedData

setContent(dataHex) Установка данных для шифрования.

addRecipient(cert) Добавление получателя.

encrypt() Выполнение шифрования контента.

getContentInfo() Возвращает CMS ContentInfo с EnvelopedData.


KJUR.asn1.cms.RecipientInfo

RecipientInfo описывает получателя зашифрованного сообщения.

Типы RecipientInfo

  • KeyTransRecipientInfo (RSA)
  • KeyAgreeRecipientInfo (ECDH)
  • KEKRecipientInfo (ключ-обёртка)

Основные поля

  • issuerAndSerialNumber
  • encryptedKey
  • keyEncryptionAlgorithm

Методы

setCert(cert) Устанавливает сертификат получателя.

wrapKey(symKey) Шифрует симметрический ключ публичным ключом получателя.


KJUR.asn1.cms.EncryptedContentInfo

Определяет структуру зашифрованного содержимого.

Поля структуры

  • contentType
  • contentEncryptionAlgorithm
  • encryptedContent

Использование

Класс применяется внутри EnvelopedData и EncryptedData для представления зашифрованного блока данных.


Алгоритмы и OID в CMS

Jsrsasign использует внутренний реестр OID для CMS-операций:

  • SHA-256 → 2.16.840.1.101.3.4.2.1
  • RSA encryption → 1.2.840.113549.1.1.1
  • AES-256-CBC → 2.16.840.1.101.3.4.1.42

Алгоритмы связываются через KJUR.crypto.OID и KJUR.asn1.x509.AlgorithmIdentifier.


Вспомогательные функции CMS

В пространстве KJUR.asn1.cms присутствуют утилитарные функции:

генерация структуры CMS

  • buildSignedData()
  • buildEnvelopedData()
  • buildContentInfo()

работа с PEM

  • cmsToPEM()
  • cmsFromPEM()

Пример внутренней цепочки формирования CMS

При создании подписанного сообщения выполняется следующая последовательность:

  1. Подготовка исходного контента
  2. Вычисление digest-значения
  3. Формирование SignedData
  4. Генерация SignerInfo
  5. Упаковка в ContentInfo
  6. Кодирование в DER/PEM

Взаимодействие SignedData и EnvelopedData

CMS допускает комбинирование структур:

  • сначала данные подписываются (SignedData)
  • затем результат шифруется (EnvelopedData)

В Jsrsasign это выражается вложенной композицией ContentInfo внутри другого ContentInfo.


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

  • полная работа на уровне ASN.1 без внешних зависимостей
  • поддержка DER и PEM
  • использование чистого JavaScript без WebCrypto (в большинстве CMS операций)
  • строгая типизация структур через KJUR.asn1

Типичные сценарии использования CMS классов

  • формирование электронных подписей
  • защищённая передача сообщений
  • реализация S/MIME логики
  • хранение зашифрованных контейнеров данных
  • взаимодействие с PKI-инфраструктурой

Взаимосвязь с другими модулями Jsrsasign

CMS тесно связан с:

  • KJUR.crypto — криптографические операции
  • KJUR.asn1.x509 — сертификаты X.509
  • KEYUTIL — загрузка и преобразование ключей
  • RSAKey / KJUR.crypto.ECDSA — подпись и проверка

Внутренняя модель данных CMS

Структуры CMS в Jsrsasign можно рассматривать как дерево:

  • ContentInfo

    • contentType OID

    • content

      • SignedData / EnvelopedData

        • SignerInfo / RecipientInfo
        • EncryptedContentInfo
        • Certificates

Каждый узел представляет ASN.1 объект, сериализуемый через DER encoder библиотеки.