PDFium Delphi Component Docs

FPdfCryptoMac 單元

單元: FPdfCryptoMac
面向 PAdES 簽署的 macOS Keychain 後端,並透過 Security.framework 提供 CMS 驗證與憑證信任評估

語法

EPdfKeychainError = class(Exception);

TPdfKeychainSignerProvider = class(TInterfacedObject, IPadesSignerProvider)
  constructor Create(const KeychainPath: string = '');
  function BackendName: string;
  function Resolve(const Options: TPadesSignerOptions): TPadesResolvedSigner;
end;

TPdfKeychainCmsVerifier = class(TInterfacedObject, IPdfCmsVerifier)
  function BackendName: string;
  function VerifyDetached(const CmsDer: TBytes; Segment1: Pointer; Segment1Length: Cardinal; Segment2: Pointer; Segment2Length: Cardinal; const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
  function VerifyAttached(const CmsDer: TBytes; const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
end;

function KeychainAvailable: Boolean;
function KeychainMissingSymbols: string;
function KeychainVerificationAvailable: Boolean;
function ConfigureKeychainSignerProvider: IPadesSignerProvider;
function ConfigureKeychainCmsVerifier: IPdfCmsVerifier;
procedure ConfigureKeychainTrustAnchors(const Anchors: TPadesChainCertArray);
procedure ConfigureKeychainOcspResponses(const Responses: TPadesChainCertArray);

說明

FPdfCryptoMac 是 FPdfCrypto 與 FPdfCms 使用的 macOS 加密後端,它涵蓋平台整合的兩個部分:透過 Keychain 身分進行 PAdES 簽署,以及透過系統 CMS 解碼器與信任評估進行 CMS 驗證。Security.framework 與 CoreFoundation 在執行期按名稱載入並解析符號,而不是連結,因此本單元可以在所有目標平台上編譯,並在執行期回報平台服務是否真正可用

在簽署一側,TPdfKeychainSignerProvider 實作 IPadesSignerProvider。它的 Resolve 方法列舉 Keychain 身分,選出憑證與 TPadesSignerOptions 攜帶的 SHA-1 指紋相符的那一個,讀取憑證 DER 與對應的私鑰參照,並傳回 TPadesResolvedSigner,其 ICmsSigner 透過 Security.framework 對 CMS 已簽屬性進行簽章,因此私鑰從不離開 Keychain。選項中要求的填充方案會與金鑰實際支援的能力相調和,RSASSA-PSS 參數與其他後端產生的完全相同,因此在 macOS 上簽署的文件攜帶一致的 AlgorithmIdentifier。ConfigureKeychainSignerProvider 建構該提供者並將其安裝為目前的 PAdES 簽署後端,傳回它註冊的介面

驗證端的 TPdfKeychainCmsVerifier 以 CMSDecoder 與 SecTrust 實作 IPdfCmsVerifier。VerifyDetached 將簽章預留區兩側的已簽署位元組範圍串接為解碼器所需的分離內容,再據此驗證 CMS 值;VerifyAttached 驗證自帶內容的 CMS 值,時間戳記權杖正是此形式。兩者均傳回 TPdfCmsVerifyResult,分別回報簽章、信任與撤銷狀態,可選擇收集簽署者憑證與評估出的鏈,並遵循 TPdfCmsVerifyOptions 的撤銷、線上擷取及 Checkpoint 設定。ConfigureKeychainCmsVerifier 建立驗證器並註冊為目前的 CMS 驗證後端

簽章有效性與憑證信任保持為相互獨立的結果,因此不受信任或自簽鏈下的真實簽章仍然可與遭竄改的內容區分開

對於內含 RFC 3161 權杖,有上限的 DER 解析會將原始封裝的 TSTInfo 位元組交給原生解碼器,不變更內容類型或已簽署屬性。一般 CMS 驗證會從原生輸入排除未簽署屬性,避免自動時間戳記處理取代外層簽章自身的完整性或憑證鏈結果。這項驗證不檢查副簽章或其他未簽署屬性;ValidatePadesTrust 另外驗證每個原始時間戳記權杖、訊息摘要、TSA 憑證角色、信任與撤銷結果

將 Keychain 檔案路徑傳給 TPdfKeychainSignerProvider.Create,可透過僅作用於本次查詢的搜尋清單,將身分查詢限制在該 Keychain,再以 ConfigurePadesSignerProvider 註冊提供者。空路徑使用目前使用者的搜尋範圍。開啟或搜尋選定 Keychain 不會變更預設 Keychain、使用者搜尋清單或系統信任設定;無效路徑或無法使用範圍搜尋符號時,會拋出 EPdfKeychainError

Resolve 也會透過離線且僅作用於本次查詢的憑證查找與原生鏈建構,匯出簽署憑證可取得的簽發者鏈。候選憑證最多 4096 張、每張 1 MiB、總計 16 MiB;建構出的鏈最多 32 張憑證,包含葉憑證,葉憑證另行傳回,不放入 ChainCertDer。匯出憑證資料不代表建立信任或安裝信任錨點,也無法合成缺少的簽發者

簽署函式

函式說明
KeychainAvailable當 Security.framework 與 CoreFoundation 已載入且簽署所需的全部符號解析成功時傳回 True
KeychainMissingSymbols傳回解析失敗的名稱(以空格分隔),全部繫結成功時傳回空字串
ConfigureKeychainSignerProvider建構 TPdfKeychainSignerProvider,將其安裝為 PAdES 簽署後端,並作為 IPadesSignerProvider 傳回
TPdfKeychainSignerProvider.Create可選擇既有 Keychain 檔案限定身分查詢範圍,拒絕內含 NUL 字元或超過 4096 個字串碼元的路徑
TPdfKeychainSignerProvider.BackendName傳回簽署提供者所回報的後端識別碼
TPdfKeychainSignerProvider.Resolve將 TPadesSignerOptions 與 Keychain 身分進行比對,傳回持有簽署器、憑證 DER 與鏈的 TPadesResolvedSigner

驗證函式

函式說明
KeychainVerificationAvailable當 CMS 解碼器、信任政策與信任評估符號解析成功時傳回 True
ConfigureKeychainCmsVerifier建構 TPdfKeychainCmsVerifier,將其安裝為 CMS 驗證後端,並作為 IPdfCmsVerifier 傳回
ConfigureKeychainTrustAnchors複製明確的 DER 信任錨點,供後續每次信任評估補充系統錨點,不改動 Keychain;上限為 64 張憑證、每張 4 MiB、總計 16 MiB,傳入空陣列即可清除
ConfigureKeychainOcspResponses複製明確的 DER OCSP 證據供原生 Security.framework 評估;上限為 8 份回應、每份 1 MiB、總計 4 MiB,傳入空陣列即可清除
TPdfKeychainCmsVerifier.BackendName傳回驗證後端所回報的後端識別碼
TPdfKeychainCmsVerifier.VerifyDetached使用給定的 TPdfCmsVerifyOptions,針對由 Segment1、Segment1Length、Segment2 與 Segment2Length 描述的兩個呼叫端內容段驗證分離的 CMS 值
TPdfKeychainCmsVerifier.VerifyAttached使用給定的 TPdfCmsVerifyOptions,驗證攜帶自身已簽章內容的內含 CMS 值

類型

類型成員與用途
EPdfKeychainError當 Security.framework 不可用、沒有 Keychain 身分與要求的簽署器相符,或平台簽署呼叫失敗時拋出的例外
TPdfKeychainSignerProvider實作 IPadesSignerProvider 的 PAdES 簽署後端,包含 BackendName 與 Resolve
TPdfKeychainCmsVerifier實作 IPdfCmsVerifier 的 CMS 驗證後端,包含 BackendName、VerifyDetached 與 VerifyAttached

備註

另請參閱

FPdfCryptoWin, FPdfCrypto, FPdfCryptoOcsp, FPdfCms, FPdfTrustedList, FPdfMac