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

KJUR.asn1.tsp.TSTInfo представляет собой реализацию структуры Time-Stamp Token Information (TSTInfo) из стандарта RFC 3161 в библиотеке Jsrsasign. Этот класс относится к пространству имён KJUR.asn1.tsp и используется для формирования ASN.1 структуры, содержащей информацию о временной метке, выдаваемой TSA (Time Stamping Authority).

TSTInfo является центральным элементом токена временной метки и описывает все параметры, связанные с созданием timestamp, включая время, алгоритмы хеширования, идентификатор политики и данные о состоянии ответа.


В стандарте RFC 3161 структура TSTInfo описывается следующим образом:

TSTInfo ::= SEQUENCE {
   version                  INTEGER,
   policy                   TSAPolicyId,
   messageImprint          MessageImprint,
   serialNumber            INTEGER,
   genTime                 GeneralizedTime,
   accuracy               Accuracy OPTIONAL,
   ordering               BOOLEAN DEFAULT FALSE,
   nonce                  INTEGER OPTIONAL,
   tsa                    [0] GeneralName OPTIONAL,
   extensions            [1] IMPLICIT Extensions OPTIONAL
}

Эта структура полностью отражена в реализации KJUR.asn1.tsp.TSTInfo, где каждый элемент соответствует ASN.1 полям.


Основные поля класса KJUR.asn1.tsp.TSTInfo

version

Определяет версию структуры TSTInfo. В большинстве реализаций используется значение 1.

  • Тип: INTEGER
  • Значение по умолчанию: 1

policy

OID политики TSA, определяющий правила формирования временной метки.

  • Тип: OBJECT IDENTIFIER (OID)
  • Пример: "1.2.3.4.5"

Политика определяет условия, при которых создаётся временная метка, включая требования к криптографическим алгоритмам и форматам данных.


messageImprint

Хеш исходного сообщения, для которого создаётся временная метка.

Структура:

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

В Jsrsasign обычно передаётся как объект с алгоритмом и значением хеша.


serialNumber

Уникальный серийный номер временной метки.

  • Тип: INTEGER
  • Используется TSA для идентификации конкретного timestamp token

genTime

Время генерации временной метки.

  • Тип: GeneralizedTime
  • Формат: YYYYMMDDHHMMSSZ

Пример:

20260101123045Z

accuracy

Погрешность времени генерации.

Состоит из трёх возможных компонентов:

Accuracy ::= SEQUENCE {
   seconds        INTEGER OPTIONAL,
   millis     [0] INTEGER OPTIONAL,
   micros     [1] INTEGER OPTIONAL
}

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


ordering

Логическое значение, указывающее порядок выдачи временных меток.

  • Тип: BOOLEAN
  • Значение по умолчанию: false

Если установлено true, TSA гарантирует строгий порядок временных меток.


nonce

Случайное число, используемое для защиты от повторного воспроизведения (replay attack).

  • Тип: INTEGER
  • Опциональное поле

tsa

Идентификатор TSA, выдавшей временную метку.

  • Тип: GeneralName
  • ASN.1 тег: [0]

Может содержать DN, URI или другие идентификаторы субъекта.


extensions

Дополнительные расширения структуры TSTInfo.

  • ASN.1 тег: [1] IMPLICIT
  • Тип: Extensions

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


Использование KJUR.asn1.tsp.TSTInfo

Класс предназначен для генерации ASN.1 объекта, который затем включается в CMS/PKCS#7 структуру timestamp token.

Основная задача — формирование корректной бинарной ASN.1 структуры.


Конструктор класса

В Jsrsasign создание объекта TSTInfo осуществляется через передачу параметров в виде JSON:

new KJUR.asn1.tsp.TSTInfo({
    version: 1,
    policy: "1.2.3.4.5",
    messageImprint: {
        hashAlg: "sha256",
        hashValue: "abcd1234..."
    },
    serial: "123456789",
    genTime: "20260102010101Z",
    accuracy: {
        millis: 500
    },
    ordering: false,
    nonce: "987654321"
});

Формирование messageImprint

