Структура TimeStampResponse

TimeStampResponse в протоколе RFC 3161 представляет собой ASN.1 структуру ответа службы временных меток (TSA), которая возвращается клиенту после запроса TimeStampRequest. В библиотеке Jsrsasign эта структура разбирается и обрабатывается как объект, содержащий статус выполнения запроса и криптографически защищённый токен временной метки.

Основная задача TimeStampResponse заключается в том, чтобы подтвердить факт существования определённых данных на момент времени, зафиксированный доверенным источником. Вся структура делится на две крупные части: информация о статусе обработки запроса и сам токен временной метки, который представляет собой CMS SignedData.


Первым ключевым элементом TimeStampResponse является структура PKIStatusInfo. Она определяет результат обработки запроса TSA-сервером.

Состав PKIStatusInfo:

  • status (PKIStatus) Целочисленное значение, отражающее итог выполнения запроса:

    • 0 — granted (запрос успешно обработан)
    • 1 — grantedWithMods (запрос обработан с изменениями)
    • 2 — rejection (отклонён)
    • 3 — waiting (ожидание обработки)
    • 4 — revocationWarning (предупреждение об отзыве)
    • 5 — revocationNotification (уведомление об отзыве)
  • statusString (PKIFreeText) Опциональное текстовое поле, содержащее человекочитаемое описание результата. Может включать несколько строк с пояснениями от TSA.

  • failInfo (PKIFailureInfo) Битовое поле, уточняющее причину ошибки при отклонении запроса. Используется только при статусах отказа. Возможные флаги включают:

    • badAlg — неподдерживаемый алгоритм
    • timeNotAvailable — время недоступно
    • badRequest — некорректный запрос
    • systemFailure — системная ошибка

В Jsrsasign данный блок обычно интерпретируется как объект, содержащий числовой статус и дополнительные строки диагностики, которые можно извлечь после парсинга DER-структуры.


TimeStampToken — криптографическое ядро ответа

Вторая и наиболее важная часть TimeStampResponse — это TimeStampToken. Он присутствует только в случае успешной обработки запроса (status = 0 или 1) и содержит саму подпись временной метки.

TimeStampToken реализуется как структура CMS (Cryptographic Message Syntax), а именно SignedData.

Внутреннее устройство TimeStampToken:

  • ContentInfo

    • contentType: id-signedData
    • content: SignedData структура
  • SignedData

    • version — версия CMS структуры
    • digestAlgorithms — список алгоритмов хеширования
    • encapContentInfo — инкапсулированное содержимое
    • certificates — цепочка сертификатов TSA
    • crls — списки отзыва сертификатов (опционально)
    • signerInfos — информация о подписи

Особенность TimeStampToken заключается в том, что он содержит не произвольные данные, а специально сформированное значение TSTInfo.


TSTInfo — данные временной метки

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

Ключевые поля TSTInfo:

  • version — версия структуры (обычно 1)

  • policy — OID политики TSA

  • messageImprint

    • hashAlgorithm — алгоритм хеширования
    • hashedMessage — хеш исходных данных из TimeStampRequest
  • serialNumber — уникальный номер временной метки

  • genTime — зафиксированное время создания метки

  • accuracy — точность времени (в секундах, миллисекундах, микросекундах)

  • nonce — случайное значение для защиты от повторов

  • tsa — идентификатор центра времени (опционально)

  • extensions — дополнительные расширения

Именно genTime является ключевым элементом, подтверждающим существование данных на конкретный момент времени.


Представление TimeStampResponse в Jsrsasign

В Jsrsasign работа с TimeStampResponse обычно осуществляется через модуль TSP (Time Stamping Protocol), входящий в пространство имён KJUR.asn1.tsp.

Объект TimeStampResponse после декодирования DER/PEM представляет собой JavaScript-структуру, где основные элементы доступны как свойства:

  • status.status
  • status.statusString
  • status.failInfo
  • timeStampToken

При наличии токена он дополнительно декодируется как CMS SignedData через встроенные парсеры Jsrsasign.


Разбор бинарного представления

TimeStampResponse кодируется в ASN.1 DER формате. При парсинге библиотека последовательно извлекает:

  1. ASN.1 Sequence верхнего уровня
  2. PKIStatusInfo
  3. Optional TimeStampToken

Внутренне Jsrsasign использует ASN.1 парсер, который преобразует бинарные данные в объектную структуру. Для CMS части применяется отдельный разборщик SignedData, так как формат повторно используется в S/MIME и PKCS#7.


Взаимосвязь с TimeStampRequest

TimeStampResponse всегда является ответом на TimeStampRequest. Связь между ними обеспечивается через поле messageImprint:

  • клиент отправляет хеш данных
  • TSA проверяет корректность
  • TSA возвращает тот же hash в TSTInfo.messageImprint

Если хеши не совпадают, TimeStampResponse не формируется как успешный и возвращается ошибка в PKIStatusInfo.


Особенности обработки в Jsrsasign

При работе с TimeStampResponse в Jsrsasign важно учитывать несколько особенностей:

  • CMS структура может быть вложенной и требует отдельного декодирования
  • сертификаты TSA могут быть встроены прямо в SignedData
  • проверка подписи требует извлечения публичного ключа TSA-сертификата
  • время genTime не следует использовать без проверки подписи токена

Jsrsasign предоставляет низкоуровневые средства для декодирования ASN.1, но проверка криптографической целостности требует корректной обработки всей цепочки CMS.


Структурная схема TimeStampResponse

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

  • TimeStampResponse

    • PKIStatusInfo

      • status
      • statusString
      • failInfo
    • TimeStampToken (опционально)

      • ContentInfo

        • SignedData

          • TSTInfo

            • messageImprint
            • genTime
            • serialNumber
            • accuracy

Практическое значение структуры

TimeStampResponse является связующим звеном между криптографическим запросом и доказательством времени существования данных. Его структура построена таким образом, чтобы обеспечивать:

  • однозначную идентификацию результата обработки
  • криптографическую неизменяемость временной метки
  • возможность проверки через стандарт CMS
  • совместимость с PKI-инфраструктурами

В Jsrsasign эта структура выступает как комплексный объект, объединяющий ASN.1 декодирование, CMS обработку и извлечение временных атрибутов.