Класс KJUR.asn1.cms.SignedData

KJUR.asn1.cms.SignedData представляет собой реализацию структуры CMS (Cryptographic Message Syntax), соответствующей стандарту PKCS

SignedData является центральным элементом CMS, обеспечивающим механизм вложенной цифровой подписи, где данные сопровождаются набором подписантов, алгоритмами хеширования и сертификатами, необходимыми для проверки подлинности.

Структура CMS SignedData

CMS SignedData в ASN.1-терминах включает несколько ключевых компонентов:

  • version — версия структуры SignedData
  • digestAlgorithms — набор алгоритмов хеширования, использованных подписантами
  • encapContentInfo — инкапсулированное содержимое (данные или ссылка на них)
  • certificates — набор X.509 сертификатов
  • crls — список отозванных сертификатов (опционально)
  • signerInfos — информация о подписантах

KJUR.asn1.cms.SignedData моделирует эту структуру в JavaScript-объекте, обеспечивая генерацию ASN.1 последовательности.

Назначение KJUR.asn1.cms.SignedData

Основная задача класса заключается в создании корректной CMS-структуры, пригодной для:

  • формирования PKCS#7 подписанных сообщений
  • инкапсуляции подписанных данных
  • объединения нескольких подписей в одном контейнере
  • подготовки данных для криптографической верификации

SignedData не занимается криптографическими вычислениями напрямую, а работает как структурный слой над результатами подписания.

Конструкция объекта

Инициализация SignedData обычно происходит через передачу конфигурационного объекта, содержащего основные элементы CMS:

  • contentType — тип содержимого (обычно data)
  • content — исходные данные или ASN.1-структура
  • certs — массив сертификатов X.509
  • signerInfos — список подписантов с их подписью и метаданными
  • digestAlgorithms — используемые алгоритмы хеширования

Внутренняя структура формируется на основе ASN.1 классов jsrsasign и сериализуется в DER-представление.

ASN.1 представление

SignedData в ASN.1 можно представить следующим образом:

SignedData ::= SEQUENCE {
  version CMSVersion,
  digestAlgorithms SET OF DigestAlgorithmIdentifier,
  encapContentInfo EncapsulatedContentInfo,
  certificates [0] IMPLICIT CertificateSet OPTIONAL,
  crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
  signerInfos SET OF SignerInfo
}

KJUR.asn1.cms.SignedData отражает эту структуру через вложенные объекты ASN.1, создаваемые через KJUR.asn1 и KJUR.asn1.cms пространства имён.

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

version

Определяет версию CMS SignedData. Обычно фиксируется значение 1 или 3 в зависимости от наличия атрибутов и сертификатов.

digestAlgorithms

Содержит список алгоритмов хеширования, например SHA-256 или SHA-1. Используется всеми подписантами.

encapContentInfo

Структура, содержащая:

  • eContentType — тип данных
  • eContent — сами данные или их ASN.1 представление

certificates

Набор X.509 сертификатов, необходимых для проверки подписей.

signerInfos

Наиболее важная часть, содержащая:

  • идентификатор подписанта
  • алгоритм подписи
  • подписанные атрибуты
  • значение подписи

Формирование SignedData

Создание SignedData обычно происходит через сбор уже сформированных компонентов:

  • данные, которые требуется подписать
  • результат криптографической подписи
  • сертификаты подписанта
  • параметры алгоритмов

Далее объект собирается в ASN.1 последовательность.

Пример структуры формирования:

var sd = new KJUR.asn1.cms.SignedData({
  version: 1,
  digestAlgorithms: ["sha256"],
  contentInfo: {
    contentType: "data",
    content: "616263"
  },
  certificates: [certObj],
  signerInfos: [signerInfoObj]
});

Encapsulated Content Info

Поле encapContentInfo играет ключевую роль в структуре CMS. Оно определяет, каким образом данные включены в подпись:

  • инкапсулированные (embedded content)
  • или внешние (detached signature)

В случае инкапсуляции данные хранятся внутри SignedData, что делает структуру самодостаточной.

SignerInfo и связь с SignedData

SignerInfo представляет подпись одного участника. В контексте SignedData может присутствовать несколько signerInfos, что позволяет реализовать мультиподпись.

Каждый signerInfo включает:

  • SID (Signer Identifier)
  • digestAlgorithm
  • signedAttrs
  • signatureAlgorithm
  • signatureValue

