PDFium Delphi Component Docs

Модуль FPdfCryptoWin

Модуль: FPdfCryptoWin
Бэкенд Windows Cryptography API для подписи PAdES, проверки отсоединённого CMS и оценки доверия к системным сертификатам только по кэшу

Syntax

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

Description

FPdfCryptoWin — специфичный для Windows криптографический бэкенд, который использует FPdfCrypto. Он открывает хранилища сертификатов текущего пользователя и локальной машины через CryptoAPI, находит сертификат, соответствующий запрошенному отпечатку, получает связанный дескриптор закрытого ключа NCRYPT и возвращает TPadesResolvedSigner, чей ICmsSigner подписывает через CNG

WinCryptoAvailable выполняет лёгкую проверку, что привязки Crypt32 / ncrypt разрешаются, чтобы вызывающий код мог ещё на старте решить, возможна ли подпись PAdES на этой машине

VerifyWinDetachedCms проверяет отсоединённое значение CMS по двум принадлежащим вызывающему коду сегментам байтов, возвращает сертификат подписанта и оценивает его цепочку с базовой политикой Windows только по кэшу, не выполняя сетевую загрузку

Расширенные функции проверки принимают TWinCmsVerifyOptions, поэтому вызывающий код может включить сетевую загрузку сертификатов, запросить проверку отзывов, задать таймаут загрузки и наблюдать контрольные точки проверки

Действительность подписи и доверие к сертификату — независимые результаты, поэтому подлинная подпись ненадёжного или самоподписанного сертификата остаётся отличимой от изменённого содержимого

Functions

FunctionDescription
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 без настоящей цепочки сертификатов

Verification Types

TypeMembers and purpose
TWinCmsVerifyStatuswcvsUnavailable, wcvsValid, wcvsInvalid, wcvsUnsupported или wcvsIndeterminate
TWinCmsVerifyStagewcvstCryptographicSignature, wcvstChainBuild, wcvstOnlineRetrieval или wcvstRevocationCheck
TWinCmsVerifyCheckpointОбратный вызов — метод объекта, получающий каждое значение TWinCmsVerifyStage
TWinCmsVerifyOptionsOnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs, OnCheckpoint и статическая фабрика Default
TWinCmsVerifyResultПсевдоним TPdfCmsVerifyResult, содержащий SignatureStatus, TrustStatus, RevocationStatus, SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason и RevocationError

Revocation results

С включённым 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 добывать подтверждающие свидетельства в пределах заданного таймаута

Remarks

See Also

FPdfCrypto, FPdfCms