THotPDF.SignPDFWithPFX

THotPDF

 

Previous  Methods  AddPubKeyRecipient

Firma un marcador PDF existente usando un archivo PFX / PKCS#12, selecciona determinísticamente una identidad de credencial, construye un contenedor CMS SignedData con su cadena de certificados disponible y escribe el PDF firmado en una llamada

 

Sintaxis Delphi (sobrecarga de archivo):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Sintaxis Delphi (sobrecarga de stream):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

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

 

Descripción

SignPDFWithPFX es el punto de entrada de firma PFX de extremo a extremo añadido en v2.119.27. El PDF de entrada ya debe contener un placeholder de firma emitido por THPDFPage.AddSignedSignatureField (o su wrapper PAdES) con subFilter adbe.pkcs7.detached. El método:

 

1. Copia la entrada a través de un búfer acotado de 256 KB, o reutiliza el mismo stream legible/escribible desplazable, localiza los placeholders /ByteRange + /Contents y parchea por seek el campo /ByteRange de anchura fija con los offsets de byte reales

2. Carga el archivo PFX y lo descifra con la contraseña suministrada. PBES2 acepta AES-128-CBC, AES-192-CBC y AES-256-CBC con el HMAC-SHA-1 por defecto o HMAC-SHA-256, HMAC-SHA-384 y HMAC-SHA-512 explícitos como PRF de PBKDF2. Un keyLength PBKDF2 opcional debe coincidir con el cifrador AES seleccionado, y los archivos PBE-SHA1-3DES heredados siguen soportándose para exportaciones de certificados antiguas. Otros perfiles de cifrado lanzan un diagnóstico con el OID infractor

3. Empareja claves privadas RSA, ECDSA de curva nombrada, Ed25519 o Ed448 con certificados por material de clave pública y valores localKeyId RFC 2985 exactos, y después sigue los nombres issuer / subject y las extensiones Authority Key Identifier / Subject Key Identifier para preservar la cadena de intermedios y raíz disponible

4. Selecciona el esquema de firma a partir de la clave coincidente, calcula el digest del documento requerido y construye un blob DER CMS SignedData (RFC 5652) que contiene el certificado del firmante, su cadena correspondiente sin certificados DER duplicados y los atributos firmados. RSA y ECDSA firman el digest de los atributos; Ed25519 y Ed448 firman el SET OF DER completo de atributos en modo PureEdDSA. Ed25519 usa SHA-512 y Ed448 usa SHAKE256 con salida de 512 bits e id-shake256-len

5. Codifica en hexadecimal el DER del CMS, verifica que cabe en el presupuesto de /Contents reservado por AddSignedSignatureField (los 8 KB por defecto cubren RSA de 1024 / 2048 bits) y lo inyecta en el placeholder

6. Escribe los bytes parcheados en la ruta o stream de salida

 

Devuelve True en caso de éxito. Lanza EHPDFPFXError con una contraseña errónea, un perfil de cifrado o de clave privada no soportado, un PFX malformado, una identidad ambigua, un emisor ambiguo o un ciclo en la cadena de certificados; EHPDFCMSError cuando el PDF de entrada carece del placeholder esperado, un proveedor EdDSA opcional no está disponible, la firma falla o el CMS DER desborda el presupuesto reservado de /Contents; EHPDFRSAError si hay desajuste de clave RSA

 

Flujo de trabajo típico

 

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');

 

Archivos PFX multi-identidad

La sobrecarga de conveniencia rechaza deliberadamente un PFX que contiene más de un certificado y clave privada coincidentes. Llame a HPDFEnumeratePFXIdentities para inspeccionar la lista determinista de identidades y sus campos LocalKeyID y FriendlyName, o llame a HPDFParsePFXByLocalKeyID cuando solo se necesita el material de clave seleccionado

Para firma de extremo a extremo, inicialice THPDFCMSSignOptions con HPDFCMSDefaultSignOptions, copie los octetos exactos seleccionados en Options.PFXLocalKeyID y llame a la sobrecarga de HPDFCMSSignPDFStream que acepta esas opciones. La hoja seleccionada, los certificados intermedios disponibles y la raíz disponible se incrustan automáticamente; los valores Options.AdditionalCertsDER suministrados por el llamador se fusionan con deduplicación DER exacta

 

Notas

La firma PFX RSA y ECDSA usa las rutas nativas de criptografía de HotPDF y Windows. La firma PFX Ed25519 y Ed448 exige OpenSSL 3 libcrypto; los llamadores directos de HPDFCMSSignPDFStream pueden establecer THPDFCMSSignOptions.OpenSSLLibraryPath, mientras la sobrecarga de conveniencia usa la ruta normal de búsqueda de librerías de la plataforma

El algoritmo de firma es RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). El identificador del firmante es IssuerAndSerialNumber extraído del certificado X.509. El encapContentInfo es destacado (eContent omitido). Los atributos firmados se ordenan por cadena de bytes DER ascendente según la sección 5.4 de RFC 5652 antes de hashearse

 

Para los flujos PAdES B-T / B-LT / B-LTA que necesitan sellos de tiempo RFC 3161, diccionarios DSS o firmas de sello de tiempo del documento, siguen siendo aplicables los helpers del lado productor (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX por sí mismo emite una firma básica solo CMS (equivalente a PAdES-B-B)

La sobrecarga a stream nunca retiene un segundo PDF completo en memoria. Hashea la salida parcheada en rangos acotados y parchea por seek el valor CMS hexadecimal sin cambiar la longitud del archivo. Los offsets decimales de ancho fijo soportan PDFs preparados menores de 10.000.000.000 bytes

 

Véase también: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField