Validación de política de firma PAdES

HotPDF crea y valida el atributo firmado CMS explícito signature-policy-identifier usado por las firmas PAdES E-EPES

Genere una política explícita

Asigne SignaturePolicyOID y el digest del documento de política en THPDFCMSSignOptions, y luego elija qualifiers estructurados opcionales

Options := HPDFCMSDefaultOptions(palExtended_E_EPES);
Options.SignaturePolicyOID := '1.2.3.4.5.1';
Options.SignaturePolicyHash := HPDFCMSDigestBytes(PolicyDocument, cmsdaSHA256);
Options.SignaturePolicyURI := 'https://policies.example/approval-v1';

SetLength(Options.SignaturePolicyQualifiers, 1);
Options.SignaturePolicyQualifiers[0].Kind := cmsqUserNotice;
Options.SignaturePolicyQualifiers[0].ExplicitText := 'Approval policy applies';

CMS := HPDFCMSBuildSignedDataEx(KeyMaterial, DocumentDigest, Options);

SignaturePolicyHashAlgOID tiene SHA-256 como predeterminado cuando está vacío, mientras que SignaturePolicyURI sigue siendo un atajo de compatibilidad para un qualifier SPuri y puede combinarse con SignaturePolicyQualifiers

El modelo de qualifiers estructurados soporta SPuri, SPUserNotice con una referencia de aviso y texto explícito opcionales, y SPDocSpecification identificado por un OID o una URI

Asigne SignaturePolicyHashIsUnknown solo cuando el firmante no conozca el hash de la política; HotPDF entonces emite la representación ETSI de todos ceros a la longitud del digest seleccionado

Parseo y reporte

HPDFParseCMSSignature expone el atributo a través de THPDFSignatureInfo.SignaturePolicy, incluyendo su identificador, algoritmo de hash, bytes del hash, flag de hash desconocido, qualifiers y status de validación

Los valores de qualifiers conocidos se decodifican en campos tipados, mientras que un qualifier no reconocido conserva su OID y su valor DER crudo para manejo a nivel de aplicación

HPDFSignatureValidationReportToJSON serializa los mismos datos de política y qualifiers con un status de validación legible por máquina

Fije una política requerida

VerifyOptions := THPDFCMSVerifyOptions.Default;
VerifyOptions.RequireSignaturePolicy := True;
VerifyOptions.ExpectedSignaturePolicyOID := '1.2.3.4.5.1';
VerifyOptions.ExpectedSignaturePolicyHash := ExpectedPolicyHash;
VerifyOptions.SignaturePolicyDocument := PolicyDocument;
VerifyOptions.VerifySignaturePolicyDocumentHash := True;
VerifyOptions.RejectUnknownSignaturePolicyHash := True;

Status := HPDFVerifyCMSSignatureEx(Source, ByteRange, CMS,
  VerifyOptions, SignatureInfo);

Los campos de OID y hash esperados restringen solo el valor correspondiente, y la verificación del documento de política hace hashing incluso de un documento intencionalmente vacío cuando VerifySignaturePolicyDocumentHash es true

Las políticas ausentes, no coincidentes, no soportadas o desconocidas rechazadas devuelven svSignaturePolicyMismatch y vfcSignaturePolicyMismatch con un THPDFSignaturePolicyValidationStatus preciso

Las verificaciones de política se ejecutan antes del trabajo del signature provider, del certificate path o de la evidencia, y aplican solo a registros SignerInfo primarios, así que la política de un documento padre no restringe las counter-signatures

Estrictez y límites

El parser rechaza atributos de política duplicados, valores múltiples, NULL de política implícita, qualifiers conocidos malformados, valores IA5String no ASCII, Unicode inválido, longitudes incorrectas de digests conocidos y tamaños de colección por encima de los límites de implementación configurados

PAdES E-EPES requiere el atributo de política explícito exactamente una vez y prohíbe la entrada /Reason del Signature Dictionary del PDF cuando ese atributo está presente; la capa CMS no puede inspeccionar el diccionario PDF, así que el workflow que produce el PDF debe hacer cumplir esa restricción final

Consulte firmantes primarios múltiples CMS, la consistencia de digests CMS y los reportes de validación CMS