EPdfKeychainError = class(Exception);
TPdfKeychainSignerProvider = class(TInterfacedObject, IPadesSignerProvider)
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;
FPdfCryptoMac är macOS-kryptobackenden som FPdfCrypto och FPdfCms konsumerar, och det täcker båda halvorna av plattformsintegrationen: PAdES-signering via en Keychain-identitet och CMS-verifiering via systemets CMS-avkodare och trotsutvärdering. Security.framework och CoreFoundation läses in och slås upp vid namn vid körning i stället för att länkas, så att enheten kompilerar på alla mål och rapporterar vid körning om plattformstjänsterna faktiskt kan nås
På signeringssidan implementerar TPdfKeychainSignerProvider IPadesSignerProvider. Dess Resolve-metod räknar upp Keychain-identiteterna, väljer den vars certifikat matchar SHA-1-tumavtrycket som TPadesSignerOptions bär, läser certifikatets DER och den matchande privatnyckelreferensen och returnerar en TPadesResolvedSigner vars ICmsSigner signerar de CMS-signerade attributen via Security.framework, så att privatnyckeln aldrig lämnar Keychain. Padding-schemat som begärs via alternativen avstämms mot vad nyckeln faktiskt klarar, och RSASSA-PSS-parametrarna är desamma som de andra backenderna skickar, så att ett dokument signerat på macOS får en identisk AlgorithmIdentifier. ConfigureKeychainSignerProvider bygger providern och installerar den som aktiv PAdES-signeringsbackend och returnerar det gränssnitt den registrerade
På verifieringssidan implementerar TPdfKeychainCmsVerifier IPdfCmsVerifier ovanpå CMSDecoder och SecTrust. VerifyDetached fogar samman de två signerade byteintervallen på varsin sida om signaturhålet till det fristående innehåll som avkodaren förväntar sig och verifierar därefter CMS-värdet mot det; VerifyAttached verifierar ett CMS-värde som bär sitt eget innehåll, vilket är det en tidsstämpeltoken behöver. Båda returnerar en TPdfCmsVerifyResult som rapporterar signaturstatus, trotsstatus och återkallningsstatus var för sig, samlar valfritt in signerarcertifikatet och den utvärderade kedjan, och båda följer återkallnings-, onlinehämtnings- och kontrollpunktsinställningarna i TPdfCmsVerifyOptions. ConfigureKeychainCmsVerifier bygger verifieraren och installerar den som aktiv CMS-verifieringsbackend
Signaturgiltighet och certifikattrot förblir separata resultat, så en äkta signatur under en otrott eller självsignerad kedja förblir åtskild från manipulerat innehåll
För en bifogad RFC 3161-token levererar avgränsad DER-tolkning de ursprungliga inkapslade TSTInfo-oktetterna till den nativa avkodaren utan att ändra deras innehållstyp eller signerade attribut. Det vanliga CMS-verifieringspasset utesluter osignerade attribut från sin nativa indata så att automatisk tidsstämpelbearbetning inte kan ersätta den yttre signaturens egen integritet eller kedjeresultat. Detta pass validerar inte motsignaturer eller andra osignerade attribut; ValidatePadesTrust verifierar varje ursprunglig tidsstämpeltoken, meddelandeavtryck, TSA-certifikatroll, tillit och återkallningsresultat separat
Skicka en Keychain-filsökväg till TPdfKeychainSignerProvider.Create för att begränsa identitetsuppslagningen till den Keychain-filen via en frågelokal söklista och registrera sedan providern med ConfigurePadesSignerProvider. En tom sökväg använder den aktuella användarens sökomfattning. Att öppna eller söka i den valda Keychain-filen ändrar inte standard-Keychain, användarens söklista eller systemets trotskonfiguration; ogiltiga sökvägar och otillgängliga scoped-search-symboler utlöser EPdfKeychainError
Resolve exporterar även signeringscertifikatets tillgängliga utfärdarkedja via en offline, frågelokal certifikatuppslagning och nativ kedjekonstruktion. Kandidatcertifikat är begränsade till 4096 poster, 1 MiB vardera och 16 MiB totalt; den konstruerade kedjan är begränsad till 32 certifikat inklusive lövet, vilket returneras separat från ChainCertDer. Att exportera certifikatmaterial fastställer ingen tillit och installerar inget trust anchor, och en otillgänglig utfärdare kan inte syntetiseras
| Function | Description |
|---|---|
KeychainAvailable | Returnerar True när Security.framework och CoreFoundation lästs in och alla symboler som krävs för signering slagits upp |
KeychainMissingSymbols | Returnerar namnen som inte kunde slås upp, åtskilda av mellanslag, eller en tom sträng när allt band |
ConfigureKeychainSignerProvider | Bygger en TPdfKeychainSignerProvider, installerar den som PAdES-signeringsbackend och returnerar den som en IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Väljer en valfri befintlig Keychain-fil för begränsad identitetsuppslagning och avvisar inbäddade NUL-tecken och sökvägar längre än 4096 strängkodsenheter |
TPdfKeychainSignerProvider.BackendName | Returnerar backend-identifieraren som rapporteras för signeringsprovidern |
TPdfKeychainSignerProvider.Resolve | Matchar TPadesSignerOptions mot Keychain-identiteterna och returnerar en TPadesResolvedSigner som håller signeraren, certifikatets DER och kedjan |
| Function | Description |
|---|---|
KeychainVerificationAvailable | Returnerar True när symbolerna för CMS-avkodaren, trotspolicyn och trotsutvärderingen slagits upp |
ConfigureKeychainCmsVerifier | Bygger en TPdfKeychainCmsVerifier, installerar den som CMS-verifieringsbackend och returnerar den som en IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Klonar explicita DER-ankare för varje senare trotsutvärdering och kompletterar systemets ankare utan att ändra Keychain-filen; gränserna är 64 certifikat, 4 MiB vardera och 16 MiB totalt, och en tom array rensar dem |
ConfigureKeychainOcspResponses | Klonar explicit DER-OCSP-evidens för nativ Security.framework-utvärdering; gränserna är 8 svar, 1 MiB vardera och 4 MiB totalt, och en tom array rensar dem |
TPdfKeychainCmsVerifier.BackendName | Returnerar backend-identifieraren som rapporteras för verifieringsbackenden |
TPdfKeychainCmsVerifier.VerifyDetached | Verifierar ett fristående CMS-värde mot de två anroparägda innehållssegmenten som beskrivs av Segment1, Segment1Length, Segment2 och Segment2Length, med de angivna TPdfCmsVerifyOptions |
TPdfKeychainCmsVerifier.VerifyAttached | Verifierar ett bifogat CMS-värde som bär sitt eget signerade innehåll, med de angivna TPdfCmsVerifyOptions |
| Type | Members and purpose |
|---|---|
EPdfKeychainError | Undantag som kastas när Security.framework inte är tillgängligt, när ingen Keychain-identitet matchar den begärda signeraren eller när plattformens signeringsanrop misslyckas |
TPdfKeychainSignerProvider | PAdES-signeringsbackend som implementerar IPadesSignerProvider, med BackendName och Resolve |
TPdfKeychainCmsVerifier | CMS-verifieringsbackend som implementerar IPdfCmsVerifier, med BackendName, VerifyDetached och VerifyAttached |
KeychainAvailable och KeychainVerificationAvailable rapporterar signering och verifiering var för sig eftersom de två halvorna behöver olika frameworksymboler, så ett system kan binda den ena och inte den andraKeychainMissingSymbols namnger varje symbol som inte kunde slås upp, vilket är det som gör ett saknat framework åtskiljbart från ett bindningsproblem: ett tomt resultat betyder att allt band, ett resultat som namnger framework-sökvägarna betyder att frameworken inte lästes in, och ett resultat som namnger enskilda ingångspunkter betyder att frameworken lästes in men att ett namn inte gick att slå uppKeychainAvailable och KeychainVerificationAvailable, returnerar en tom KeychainMissingSymbols och kastar EPdfKeychainError från konfigurationsfunktionernaTPadesSignerOptions inte bär något certifikattumavtryck väljs den första användbara identiteten i Keychain, vilket passar ett test snarare än en produktionssignaturpcvsUnsupported och behåller nativ diagnostik i stället för att rapportera giltig eller ogiltig integritet. Använd OpenSSL-CMS-verifieraren för dessa värden; blandad signerardiagnostik behåller varje signerares separata algoritmresultatFreshOcspResponse, följt av nativa kontroller av respondersignatur, auktoritet och certifikat. Den tillåtna driften är 300 sekunder, och producedAt och thisUpdate är begränsade till en dags ålderOnlineRetrieval=False stänger av nativ hämtning från trotsnätverket. Nativ online-utvärdering i Security.framework följer plattformens beteende; UrlRetrievalTimeoutMs ger inte den avgränsade OpenSSL-transporttidsgränsen på denna backendCollectSignerDiagnostics=True returnerar separata signerarögonblicksbilder, begränsade av MaxSignerCount och en hård gräns på 64. Returnerat certifikatmaterial är begränsat till 4 MiB per certifikat och 64 MiB totalt; en ofullständig insamling rapporterar pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid betyder att insamlingen är komplett, inklusive underkända signerardomar. RevocationError bär nativ Security.framework-status, medan RevocationCertificate förblir tom på denna backend