Dimensionamento automático de placeholder CMS
O HotPDF pode estimar um contêiner CMS destacado sem invocar uma operação de chave privada, autoridade de carimbo de tempo ou contra-assinante, e então reconstruir um PDF não assinado subdimensionado antes do limite irreversível de assinatura
Estimativa sem efeitos colaterais
HPDFCMSEstimatePlaceholder seleciona o comprimento da assinatura a partir de EstimatedSignatureBytes, de um provedor que anuncia spcEstimateSignatureSize ou do módulo RSA no certificado de assinatura, nessa ordem
O estimador constrói a forma CMS estática exata com uma assinatura sintética desse comprimento, retém certificados configurados e contra-assinaturas estáticas e substitui callbacks dinâmicos por reservas de carga configuráveis pelo chamador
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; estimativas de carimbo de tempo e contra-assinatura permanecem explícitas porque seus tamanhos de resposta dependem de serviços externos
THPDFCMSPlaceholderEstimateInfo relata a origem selecionada, o comprimento da assinatura, o comprimento CMS estático, a reserva dinâmica, o comprimento CMS estimado e a capacidade /Contents alinhada recomendada
Reconstrução antes da assinatura
As funções de dimensionamento automático inspecionam a capacidade /Contents existente após preparar /ByteRange
Se a capacidade estiver abaixo da recomendação, THPDFCMSRebuildUnsignedPDFCallback recebe a contagem de bytes necessária e grava um novo PDF não assinado no stream de destino fornecido; o placeholder reconstruído é validado antes que qualquer callback de assinatura seja executado
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 segurança de nova tentativa
HPDFCMSSignPDFStreamWithExternalSignerAutoSize nunca chama o signatário externo novamente depois que ele retorna uma assinatura; um estouro inesperado restaura o placeholder não assinado e gera um erro contendo os tamanhos real e disponível
HPDFCMSSignPDFStreamWithProviderAutoSize pode tentar novamente apenas quando o provedor anuncia spcSafeSignRetry, um callback de reconstrução está disponível e MaximumSigningRetries não foi esgotado
Se carimbos de tempo de conteúdo, carimbos de tempo de assinatura ou contra-assinaturas dinâmicas estiverem habilitados, a nova tentativa também exige DynamicCallbacksSafeToRetry=True
O provedor de callback expõe ConfigureSizeEstimation, provedores remotos aceitam um estimador opcional e uma declaração de nova tentativa segura, e provedores PKCS#11 ou de armazenamento de chaves do Windows inferem o comprimento de saída RSA do certificado sem tocar na chave privada
Diagnósticos e limites
THPDFCMSAutoSizeInfo relata capacidades inicial e final, o comprimento CMS real, a contagem de reconstruções, tentativas de assinatura e se ocorreu uma nova tentativa após a assinatura
Tamanhos recomendados e de nova tentativa são verificados com aritmética ampla, alinhados dentro do máximo configurado, e rejeitam porcentagens inválidas, contagens de nova tentativa, comprimentos zero, certificados malformados, chaves não suportadas e callbacks de reconstrução que reservam menos do que o solicitado