Ajuste automático del tamaño del marcador de posición CMS
HotPDF puede estimar un contenedor CMS separado sin invocar una operación de clave privada, una autoridad de sellado de tiempo ni un contrafirmante, y luego reconstruir un PDF sin firmar de tamaño insuficiente antes del límite irreversible de la firma
Estimación sin efectos secundarios
HPDFCMSEstimatePlaceholder selecciona la longitud de la firma a partir de EstimatedSignatureBytes, de un proveedor que anuncia spcEstimateSignatureSize o del módulo RSA del certificado de firma, en ese orden
El estimador construye la forma estática exacta de CMS con una firma sintética de esa longitud, conserva los certificados configurados y las contrafirmas estáticas, y sustituye las devoluciones de llamada dinámicas por reservas de carga útil 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 sellado de tiempo y de contrafirma siguen siendo explícitas porque sus tamaños de respuesta dependen de servicios externos
THPDFCMSPlaceholderEstimateInfo informa del origen seleccionado, la longitud de la firma, la longitud estática de CMS, la reserva dinámica, la longitud estimada de CMS y la capacidad alineada recomendada de /Contents
Reconstrucción antes de la firma
Las funciones de ajuste automático 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 necesario y escribe un PDF sin firmar nuevo en el flujo de destino suministrado; el marcador de posición reconstruido se valida antes de que se ejecute cualquier devolución de llamada 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 de reintento
HPDFCMSSignPDFStreamWithExternalSignerAutoSize nunca vuelve a llamar al firmante externo después de que devuelva una firma; un desbordamiento inesperado restaura el marcador de posición sin firmar y genera un error que contiene los tamaños real y disponible
HPDFCMSSignPDFStreamWithProviderAutoSize solo puede reintentar cuando el proveedor anuncia spcSafeSignRetry, hay disponible una devolución de llamada de reconstrucción y no se ha agotado MaximumSigningRetries
Si están habilitados los sellos de tiempo de contenido, los sellos de tiempo de firma o las contrafirmas dinámicas, el reintento además requiere DynamicCallbacksSafeToRetry=True
El proveedor de devoluciones de llamada expone ConfigureSizeEstimation, los proveedores remotos aceptan un estimador opcional y una declaración de reintento seguro, y los proveedores PKCS#11 o de almacenamiento de claves de Windows deducen la longitud de salida RSA del certificado sin tocar la clave privada
Diagnósticos y límites
THPDFCMSAutoSizeInfo informa de las capacidades inicial y final, la longitud real de CMS, el número de reconstrucciones, los intentos de firma y si se produjo 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 rechazan porcentajes no válidos, recuentos de reintento, longitudes cero, certificados malformados, claves no admitidas y devoluciones de llamada de reconstrucción que reservan menos de lo solicitado