KJUR.asn1.cms.SignedData представляет собой реализацию структуры CMS (Cryptographic Message Syntax), соответствующей стандарту PKCS
SignedData является центральным элементом CMS, обеспечивающим механизм вложенной цифровой подписи, где данные сопровождаются набором подписантов, алгоритмами хеширования и сертификатами, необходимыми для проверки подлинности.
CMS SignedData в ASN.1-терминах включает несколько ключевых компонентов:
KJUR.asn1.cms.SignedData моделирует эту структуру в JavaScript-объекте, обеспечивая генерацию ASN.1 последовательности.
Основная задача класса заключается в создании корректной CMS-структуры, пригодной для:
SignedData не занимается криптографическими вычислениями напрямую, а работает как структурный слой над результатами подписания.
Инициализация SignedData обычно происходит через передачу конфигурационного объекта, содержащего основные элементы CMS:
Внутренняя структура формируется на основе ASN.1 классов jsrsasign и сериализуется в DER-представление.
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 пространства имён.
Определяет версию CMS SignedData. Обычно фиксируется значение 1 или 3 в зависимости от наличия атрибутов и сертификатов.
Содержит список алгоритмов хеширования, например SHA-256 или SHA-1. Используется всеми подписантами.
Структура, содержащая:
Набор X.509 сертификатов, необходимых для проверки подписей.
Наиболее важная часть, содержащая:
Создание SignedData обычно происходит через сбор уже сформированных компонентов:
Далее объект собирается в ASN.1 последовательность.
Пример структуры формирования:
var sd = new KJUR.asn1.cms.SignedData({
version: 1,
digestAlgorithms: ["sha256"],
contentInfo: {
contentType: "data",
content: "616263"
},
certificates: [certObj],
signerInfos: [signerInfoObj]
});
Поле encapContentInfo играет ключевую роль в структуре CMS. Оно определяет, каким образом данные включены в подпись:
В случае инкапсуляции данные хранятся внутри SignedData, что делает структуру самодостаточной.
SignerInfo представляет подпись одного участника. В контексте SignedData может присутствовать несколько signerInfos, что позволяет реализовать мультиподпись.
Каждый signerInfo включает:
SignedData агрегирует все signerInfos в единую ASN.1 структуру SET.
SignedData может включать сертификаты в поле certificates. Они используются для:
KJUR.asn1.cms.SignedData не выполняет валидацию сертификатов, а лишь включает их в структуру.
Финальная стадия работы SignedData — преобразование в ASN.1 DER формат. Это выполняется через внутренние методы jsrsasign:
DER-структура используется в протоколах PKCS#7, S/MIME и CMS-сообщениях.
Процесс построения 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();
При наличии нескольких подписантов структура signerInfos превращается в SET OF SignerInfo, где порядок не фиксирован. Это важно для совместимости с CMS-реализациями других платформ.
Каждый подписант может использовать:
SignedData агрегирует их без изменения криптографической логики.
SignedData поддерживает два основных режима:
В случае detached подписи encapContentInfo содержит пустое значение eContent.
KJUR.asn1.cms.SignedData является прямой реализацией PKCS#7 SignedData, расширенной до CMS-совместимого формата. Это позволяет использовать структуру в:
Внутри библиотеки объект SignedData строится через комбинацию:
SignedData выступает как агрегатор этих структур.
SignedData в jsrsasign не выполняет:
Его задача ограничена формированием корректной ASN.1 структуры, соответствующей стандарту CMS.
SignedData обычно применяется совместно с:
Эти компоненты формируют полный цикл создания CMS SignedData-объекта.
Данные внутри SignedData часто представлены в hex-формате или DER-кодировке. jsrsasign использует строгую ASN.1 типизацию, поэтому любые текстовые данные предварительно преобразуются в бинарное представление.
SignedData поддерживает различные алгоритмы через digestAlgorithms:
Алгоритмы указываются как OID или строковые идентификаторы, которые затем преобразуются в ASN.1 AlgorithmIdentifier.
SignedData обычно не используется напрямую, а помещается внутрь структуры ContentInfo:
ContentInfo ::= SEQUENCE {
contentType SignedData,
content SignedData
}
KJUR.asn1.cms.ContentInfo обеспечивает этот уровень обёртки, делая SignedData частью CMS сообщения.
В CMS каждая часть структуры идентифицируется через OID. SignedData использует:
KJUR.asn1.cms.SignedData автоматически подставляет корректные OID при генерации структуры.