Auto-dimensionamiento de placeholders CMS
HotPDF puede estimar un contenedor CMS detached sin invocar una operación de clave privada, una timestamp authority ni un counter-signer, y luego reconstruir un PDF sin firmar demasiado pequeño antes de la frontera irreversible de firma
Estimación sin efectos secundarios
HPDFCMSEstimatePlaceholder selecciona la longitud de la firma a partir de EstimatedSignatureBytes, de un provider que anuncie spcEstimateSignatureSize o del módulo RSA del certificado de firma, en ese orden
El estimador construye la forma estática exacta del CMS con una firma sintética de esa longitud, conserva los certificados y counter-signatures estáticos configurados, y reemplaza los callbacks dinámicos por reservas de payload configurables por el llamador
THPDFCMSPlaceholderEstimateOptions.Default aplica un margen del 50 por ciento, un mínimo de 1,024 bytes, una alineación de 256 bytes y un máximo de 16 MiB; las estimaciones de timestamp y counter-signature siguen siendo explícitas porque sus tamaños de respuesta dependen de servicios externos
THPDFCMSPlaceholderEstimateInfo reporta la fuente seleccionada, la longitud de la firma, la longitud estática del CMS, la reserva dinámica, la longitud estimada del CMS y la capacidad recomendada alineada de /Contents
Reconstrucción antes de firmar
Las funciones de auto-size inspeccionan la capacidad existente de /Contents después de preparar /ByteRange
Si la capacidad está por debajo de la recomendación, THPDFCMSRebuildUnsignedPDFCallback recibe el número de bytes requerido y escribe un PDF sin firmar nuevo en el stream de destino suministrado; el placeholder reconstruido se valida antes de que se ejecute cualquier callback de firma
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);
Contrato de seguridad para reintentos
HPDFCMSSignPDFStreamWithExternalSignerAutoSize nunca vuelve a llamar al external signer después de que este devuelva una firma; un overflow inesperado restaura el placeholder sin firmar y lanza un error que contiene el tamaño real y el disponible
HPDFCMSSignPDFStreamWithProviderAutoSize solo puede reintentar cuando el provider anuncia spcSafeSignRetry, hay un callback de reconstrucción disponible y no se ha agotado MaximumSigningRetries
Si hay content timestamps, signature timestamps o counter-signatures dinámicas habilitados, el reintento requiere además DynamicCallbacksSafeToRetry=True
El provider de callbacks expone ConfigureSizeEstimation, los providers remotos aceptan un estimador opcional y una declaración de reintento seguro, y los providers de key storage PKCS#11 o Windows infieren la longitud de salida RSA a partir del certificado sin tocar la clave privada
Diagnóstico y límites
THPDFCMSAutoSizeInfo reporta las capacidades inicial y final, la longitud real del CMS, el número de reconstrucciones, los intentos de firma y si ocurrió un reintento posterior a la firma
Los tamaños recomendados y de reintento se comprueban con aritmética amplia, se alinean dentro del máximo configurado, y se rechazan porcentajes inválidos, conteos de reintento inválidos, longitudes cero, certificados malformados, claves no soportadas y callbacks de reconstrucción que reserven menos de lo solicitado