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 則從下列原因中擇一

JSON 簽署器物件透過 digestAlgorithmOID 與 digestConsistencyIssue 公開相同資訊,值為 signerDigestNotDeclared、signatureDigestMismatch、algorithmProtectionDigestMismatch 或 algorithmProtectionSignatureMismatch

時間戳記與優先順序

RFC 3161 文件時間戳記與未簽署的簽章時間戳記符記使用同一套檢查,其 THPDFTimestampInfo.DigestConsistencyIssue 值可識別不一致的巢狀 CMS 容器

結構錯誤仍然以格式錯誤的 CMS 失敗、未知的簽署器摘要仍然不受支援,而第一個確定性的一致性問題會依容器、演算法保護、簽章機制的順序保留下來

提供者與已載入文件的驗證契約請參閱現代簽章提供者與THotPDF.VerifyLoadedSignatureWithOptions