Модуль asn1tsp

Модуль asn1tsp библиотеки Jsrsasign предназначен для работы с объектами, определёнными в стандарте Time-Stamp Protocol (TSP), описанном в RFC 3161. Основная задача — формирование, разбор и обработка структур ASN.1, используемых при создании и проверке меток времени (timestamp).

TSP применяется в системах, где требуется доказательство существования данных в определённый момент времени, например:

  • электронная подпись
  • архивирование документов
  • системы аудита
  • блокчейн-решения

Модуль реализует классы для создания запросов на метку времени (TimeStampReq) и обработки ответов (TimeStampResp), а также вспомогательные структуры ASN.1.


Структура ASN.1 в TSP

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

TimeStampReq

Запрос к серверу меток времени:

TimeStampReq ::= SEQUENCE {
   version        INTEGER,
   messageImprint MessageImprint,
   reqPolicy      TSAPolicyId OPTIONAL,
   nonce          INTEGER OPTIONAL,
   certReq        BOOLEAN DEFAULT FALSE,
   extensions     [0] IMPLICIT Extensions OPTIONAL
}

MessageImprint

Хэш данных, для которых требуется метка времени:

MessageImprint ::= SEQUENCE {
   hashAlgorithm AlgorithmIdentifier,
   hashedMessage OCTET STRING
}

TimeStampResp

Ответ от TSA (Time Stamping Authority):

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

Основные классы модуля

KJUR.asn1.tsp.TimeStampReq

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

Пример создания запроса:

var tsReq = new KJUR.asn1.tsp.TimeStampReq({
  "mi": {
    "hashAlg": "sha256",
    "hashValue": "aabbccddeeff..."
  },
  "nonce": { "int": 12345 },
  "certreq": true
});

Ключевые параметры:

  • mi (messageImprint) — обязательный

    • hashAlg — алгоритм хэширования
    • hashValue — хэш данных (hex)
  • policy — идентификатор политики TSA

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

  • certreq — требуется ли сертификат TSA

Получение DER-кодированного запроса:

var hex = tsReq.getEncodedHex();

KJUR.asn1.tsp.MessageImprint

Представляет хэш входных данных.

Пример:

var mi = new KJUR.asn1.tsp.MessageImprint({
  "hashAlg": "sha512",
  "hashValue": "deadbeef..."
});

Особенности:

  • автоматически формирует ASN.1 структуру
  • поддерживает популярные алгоритмы: sha1, sha256, sha512

KJUR.asn1.tsp.TimeStampResp

Класс для разбора ответа TSA.

Пример разбора:

var resp = new KJUR.asn1.tsp.TimeStampResp({
  "hex": responseHex
});

Основные методы:

  • getStatus() — возвращает статус ответа
  • getTimeStampToken() — извлекает токен метки времени

Работа с TimeStampToken

TimeStampToken — это CMS (PKCS#7) структура, содержащая:

  • подпись TSA
  • время
  • хэш исходных данных
  • сертификат TSA

Для обработки используется модуль cms внутри Jsrsasign.

Извлечение токена:

var token = resp.getTimeStampToken();

Проверка подписи:

var isValid = token.verify();

Генерация messageImprint

Перед созданием запроса необходимо вычислить хэш:

var hash = KJUR.crypto.Util.hashString("data", "sha256");

Затем используется:

var mi = {
  hashAlg: "sha256",
  hashValue: hash
};

Использование nonce

Nonce защищает от атак повторного воспроизведения.

nonce: { int: Math.floor(Math.random() * 1000000) }

При получении ответа:

  • значение nonce должно совпадать
  • несоответствие означает потенциальную атаку

Политики TSA (reqPolicy)

Поле reqPolicy позволяет указать требуемую политику TSA:

reqPolicy: "1.2.3.4.5.6"

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


Обработка ошибок в TimeStampResp

Статус ответа определяется структурой PKIStatusInfo:

Возможные значения:

  • 0 — granted
  • 1 — grantedWithMods
  • 2 — rejection
  • 3 — waiting
  • 4 — revocationWarning
  • 5 — revocationNotification

Получение статуса:

var status = resp.getStatus();

ASN.1 кодирование и DER

Все структуры кодируются в DER (Distinguished Encoding Rules):

  • бинарный формат
  • строгая структура
  • используется в криптографии

Методы:

getEncodedHex()

возвращают HEX-представление DER.


Взаимодействие с TSA сервером

Процесс работы:

  1. Формируется TimeStampReq

  2. Отправляется HTTP POST с Content-Type:

    application/timestamp-query
  3. Получается бинарный ответ

  4. Разбирается через TimeStampResp

Пример отправки:

fetch("https://tsa.example.com", {
  method: "POST",
  headers: {
    "Content-Type": "application/timestamp-query"
  },
  body: hexToUint8Array(tsReqHex)
});

Расширения (extensions)

Поддержка дополнительных полей ASN.1:

extensions: [
  {
    extname: "1.2.3.4",
    critical: true,
    value: "..."
  }
]

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


Безопасность и проверки

При обработке ответа необходимо:

  • проверять подпись TSA
  • сверять messageImprint
  • проверять nonce
  • проверять срок действия сертификата TSA
  • удостоверяться в доверии к TSA

Связь с другими модулями Jsrsasign

Модуль asn1tsp тесно интегрирован с:

  • asn1cms — обработка CMS/PKCS#7
  • crypto — вычисление хэшей
  • x509 — работа с сертификатами

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

Электронная подпись

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

Архивирование

  • фиксация состояния документа
  • долгосрочное хранение

Blockchain и distributed systems

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

Ограничения реализации

  • отсутствует встроенный HTTP-клиент
  • проверка сертификатов требует дополнительной логики
  • нет автоматической работы с доверенными корневыми центрами

Производительность

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

Практические замечания

  • использовать SHA-256 или выше
  • избегать SHA-1
  • всегда проверять nonce
  • доверять только известным TSA
  • логировать ответы для аудита