Пакетная валидация подписей с общими кэшами

HotPDF может валидировать все подписи загруженного документа за один проход через три общих кэша: кэш цепочек сертификатов с ключом по набору CMS-сертификатов и действующим опциям валидации, кэш timestamp с ключом по CMS-блобу и /ByteRange, а также хранилище улик THPDFRevocationEvidenceCache с ключом по издателю и серийному номеру

THotPDF.ValidateLoadedSignatureBatch

Точка входа уровня документа перечисляет все поля подписей, побайтово проверяет каждый /ByteRange против источника, собирает улики DSS и /VRI и запускает валидацию цепочек с общими кэшами. При WorkerLimit больше единицы пути оцениваются на параллельных worker'ах

var
  Options: THPDFSignatureBatchOptions;
  Result: THPDFSignatureBatchResult;
begin
  PDF.LoadFromFile('Signed.pdf');
  Options:= THPDFSignatureBatchOptions.Default;
  Options.CertificateOptions.TrustAnchors:= MyAnchors;
  Result:= PDF.ValidateLoadedSignatureBatch(Options);
  if Result.AllSignaturesValid then
    WriteLn('All ', Result.SignatureCount, ' signatures valid');
end;

Общие кэши

Подписи с одинаковой цепочкой подписанта переиспользуют прежний вердикт по цепочке вместо повторного вычисления: ключи кэша цепочек покрывают набор CMS-сертификатов, trust anchors, промежуточные сертификаты, каждый блоб OCSP, CRL и delta-CRL в порядке оценки, режим проверки отзывов, время валидации и весь блок политик. Улики, подмешанные из кэша, помечаются источником vesCache

Кэш отзывов хранит каждый OCSP-ответ и CRL, встреченные за батч, с ключом по DN издателя, серийному номеру и окну действия, поэтому последующие подписи и последующие батчи с тем же инстансом THPDFRevocationEvidenceCache разрешают отзывы без повторной подачи улик

Кэш timestamp запоминает вердикты побайтовой проверки для document timestamp всего CMS (ETSI.RFC3161) и встроенных signature timestamp token'ов. Попадание в кэш на встроенном token'е выставляет THPDFCMSVerifyOptions.SkipSignatureTimestampVerification, пропуская повторную проверку token'а, тогда как основная CMS-подпись всё равно проверяется полностью

Автономный batch-движок

THPDFSignatureValidationBatch принимает задания, чей Info уже несёт вердикт побайтовой проверки, — для тех, кто владеет исходным stream или проверяет вне компонента. FailFast прекращает диспетчеризацию после первого негативного вердикта, а THPDFCancellationToken оставляет оставшиеся записи в состоянии sbsCancelled

Batch:= THPDFSignatureValidationBatch.Create(Options);
try
  Batch.AddJob(Job);
  Result:= Batch.Run;
finally
  Batch.Free;
end;

Структурированные результаты

Каждая запись сообщает статус подписи и сертификата, использованный кэш и диагностику по конкретной подписи; HPDFSignatureBatchResultToJSON выдаёт весь батч со статистикой кэшей в виде машиночитаемого JSON