Класс KJUR.asn1.tsp.TimeStampResp

ASN.1 структура TimeStampResp определена в RFC 3161 и представляет собой ответ службы штампов времени (TSA). Основное назначение структуры — передача результата обработки запроса на временную метку, включая статус выполнения операции и, при успешной обработке, криптографический токен временной метки.

SEQUENCE TimeStampResp содержит два ключевых компонента:

  • status — обязательное поле типа PKIStatusInfo, описывающее результат обработки запроса
  • timeStampToken — необязательное поле типа ContentInfo, содержащее CMS-структуру с самим штампом времени

В библиотеке jsrsasign данная структура реализована через класс KJUR.asn1.tsp.TimeStampResp, входящий в модуль ASN.1 инструментов для работы с криптографическими протоколами.

Класс используется для формирования, кодирования и интерпретации ASN.1 DER-структур, соответствующих ответу TSA-сервера.


Формальное описание:

TimeStampResp ::= SEQUENCE {
    status          PKIStatusInfo,
    timeStampToken  TimeStampToken OPTIONAL
}

PKIStatusInfo содержит:

  • status — числовой код состояния (успех, ошибка, отклонение)
  • statusString — текстовое описание (опционально)
  • failInfo — дополнительные флаги ошибок (опционально)

TimeStampToken представляет собой CMS ContentInfo, внутри которого находится подписанный объект SignedData, содержащий временную метку.


Реализация в jsrsasign

В jsrsasign класс KJUR.asn1.tsp.TimeStampResp наследует общую модель ASN.1 объектов библиотеки и предназначен для построения DER-структур.

Типичное создание объекта осуществляется через передачу параметров в виде JavaScript-структуры:

var resp = new KJUR.asn1.tsp.TimeStampResp({
    status: {
        status: 0
    },
    timeStampToken: cmsContentInfoObject
});

где:

  • status — объект PKIStatusInfo
  • timeStampToken — ASN.1 объект CMS ContentInfo (обычно KJUR.asn1.cms.ContentInfo)

Поле status

Поле status является обязательным и определяет итог обработки запроса TSA.

Основные значения:

  • 0 — granted (запрос успешно обработан)
  • 1 — grantedWithMods (успешно с модификациями)
  • 2 — rejection (отклонение запроса)
  • 3 — waiting (обработка в ожидании)
  • 4 — revocationWarning (предупреждение об отзыве)
  • 5 — revocationNotification (уведомление об отзыве)

В jsrsasign структура задаётся как вложенный объект:

status: {
    status: 0,
    statusString: ["Operation successful"]
}

Поле timeStampToken

timeStampToken содержит криптографически подписанный ответ, формируемый на основе CMS (Cryptographic Message Syntax).

Структура включает:

  • SignedData
  • EncapsulatedContentInfo
  • сертификат TSA
  • подпись временной метки
  • данные о времени (TSTInfo)

В jsrsasign это обычно объект:

timeStampToken: new KJUR.asn1.cms.ContentInfo({
    contentType: "signed-data",
    content: signedDataObject
})

Если статус не равен “granted”, поле timeStampToken может отсутствовать.


Кодирование в DER

Класс KJUR.asn1.tsp.TimeStampResp поддерживает кодирование в DER-формат, используемый в ASN.1-структурах.

Процесс кодирования:

  • формирование ASN.1 дерева
  • сериализация в DER
  • получение бинарного или hex-представления

Типичный вызов:

var hex = resp.getEncodedHex();

Результатом является шестнадцатеричная строка DER-представления структуры TimeStampResp.


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

При создании объект формирует дерево:

TimeStampResp
 ├── status (PKIStatusInfo)
 └── timeStampToken (ContentInfo, optional)

Каждый узел соответствует ASN.1 типу, реализованному через KJUR.asn1.ASN1Object.


Разбор (парсинг) структуры

В jsrsasign отсутствует единый универсальный парсер для всех ASN.1 TSP структур, однако используется подход:

  • декодирование DER в ASN.1 объект через KJUR.asn1.ASN1Util
  • дальнейшая интерпретация структуры вручную или через специализированные классы CMS/TSP

Пример декодирования:

var asn1 = ASN1HEX.parse(hexString);

Далее осуществляется навигация по узлам:

  • first element → status
  • second element → timeStampToken (если присутствует)

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

timeStampToken тесно связан с модулем CMS библиотеки jsrsasign.

Внутри содержится:

  • KJUR.asn1.cms.SignedData
  • сертификат TSA
  • подписанные атрибуты

Для работы с токеном часто используется цепочка:

TimeStampResp → ContentInfo → SignedData → TSTInfo

TSTInfo содержит:

  • genTime (время создания метки)
  • messageImprint (хеш исходных данных)
  • serialNumber
  • accuracy (точность времени)

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

var statusInfo = {
    status: 0,
    statusString: ["OK"]
};

var tsToken = new KJUR.asn1.cms.ContentInfo({
    contentType: "signed-data",
    content: signedData
});

var tsResp = new KJUR.asn1.tsp.TimeStampResp({
    status: statusInfo,
    timeStampToken: tsToken
});

var derHex = tsResp.getEncodedHex();

Обработка ошибок и статусов

При формировании ответа особое значение имеет корректная установка status:

  • отказ в подписи приводит к отсутствию timeStampToken
  • ошибки в формате запроса отражаются через statusString
  • технические ошибки кодируются через failInfo

Пример отказа:

{
    status: 2,
    statusString: ["Invalid request"]
}

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

Класс KJUR.asn1.tsp.TimeStampResp:

  • реализует строгую ASN.1 SEQUENCE структуру
  • совместим с RFC 3161 TSA ответами
  • поддерживает вложенные CMS объекты
  • использует DER-кодирование без альтернативных форматов (BER/JSON)

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


Совместимость и использование

Структура TimeStampResp используется в системах:

  • проверки временных подписей PDF (PAdES)
  • электронной подписи (CAdES)
  • архивного хранения документов
  • нотариальных и юридически значимых системах

В jsrsasign объект применяется как низкоуровневое представление TSA-ответа, интегрируемое с CMS и X.509 модулями библиотеки.