Класс KJUR.asn1.tsp.TimeStampReq в библиотеке Jsrsasign
реализует формирование ASN.1 структуры запроса временной метки в
соответствии с RFC 3161. Этот запрос отправляется в TSA (Time Stamping
Authority) для получения криптографически доказанного времени
существования данных.
Запрос временной метки представляет собой строго определённую ASN.1 структуру:
TimeStampReq ::= SEQUENCE {
version INTEGER { v1(1) },
messageImprint MessageImprint,
reqPolicy TSAPolicyId OPTIONAL,
nonce INTEGER OPTIONAL,
certReq BOOLEAN DEFAULT FALSE,
extensions [0] IMPLICIT Extensions OPTIONAL
}
В Jsrsasign этот объект инкапсулирует все поля и предоставляет механизм генерации корректно закодированного DER-представления.
Экземпляр запроса создаётся через конструктор с параметром-объектом, содержащим поля структуры:
var req = new KJUR.asn1.tsp.TimeStampReq({
version: 1,
messageImprint: {...},
reqPolicy: "1.2.3.4.5",
nonce: "12345678",
certReq: true
});
Основная идея реализации — декларативное описание ASN.1 структуры через JavaScript-объект, который затем преобразуется в бинарный DER.
Поле version определяет версию протокола. В RFC 3161
используется единственное допустимое значение:
1 — соответствует v1В библиотеке Jsrsasign это значение обычно устанавливается автоматически, но может быть задано явно:
version: 1
Ключевым элементом запроса является messageImprint. Он
содержит хешируемые данные и алгоритм хеширования.
ASN.1 структура:
MessageImprint ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
hashedMessage OCTET STRING
}
В Jsrsasign этот объект формируется через
KJUR.asn1.tsp.MessageImprint.
Пример:
messageImprint: {
hashAlg: "sha256",
data: "4a656665"
}
Поддерживаются стандартные криптографические алгоритмы:
Алгоритм задаётся либо строкой, либо OID-идентификатором.
Поле reqPolicy задаёт идентификатор политики временной
метки (OID), определяющий правила выдачи меток.
Пример:
reqPolicy: "1.3.6.1.4.1.13762.3"
Если поле не указано, TSA применяет политику по умолчанию.
nonce — случайное или псевдослучайное число,
используемое для защиты от replay-атак.
Особенности:
Пример:
nonce: "987654321"
Поле certReq указывает, должен ли TSA включать свой
сертификат в ответ.
true — сертификат включаетсяfalse или отсутствие поля — сертификат не
требуетсяПример:
certReq: true
Это полезно при валидации подписи ответа.
Поле extensions позволяет добавлять дополнительные ASN.1
расширения.
Структура соответствует стандартным X.509 расширениям.
Пример:
extensions: [
{
extnID: "1.2.3.4.5",
critical: false,
extnValue: "0500"
}
]
Расширения кодируются как [0] IMPLICIT Extensions.
После создания объекта Jsrsasign строит ASN.1 дерево:
SEQUENCE
├─ INTEGER (version)
├─ SEQUENCE (messageImprint)
├─ OBJECT IDENTIFIER (reqPolicy) [optional]
├─ INTEGER (nonce) [optional]
├─ BOOLEAN (certReq)
└─ [0] EXPLICIT Extensions [optional]
Каждый узел представляет собой экземпляр
KJUR.asn1.ASN1Object.
Основная операция класса — кодирование структуры в DER:
var der = req.getEncodedHex();
или
var der = req.getEncoded();
Результат:
var req = new KJUR.asn1.tsp.TimeStampReq({
version: 1,
messageImprint: {
hashAlg: "sha256",
data: KJUR.crypto.Util.hashString("hello", "sha256")
},
reqPolicy: "1.2.3.4.5",
nonce: "123456789",
certReq: true
});
var der = req.getEncodedHex();
Этот DER-код затем передаётся в TSA endpoint в бинарном виде.
TimeStampReq тесно связан с другими классами:
KJUR.asn1.tsp.MessageImprint — формирование хешаKJUR.crypto.Util — вычисление digestKJUR.asn1.ASN1Object — базовый класс всех ASN.1
структурВ типичной цепочке:
Библиотека приводит входные значения к ASN.1 типам:
Опциональные поля полностью исключаются из структуры, а не кодируются как null.
Реализация строго следует стандарту:
Если TSA ожидает SHA-256, а передан SHA-1, запрос будет отклонён.
Повторяющиеся значения nonce могут привести к отказу в обработке или невозможности сопоставления ответа.
Любые ручные модификации HEX-строки после генерации могут привести к нарушению структуры ASN.1.
KJUR.asn1.tsp.TimeStampReq выполняет ключевую роль в
построении доверенной временной метки:
Этот механизм используется в: