مرجع HotPDF

تستطيع HotPDF تقدير حجم حاوية CMS منفصلة (detached) دون استدعاء عملية مفتاح خاص، أو جهة طابع زمني، أو موقِّع مضاد (counter-signer)، ثم إعادة بناء ملف PDF غير موقَّع بحجم غير كافٍ قبل حد التوقيع الذي لا رجعة فيه

تقدير خالٍ من الآثار الجانبية

تختار HPDFCMSEstimatePlaceholder طول التوقيع من EstimatedSignatureBytes، أو من مزوِّد (provider) يعلن spcEstimateSignatureSize، أو من مقياس RSA (modulus) في شهادة التوقيع، بهذا الترتيب

يبني المقدِّر (estimator) الشكل الساكن الدقيق لـ CMS بتوقيع اصطناعي بذلك الطول، ويحتفظ بالشهادات المهيّأة والتوقيعات المضادة (counter-signatures) الساكنة، ويستبدل الـ callbacks الديناميكية باحتياطيات حمولة يمكن للمستدعي تهيئتها

تطبّق THPDFCMSPlaceholderEstimateOptions.Default هامشًا نسبته 50 بالمئة، وحدًا أدنى 1,024 بايت، ومحاذاة (alignment) بمقدار 256 بايت، وحدًا أقصى 16 ميجابايت؛ وتبقى تقديرات الطابع الزمني والتوقيع المضاد صريحة لأن حجم استجابتها يعتمد على خدمات خارجية

تُبلغ THPDFCMSPlaceholderEstimateInfo عن المصدر المختار، وطول التوقيع، وطول CMS الثابت، والاحتياطي الديناميكي، وطول CMS المقدَّر، وسعة /Contents المحاذاة الموصى بها

إعادة البناء قبل التوقيع

تفحص دوال الحجم التلقائي (auto-size) سعة /Contents الموجودة بعد تحضير /ByteRange

إذا كانت السعة أقل من التوصية، يتلقى THPDFCMSRebuildUnsignedPDFCallback عدد البايتات المطلوب ويكتب ملف PDF جديدًا غير موقَّع إلى stream الوجهة المُزوَّد؛ ويُتحقَّق من الحجز المسبق المُعاد بناؤه قبل تشغيل أي استدعاء توقيع

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 الموقِّع الخارجي مجددًا أبدًا بعد إعادته توقيعًا؛ ويستعيد أي تجاوز (overflow) غير متوقَّع الحجز المسبق غير الموقَّع ويثير خطأً يحتوي على الحجمين الفعلي والمتاح

يمكن لـ HPDFCMSSignPDFStreamWithProviderAutoSize إعادة المحاولة فقط عندما يعلن المزوِّد spcSafeSignRetry، ويتوفر استدعاء إعادة بناء، ولم يُستنفَد MaximumSigningRetries

إذا كانت الطوابع الزمنية للمحتوى، أو طوابع التوقيع الزمنية، أو التوقيعات المضادة الديناميكية مفعَّلة، تتطلب إعادة المحاولة إضافة DynamicCallbacksSafeToRetry=True

يكشف مزوِّد الاستدعاء (callback provider) ConfigureSizeEstimation، وتقبل المزوِّدات (providers) البعيدة مُقدِّرًا (estimator) اختياريًا وإعلانًا لإعادة المحاولة الآمنة، وتستنتج مزوِّدات PKCS#11 أو تخزين مفاتيح Windows طول مخرجات RSA من الشهادة دون المساس بالمفتاح الخاص

إعادة البناء قبل التوقيع

تُبلغ THPDFCMSAutoSizeInfo عن السعتين الأولية والنهائية، وطول CMS الفعلي، وعدد عمليات إعادة البناء، ومحاولات التوقيع، وهل حدثت إعادة محاولة بعد التوقيع

يبني المقدِّر (estimator) الشكل الساكن الدقيق لـ CMS بتوقيع اصطناعي بذلك الطول، ويحتفظ بالشهادات المهيّأة والتوقيعات المضادة (counter-signatures) الساكنة، ويستبدل الـ callbacks الديناميكية باحتياطيات حمولة يمكن للمستدعي تهيئتها