function WinCryptoAvailable: Boolean;
function WinCmsVerificationAvailable: Boolean;
function VerifyWinDetachedCms(const CmsDer: TBytes; Segment1: Pointer; Segment1Length: Cardinal; Segment2: Pointer; Segment2Length: Cardinal): TWinCmsVerifyResult;
function VerifyWinDetachedCmsEx(const CmsDer: TBytes; Segment1: Pointer; Segment1Length: Cardinal; Segment2: Pointer; Segment2Length: Cardinal; const Options: TWinCmsVerifyOptions): TWinCmsVerifyResult;
function VerifyWinAttachedCmsEx(const CmsDer: TBytes; const Options: TWinCmsVerifyOptions): TWinCmsVerifyResult;
function ResolveWinSigner(const Options: TPadesSignerOptions): TPadesResolvedSigner;
function TestBuildWinCmsTrust(SignerCert: Pointer;
const Options: TWinCmsVerifyOptions; GetChain, VerifyPolicy,
FreeChain: Pointer): TWinCmsVerifyResult; // PDFIUMPAS_CRYPTO_TESTS only
FPdfCryptoWin — специфичный для Windows криптографический бэкенд, который использует FPdfCrypto. Он открывает хранилища сертификатов текущего пользователя и локальной машины через CryptoAPI, находит сертификат, соответствующий запрошенному отпечатку, получает связанный дескриптор закрытого ключа NCRYPT и возвращает TPadesResolvedSigner, чей ICmsSigner подписывает через CNG
WinCryptoAvailable выполняет лёгкую проверку, что привязки Crypt32 / ncrypt разрешаются, чтобы вызывающий код мог ещё на старте решить, возможна ли подпись PAdES на этой машине
VerifyWinDetachedCms проверяет отсоединённое значение CMS по двум принадлежащим вызывающему коду сегментам байтов, возвращает сертификат подписанта и оценивает его цепочку с базовой политикой Windows только по кэшу, не выполняя сетевую загрузку
Расширенные функции проверки принимают TWinCmsVerifyOptions, поэтому вызывающий код может включить сетевую загрузку сертификатов, запросить проверку отзывов, задать таймаут загрузки и наблюдать контрольные точки проверки
Действительность подписи и доверие к сертификату — независимые результаты, поэтому подлинная подпись ненадёжного или самоподписанного сертификата остаётся отличимой от изменённого содержимого
| Function | Description |
|---|---|
WinCryptoAvailable | Возвращает True, когда привязки Windows Crypt32 и ncrypt разрешаются во время выполнения |
WinCmsVerificationAvailable | Возвращает True, когда доступны проверка отсоединённого CMS и API политики цепочки сертификатов |
VerifyWinDetachedCms | Проверяет подписанные атрибуты и подпись CMS по двум отсоединённым сегментам содержимого и отдельно сообщает текущее системное доверие только по кэшу |
VerifyWinDetachedCmsEx | Проверяет содержимое отсоединённого CMS с явными опциями сетевой загрузки, отзыва, таймаута и контрольных точек |
VerifyWinAttachedCmsEx | Проверяет присоединённое значение CMS и оценивает сертификат подписанта с переданными опциями |
ResolveWinSigner | Превращает отпечаток в подписанта, DER сертификата и цепочку, используя хранилище сертификатов Windows и закрытый ключ CNG |
TestBuildWinCmsTrust | Тестово-условный хук, компилируемый только под PDFIUMPAS_CRYPTO_TESTS: подменяет указатели на функции CNG-политики цепочки заглушками вызывающего кода, прогоняет построение доверия с заранее валидным статусом подписи и возвращает указатели на место, чтобы криптографические юнит-тесты могли упражнять BuildWinCmsTrust без настоящей цепочки сертификатов |
| Type | Members and purpose |
|---|---|
TWinCmsVerifyStatus | wcvsUnavailable, wcvsValid, wcvsInvalid, wcvsUnsupported или wcvsIndeterminate |
TWinCmsVerifyStage | wcvstCryptographicSignature, wcvstChainBuild, wcvstOnlineRetrieval или wcvstRevocationCheck |
TWinCmsVerifyCheckpoint | Обратный вызов — метод объекта, получающий каждое значение TWinCmsVerifyStage |
TWinCmsVerifyOptions | OnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs, OnCheckpoint и статическая фабрика Default |
TWinCmsVerifyResult | Псевдоним TPdfCmsVerifyResult, содержащий SignatureStatus, TrustStatus, RevocationStatus, SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason и RevocationError |
С включённым CheckRevocation бэкенд строит отдельную цепочку отзыва и заполняет RevocationStatus, RevocationReason и RevocationError. Сбои отзыва не перезаписывают результат подписи и независимо вычисленные TrustStatus и TrustError
Для корректной нативной цепочки подтверждённый отзыв даёт wcvsInvalid с pcrrCertificateRevoked. Без подтверждённого отзыва недоверенная цепочка даёт wcvsIndeterminate с pcrrChainUntrusted; неполные нативные структуры и прочие неразрешённые проверки отзыва остаются wcvsIndeterminate с pcrrUnknown
Валидный результат требует доверенной цепочки, отсутствия ошибок цепочки, хотя бы одного сертификата, требующего проверки отзыва, и успешного нативного результата отзыва для каждого такого сертификата. Из этого требования покрытия исключается только терминальный сертификат, явно помеченный как самоподписанный или как якорь доверенного CA; цепочка из одного корня или недостающие свидетельства по отдельным сертификатам остаются неопределёнными
RevocationError сохраняет сырой DWORD из CERT_REVOCATION_INFO.dwRevocationResult или непосредственное значение GetLastError, когда вызов цепочки отзыва не удался. Ноль означает, что нативная диагностика недоступна, в том числе когда статус цепочки устанавливает отзыв без соответствующего кода провайдера. Агрегатные биты CERT_TRUST_STATUS.dwErrorStatus используются для классификации и не копируются в это поле как выдуманный нативный код
Трактовать сырое значение нужно в контексте его провайдера или API Windows; никто не гарантирует, что это HRESULT. Офлайн-, устаревшие или неизвестные свидетельства отзыва не называют истёкшую CRL, кривую CRL или плохую подпись CRL, поэтому этот бэкенд не выводит такие детальные причины
С OnlineRetrieval = False и построение цепочки, и проверка отзыва используют только кэш. Включение сетевой загрузки разрешает движку цепочек Windows добывать подтверждающие свидетельства в пределах заданного таймаута
PadesCryptoAvailable = False, если не зарегистрирован другой бэкендTWinCmsVerifyOptions.Default сохраняет проверку только по кэшу; включайте сетевую загрузку и проверку отзывов, только когда приложение принимает сетевой доступ и его задержкиRevocationReason: TPdfCmsRevocationReason и RevocationError: Cardinal. Когда отзыв выключен или до его прохода дело не дошло, эти поля хранят pcrrNone и ноль; те же значения сопровождают успешную проверку, так что вердикт выносите по RevocationStatusNativeRevocationError и NativeTimeStampRevocationError