Согласованность digest-алгоритмов CMS
HotPDF диагностирует несогласованные идентификаторы алгоритмов CMS до чтения подписанных диапазонов документа, хеширования содержимого, построения цепочек сертификатов или вызова signature provider
Проверки согласованности
Текущий SignerInfo.digestAlgorithm должен присутствовать в наборе SignedData.digestAlgorithms объемлющего контейнера, при этом посторонние дополнительные алгоритмы остаются допустимыми для интероперабельных контейнеров с несколькими подписантами
Digest-специфичные OID подписей RSA PKCS#1 v1.5 и ECDSA, а также явный hash в параметрах RSA-PSS должны выбирать тот же digest, что и SignerInfo.digestAlgorithm
Если присутствует подписанный атрибут CMSAlgorithmProtection из RFC 6211, он должен встречаться один раз с одним значением, а его защищённые digest и signature AlgorithmIdentifier должны совпадать с фактическими полями SignerInfo
Отсутствующие параметры и DER NULL сравниваются как эквивалентные для идентификаторов алгоритмов без параметров; прочие параметры сравниваются точно, чтобы параметризованные механизмы подписи нельзя было молча нормализовать
Машиночитаемый результат
HPDFParseCMSSignature сохраняет успешно разобранные метаданные, но выставляет THPDFSignatureInfo.Status в svDigestAlgorithmMismatch, когда проверка согласованности проваливается
Верификация возвращает svDigestAlgorithmMismatch, отчёты валидации используют vfcDigestAlgorithmMismatch, а JSON выдаёт digestAlgorithmMismatch — условие не сворачивается в malformed CMS, unsupported algorithm или несовпадение content digest
THPDFSignatureInfo.DigestAlgorithmOID записывает OID digest подписанта, а THPDFSignatureInfo.DigestConsistencyIssue выбирает одну из следующих причин
dciSignerDigestNotDeclared— известный digest подписанта отсутствует во внешнем наборе digestdciSignatureDigestMismatch— фиксированный или параметризованный механизм подписи выбирает другой digestdciAlgorithmProtectionDigestMismatch— защищённый идентификатор digest отличается от идентификатора digest подписантаdciAlgorithmProtectionSignatureMismatch— защищённый идентификатор подписи отличается от идентификатора подписи подписанта
JSON-объекты подписантов открывают ту же информацию как digestAlgorithmOID и digestConsistencyIssue со значениями signerDigestNotDeclared, signatureDigestMismatch, algorithmProtectionDigestMismatch или algorithmProtectionSignatureMismatch
Timestamp и приоритеты
Document timestamp RFC 3161 и неподписанные signature timestamp token'ы проходят те же проверки, а их значение THPDFTimestampInfo.DigestConsistencyIssue указывает на несогласованный вложенный CMS-контейнер
Структурные ошибки по-прежнему проваливаются как malformed CMS, неизвестные digest подписанта остаются неподдерживаемыми, а первая детерминированная проблема согласованности сохраняется в порядке: контейнер, algorithm protection, затем механизм подписи
См. современные signature provider и THotPDF.VerifyLoadedSignatureWithOptions — там описаны контракты верификации провайдеров и загруженных документов