CMS (Cryptographic Message Syntax) представляет собой стандарт
ASN.1-структур, описывающий формат защищённых сообщений: подписанных,
зашифрованных, а также комбинированных конструкций. В рамках библиотеки
Jsrsasign реализация CMS сосредоточена в пространстве имён
KJUR.asn1.cms, где представлены классы для построения и
разбора структур уровня ContentInfo, SignedData, EnvelopedData и
связанных с ними компонентов.
CMS базируется на иерархии вложенных ASN.1-структур. Центральным
элементом выступает контейнер ContentInfo, внутри которого
размещается один из типов содержимого:
Каждый из этих типов в Jsrsasign реализуется через соответствующие
классы KJUR.asn1.cms.*, формирующие корректные ASN.1
DER-структуры.
ContentInfo является корневым контейнером
CMS-сообщения.
new KJUR.asn1.cms.ContentInfo(params)
Параметры:
contentType — OID типа содержимогоcontent — ASN.1 объект содержимого (SignedData,
EnvelopedData и т.д.)toASN1Object() Формирует ASN.1 структуру ContentInfo.
getEncodedHex() Возвращает DER-представление в hex-формате.
getPEM() Генерирует PEM-строку с заголовками CMS.
SignedData реализует структуру цифровой подписи, позволяющую подтвердить целостность и подлинность данных.
SignedData включает:
new KJUR.asn1.cms.SignedData(params)
contentType — тип подписываемого контентаcontent — исходные данныеsignerInfos — массив подписантовcerts — сертификаты X.509crls — списки отзыва сертификатовsetContent(dataHex) Устанавливает данные для подписи.
addSigner(params) Добавляет информацию о подписанте.
Параметры подписанта:
cert — сертификатprivateKey — приватный ключhashAlg — алгоритм хеширования (SHA-256, SHA-512 и
др.)getContentInfo() Возвращает объект ContentInfo, содержащий SignedData.
SignerInfo описывает одного подписанта в структуре SignedData.
setSignerCert(cert) Устанавливает сертификат подписанта.
setPrivateKey(prvKey) Назначает приватный ключ.
sign() Выполняет вычисление подписи.
EnvelopedData используется для шифрования данных для одного или нескольких получателей.
new KJUR.asn1.cms.EnvelopedData(params)
content — исходные данныеrecipientCerts — сертификаты получателейencAlg — симметрический алгоритм (AES-256-CBC и
др.)setContent(dataHex) Установка данных для шифрования.
addRecipient(cert) Добавление получателя.
encrypt() Выполнение шифрования контента.
getContentInfo() Возвращает CMS ContentInfo с EnvelopedData.
RecipientInfo описывает получателя зашифрованного сообщения.
setCert(cert) Устанавливает сертификат получателя.
wrapKey(symKey) Шифрует симметрический ключ публичным ключом получателя.
Определяет структуру зашифрованного содержимого.
Класс применяется внутри EnvelopedData и EncryptedData для представления зашифрованного блока данных.
Jsrsasign использует внутренний реестр OID для CMS-операций:
2.16.840.1.101.3.4.2.11.2.840.113549.1.1.12.16.840.1.101.3.4.1.42Алгоритмы связываются через KJUR.crypto.OID и
KJUR.asn1.x509.AlgorithmIdentifier.
В пространстве KJUR.asn1.cms присутствуют утилитарные
функции:
При создании подписанного сообщения выполняется следующая последовательность:
CMS допускает комбинирование структур:
В Jsrsasign это выражается вложенной композицией ContentInfo внутри другого ContentInfo.
CMS тесно связан с:
KJUR.crypto — криптографические операцииKJUR.asn1.x509 — сертификаты X.509KEYUTIL — загрузка и преобразование ключейRSAKey / KJUR.crypto.ECDSA — подпись и
проверкаСтруктуры CMS в Jsrsasign можно рассматривать как дерево:
ContentInfo
contentType OID
content
SignedData / EnvelopedData
Каждый узел представляет ASN.1 объект, сериализуемый через DER encoder библиотеки.