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