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

Модуль KJUR.asn1.cades в библиотеке Jsrsasign предназначен для работы с расширениями формата CMS Advanced Electronic Signatures (CAdES). Он реализует структуры ASN.1, необходимые для формирования, разбора и проверки расширенных электронных подписей, соответствующих стандарту CAdES (ETSI EN 319 122 / 319 132).

Основная задача этого пространства имён — предоставление высокоуровневых классов для создания и обработки подписанных данных CMS (Cryptographic Message Syntax) с дополнительными атрибутами, такими как временные метки, политика подписи, доказательства подлинности и долгосрочная проверка (LTV).


Общая архитектура CAdES в Jsrsasign

CAdES строится поверх CMS/PKCS#7 и расширяет его через набор подписанных и неподписанных атрибутов.

Внутри KJUR.asn1.cades реализуются:

  • структуры SignedData с расширенными атрибутами
  • объекты подписанных и неподписанных атрибутов
  • контейнеры для временных меток
  • механизмы долгосрочной валидации (LT, LTA уровни)
  • вспомогательные ASN.1 классы для кодирования DER

Базовая идея — строгая совместимость с ASN.1 схемами ETSI, где каждая структура представлена отдельным классом.


Основные классы KJUR.asn1.cades

CAdESAttribute

Базовый класс для всех атрибутов CAdES. Представляет ASN.1 структуру Attribute.

Содержит:

  • OID атрибута
  • значение (ASN.1 SET или SEQUENCE)

Используется как родительский класс для всех специализированных атрибутов.

Ключевая роль — унификация сериализации атрибутов в SignedAttributes.


CAdESAttributes

Контейнер для набора атрибутов.

Функциональность:

  • хранение массива CAdESAttribute
  • преобразование в ASN.1 SetOf
  • проверка уникальности OID
  • сериализация в DER

Используется при формировании блока signedAttrs в CMS подписи.


CAdESSignaturePolicyIdentifier

Класс, реализующий атрибут политики подписи.

Содержит:

  • идентификатор политики (OID)
  • хэш политики
  • алгоритм хэширования

Используется для привязки подписи к формальной политике, определяющей правила создания и проверки подписи.

Структура соответствует:

  • SignaturePolicyIdentifier ::= CHOICE

    • SignaturePolicyId
    • SignaturePolicyImplied

CAdESSigningCertificate

Представление сертификата подписанта в виде хэш-структуры.

Поддерживает:

  • ESSCertID
  • ESSCertIDv2

Функции:

  • генерация SHA-1 / SHA-256 отпечатка сертификата
  • упаковка в ASN.1 структуру ESSCertID
  • поддержка цепочек сертификатов

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


CAdESContentTimestamp

Реализация атрибута временной метки содержимого.

Функции:

  • создание запроса на timestamp
  • упаковка TimeStampToken
  • интеграция с TSP (Time Stamping Protocol)

Структура:

  • ContentTimestamp ::= TimeStampToken

Используется для доказательства существования данных в момент времени.


CAdESSignatureTimeStamp

Класс для временной метки самой подписи.

Отличие от ContentTimestamp:

  • применяется к значению signatureValue
  • обеспечивает доказательство существования подписи

Формирует:

  • TimeStampToken над подписью DER encoded

CAdESArchiveTimeStamp

Один из ключевых классов уровня LTA (Long Term Archival).

Функции:

  • создание архивных временных меток
  • включение всех предыдущих атрибутов подписи
  • формирование цепочки доказательств

Используется для длительного хранения подписи с возможностью проверки спустя годы.


CAdESCompleteCertificateRefs

Структура, содержащая ссылки на все сертификаты цепочки.

Содержит:

  • хэш сертификатов
  • идентификаторы issuer/serial
  • поддержку полной цепочки доверия

Используется для offline проверки подписи.


CAdESCertificateValues

Хранилище самих сертификатов, используемых в подписи.

Функции:

  • упаковка X.509 сертификатов в ASN.1
  • включение в SignedData
  • обеспечение автономной проверки

CAdESRevocationValues

Класс для хранения данных об отзыве сертификатов.

Поддерживает:

  • CRL (Certificate Revocation List)
  • OCSP responses

Позволяет проверять действительность сертификата на момент подписания.


Работа с Signed Attributes

Signed attributes — ключевая часть CAdES. Они кодируются как ASN.1 SET OF Attribute и подписываются вместе с хэшом данных.

Основные правила:

  • атрибуты сортируются по DER правилам
  • каждый атрибут имеет уникальный OID
  • изменение любого атрибута делает подпись недействительной

В Jsrsasign это реализуется через:

  • CAdESAttributes
  • CAdESAttribute

Unsigned Attributes

Unsigned attributes не включаются в хэш подписи, но добавляются в SignedData после вычисления подписи.

Типичные примеры:

  • временные метки
  • архивные метки
  • доказательства проверки сертификатов

В реализации Jsrsasign они хранятся отдельно и добавляются в unsignedAttrs.


Формирование CAdES структуры

Процесс построения CAdES подписи включает несколько этапов:

  1. Формирование SignedData (CMS)

  2. Создание SignedAttributes:

    • signing time
    • signing certificate
    • policy identifier
  3. Вычисление подписи

  4. Добавление UnsignedAttributes:

    • timestamp
    • revocation data
    • archive timestamp

ASN.1 сериализация

Все классы KJUR.asn1.cades используют базовые механизмы Jsrsasign:

  • DER encoding
  • ASN.1 SEQUENCE / SET
  • OID representation

Каждый объект имеет метод:

  • toASN1Object()

Он возвращает структуру, готовую к сериализации в DER.


Взаимодействие с другими модулями Jsrsasign

KJUR.asn1.cades тесно связан с:

  • KJUR.crypto — криптографические операции
  • KJUR.asn1.cms — базовый CMS слой
  • KJUR.asn1.x509 — работа с сертификатами
  • KJUR.jws — JWT (в некоторых сценариях)

CAdES фактически является расширением CMS, поэтому использует его структуры как основу.


Пример логики построения атрибутов

Типичная цепочка создания атрибутов выглядит следующим образом:

  • создание хэша сертификата
  • формирование SigningCertificate
  • добавление SignaturePolicyIdentifier
  • упаковка всех атрибутов в SignedAttributes
  • DER сериализация перед подписью

Каждый шаг строго соответствует ASN.1 спецификации ETSI.


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

  • Полная JavaScript-реализация ASN.1 без нативных зависимостей
  • Поддержка DER encoding на уровне байтовых массивов
  • Гибкость при формировании нестандартных атрибутов
  • Возможность ручного контроля структуры подписи

Ограничения и нюансы

  • Нет автоматической проверки политик подписи
  • Требуется ручное управление OCSP/CRL данными
  • Timestamp должен предоставляться внешним TSA сервисом
  • LTA уровень требует ручной сборки архивных атрибутов

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

  • электронные подписи документов в корпоративных системах
  • юридически значимые подписи с долгосрочной проверкой
  • интеграция с государственными PKI
  • формирование подписей уровня CAdES-BES / CAdES-T / CAdES-A

Структурная роль модуля

KJUR.asn1.cades выступает как слой над CMS, добавляющий:

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