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 è il backend crittografico macOS consumato da FPdfCrypto e FPdfCms, e copre entrambe le metà dell'integrazione di piattaforma: la firma PAdES tramite un'identità Keychain, e la verifica CMS tramite il decoder CMS di sistema e la valutazione di attendibilità. Security.framework e CoreFoundation vengono caricati e risolti per nome a runtime anziché essere linkati, così l'unità compila su ogni target e riporta a runtime se i servizi della piattaforma sono effettivamente raggiungibili
Sul fronte della firma, TPdfKeychainSignerProvider implementa IPadesSignerProvider. Il suo metodo Resolve enumera le identità del Keychain, seleziona quella il cui certificato corrisponde al thumbprint SHA-1 portato da TPadesSignerOptions, legge il DER del certificato e il riferimento alla chiave privata corrispondente, e restituisce un TPadesResolvedSigner il cui ICmsSigner firma gli attributi firmati CMS tramite Security.framework, così la chiave privata non lascia mai il Keychain. Lo schema di padding richiesto tramite le opzioni viene riconciliato con ciò che la chiave può effettivamente fare, e i parametri RSASSA-PSS sono gli stessi che gli altri backend emettono, così un documento firmato su macOS porta un AlgorithmIdentifier identico. ConfigureKeychainSignerProvider costruisce il provider e lo installa come backend di firma PAdES attivo, restituendo l'interfaccia che ha registrato
Per la verifica, TPdfKeychainCmsVerifier implementa IPdfCmsVerifier su CMSDecoder e SecTrust. VerifyDetached unisce i due intervalli firmati ai lati del vuoto della firma nel contenuto detached richiesto dal decoder e verifica il valore CMS; VerifyAttached verifica un valore CMS con contenuto incorporato, necessario per i token di timestamp. Entrambi restituiscono TPdfCmsVerifyResult con stati separati di firma, attendibilità e revoca, raccogliendo opzionalmente certificato del firmatario e catena valutata e rispettando revoca, recupero online e checkpoint di TPdfCmsVerifyOptions. ConfigureKeychainCmsVerifier costruisce il verificatore e lo installa come backend CMS attivo
La validità della firma e l'attendibilità del certificato restano risultati indipendenti, così una firma autentica sotto una catena non attendibile o autofirmata resta distinguibile da un contenuto manomesso
Per un token RFC 3161 attached, il parsing DER limitato passa al decoder nativo gli ottetti TSTInfo originali senza cambiarne tipo di contenuto o attributi firmati. La verifica CMS ordinaria esclude gli attributi non firmati dall'input nativo, affinché il trattamento automatico del timestamp non sostituisca integrità o catena della firma esterna. Questa fase non verifica controfirme o altri attributi non firmati; ValidatePadesTrust verifica separatamente ogni token di timestamp originale, imprint, ruolo del certificato TSA, attendibilità e revoca
Passare un percorso Keychain a TPdfKeychainSignerProvider.Create per limitare la ricerca dell'identità a quel file tramite una lista locale alla query, quindi registrare il provider con ConfigurePadesSignerProvider. Un percorso vuoto usa l'ambito di ricerca dell'utente corrente. Apertura o ricerca non cambiano Keychain predefinito, lista utente o attendibilità di sistema; percorsi non validi e simboli di ricerca circoscritta indisponibili sollevano EPdfKeychainError
Resolve esporta anche la catena degli emittenti disponibile del certificato di firma tramite ricerca offline locale alla query e costruzione nativa della catena. I candidati sono limitati a 4096 certificati, 1 MiB ciascuno e 16 MiB totali; la catena costruita a 32 certificati incluso il leaf, restituito separatamente da ChainCertDer. Esportare certificati non stabilisce attendibilità né installa un trust anchor e un emittente mancante non può essere sintetizzato
| Funzione | Descrizione |
|---|---|
KeychainAvailable | Restituisce True quando Security.framework e CoreFoundation sono caricati e ogni simbolo richiesto per la firma è stato risolto |
KeychainMissingSymbols | Restituisce i nomi che non sono stati risolti, separati da spazi, o una stringa vuota quando tutto è stato linkato |
ConfigureKeychainSignerProvider | Costruisce un TPdfKeychainSignerProvider, lo installa come backend di firma PAdES e lo restituisce come IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Seleziona opzionalmente un file Keychain esistente per circoscrivere la ricerca dell'identità; rifiuta NUL incorporati e percorsi oltre 4096 unità di codice di stringa |
TPdfKeychainSignerProvider.BackendName | Restituisce l'identificatore di backend riportato per il provider di firma |
TPdfKeychainSignerProvider.Resolve | Confronta TPadesSignerOptions con le identità del Keychain e restituisce un TPadesResolvedSigner contenente il firmatario, il DER del certificato e la catena |
| Funzione | Descrizione |
|---|---|
KeychainVerificationAvailable | Restituisce True quando i simboli del decoder CMS, della trust policy e della valutazione di attendibilità sono stati risolti |
ConfigureKeychainCmsVerifier | Costruisce un TPdfKeychainCmsVerifier, lo installa come backend di verifica CMS e lo restituisce come IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Clona trust anchor DER espliciti per ogni successiva valutazione, integrando quelli di sistema senza modificare Keychain; i limiti sono 64 certificati, 4 MiB ciascuno e 16 MiB totali e un array vuoto li azzera |
ConfigureKeychainOcspResponses | Clona prove OCSP DER esplicite per la valutazione nativa Security.framework; i limiti sono 8 risposte, 1 MiB ciascuna e 4 MiB totali e un array vuoto le azzera |
TPdfKeychainCmsVerifier.BackendName | Restituisce l'identificatore di backend riportato per il backend di verifica |
TPdfKeychainCmsVerifier.VerifyDetached | Verifica un valore CMS detached rispetto ai due segmenti di contenuto posseduti dal chiamante descritti da Segment1, Segment1Length, Segment2 e Segment2Length, usando le TPdfCmsVerifyOptions fornite |
TPdfKeychainCmsVerifier.VerifyAttached | Verifica un valore CMS attached che porta il proprio contenuto firmato, usando le TPdfCmsVerifyOptions fornite |
| Tipo | Membri e scopo |
|---|---|
EPdfKeychainError | Eccezione sollevata quando Security.framework non è disponibile, quando nessuna identità del Keychain corrisponde al firmatario richiesto, o quando la chiamata di firma della piattaforma fallisce |
TPdfKeychainSignerProvider | Backend di firma PAdES che implementa IPadesSignerProvider, con BackendName e Resolve |
TPdfKeychainCmsVerifier | Backend di verifica CMS che implementa IPdfCmsVerifier, con BackendName, VerifyDetached e VerifyAttached |
KeychainAvailable e KeychainVerificationAvailable riportano firma e verifica separatamente perché le due metà richiedono simboli di framework diversi, così un sistema può linkarne una e non l'altraKeychainMissingSymbols nomina ogni simbolo che non è stato risolto, ciò che rende distinguibile un framework assente da un problema di link: un risultato vuoto significa che tutto è stato linkato, un risultato che nomina i percorsi dei framework significa che i framework non si sono caricati, e un risultato che nomina singoli entry point significa che i framework si sono caricati ma un nome non è stato risoltoKeychainAvailable e KeychainVerificationAvailable, una stringa vuota da KeychainMissingSymbols e solleva EPdfKeychainError nelle funzioni di configurazioneTPadesSignerOptions non porta alcun thumbprint del certificato viene selezionata la prima identità utilizzabile nel Keychain, adatta a un test più che a una firma di produzionepcvsUnsupported e conservano la diagnostica nativa, senza dichiarare l'integrità valida o non valida. Usare il verificatore CMS OpenSSL per tali valori; la diagnostica di firmatari misti mantiene il risultato dell'algoritmo di ciascunoFreshOcspResponse, poi dai controlli nativi su firma, autorità del responder e certificato. Lo scarto consentito è 300 secondi e producedAt e thisUpdate possono risalire al massimo a un giorno primaOnlineRetrieval=False disabilita il recupero di rete nativo per l'attendibilità. La valutazione online Security.framework segue il comportamento della piattaforma; UrlRetrievalTimeoutMs non fornisce su questo backend la scadenza limitata del trasporto OpenSSLCollectSignerDiagnostics=True restituisce snapshot separati dei firmatari, limitati da MaxSignerCount e dal massimo rigido di 64. I certificati restituiti sono limitati a 4 MiB ciascuno e 64 MiB totali; una raccolta incompleta segnala pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid indica raccolta completa, anche per verdetti negativi. RevocationError contiene lo stato nativo Security.framework e RevocationCertificate resta vuoto su questo backend