CMS 摘要演算法一致性
HotPDF 在讀取已簽署文件範圍、雜湊內容、建構憑證路徑或叫用簽章提供者之前,就會先診斷不一致的 CMS 演算法識別碼
一致性檢查
目前的 SignerInfo.digestAlgorithm 必須出現在外層 SignedData.digestAlgorithms 集合中,而為了與多重簽署器容器互通,不相關的額外演算法仍然允許存在
摘要專屬的 RSA PKCS#1 v1.5 與 ECDSA 簽章 OID,以及 RSA-PSS 參數中明確指定的雜湊,都必須選擇與 SignerInfo.digestAlgorithm 相同的摘要
當 RFC 6211 的 CMSAlgorithmProtection 已簽署屬性存在時,它必須只出現一次且只帶一個值,其受保護的摘要與簽章 AlgorithmIdentifier 值必須與實際的 SignerInfo 欄位相符
對於不帶參數的演算法識別碼,缺少參數與 DER NULL 參數視為等價;其他參數則逐位元組精確比較,參數化的簽章機制因此無法被默默正規化
機器可讀結果
HPDFParseCMSSignature 會保留成功解析出來的中繼資料,但在一致性檢查失敗時把 THPDFSignatureInfo.Status 設為 svDigestAlgorithmMismatch
驗證回傳 svDigestAlgorithmMismatch、驗證報告使用 vfcDigestAlgorithmMismatch、JSON 輸出 digestAlgorithmMismatch,不會把這種狀況折疊成格式錯誤的 CMS、不支援的演算法或內容摘要不符
THPDFSignatureInfo.DigestAlgorithmOID 記錄簽署器的摘要 OID,THPDFSignatureInfo.DigestConsistencyIssue 則從下列原因中擇一
dciSignerDigestNotDeclared— 外層摘要集合中找不到已知的簽署器摘要dciSignatureDigestMismatch— 固定或參數化的簽章機制選擇了另一個摘要dciAlgorithmProtectionDigestMismatch— 受保護的摘要識別碼與簽署器摘要識別碼不同dciAlgorithmProtectionSignatureMismatch— 受保護的簽章識別碼與簽署器簽章識別碼不同
JSON 簽署器物件透過 digestAlgorithmOID 與 digestConsistencyIssue 公開相同資訊,值為 signerDigestNotDeclared、signatureDigestMismatch、algorithmProtectionDigestMismatch 或 algorithmProtectionSignatureMismatch
時間戳記與優先順序
RFC 3161 文件時間戳記與未簽署的簽章時間戳記符記使用同一套檢查,其 THPDFTimestampInfo.DigestConsistencyIssue 值可識別不一致的巢狀 CMS 容器
結構錯誤仍然以格式錯誤的 CMS 失敗、未知的簽署器摘要仍然不受支援,而第一個確定性的一致性問題會依容器、演算法保護、簽章機制的順序保留下來
提供者與已載入文件的驗證契約請參閱現代簽章提供者與THotPDF.VerifyLoadedSignatureWithOptions