Важной частью является формирование messageImprint, которое должно соответствовать ASN.1 структуре.

Пример:

messageImprint: {
    hashAlg: "sha256",
    hashValue: "9f86d081884c7d659a2feaa0c55ad015"
}

Алгоритм автоматически преобразуется в OID:

  • sha1 → 1.3.14.3.2.26
  • sha256 → 2.16.840.1.101.3.4.2.1
  • sha512 → 2.16.840.1.101.3.4.2.3

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

При сериализации объект преобразуется в DER-encoded ASN.1:

TSTInfo ::= SEQUENCE {
    INTEGER,
    OBJECT IDENTIFIER,
    SEQUENCE {
        SEQUENCE {
            OBJECT IDENTIFIER,
            OCTET STRING
        }
    },
    INTEGER,
    GeneralizedTime,
    ...
}

Jsrsasign автоматически строит дерево ASN.1 узлов через KJUR.asn1.ASN1Object.


Генерация DER

После создания объекта TSTInfo может быть сериализован в DER:

const tstinfo = new KJUR.asn1.tsp.TSTInfo({
    version: 1,
    policy: "1.2.3.4.5",
    messageImprint: {
        hashAlg: "sha256",
        hashValue: "abcd"
    },
    serial: "1001",
    genTime: "20260102000000Z"
});

const der = tstinfo.getEncodedHex();

Результат — hex-представление ASN.1 структуры.


Валидация полей

При формировании TSTInfo важно учитывать корректность данных:

genTime

  • должен соответствовать GeneralizedTime
  • обязательно завершение символом Z

messageImprint

  • hashValue должен быть hex-строкой
  • алгоритм должен быть поддерживаемым

serialNumber

  • должен быть уникальным в пределах TSA

Роль в RFC 3161 Timestamp Token

TSTInfo является частью структуры:

ContentInfo
 └── SignedData
      └── EncapsulatedContentInfo
           └── TSTInfo

Он подписывается TSA и включается в CMS ответ.


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

Класс KJUR.asn1.tsp.TSTInfo построен поверх ASN.1 генератора Jsrsasign и обладает следующими особенностями:

  • автоматическая генерация ASN.1 SEQUENCE
  • поддержка optional полей
  • конвертация JavaScript объектов в DER
  • интеграция с CMS/PKCS#7 модулями

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

KJUR.asn1.cms.SignedData

Использует TSTInfo как encapsulated content.

KJUR.crypto.MessageDigest

Формирует hash для messageImprint.

KJUR.asn1.tsp.TimeStampReq

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


Типичные ошибки при формировании

Несоответствие hashAlg и hashValue

Если алгоритм sha256, но длина hash не соответствует 32 байтам, структура становится некорректной.


Неверный genTime

Отсутствие суффикса Z приводит к ошибке парсинга ASN.1.


Неправильный OID policy

Некорректный OID может быть отвергнут TSA или клиентом.


Пример полного формирования TSTInfo

const tstInfo = new KJUR.asn1.tsp.TSTInfo({
    version: 1,
    policy: "1.2.3.4.5.6.7",
    messageImprint: {
        hashAlg: "sha256",
        hashValue: "d2d2d2d2aabbccddeeff001122334455"
    },
    serial: "1234567890",
    genTime: "20260102120000Z",
    accuracy: {
        seconds: 1,
        millis: 500
    },
    ordering: true,
    nonce: "1122334455"
});

const hex = tstInfo.getEncodedHex();

ASN.1 сериализация и структура узлов

Внутри Jsrsasign структура разбивается на ASN.1 узлы:

  • DERSequence
  • DERInteger
  • DERObjectIdentifier
  • DERGeneralizedTime
  • DEROctetString
  • DERBoolean

Каждый элемент TSTInfo преобразуется в соответствующий ASN.1 объект.


Применение в системах доверенной временной метки

TSTInfo используется в следующих сценариях:

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

Поведение при отсутствии optional полей

Если поля accuracy, nonce, tsa или extensions не заданы, они исключаются из ASN.1 последовательности без нарушения структуры.