Перевірка політики підпису PAdES

HotPDF створює та перевіряє явний підписаний атрибут CMS signature-policy-identifier, який використовують підписи PAdES E-EPES

Створення явної політики

Установіть SignaturePolicyOID і дайджест документа політики на THPDFCMSSignOptions, а потім оберіть необов'язкові структуровані кваліфікатори

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 за замовчуванням використовує SHA-256, коли поле порожнє, тоді як SignaturePolicyURI залишається сумісним ярликом для одного кваліфікатора SPuri і може поєднуватися з SignaturePolicyQualifiers

Модель структурованих кваліфікаторів підтримує SPuri, SPUserNotice із необов'язковим посиланням на повідомлення та явним текстом, а також SPDocSpecification, ідентифікований OID або URI

Установіть SignaturePolicyHashIsUnknown лише тоді, коли підписувач не знає хеш політики; тоді HotPDF видає подання ETSI з усіма нулями на вибраній довжині дайджесту

Розбір і звіт

HPDFParseCMSSignature надає атрибут через THPDFSignatureInfo.SignaturePolicy, включно з його ідентифікатором, алгоритмом хешування, байтами хешу, прапорцем невідомого хешу, кваліфікаторами та статусом перевірки

Відомі значення кваліфікаторів декодуються в типізовані поля, тоді як нерозпізнаний кваліфікатор зберігає свій OID і необроблений DER значення для обробки на рівні застосунку

HPDFSignatureValidationReportToJSON серіалізує ті самі дані політики та кваліфікаторів із машиночитабельним статусом перевірки

Закріплення необхідної політики

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

Поля очікуваного OID і хешу обмежують лише відповідне значення, а перевірка документа політики хешує навіть навмисно порожній документ, коли VerifySignaturePolicyDocumentHash задане як true

Відсутні, невідповідні, непідтримувані або відхилені невідомі політики повертають svSignaturePolicyMismatch і vfcSignaturePolicyMismatch із точним THPDFSignaturePolicyValidationStatus

Перевірки політики виконуються до роботи постачальника підпису, шляху сертифікатів чи доказів і застосовуються лише до основних записів SignerInfo, тому політика батьківського документа не обмежує контрпідписи

Строгість і межі

Парсер відхиляє дублікати атрибутів політики, множинні значення, NULL неявної політики, пошкоджені відомі кваліфікатори, значення IA5String, що не є ASCII, недійсний Unicode, неправильні довжини відомих дайджестів і розміри колекцій, що перевищують налаштовані обмеження реалізації

PAdES E-EPES вимагає явного атрибута політики рівно один раз і забороняє запис /Reason словника підпису PDF, коли цей атрибут присутній; шар CMS не може перевіряти словник PDF, тому робочий процес, що створює PDF, має застосовувати останнє обмеження

Перегляньте множинних основних підписувачів CMS, узгодженість дайджест-алгоритмів CMS та звіти перевірки CMS