CMS 摘要算法一致性
HotPDF 在读取已签名文档区间、计算内容摘要、构建证书路径或调用签名 provider 之前,会先诊断 CMS 算法标识符的不一致问题
一致性检查
当前 SignerInfo.digestAlgorithm 必须出现在外层 SignedData.digestAlgorithms 集合中;为了兼容互操作的多签名者容器,无关的额外算法仍然允许保留
摘要型 RSA PKCS#1 v1.5 与 ECDSA 签名 OID,以及 RSA-PSS 参数中的显式 hash,都必须与 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 文档时间戳和无签名的 signature-timestamp token 走同一套检查,其 THPDFTimestampInfo.DigestConsistencyIssue 值可以定位嵌套 CMS 容器中的不一致问题
结构错误仍然按格式错误的 CMS 处理,未知的签名者摘要依旧算不支持;首个确定的一致性问题按容器、algorithm-protection、签名机制的顺序保留
provider 与已加载文档的验证契约参见 modern signature providers 和 THotPDF.VerifyLoadedSignatureWithOptions