KJUR.asn1.cades.SignatureTimeStamp представляет собой реализацию структуры атрибута подписи временной метки в рамках стандарта CAdES (CMS Advanced Electronic Signatures). Этот атрибут используется для доказательства существования цифровой подписи в конкретный момент времени и опирается на криптографически защищённые ответы службы временных меток (TSA — Time Stamping Authority).
В контексте CMS/PKCS#7 данный элемент входит в набор подписанных атрибутов (signed attributes) и обеспечивает усиление доверия к подписи за счёт независимого подтверждения времени её формирования.
В структуре CAdES временная метка подписи фиксирует момент, когда значение подписи уже существовало и было неизменным. Это критически важно для:
SignatureTimeStamp относится к атрибутам, которые накладываются поверх уже вычисленной подписи, а не участвуют в её первичном вычислении.
В терминах ASN.1 атрибут SignatureTimeStamp соответствует следующей логике:
Attribute ::= SEQUENCE
Значение attrValues содержит один или несколько элементов:
TimeStampToken ::= ContentInfo (CMS)
signedData
Ключевой элемент внутри — TSTInfo, который содержит:
Класс KJUR.asn1.cades.SignatureTimeStamp является частью
подсистемы CAdES и используется при формировании расширенных
CMS-структур.
Он тесно связан с:
KJUR.asn1.cms.SignedDataKJUR.asn1.cms.AttributeKJUR.crypto.TSAClientKJUR.asn1.tsp.TimeStampReqОсновная функция класса заключается в создании ASN.1-структуры атрибута, который содержит временную метку подписи.
Формируемая структура используется внутри:
Типичный вызов конструктора включает данные временной метки, полученные от TSA:
Псевдоструктура:
new KJUR.asn1.cades.SignatureTimeStamp({
der: "..."
});
Внутренне класс не генерирует временную метку самостоятельно, а оборачивает уже полученный ответ TSA.
Процесс создания SignatureTimeStamp включает несколько этапов:
var tsa = new KJUR.crypto.TSAClient({
url: "https://tsa.example.com"
});
tsa.getTimeStampToken(signatureHex, function(res) {
var tst = new KJUR.asn1.cades.SignatureTimeStamp({
der: res
});
});
SignatureTimeStamp добавляется в набор подписанных атрибутов CMS:
var signedAttrs = [
new KJUR.asn1.cms.ContentType({ oid: "1.2.840.113549.1.7.1" }),
new KJUR.asn1.cms.MessageDigest({ hash: digest }),
new KJUR.asn1.cades.SignatureTimeStamp({ der: tstToken })
];
Далее атрибуты включаются в SignedData перед вычислением окончательной подписи.
После декодирования DER структура содержит:
ContentInfo
contentType: id-signedData
content:
SignedData
version
digestAlgorithms
encapContentInfo
certificates
signerInfos
unsignedAttributes (опционально)
Класс работает исключительно с бинарным представлением ASN.1:
При обработке важны:
SignatureTimeStamp опирается на стандарт:
Ключевые элементы:
SignatureTimeStamp фактически инкапсулирует TimeStampToken из ответа TSA.
В профилях CAdES:
SignatureTimeStamp является основой перехода от BES к T-профилю.
При проверке выполняются следующие шаги:
Несовпадение messageImprint означает нарушение целостности подписи.
Часто встречающиеся проблемы:
SignatureTimeStamp усиливает модель доверия:
Ключевой принцип — доверие переносится на TSA как независимый источник времени.
MessageImprint внутри TSTInfo содержит:
Это значение должно соответствовать:
hash(signatureValue)
Структуры, создаваемые
KJUR.asn1.cades.SignatureTimeStamp, совместимы с:
Хотя стандарт допускает множественные атрибуты, SignatureTimeStamp обычно:
SignatureTimeStamp используется совместно с другими атрибутами:
Он не заменяет SigningTime, а криптографически подтверждает его и сам факт подписи.
В CMS дерево выглядит следующим образом:
ContentInfo
SignedData
SignerInfo
signedAttributes
SignatureTimeStamp размещается именно в signedAttributes, а не unsignedAttributes, что принципиально для CAdES-T.
Для корректной работы требуются:
SignatureTimeStamp является критическим элементом LTV:
При разборе через jsrsasign:
Ошибки парсинга обычно связаны с некорректным ASN.1 тегированием или повреждённым DER.