CMS 占位符自动调整大小

HotPDF 可以在不调用私钥操作、时间戳机构或副署者的情况下估算分离式 CMS 容器,然后在不可逆签名边界之前重建过小的未签名 PDF

无副作用估算

HPDFCMSEstimatePlaceholder 按顺序从 EstimatedSignatureBytes、通告 spcEstimateSignatureSize 的提供程序或签名证书中的 RSA 模数选择签名长度

估算器以该长度的合成签名构建精确的静态 CMS 形状,保留配置的证书和静态副署,并用调用方可配置的负载储备替换动态回调

THPDFCMSPlaceholderEstimateOptions.Default 应用 50% 的余量、1,024 字节的最小值、256 字节对齐和 16 MiB 的最大值;时间戳和副署估算保持显式,因为其响应大小取决于外部服务

THPDFCMSPlaceholderEstimateInfo 报告选定的源、签名长度、静态 CMS 长度、动态储备、估算的 CMS 长度和推荐的已对齐 /Contents 容量

签名前重建

自动调整大小函数在准备 /ByteRange 后检查现有 /Contents 容量

如果容量低于推荐值,THPDFCMSRebuildUnsignedPDFCallback 接收所需字节数并将新的未签名 PDF 写入提供的目标流;重建的占位符在任何签名回调运行前经过验证

EstimateOptions := THPDFCMSPlaceholderEstimateOptions.Default;
AutoOptions := THPDFCMSAutoSizeOptions.Default;
AutoOptions.Estimate := EstimateOptions;

HPDFCMSSignPDFStreamWithProviderAutoSize(
  InputStream, OutputStream, CertificateDER, Provider, KeyIdentifier,
  SignOptions, AutoOptions,
  procedure(ContentsBytes: Integer; Destination: TStream)
  begin
    BuildUnsignedPDF(ContentsBytes, Destination);
  end,
  AutoSizeInfo);

重试安全契约

HPDFCMSSignPDFStreamWithExternalSignerAutoSize 在外部签名者返回签名后绝不会再次调用它;意外溢出会恢复未签名占位符并引发包含实际和可用大小的错误

HPDFCMSSignPDFStreamWithProviderAutoSize 仅在提供程序通告 spcSafeSignRetry、重建回调可用且 MaximumSigningRetries 未耗尽时才能重试

如果启用了内容时间戳、签名时间戳或动态副署,重试还要求 DynamicCallbacksSafeToRetry=True

回调提供程序暴露 ConfigureSizeEstimation,远程提供程序接受可选的估算器和安全重试声明,PKCS#11 或 Windows 密钥存储提供程序从证书推断 RSA 输出长度而不接触私钥

诊断与限制

THPDFCMSAutoSizeInfo 报告初始和最终容量、实际 CMS 长度、重建次数、签名尝试以及是否发生签名后重试

推荐和重试大小使用宽算术检查,在配置的最大值内对齐,并拒绝无效百分比、重试次数、零长度、格式错误的证书、不受支持的密钥以及储备少于请求的重建回调