Модуль asn1tsp библиотеки Jsrsasign предназначен для
работы с объектами, определёнными в стандарте Time-Stamp
Protocol (TSP), описанном в RFC 3161. Основная задача —
формирование, разбор и обработка структур ASN.1, используемых при
создании и проверке меток времени (timestamp).
TSP применяется в системах, где требуется доказательство существования данных в определённый момент времени, например:
Модуль реализует классы для создания запросов на метку времени (TimeStampReq) и обработки ответов (TimeStampResp), а также вспомогательные структуры ASN.1.
Ключевые структуры, реализованные в модуле:
Запрос к серверу меток времени:
TimeStampReq ::= SEQUENCE {
version INTEGER,
messageImprint MessageImprint,
reqPolicy TSAPolicyId OPTIONAL,
nonce INTEGER OPTIONAL,
certReq BOOLEAN DEFAULT FALSE,
extensions [0] IMPLICIT Extensions OPTIONAL
}
Хэш данных, для которых требуется метка времени:
MessageImprint ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
hashedMessage OCTET STRING
}
Ответ от TSA (Time Stamping Authority):
TimeStampResp ::= SEQUENCE {
status PKIStatusInfo,
timeStampToken TimeStampToken OPTIONAL
}
Класс для создания запроса метки времени.
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
var hex = tsReq.getEncodedHex();
Представляет хэш входных данных.
var mi = new KJUR.asn1.tsp.MessageImprint({
"hashAlg": "sha512",
"hashValue": "deadbeef..."
});
Класс для разбора ответа TSA.
var resp = new KJUR.asn1.tsp.TimeStampResp({
"hex": responseHex
});
getStatus() — возвращает статус ответаgetTimeStampToken() — извлекает токен метки
времениTimeStampToken — это CMS (PKCS#7) структура,
содержащая:
Для обработки используется модуль cms внутри
Jsrsasign.
var token = resp.getTimeStampToken();
var isValid = token.verify();
Перед созданием запроса необходимо вычислить хэш:
var hash = KJUR.crypto.Util.hashString("data", "sha256");
Затем используется:
var mi = {
hashAlg: "sha256",
hashValue: hash
};
Nonce защищает от атак повторного воспроизведения.
nonce: { int: Math.floor(Math.random() * 1000000) }
При получении ответа:
Поле reqPolicy позволяет указать требуемую политику
TSA:
reqPolicy: "1.2.3.4.5.6"
Используется в системах с несколькими уровнями доверия.
Статус ответа определяется структурой PKIStatusInfo:
var status = resp.getStatus();
Все структуры кодируются в DER (Distinguished Encoding Rules):
Методы:
getEncodedHex()
возвращают HEX-представление DER.
Процесс работы:
Формируется TimeStampReq
Отправляется HTTP POST с Content-Type:
application/timestamp-queryПолучается бинарный ответ
Разбирается через TimeStampResp
fetch("https://tsa.example.com", {
method: "POST",
headers: {
"Content-Type": "application/timestamp-query"
},
body: hexToUint8Array(tsReqHex)
});
Поддержка дополнительных полей ASN.1:
extensions: [
{
extname: "1.2.3.4",
critical: true,
value: "..."
}
]
Используются редко, но важны для специализированных систем.
При обработке ответа необходимо:
messageImprintМодуль asn1tsp тесно интегрирован с:
asn1cms — обработка CMS/PKCS#7crypto — вычисление хэшейx509 — работа с сертификатами