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 長度、重建次數、簽署嘗試次數,以及是否發生過簽章後重試

建議與重試大小以寬型算術檢查、在設定的上限內對齊,並拒絕無效百分比、重試次數、零長度、格式錯誤的憑證、不支援的金鑰,以及保留少於要求之重建回呼