PAdES 簽章原則驗證
HotPDF 建立並驗證 PAdES E-EPES 簽章所用的明確 CMS signature-policy-identifier 簽署屬性
產生明確原則
在 THPDFCMSSignOptions 上設定 SignaturePolicyOID 與原則文件的摘要,再挑選選用的結構化限定詞
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,以及以 OID 或 URI 識別的 SPDocSpecification
只有簽署者不知道原則雜湊時才設定 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、格式錯誤的已知限定詞、非 ASCII 的 IA5String 值、無效 Unicode、錯誤的已知摘要長度,以及超出設定實作上限的集合大小
PAdES E-EPES 要求明確原則屬性恰好出現一次,且該屬性存在時禁止 PDF Signature Dictionary 的 /Reason 項目;CMS 層無法檢查 PDF 字典,這條最終約束必須由產生 PDF 的工作流程把關