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