Автоматичне змінення розміру заповнювача CMS

HotPDF може оцінити відкріплений контейнер CMS без виклику операції закритого ключа, центру міток часу або контрпідписувача, а потім перебудувати замалий непідписаний PDF до незворотної межі підписання

Оцінка без побічних ефектів

HPDFCMSEstimatePlaceholder обирає довжину підпису з EstimatedSignatureBytes, постачальника, який оголошує spcEstimateSignatureSize, або модуля RSA в сертифікаті підпису, у такому порядку

Оцінювач будує точну статичну форму CMS із синтетичним підписом цієї довжини, зберігає налаштовані сертифікати та статичні контрпідписи та замінює динамічні зворотні виклики резервами корисного навантаження, які налаштовує викликаючий код

THPDFCMSPlaceholderEstimateOptions.Default застосовує запас 50 відсотків, мінімум 1024 байти, вирівнювання до 256 байтів і максимум 16 МіБ; оцінки міток часу та контрпідпису залишаються явними, оскільки розміри їхніх відповідей залежать від зовнішніх служб

THPDFCMSPlaceholderEstimateInfo повідомляє обране джерело, довжину підпису, статичну довжину CMS, динамічний резерв, оцінену довжину CMS та рекомендовану вирівняну місткість /Contents

Перебудова до підписання

Функції автоматичного розміру перевіряють наявну місткість /Contents після підготовки /ByteRange

Якщо місткість нижча за рекомендацію, 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, кількість перебудов, спроб підписання та чи сталася повторна спроба після підписання

Рекомендовані розміри та розміри повторних спроб перевіряються широкою арифметикою, вирівнюються в межах налаштованого максимуму та відхиляють недійсні відсотки, кількість повторних спроб, нульові довжини, пошкоджені сертифікати, непідтримувані ключі та зворотні виклики перебудови, що резервують менше, ніж затребувано