Dimensionnement automatique d’espace réservé CMS

HotPDF peut estimer un conteneur CMS détaché sans appeler une opération de clé privée, une autorité d’horodatage ou un contresignataire, puis reconstruire un PDF non signé trop petit avant la limite irréversible de signature

Estimation sans effet de bord

HPDFCMSEstimatePlaceholder sélectionne la longueur de signature, dans cet ordre, à partir de EstimatedSignatureBytes, d’un fournisseur qui annonce spcEstimateSignatureSize ou du module RSA du certificat de signature

L’estimateur construit la forme CMS statique exacte avec une signature synthétique de cette longueur, conserve les certificats configurés et les contresignatures statiques, puis remplace les rappels dynamiques par des réserves de charge utile configurables par l’appelant

THPDFCMSPlaceholderEstimateOptions.Default applique une marge de 50 %, un minimum de 1 024 octets, un alignement de 256 octets et un maximum de 16 Mio ; les estimations d’horodatage et de contresignature restent explicites car la taille de leurs réponses dépend de services externes

THPDFCMSPlaceholderEstimateInfo rapporte la source sélectionnée, la longueur de signature, la longueur CMS statique, la réserve dynamique, la longueur CMS estimée et la capacité /Contents alignée recommandée

Reconstruction avant signature

Les fonctions de dimensionnement automatique inspectent la capacité /Contents existante après préparation de /ByteRange

Si la capacité est inférieure à la recommandation, THPDFCMSRebuildUnsignedPDFCallback reçoit le nombre d’octets requis et écrit un nouveau PDF non signé dans le flux de destination fourni ; l’espace réservé reconstruit est validé avant l’exécution de tout rappel de signature

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);

Contrat de sûreté des tentatives

HPDFCMSSignPDFStreamWithExternalSignerAutoSize n’appelle jamais à nouveau le signataire externe après que celui-ci a renvoyé une signature ; un débordement inattendu restaure l’espace réservé non signé et lève une erreur contenant les tailles réelle et disponible

HPDFCMSSignPDFStreamWithProviderAutoSize ne peut réessayer que si le fournisseur annonce spcSafeSignRetry, si un rappel de reconstruction est disponible et si MaximumSigningRetries n’est pas épuisé

Si les horodatages de contenu ou de signature, ou les contresignatures dynamiques sont activés, une nouvelle tentative exige en outre DynamicCallbacksSafeToRetry=True

Le fournisseur de rappel expose ConfigureSizeEstimation, les fournisseurs distants acceptent un estimateur facultatif et une déclaration de tentative sûre, et les fournisseurs PKCS#11 ou de stockage de clés Windows déduisent la longueur RSA depuis le certificat sans toucher la clé privée

Diagnostics et limites

THPDFCMSAutoSizeInfo rapporte les capacités initiale et finale, la longueur CMS réelle, le nombre de reconstructions, les tentatives de signature et l’existence d’une nouvelle tentative après signature

Les tailles recommandées et de nouvelle tentative sont contrôlées par une arithmétique large, alignées dans le maximum configuré et refusent les pourcentages, nombres de tentatives ou longueurs zéro non valides, les certificats mal formés, clés non prises en charge et rappels de reconstruction qui réservent moins que demandé