Класс KJUR.asn1.cades.SignatureTimeStamp

KJUR.asn1.cades.SignatureTimeStamp представляет собой реализацию структуры атрибута подписи временной метки в рамках стандарта CAdES (CMS Advanced Electronic Signatures). Этот атрибут используется для доказательства существования цифровой подписи в конкретный момент времени и опирается на криптографически защищённые ответы службы временных меток (TSA — Time Stamping Authority).

В контексте CMS/PKCS#7 данный элемент входит в набор подписанных атрибутов (signed attributes) и обеспечивает усиление доверия к подписи за счёт независимого подтверждения времени её формирования.


Роль SignatureTimeStamp в CAdES

В структуре CAdES временная метка подписи фиксирует момент, когда значение подписи уже существовало и было неизменным. Это критически важно для:

  • предотвращения заднего числа подписей
  • доказательства существования подписи до истечения сертификата
  • подтверждения корректности долгосрочной валидации (LTV)

SignatureTimeStamp относится к атрибутам, которые накладываются поверх уже вычисленной подписи, а не участвуют в её первичном вычислении.


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

В терминах ASN.1 атрибут SignatureTimeStamp соответствует следующей логике:

  • Attribute ::= SEQUENCE

    • attrType (OID)
    • attrValues (SET OF AttributeValue)

Значение attrValues содержит один или несколько элементов:

  • TimeStampToken ::= ContentInfo (CMS)

    • signedData

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

Ключевой элемент внутри — TSTInfo, который содержит:

  • genTime — время формирования метки
  • messageImprint — хэш от подписываемых данных
  • serialNumber — идентификатор токена
  • tsa policy
  • accuracy (опционально)

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

Класс KJUR.asn1.cades.SignatureTimeStamp является частью подсистемы CAdES и используется при формировании расширенных CMS-структур.

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

  • KJUR.asn1.cms.SignedData
  • KJUR.asn1.cms.Attribute
  • KJUR.crypto.TSAClient
  • KJUR.asn1.tsp.TimeStampReq

Назначение класса

Основная функция класса заключается в создании ASN.1-структуры атрибута, который содержит временную метку подписи.

Формируемая структура используется внутри:

  • signedAttributes CMS SignedData
  • CAdES-BES и CAdES-EPES профилей
  • LTV-расширений (long-term validation)

Конструктор и параметры

Типичный вызов конструктора включает данные временной метки, полученные от TSA:

  • derTimeStampToken — DER-кодированная CMS структура
  • параметры кодирования ASN.1

Псевдоструктура:

new KJUR.asn1.cades.SignatureTimeStamp({
  der: "..."
});

Внутренне класс не генерирует временную метку самостоятельно, а оборачивает уже полученный ответ TSA.


Формирование временной метки

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

  1. Вычисление хэша подписи (signature value)
  2. Формирование запроса TimeStampReq
  3. Отправка запроса в TSA
  4. Получение TimeStampToken
  5. Инкапсуляция токена в SignatureTimeStamp атрибут

Пример формирования запроса TSA

var tsa = new KJUR.crypto.TSAClient({
  url: "https://tsa.example.com"
});

tsa.getTimeStampToken(signatureHex, function(res) {
  var tst = new KJUR.asn1.cades.SignatureTimeStamp({
    der: res
  });
});

Встраивание в SignedAttributes

SignatureTimeStamp добавляется в набор подписанных атрибутов CMS:

var signedAttrs = [
  new KJUR.asn1.cms.ContentType({ oid: "1.2.840.113549.1.7.1" }),
  new KJUR.asn1.cms.MessageDigest({ hash: digest }),
  new KJUR.asn1.cades.SignatureTimeStamp({ der: tstToken })
];

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


Внутренняя структура объекта

После декодирования DER структура содержит:

  • ContentInfo

    • contentType: id-signedData

    • content:

      • SignedData

        • version

        • digestAlgorithms

        • encapContentInfo

        • certificates

        • signerInfos

          • unsignedAttributes (опционально)

            • SignatureTimeStamp

