THotPDF.SignPDFWithPFX

THotPDF

 

Anterior  Métodos  AddPubKeyRecipient

Signs an existing PDF placeholder using a PFX / PKCS#12 file, building a CMS SignedData container and writing the signed PDF in one call.

 

Delphi syntax (file overload):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Delphi syntax (stream overload):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Descrição

SignPDFWithPFX é o ponto de entrada completo para assinatura PFX acrescentado na v2.119.27. O PDF de entrada tem de conter já um espaço reservado de assinatura emitido por THPDFPage.AddSignedSignatureField (ou pelo respectivo invólucro PAdES) com subFilter adbe.pkcs7.detached. O método:

 

1. Carrega o PDF de entrada, localiza os espaços reservados sentinela /ByteRange + /Contents e actualiza /ByteRange com os offsets reais dos bytes

2. Carrega o ficheiro PFX e desencripta-o com a palavra-passe fornecida. PBES2 com PBKDF2-HMAC-SHA-256 + AES-256-CBC é suportado (este é o valor predefinido para ficheiros PFX exportados por OpenSSL 3.0+, certutil do Windows 11+ e Acesso às Chaves do macOS). Os ficheiros legados PBE-SHA1-3DES geram um diagnóstico; volte a exportar com openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Calcula SHA-256 sobre os bytes do documento cobertos por /ByteRange e constrói um blob CMS SignedData (RFC 5652) DER contendo o certificado X.509, os atributos assinados (contentType + messageDigest + signingTime) e uma assinatura RSA + SHA-256 sobre os atributos assinados com etiqueta SET

4. Codifica o CMS DER em hexadecimal, verifica se cabe no orçamento /Contents reservado por AddSignedSignatureField (8 KB por omissão cobre RSA de 1024 / 2048 bits) e injeta-o no espaço reservado

5. Escreve os bytes corrigidos para o caminho ou fluxo de saída

 

Devolve True em caso de sucesso. Lança EHPDFPFXError para palavra-passe inválida, perfil de encriptação não suportado ou PFX malformado; EHPDFCMSError quando o PDF de entrada não tem o espaço reservado esperado ou o CMS DER ultrapassa o orçamento reservado de /Contents; EHPDFRSAError para desajuste da chave RSA

 

Typical workflow

 

Doc := THotPDF.Create(nil);

Doc.FileName := 'unsigned.pdf';

Doc.BeginDoc;

Doc.CurrentPage.AddSignedSignatureField(

  'Sig1', Rect(60, 60, 260, 90), 8192,

  'adbe.pkcs7.detached', 'Approved', 'Brussels', '', []);

Doc.EndDoc;

Doc.Free;

THotPDF.SignPDFWithPFX('unsigned.pdf', 'signed.pdf', 'mykey.pfx', 'mypassword');

 

Notes

O algoritmo de assinatura é RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). O identificador do signatário é IssuerAndSerialNumber extraído do certificado X.509. O encapContentInfo é detached (eContent omitido). Os atributos assinados são ordenados por string de bytes DER crescente de acordo com a RFC 5652 §5.4 antes de serem hashados

 

Para fluxos de trabalho PAdES B-T / B-LT / B-LTA que precisem de carimbos de data/hora RFC 3161, dicionários DSS ou assinaturas de timestamp de documento, os auxiliares do lado do produtor (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) continuam a aplicar-se; o próprio SignPDFWithPFX emite uma assinatura CMS básica apenas (equivalente a PAdES-B-B)

 

See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField