TSTInfo представляет собой ключевую ASN.1-структуру, используемую в протоколе доверенного времени (Time-Stamp Protocol, RFC 3161). Она входит в состав временной метки, формируемой удостоверяющим центром (Time Stamping Authority, TSA), и содержит всю необходимую информацию для проверки того, что данные существовали в определённый момент времени и не были изменены.
В библиотеке Jsrsasign работа с TSTInfo обычно происходит через
ASN.1-парсеры и утилиты пакета KJUR.asn1.tsp, которые
позволяют декодировать DER-кодированные структуры и извлекать поля
временной метки.
TSTInfo описывается ASN.1-схемой:
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
}
Каждое поле несёт строго определённую криптографическую и семантическую нагрузку, обеспечивающую проверяемость временной метки.
Поле версии определяет формат TSTInfo. В текущей версии RFC 3161 используется значение:
version = 1В Jsrsasign это поле извлекается как целое число из ASN.1 INTEGER:
const ver = tstinfo.version;
Несмотря на простоту, это поле важно для обратной совместимости при изменениях стандарта.
Поле policy содержит OID политики TSA, по которой был
сформирован токен.
Пример OID:
1.2.3.4.5.6.7.8.1В Jsrsasign оно представлено строкой:
const policy = tstinfo.policy;
Этот идентификатор позволяет определить правила формирования и проверки подписи временной метки.
Ключевой элемент структуры — messageImprint,
представляющий собой хеш исходных данных.
ASN.1-структура:
MessageImprint ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
hashedMessage OCTET STRING
}
Поле hashAlgorithm определяет криптографический
алгоритм:
2.16.840.1.101.3.4.2.1)В Jsrsasign:
const algo = tstinfo.messageImprint.hashAlgorithm.name;
Поле hashedMessage содержит фактический хеш данных:
const hash = tstinfo.messageImprint.hashedMessage;
Именно это значение сравнивается с вычисленным хешем при проверке временной метки.
Поле serialNumber — уникальный идентификатор временной
метки, присваиваемый TSA.
Обычно это большое целое число:
const serial = tstinfo.serialNumber;
Серийный номер обеспечивает уникальность каждой выпущенной метки в рамках политики TSA.
Поле genTime содержит момент формирования временной
метки в формате GeneralizedTime.
Пример:
20260101123045Z
В Jsrsasign:
const genTime = tstinfo.genTime;
Это поле является основным доказательством временной фиксации события.
Поле accuracy определяет допустимую погрешность
временной метки.
ASN.1 структура:
Accuracy ::= SEQUENCE {
seconds INTEGER OPTIONAL,
millis [0] INTEGER OPTIONAL,
micros [1] INTEGER OPTIONAL
}
Возможные компоненты:
В Jsrsasign:
const acc = tstinfo.accuracy;
Если поле отсутствует, точность считается неопределённой или нулевой.
Поле ordering определяет, допускается ли строгий порядок
временных меток.
TRUE — TSA гарантирует упорядочиваниеFALSE — порядок не гарантируетсяВ Jsrsasign:
const ordering = tstinfo.ordering;
Это поле важно для систем, где последовательность событий критична.
Поле nonce используется для защиты от повторного
воспроизведения (replay attack).
Это случайное число, которое клиент отправляет при запросе временной метки, и TSA возвращает его обратно.
const nonce = tstinfo.nonce;
Совпадение nonce при проверке подтверждает актуальность ответа TSA.
Поле tsa содержит идентификатор удостоверяющего
центра.
Тип — GeneralName, который может включать:
В Jsrsasign:
const tsa = tstinfo.tsa;
Пример DN:
CN=Trusted Timestamp Authority, O=Example CA, C=US
Поле extensions позволяет добавлять дополнительные
атрибуты, не входящие в базовый стандарт.
Типично используется для:
В Jsrsasign:
const ext = tstinfo.extensions;
Декодирование DER-структуры обычно выполняется через:
const asn1 = KJUR.asn1.ASN1Util.newObject({
"seq": [
{"int": 1},
{"oid": "1.2.3.4.5"},
{"seq": [
{"oid": "2.16.840.1.101.3.4.2.1"},
{"octstr": "abc123..."}
]},
{"int": 123456789},
{"gentime": "20260102120000Z"}
]
});
В реальных сценариях используется:
const tstinfo = new KJUR.asn1.tsp.TSTInfo({asn1: der});
После декодирования структура становится доступной как объект JavaScript.
Все элементы TSTInfo образуют связанную систему:
messageImprint связывает временную метку с исходными
даннымиgenTime фиксирует момент существования этих данныхserialNumber обеспечивает уникальность записиpolicy определяет правила доверияnonce защищает от повторного воспроизведенияtsa подтверждает источникЭта структура позволяет построить криптографически проверяемую цепочку доверия к времени.
При работе с TSTInfo в Jsrsasign учитываются особенности ASN.1 кодирования:
Внутренние функции библиотеки обеспечивают преобразование низкоуровневого ASN.1 в удобные JavaScript-объекты, сохраняя при этом исходную структуру RFC 3161 без потерь.