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

Пространство имен KJUR.asn1.tsp в библиотеке Jsrsasign реализует структуры ASN.1, необходимые для работы с протоколом TSP (Time-Stamp Protocol, RFC 3161). Этот протокол применяется для создания доверенных временных меток, фиксирующих факт существования данных в определённый момент времени.

Архитектура модуля ориентирована на формирование и разбор ASN.1-структур запросов и ответов службы временных меток, включая контроль целостности данных, криптографические хэши и параметры подписи.


Модуль построен вокруг набора классов, соответствующих ASN.1-структурам протокола:

  • TimeStampReq
  • TimeStampResp
  • TSTInfo
  • MessageImprint
  • Accuracy
  • PKIStatusInfo

Каждый класс наследует базовую логику ASN.1-объектов Jsrsasign и предоставляет методы сериализации в DER/HEX и, в ряде случаев, вспомогательные методы построения вложенных структур.


TimeStampReq: структура запроса временной метки

Класс TimeStampReq соответствует ASN.1-структуре запроса RFC 3161.

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

Запрос временной метки включает:

  • version — версия протокола (обычно 1)
  • messageImprint — хэш данных и алгоритм хэширования
  • reqPolicy — идентификатор политики TSA (опционально)
  • nonce — случайное число для защиты от повторов
  • certReq — флаг запроса сертификата TSA

MessageImprint

Внутренний объект MessageImprint описывает хэшируемые данные:

  • hashAlgorithm — OID алгоритма (например, SHA-256)
  • hashedMessage — результат хэширования данных

Конструктор TimeStampReq

Создание запроса обычно опирается на передачу конфигурационного объекта:

  • версия протокола
  • алгоритм хэширования
  • хэш сообщения
  • дополнительные параметры политики и nonce

Метод getEncodedHex()

Основной метод сериализации:

  • формирует DER-представление ASN.1 структуры
  • возвращает результат в HEX-формате

Используется при передаче запроса в TSA (Time Stamping Authority).


TimeStampResp: структура ответа TSA

Класс TimeStampResp инкапсулирует ответ службы временных меток.

Состав структуры

  • status — результат обработки запроса (PKIStatusInfo)
  • timeStampToken — криптографический токен CMS (если запрос успешен)

PKIStatusInfo

Объект PKIStatusInfo описывает состояние обработки запроса.

Поля:

  • status — код состояния (0–5 по RFC 3161)
  • statusString — текстовое описание
  • failInfo — дополнительная информация об ошибке

Типичные значения status:

  • 0 — granted (успешно)
  • 1 — grantedWithMods
  • 2 — rejection
  • 3 — waiting
  • 4 — revocationWarning
  • 5 — revocationNotification

TSTInfo: ядро временной метки

TSTInfo представляет собой основную структуру временной метки внутри CMS-токена.

Поля TSTInfo

  • version — версия структуры
  • policy — OID политики TSA
  • messageImprint — исходный хэш данных
  • serialNumber — уникальный номер метки
  • genTime — точное время генерации
  • accuracy — точность времени
  • ordering — признак упорядоченности меток
  • nonce — исходное значение nonce
  • tsa — идентификатор TSA

genTime

Поле genTime критически важно для временной метки и кодируется в формате ASN.1 GeneralizedTime. Jsrsasign обеспечивает корректную сериализацию времени в UTC-формате.


Accuracy: точность временной метки

Класс Accuracy описывает допустимую погрешность времени.

Структура:

  • seconds — секунды
  • millis — миллисекунды
  • micros — микросекунды

Эти значения кодируются как отдельные ASN.1 INTEGER поля и могут комбинироваться.


MessageImprint: контроль целостности

Класс MessageImprint является ключевым элементом как запроса, так и ответа.

Состав:

  • hashAlgorithm — алгоритм хэширования (OID)
  • hashedMessage — бинарный хэш

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

В Jsrsasign алгоритм хэширования представляется ASN.1-структурой AlgorithmIdentifier, включающей:

  • OID алгоритма
  • параметры (обычно NULL)

Методы сериализации ASN.1 объектов

Все основные классы KJUR.asn1.tsp используют единый подход к сериализации.

getEncodedHex()

Базовый метод:

  • преобразует ASN.1 дерево в DER-структуру
  • возвращает HEX-строку

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


Внутренняя модель ASN.1

Каждый объект строится на основе:

  • ASN1Object
  • ASN1Sequence
  • ASN1Integer
  • ASN1OctetString
  • ASN1UTCTime / ASN1GeneralizedTime

Эта модель обеспечивает строгую совместимость с RFC 3161.


Взаимодействие классов внутри TSP

Процесс формирования временной метки включает последовательную вложенность объектов:

  1. MessageImprint формирует хэш данных
  2. TimeStampReq инкапсулирует запрос
  3. TSA возвращает TimeStampResp
  4. Внутри timeStampToken содержится CMS-структура
  5. TSTInfo извлекается из CMS и содержит итоговую метку

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

Модуль KJUR.asn1.tsp отличается следующими характеристиками:

  • строгая привязка к ASN.1 спецификации RFC 3161
  • совместимость с CMS (Cryptographic Message Syntax)
  • использование OID-ориентированной модели криптографических алгоритмов
  • поддержка сериализации без внешних зависимостей

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

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

Используются:

  • MessageImprint
  • TimeStampReq

Разбор ответа TSA

Используются:

  • TimeStampResp
  • PKIStatusInfo
  • CMS-декодер Jsrsasign
  • TSTInfo

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

Типовая структура TSTInfo в ASN.1 выглядит следующим образом:

  • SEQUENCE

    • INTEGER version
    • OBJECT IDENTIFIER policy
    • MessageImprint messageImprint
    • INTEGER serialNumber
    • GeneralizedTime genTime
    • Accuracy accuracy (OPTIONAL)
    • BOOLEAN ordering (DEFAULT FALSE)
    • INTEGER nonce (OPTIONAL)
    • GeneralName tsa (OPTIONAL)

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


Работа с OID в TSP

OID (Object Identifier) используется для:

  • алгоритмов хэширования (SHA-1, SHA-256)
  • политик TSA
  • идентификации подписей

В Jsrsasign OID передаётся строкой и преобразуется в ASN.1 OBJECT IDENTIFIER автоматически.


Взаимодействие с CMS-структурами

TimeStampResp часто содержит CMS SignedData, внутри которого находится:

  • EncapsulatedContentInfo
  • TSTInfo (как content)

Jsrsasign обеспечивает совместное использование модулей:

  • KJUR.asn1.cms
  • KJUR.asn1.tsp

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


Обработка nonce и защита от replay-атак

Поле nonce в TimeStampReq и TSTInfo используется для:

  • предотвращения повторного использования ответов TSA
  • связывания запроса и ответа

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


Кодирование и бинарное представление

Все структуры в KJUR.asn1.tsp кодируются в DER:

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

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