PAdES 签名策略验证
HotPDF 可以创建并验证 PAdES E-EPES 签名所用的显式 CMS signature-policy-identifier 签名属性
生成显式策略
在 THPDFCMSSignOptions 上设置 SignaturePolicyOID 和策略文档的摘要,再按需选择结构化 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 只是单个 SPuri qualifier 的兼容捷径,可以与 SignaturePolicyQualifiers 组合使用
结构化 qualifier 模型支持 SPuri、带可选 notice reference 和显式文本的 SPUserNotice,以及以 OID 或 URI 标识的 SPDocSpecification
只有签名者不知道策略 hash 时才设置 SignaturePolicyHashIsUnknown;此时 HotPDF 会按所选摘要长度输出 ETSI 的全零表示
解析与报告
HPDFParseCMSSignature 通过 THPDFSignatureInfo.SignaturePolicy 暴露该属性,包括标识符、hash 算法、hash 字节、未知 hash 标志、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 与 hash 字段只约束对应的值;VerifySignaturePolicyDocumentHash 为 true 时,即使策略文档故意为空也会参与 hash 验证
策略缺失、不匹配、不支持或被拒绝的未知策略会返回 svSignaturePolicyMismatch 和 vfcSignaturePolicyMismatch,并给出精确的 THPDFSignaturePolicyValidationStatus
策略检查在签名 provider、证书路径或证据工作之前执行,且只作用于主 SignerInfo 记录,因此父文档策略不会约束会签
严格性与边界
解析器会拒绝重复的策略属性、多个值、implied-policy NULL、格式错误的已知 qualifier、非 ASCII 的 IA5String 值、非法 Unicode、长度错误的已知摘要,以及超出配置实现上限的集合尺寸
PAdES E-EPES 要求显式策略属性恰好出现一次,并且在该属性存在时禁止 PDF 签名字典中的 /Reason 条目;CMS 层无法检查 PDF 字典,所以这条最终约束必须由生成 PDF 的工作流来执行