SignedData агрегирует все signerInfos в единую ASN.1 структуру SET.

Работа с сертификатами

SignedData может включать сертификаты в поле certificates. Они используются для:

  • построения цепочки доверия
  • проверки подписи
  • извлечения публичных ключей

KJUR.asn1.cms.SignedData не выполняет валидацию сертификатов, а лишь включает их в структуру.

Сериализация в DER

Финальная стадия работы SignedData — преобразование в ASN.1 DER формат. Это выполняется через внутренние методы jsrsasign:

  • toASN1Object()
  • toHex()

DER-структура используется в протоколах PKCS#7, S/MIME и CMS-сообщениях.

Пример генерации ASN.1 структуры

Процесс построения SignedData можно описать через последовательное формирование компонентов:

var signedData = new KJUR.asn1.cms.SignedData({
  version: 1,
  digestAlgorithms: ["sha256"],
  encapContentInfo: {
    eContentType: "data",
    eContent: "546573742064617461"
  },
  certificates: [cert1, cert2],
  signerInfos: [signerInfo]
});

var asn1 = signedData.toASN1Object();
var hex = asn1.getEncodedHex();

Особенности работы с multiple signers

При наличии нескольких подписантов структура signerInfos превращается в SET OF SignerInfo, где порядок не фиксирован. Это важно для совместимости с CMS-реализациями других платформ.

Каждый подписант может использовать:

  • разные алгоритмы подписи
  • разные сертификаты
  • независимые атрибуты подписи

SignedData агрегирует их без изменения криптографической логики.

Инкапсуляция данных и detached signatures

SignedData поддерживает два основных режима:

  • attached signature — данные встроены в CMS
  • detached signature — данные отсутствуют внутри структуры, хранятся отдельно

В случае detached подписи encapContentInfo содержит пустое значение eContent.

Связь с PKCS#7

KJUR.asn1.cms.SignedData является прямой реализацией PKCS#7 SignedData, расширенной до CMS-совместимого формата. Это позволяет использовать структуру в:

  • S/MIME сообщениях
  • криптографических контейнерах
  • системах электронной подписи

Внутреннее представление в jsrsasign

Внутри библиотеки объект SignedData строится через комбинацию:

  • KJUR.asn1.ASN1Object
  • KJUR.asn1.DERSequence
  • KJUR.asn1.cms.ContentInfo
  • KJUR.asn1.cms.SignerInfo

SignedData выступает как агрегатор этих структур.

Ограничения и особенности реализации

SignedData в jsrsasign не выполняет:

  • проверку цепочек сертификатов
  • криптографическое хеширование данных
  • валидацию подписей

Его задача ограничена формированием корректной ASN.1 структуры, соответствующей стандарту CMS.

Использование в связке с другими классами

SignedData обычно применяется совместно с:

  • KJUR.crypto.Signature — для генерации подписи
  • KJUR.asn1.x509.X500Name — для идентификации подписанта
  • KJUR.asn1.x509.Certificate — для работы с сертификатами
  • KJUR.asn1.cms.SignerInfo — для формирования подписей

Эти компоненты формируют полный цикл создания CMS SignedData-объекта.

Обработка бинарных данных

Данные внутри SignedData часто представлены в hex-формате или DER-кодировке. jsrsasign использует строгую ASN.1 типизацию, поэтому любые текстовые данные предварительно преобразуются в бинарное представление.

Взаимодействие с криптографическими алгоритмами

SignedData поддерживает различные алгоритмы через digestAlgorithms:

  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

Алгоритмы указываются как OID или строковые идентификаторы, которые затем преобразуются в ASN.1 AlgorithmIdentifier.

Формирование ContentInfo обёртки

SignedData обычно не используется напрямую, а помещается внутрь структуры ContentInfo:

ContentInfo ::= SEQUENCE {
  contentType SignedData,
  content SignedData
}

KJUR.asn1.cms.ContentInfo обеспечивает этот уровень обёртки, делая SignedData частью CMS сообщения.

Работа с OID идентификаторами

В CMS каждая часть структуры идентифицируется через OID. SignedData использует:

  • 1.2.840.113549.1.7.2 — SignedData
  • 1.2.840.113549.1.9.16.x — расширения CMS

KJUR.asn1.cms.SignedData автоматически подставляет корректные OID при генерации структуры.