带共享缓存的批量签名验证

HotPDF 可以通过三个共享缓存在一次遍历中验证已加载文档的每个签名:以 CMS 证书集和有效验证选项为键的证书路径缓存、以 CMS 数据块和 /ByteRange 为键的时间戳缓存,以及以颁发者和序列号为键的 THPDFRevocationEvidenceCache 证据存储

THotPDF.ValidateLoadedSignatureBatch

文档级入口点枚举每个签名字段,对照源逐字节验证每个 /ByteRange,收集 DSS 和 /VRI 证据,并使用共享缓存运行证书路径验证。大于一的 WorkerLimit 会在并行工作线程上求值路径

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 证书集、信任锚、中间证书、按求值顺序的每个 OCSP、CRL 和 delta-CRL 数据块、吊销模式、验证时间以及完整的策略块。从缓存注入的证据会标记为 vesCache 证据源

吊销缓存存储批处理期间看到的每个 OCSP 响应和 CRL,以颁发者 DN、序列号和有效期窗口为键,因此共享同一 THPDFRevocationEvidenceCache 实例的后续签名和后续批次无需重新提供证据即可解析吊销

时间戳缓存记忆整个 CMS 文档时间戳(ETSI.RFC3161)和嵌入签名时间戳令牌的逐字节验证判定。嵌入令牌的缓存命中会设置 THPDFCMSVerifyOptions.SkipSignatureTimestampVerification,跳过令牌重新验证,同时主 CMS 签名仍被完整检查

独立批量引擎

THPDFSignatureValidationBatch 接受其 Info 已携带逐字节验证判定的作业,供拥有源流或在组件外部验证的调用方使用。FailFast 在第一个否定判定后停止派发,THPDFCancellationToken 使其余条目保持 sbsCancelled

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

结构化结果

每个条目报告签名和证书状态、其复用的缓存以及逐签名诊断;HPDFSignatureBatchResultToJSON 将整个批次连同缓存统计渲染为机器可读的 JSON