Валидация политики подписи PAdES

HotPDF создаёт и проверяет явный подписанный атрибут CMS signature-policy-identifier, используемый подписями PAdES E-EPES

Генерация явной политики

Задайте SignaturePolicyOID и дайджест документа политики в THPDFCMSSignOptions, затем при необходимости выберите структурированные qualifier

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 остаётся совместимым сокращением для одного qualifier SPuri и может сочетаться с SignaturePolicyQualifiers

Модель структурированных qualifier поддерживает SPuri, SPUserNotice с опциональной ссылкой на уведомление и явным текстом, а также SPDocSpecification, идентифицируемый по OID или URI

SignaturePolicyHashIsUnknown устанавливайте только когда подписант не знает хеш политики; тогда HotPDF выдаёт представление ETSI из всех нулей выбранной длины дайджеста

Разбор и отчёт

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

Известные значения qualifier декодируются в типизированные поля, а неопознанный qualifier сохраняет свой OID и исходное значение DER для обработки на уровне приложения

HPDFSignatureValidationReportToJSON сериализует те же данные политики и qualifier с машиночитаемым статусом валидации

Фиксация обязательной политики

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 истинно

Отсутствующая, не совпавшая, неподдерживаемая или отклонённая неизвестная политика возвращает svSignaturePolicyMismatch и vfcSignaturePolicyMismatch с точным THPDFSignaturePolicyValidationStatus

Проверки политики выполняются до работы с провайдером подписи, путём сертификатов или доказательствами и применяются только к первичным записям SignerInfo, поэтому политика родительского документа не ограничивает counter-signature

Строгость и границы

Парсер отклоняет дублирующиеся атрибуты политики, несколько значений, implied-policy NULL, повреждённые известные qualifier, значения IA5String вне ASCII, невалидный Unicode, неверные длины известных дайджестов и размеры коллекций сверх настроенных пределов реализации

PAdES E-EPES требует ровно один явный атрибут политики и запрещает запись /Reason в словаре подписи PDF при наличии этого атрибута; слой CMS не может заглянуть в словарь PDF, поэтому финальное ограничение обязан обеспечивать workflow, порождающий PDF

См. Несколько первичных подписантов CMS, Согласованность digest-алгоритмов CMS и Отчёты валидации CMS