Walidacja polityki podpisu PAdES
HotPDF tworzy i waliduje jawny podpisany atrybut CMS signature-policy-identifier używany przez podpisy PAdES E-EPES
Generowanie jawnej polityki
Ustaw SignaturePolicyOID i digest dokumentu polityki na THPDFCMSSignOptions, a potem dobierz opcjonalne kwalifikatory strukturalne
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 przy pustej wartości przyjmuje SHA-256, a SignaturePolicyURI pozostaje skrótem kompatybilności dla pojedynczego kwalifikatora SPuri i może być łączone z SignaturePolicyQualifiers
Model kwalifikatorów strukturalnych obsługuje SPuri, SPUserNotice z opcjonalną referencją powiadomienia i jawnym tekstem oraz SPDocSpecification identyfikowany przez OID lub URI
Ustawiaj SignaturePolicyHashIsUnknown tylko wtedy, gdy podpisujący nie zna hasha polityki; HotPDF emituje wtedy reprezentację ETSI z samych zer w wybranej długości digestu
Parsowanie i raportowanie
HPDFParseCMSSignature wystawia atrybut przez THPDFSignatureInfo.SignaturePolicy, łącznie z identyfikatorem, algorytmem hasha, bajtami hasha, flagą nieznanego hasha, kwalifikatorami i statusem walidacji
Znane wartości kwalifikatorów są dekodowane do pól typowanych, a nierozpoznany kwalifikator zachowuje swój OID i surową wartość DER do obsługi na poziomie aplikacji
HPDFSignatureValidationReportToJSON serializuje te same dane polityki i kwalifikatorów z maszynowo czytelnym statusem walidacji
Przypięcie wymaganej polityki
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);
Oczekiwane pola OID i hasha ograniczają tylko odpowiadającą im wartość, a weryfikacja dokumentu polityki hashuje nawet celowo pusty dokument, gdy VerifySignaturePolicyDocumentHash jest true
Brakujące, niezgodne, nieobsługiwane lub odrzucone nieznane polityki zwracają svSignaturePolicyMismatch i vfcSignaturePolicyMismatch z precyzyjnym THPDFSignaturePolicyValidationStatus
Sprawdzenia polityki działają przed pracą dostawcy podpisu, ścieżki certyfikatów czy dowodów i dotyczą tylko głównych rekordów SignerInfo, więc polityka dokumentu nadrzędnego nie ogranicza współpodpisów
Surowość i granice
Parser odrzuca zduplikowane atrybuty polityki, wiele wartości, NULL polityki dorozumianej, źle uformowane znane kwalifikatory, wartości IA5String spoza ASCII, nieprawidłowy Unicode, złe długości znanych digestów i rozmiary kolekcji powyżej skonfigurowanych limitów implementacji
PAdES E-EPES wymaga atrybutu jawnej polityki dokładnie raz i zakazuje wpisu /Reason w słowniku PDF Signature Dictionary, gdy ten atrybut jest obecny; warstwa CMS nie może zaglądać do słownika PDF, więc ten ostatni warunek musi wyegzekwować workflow produkujący PDF
Zobacz wielu głównych podpisujących CMS, spójność algorytmów digest CMS i raporty walidacji CMS