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