PDFium Delphi Component 文件

FPdfCryptoWin 单元

单元: FPdfCryptoWin
面向 PAdES 签名、分离式 CMS 验证和仅缓存系统证书信任评估的 Windows 密码学 API 后端

语法

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 是 FPdfCrypto 使用的 Windows 专用加密后端。它通过 CryptoAPI 打开当前用户和本地计算机的证书存储,定位与请求指纹匹配的证书,获取关联的 NCRYPT 私钥句柄,并返回 TPadesResolvedSigner,其 ICmsSigner 通过 CNG 执行签名

WinCryptoAvailable 执行轻量检查以确认 Crypt32 / ncrypt 绑定可解析,因此调用方可以在启动时判断本机是否能够进行 PAdES 签名

VerifyWinDetachedCms 针对两个调用方持有的字节段验证分离式 CMS 值,返回签名者证书,并使用仅缓存的 Windows 基础策略评估其证书链,不执行任何网络检索

扩展验证函数接受 TWinCmsVerifyOptions,调用方由此可以启用在线证书检索、请求吊销检查、设置检索超时并观察验证检查点

签名有效性与证书信任是相互独立的结果,因此来自不受信任或自签名证书的真实签名仍可与被篡改的内容区分开

函数

FunctionDescription
WinCryptoAvailable当运行时可以解析 Windows Crypt32 和 ncrypt 绑定时返回 True
WinCmsVerificationAvailable当分离式 CMS 验证和证书链策略 API 可用时返回 True
VerifyWinDetachedCms针对两个分离的内容段验证 CMS 签名属性和签名,并单独报告当前仅缓存的系统信任状态
VerifyWinDetachedCmsEx以显式的在线检索、吊销、超时和检查点选项验证分离式 CMS 内容
VerifyWinAttachedCmsEx验证随附式 CMS 值,并使用提供的选项评估其签名者证书
ResolveWinSigner使用 Windows 证书存储和 CNG 私钥将指纹解析为签名器、证书 DER 和证书链
TestBuildWinCmsTrust仅在 PDFIUMPAS_CRYPTO_TESTS 条件下编译的测试钩子:把 CNG 链策略函数指针换成调用方提供的桩,在签名状态预设为有效的情况下执行信任构建,然后还原指针,使加密单元测试无需真实证书链即可驱动 BuildWinCmsTrust

验证类型

TypeMembers and purpose
TWinCmsVerifyStatuswcvsUnavailable、wcvsValid、wcvsInvalid、wcvsUnsupported 或 wcvsIndeterminate
TWinCmsVerifyStagewcvstCryptographicSignature、wcvstChainBuild、wcvstOnlineRetrieval 或 wcvstRevocationCheck
TWinCmsVerifyCheckpoint接收每个 TWinCmsVerifyStage 的对象方法回调
TWinCmsVerifyOptionsOnlineRetrieval、CheckRevocation、CollectChainCertificates、UrlRetrievalTimeoutMs、OnCheckpoint,以及静态 Default 工厂
TWinCmsVerifyResultTPdfCmsVerifyResult 的别名,包含 SignatureStatus、TrustStatus、RevocationStatus、SignatureError、TrustError、SignerCertificate、ChainCertificates、RevocationReason 和 RevocationError

吊销结果

启用 CheckRevocation 后,后端会构建一条独立的吊销链,并填充 RevocationStatus、RevocationReason 和 RevocationError。吊销失败不会覆盖签名结果,也不会覆盖独立评估的 TrustStatus 和 TrustError

对格式良好的原生链,确认吊销会产生 wcvsInvalid 加 pcrrCertificateRevoked。没有确认吊销时,不受信任的链产生 wcvsIndeterminate 加 pcrrChainUntrusted;原生结构不完整和其他未决的吊销检查保持 wcvsIndeterminate 加 pcrrUnknown

有效结果要求:链受信任、链无错误、至少有一张证书需要吊销检查,且每张这样的证书都有成功的原生吊销结果。只有终结证书被显式标记为自签名或受信任的 CA 锚点时才豁免于该覆盖要求;只含根证书的链或缺少逐证书证据的链仍视为不确定

RevocationError 保留来自 CERT_REVOCATION_INFO.dwRevocationResult 的原始 DWORD;吊销链调用失败时保留当时的 GetLastError 值。0 表示没有可用的原生诊断,包括链状态确立了吊销却没有对应提供方代码的情形。聚合的 CERT_TRUST_STATUS.dwErrorStatus 位只用于分类,不会作为编造的原生错误复制进该字段

解读该原始值时要结合其 Windows 提供方或 API 上下文;它不保证是 HRESULT。离线、过期或未知的吊销证据无法指认 CRL 过期、CRL 损坏或 CRL 签名错误,因此本后端不推断这些细节原因

OnlineRetrieval = False 时,链构建和吊销检查都只用缓存检索。启用在线检索后,Windows 链引擎才可以在配置的检索超时内获取支撑证据

备注

参见

FPdfCrypto, FPdfCms