Validazione della Politica di Firma PAdES

HotPDF crea e valida l'attributo firmato CMS esplicito signature-policy-identifier usato dalle firme PAdES E-EPES

Generare una politica esplicita

Impostare SignaturePolicyOID e il digest del documento di politica su THPDFCMSSignOptions, poi scegliere i qualifier strutturati opzionali

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 vale SHA-256 per default quando vuoto, mentre SignaturePolicyURI resta una scorciatoia di compatibilità per un singolo qualifier SPuri e può essere combinata con SignaturePolicyQualifiers

Il modello di qualifier strutturato supporta SPuri, SPUserNotice con un notice reference opzionale e testo esplicito, e SPDocSpecification identificato da un OID o un URI

Impostare SignaturePolicyHashIsUnknown solo quando il firmatario non conosce l'hash della politica; HotPDF emette allora la rappresentazione ETSI all-zero alla lunghezza del digest selezionato

Parse e report

HPDFParseCMSSignature espone l'attributo tramite THPDFSignatureInfo.SignaturePolicy, inclusi identificatore, algoritmo di hash, byte dell'hash, flag di hash sconosciuto, qualifier e stato di validazione

I valori dei qualifier noti vengono decodificati in campi tipizzati, mentre un qualifier non riconosciuto conserva il suo OID e il valore DER raw per la gestione a livello applicativo

HPDFSignatureValidationReportToJSON serializza gli stessi dati di politica e qualifier con uno stato di validazione leggibile da macchina

Fissare una politica richiesta

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

I campi di OID e hash attesi vincolano solo il valore corrispondente, e la verifica del documento di politica calcola l'hash anche di un documento volutamente vuoto quando VerifySignaturePolicyDocumentHash è true

Politiche mancanti, non corrispondenti, non supportate o rifiutate come sconosciute restituiscono svSignaturePolicyMismatch e vfcSignaturePolicyMismatch con uno THPDFSignaturePolicyValidationStatus preciso

I controlli di politica girano prima del lavoro su signature provider, percorso di certificati o prove e si applicano solo ai record SignerInfo primari, quindi la politica di un documento padre non vincola le controfirme

Rigidità e limiti

Il parser rifiuta attributi di politica duplicati, valori multipli, NULL di politica implicita, qualifier noti malformati, valori IA5String non ASCII, Unicode non valido, lunghezze errate dei digest noti e dimensioni delle collezioni oltre i limiti implementativi configurati

PAdES E-EPES richiede l'attributo di politica esplicita esattamente una volta e vieta la voce /Reason del dizionario di firma PDF quando quell'attributo è presente; il layer CMS non può ispezionare il dizionario PDF, quindi è il workflow che produce il PDF a dover far rispettare quel vincolo finale

Vedere CMS con più firmatari primari, coerenza degli algoritmi di digest CMS e rapporti di validazione CMS