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 полям.
Определяет версию структуры TSTInfo. В большинстве реализаций
используется значение 1.
OID политики TSA, определяющий правила формирования временной метки.
"1.2.3.4.5"Политика определяет условия, при которых создаётся временная метка, включая требования к криптографическим алгоритмам и форматам данных.
Хеш исходного сообщения, для которого создаётся временная метка.
Структура:
MessageImprint ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
hashedMessage OCTET STRING
}
В Jsrsasign обычно передаётся как объект с алгоритмом и значением хеша.
Уникальный серийный номер временной метки.
Время генерации временной метки.
YYYYMMDDHHMMSSZПример:
20260101123045Z
Погрешность времени генерации.
Состоит из трёх возможных компонентов:
Accuracy ::= SEQUENCE {
seconds INTEGER OPTIONAL,
millis [0] INTEGER OPTIONAL,
micros [1] INTEGER OPTIONAL
}
Используется для указания точности времени TSA.
Логическое значение, указывающее порядок выдачи временных меток.
falseЕсли установлено true, TSA гарантирует строгий порядок
временных меток.
Случайное число, используемое для защиты от повторного воспроизведения (replay attack).
Идентификатор TSA, выдавшей временную метку.
[0]Может содержать DN, URI или другие идентификаторы субъекта.
Дополнительные расширения структуры TSTInfo.
[1] IMPLICITИспользуется для добавления нестандартных или расширенных параметров.
Класс предназначен для генерации 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,
которое должно соответствовать ASN.1 структуре.
Пример:
messageImprint: {
hashAlg: "sha256",
hashValue: "9f86d081884c7d659a2feaa0c55ad015"
}
Алгоритм автоматически преобразуется в OID:
При сериализации объект преобразуется в DER-encoded ASN.1:
TSTInfo ::= SEQUENCE {
INTEGER,
OBJECT IDENTIFIER,
SEQUENCE {
SEQUENCE {
OBJECT IDENTIFIER,
OCTET STRING
}
},
INTEGER,
GeneralizedTime,
...
}
Jsrsasign автоматически строит дерево ASN.1 узлов через
KJUR.asn1.ASN1Object.
После создания объекта 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 важно учитывать корректность данных:
ZTSTInfo является частью структуры:
ContentInfo
└── SignedData
└── EncapsulatedContentInfo
└── TSTInfo
Он подписывается TSA и включается в CMS ответ.
Класс KJUR.asn1.tsp.TSTInfo построен поверх ASN.1
генератора Jsrsasign и обладает следующими особенностями:
Использует TSTInfo как encapsulated content.
Формирует hash для messageImprint.
Используется для создания запроса, результатом которого является TSTInfo.
Если алгоритм sha256, но длина hash не соответствует 32 байтам, структура становится некорректной.
Отсутствие суффикса Z приводит к ошибке парсинга
ASN.1.
Некорректный OID может быть отвергнут TSA или клиентом.
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();
Внутри Jsrsasign структура разбивается на ASN.1 узлы:
Каждый элемент TSTInfo преобразуется в соответствующий ASN.1 объект.
TSTInfo используется в следующих сценариях:
Если поля accuracy, nonce, tsa
или extensions не заданы, они исключаются из ASN.1
последовательности без нарушения структуры.