Особенности обработки DER

Класс работает исключительно с бинарным представлением ASN.1:

  • вход: DER (hex string или ArrayBuffer)
  • выход: ASN.1 Object Identifier + SET OF OCTET STRING

При обработке важны:

  • корректная вложенность SEQUENCE
  • строгая совместимость с RFC 3161
  • корректное кодирование UTCTime/GeneralizedTime

Связь с RFC 3161

SignatureTimeStamp опирается на стандарт:

  • RFC 3161 — Time-Stamp Protocol (TSP)

Ключевые элементы:

  • TimeStampReq — запрос
  • TimeStampResp — ответ
  • TSTInfo — содержимое метки

SignatureTimeStamp фактически инкапсулирует TimeStampToken из ответа TSA.


Использование в CAdES-BES и CAdES-XL

В профилях CAdES:

  • CAdES-BES: базовая подпись + атрибуты
  • CAdES-T: добавление SignatureTimeStamp
  • CAdES-XL: расширенные данные + цепочки сертификатов + временные метки

SignatureTimeStamp является основой перехода от BES к T-профилю.


Валидация SignatureTimeStamp

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

  • извлечение TimeStampToken
  • проверка подписи TSA
  • сверка messageImprint с исходным хэшем подписи
  • проверка времени genTime
  • проверка сертификата TSA

Несовпадение messageImprint означает нарушение целостности подписи.


Типичные ошибки интеграции

Часто встречающиеся проблемы:

  • использование не DER-encoded токена
  • передача не хэша, а исходных данных в TSA
  • отсутствие корректного MessageImprint
  • несоответствие алгоритма хэширования TSA и подписи
  • нарушение структуры SignedAttributes (отсутствие SET OF)

Криптографическая значимость

SignatureTimeStamp усиливает модель доверия:

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

Ключевой принцип — доверие переносится на TSA как независимый источник времени.


ASN.1 детали MessageImprint

MessageImprint внутри TSTInfo содержит:

  • hashAlgorithm (OID, например SHA-256)
  • hashedMessage (octet string)

Это значение должно соответствовать:

hash(signatureValue)

Интероперабельность

Структуры, создаваемые KJUR.asn1.cades.SignatureTimeStamp, совместимы с:

  • Adobe PDF Advanced Signatures
  • ETSI CAdES профилями
  • Java BouncyCastle CMS
  • OpenSSL CMS verify (при корректной упаковке)

Обработка нескольких временных меток

Хотя стандарт допускает множественные атрибуты, SignatureTimeStamp обычно:

  • один на уровень подписи
  • может дополняться архивными временными метками (ArchiveTimeStampV3)

Взаимодействие с KJUR.asn1.cades

SignatureTimeStamp используется совместно с другими атрибутами:

  • SigningTime
  • SigningCertificate
  • CompleteCertificateRefs
  • CompleteRevocationRefs

Он не заменяет SigningTime, а криптографически подтверждает его и сам факт подписи.


Структурная роль в CMS

В CMS дерево выглядит следующим образом:

  • ContentInfo

    • SignedData

      • SignerInfo

        • signedAttributes

          • MessageDigest
          • ContentType
          • SignatureTimeStamp

SignatureTimeStamp размещается именно в signedAttributes, а не unsignedAttributes, что принципиально для CAdES-T.


Алгоритмические требования TSA

Для корректной работы требуются:

  • SHA-256 или выше
  • RSA или ECDSA подпись TSA
  • корректная политика TSA (OID policy identifier)

Значение для долгосрочной валидации

SignatureTimeStamp является критическим элементом LTV:

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

Поведение при декодировании

При разборе через jsrsasign:

  • DER преобразуется в ASN.1 объект
  • извлекается ContentInfo
  • парсится SignedData
  • выделяется TSTInfo

Ошибки парсинга обычно связаны с некорректным ASN.1 тегированием или повреждённым DER.