مرجع 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 الديناميكية باحتياطيات حمولة يمكن للمستدعي تهيئتها