Dimensionamento automático de espaço reservado CMS
O HotPDF consegue estimar um contentor CMS detached sem invocar operações com chave privada, timestamp authority ou counter-signer, e depois reconstruir um PDF por assinar subdimensionado antes da fronteira irreversível da assinatura
Estimativa sem efeitos secundários
HPDFCMSEstimatePlaceholder seleciona o comprimento da assinatura, por esta ordem, a partir de EstimatedSignatureBytes, de um provider que anuncie spcEstimateSignatureSize, ou do módulo RSA do certificado de assinatura
O estimador constrói a forma CMS estática exata com uma assinatura sintética desse comprimento, retém os certificados configurados e as counter-signatures estáticas, e substitui os callbacks dinâmicos por reservas de payload configuráveis por quem chama
THPDFCMSPlaceholderEstimateOptions.Default aplica uma margem de 50 por cento, um mínimo de 1.024 bytes, alinhamento de 256 bytes e um máximo de 16 MiB; as estimativas de timestamp e de counter-signature continuam explícitas, porque o tamanho das respostas depende de serviços externos
THPDFCMSPlaceholderEstimateInfo reporta a origem selecionada, o comprimento da assinatura, o comprimento do CMS estático, a reserva dinâmica, o comprimento estimado do CMS e a capacidade de /Contents alinhada recomendada
Reconstrução antes da assinatura
The auto-size functions inspect the existing /Contents capacity after preparing /ByteRange
Se a capacidade for inferior à recomendada, THPDFCMSRebuildUnsignedPDFCallback recebe o número de bytes necessário e escreve um PDF novo, por assinar, no stream de destino fornecido; o placeholder reconstruído é validado antes de qualquer callback de assinatura correr
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);
Retry safety contract
HPDFCMSSignPDFStreamWithExternalSignerAutoSize nunca volta a chamar o signer externo depois de este devolver uma assinatura; um overflow inesperado restaura o placeholder por assinar e lança um erro com os tamanhos real e disponível
HPDFCMSSignPDFStreamWithProviderAutoSize só pode repetir a tentativa quando o provider anuncia spcSafeSignRetry, existe um callback de rebuild e MaximumSigningRetries ainda não se esgotou
Se os timestamps de conteúdo, os timestamps de assinatura ou as counter-signatures dinâmicas estiverem ativos, o retry exige adicionalmente DynamicCallbacksSafeToRetry=True
O callback provider expõe ConfigureSizeEstimation, os providers remotos aceitam um estimador opcional e a declaração de safe-retry, e os providers PKCS#11 ou de armazenamento de chaves do Windows inferem o comprimento de saída RSA a partir do certificado, sem tocar na chave privada
Diagnostics and limits
THPDFCMSAutoSizeInfo reporta as capacidades inicial e final, o comprimento real do CMS, o número de rebuilds, as tentativas de assinatura e se ocorreu um retry após a assinatura
Os tamanhos recomendados e de retry são verificados com aritmética alargada e alinhados dentro do máximo configurado; percentagens inválidas, contagens de retry inválidas, comprimentos zero, certificados malformados, chaves não suportadas e callbacks de rebuild que reservem menos do que o pedido são rejeitados