Валидация политики подписи 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