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