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 is de macOS-cryptobackend die door FPdfCrypto en FPdfCms wordt gebruikt en die beide helften van de platformintegratie dekt: PAdES-ondertekening via een Keychain-identiteit, en CMS-verificatie via de systeem-CMS-decoder en vertrouwensevaluatie. Security.framework en CoreFoundation worden tijdens runtime op naam geladen en opgezocht in plaats van gekoppeld, zodat de unit op elk doel compileert en tijdens runtime rapporteert of de platformservices daadwerkelijk bereikbaar zijn
Aan de ondertekenkant implementeert TPdfKeychainSignerProvider IPadesSignerProvider. Zijn Resolve-methode somt de Keychain-identiteiten op, selecteert degene waarvan het certificaat overeenkomt met de SHA-1-thumbprint in TPadesSignerOptions, leest het certificaat-DER en de bijbehorende private-sleutelreferentie, en geeft een TPadesResolvedSigner terug waarvan de ICmsSigner de CMS signed attributes via Security.framework ondertekent, zodat de private sleutel de Keychain nooit verlaat. Het via de opties gevraagde paddingschema wordt afgestemd op wat de sleutel werkelijk kan, en de RSASSA-PSS-parameters zijn dezelfde die de andere backends emitteren, zodat een op macOS ondertekend document een identieke AlgorithmIdentifier meedraagt. ConfigureKeychainSignerProvider bouwt de provider en installeert deze als de actieve PAdES-ondertekeningsbackend, en geeft de geregistreerde interface terug
Aan de verificatiekant implementeert TPdfKeychainCmsVerifier IPdfCmsVerifier bovenop CMSDecoder en SecTrust. VerifyDetached voegt de twee ondertekende bytebereiken aan weerszijden van het handtekeninggat samen tot de losse inhoud die de decoder verwacht, en verifieert de CMS-waarde er vervolgens tegen; VerifyAttached verifieert een CMS-waarde die zijn eigen inhoud meedraagt, wat een timestamp-token nodig heeft. Beide geven een TPdfCmsVerifyResult terug die de status van de handtekening, het vertrouwen en de revocation apart rapporteert, optioneel het signercertificaat en de geëvalueerde keten verzamelt, en beide respecteren de instellingen voor revocation, online ophalen en checkpoints in TPdfCmsVerifyOptions. ConfigureKeychainCmsVerifier bouwt de verifier en installeert deze als de actieve CMS-verificatiebackend
Handtekeninggeldigheid en certificaatvertrouwen blijven onafhankelijke resultaten, zodat een authentieke handtekening onder een niet-vertrouwde of zelfondertekende keten onderscheidbaar blijft van gemanipuleerde inhoud
Voor een ingesloten RFC 3161-token levert begrensde DER-parsing de oorspronkelijk ingekapselde TSTInfo-octetten aan de native decoder, zonder hun contenttype of signed attributes te wijzigen. De gewone CMS-verificatieronde sluit unsigned attributes uit van zijn native invoer, zodat automatische timestampverwerking het eigen integriteits- of ketenresultaat van de buitenste handtekening niet kan vervangen. Deze ronde valideert geen medeondertekeningen of andere unsigned attributes; ValidatePadesTrust verifieert elk oorspronkelijk timestamp-token, message imprint, de TSA-certificaatrol, trust en revocatieresultaat apart
Geef een Keychain-bestandspad mee aan TPdfKeychainSignerProvider.Create om het opzoeken van identiteiten tot die Keychain te beperken via een query-lokale zoeklijst, en registreer de provider daarna met ConfigurePadesSignerProvider. Een leeg pad gebruikt het zoekbereik van de huidige gebruiker. Het openen of doorzoeken van de geselecteerde Keychain wijzigt de standaard-Keychain, de gebruikerszoeklijst of de systeemtrustconfiguratie niet; ongeldige paden en niet-beschikbare scoped-search-symbolen werpen EPdfKeychainError
Resolve exporteert ook de beschikbare issuersketen van het ondertekeningscertificaat via een offline, query-lokale certificaatopzoeking en native ketenconstructie. Kandidaatcertificaten zijn beperkt tot 4096 items, 1 MiB per stuk en 16 MiB in totaal; de opgebouwde keten is beperkt tot 32 certificaten inclusief het leaf, dat afzonderlijk van ChainCertDer wordt teruggegeven. Het exporteren van certificaatmateriaal vestigt geen vertrouwen en installeert geen trust anchor, en een niet-beschikbare issuer kan niet worden gesynthetiseerd
| Function | Description |
|---|---|
KeychainAvailable | Geeft True terug wanneer Security.framework en CoreFoundation zijn geladen en elk symbool dat voor ondertekening nodig is, is opgezocht |
KeychainMissingSymbols | Geeft de namen terug die niet konden worden opgezocht, gescheiden door spaties, of een lege string wanneer alles is gebonden |
ConfigureKeychainSignerProvider | Bouwt een TPdfKeychainSignerProvider, installeert hem als de PAdES-ondertekeningsbackend en geeft hem terug als IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Selecteert een optionele bestaande Keychain voor scoped identiteitsopzoeking en wijst ingebedde NUL-tekens en paden langer dan 4096 string-code-eenheden af |
TPdfKeychainSignerProvider.BackendName | Geeft de backend-identificatie terug die voor de ondertekeningsprovider wordt gerapporteerd |
TPdfKeychainSignerProvider.Resolve | Vergelijkt TPadesSignerOptions met de Keychain-identiteiten en geeft een TPadesResolvedSigner terug met de signer, het certificaat-DER en de keten |
| Function | Description |
|---|---|
KeychainVerificationAvailable | Geeft True terug wanneer de symbolen voor de CMS-decoder, het trustbeleid en de vertrouwensevaluatie zijn opgezocht |
ConfigureKeychainCmsVerifier | Bouwt een TPdfKeychainCmsVerifier, installeert hem als de CMS-verificatiebackend en geeft hem terug als IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Kloont expliciete DER-anchors voor elke latere vertrouwensevaluatie, als aanvulling op systeemanchors zonder de Keychain te wijzigen; de limieten zijn 64 certificaten, 4 MiB per stuk en 16 MiB in totaal, en een lege array wist ze |
ConfigureKeychainOcspResponses | Kloont expliciet DER OCSP-bewijs voor native Security.framework-evaluatie; de limieten zijn 8 responses, 1 MiB per stuk en 4 MiB in totaal, en een lege array wist ze |
TPdfKeychainCmsVerifier.BackendName | Geeft de backend-identificatie terug die voor de verificatiebackend wordt gerapporteerd |
TPdfKeychainCmsVerifier.VerifyDetached | Verifieert een losse CMS-waarde tegen de twee inhoudssegmenten in eigendom van de aanroeper, beschreven door Segment1, Segment1Length, Segment2 en Segment2Length, met de opgegeven TPdfCmsVerifyOptions |
TPdfKeychainCmsVerifier.VerifyAttached | Verifieert een ingesloten CMS-waarde die zijn eigen ondertekende inhoud meedraagt, met de opgegeven TPdfCmsVerifyOptions |
| Type | Members and purpose |
|---|---|
EPdfKeychainError | Exceptie die wordt verhoogd wanneer Security.framework niet beschikbaar is, wanneer geen enkele Keychain-identiteit overeenkomt met de gevraagde signer, of wanneer de platform-ondertekenaanroep faalt |
TPdfKeychainSignerProvider | PAdES-ondertekeningsbackend die IPadesSignerProvider implementeert, met BackendName en Resolve |
TPdfKeychainCmsVerifier | CMS-verificatiebackend die IPdfCmsVerifier implementeert, met BackendName, VerifyDetached en VerifyAttached |
KeychainAvailable en KeychainVerificationAvailable rapporteren ondertekening en verificatie apart, omdat de twee helften verschillende frameworksymbolen nodig hebben; een systeem kan dus de één binden en de ander nietKeychainMissingSymbols noemt elk symbool dat niet kon worden opgezocht, waarmee een ontbrekend framework onderscheidbaar is van een bindingsprobleem: een leeg resultaat betekent dat alles is gebonden, een resultaat met de frameworkpaden betekent dat de frameworks niet zijn geladen, en een resultaat met afzonderlijke entry points betekent dat de frameworks wel zijn geladen maar een naam niet kon worden opgezochtKeychainAvailable en KeychainVerificationAvailable False terug, geeft KeychainMissingSymbols een lege string terug, en werpen de configure-functies EPdfKeychainErrorTPadesSignerOptions geen certificaat-thumbprint meedraagt, wordt de eerste bruikbare identiteit in de Keychain gekozen, wat voor een test geschikt is maar niet voor een productiehandtekeningpcvsUnsupported, met behoud van native diagnostiek, in plaats van geldige of ongeldige integriteit te melden. Gebruik voor die waarden de OpenSSL CMS-verifier; gemengde signer-diagnostiek behoudt het afzonderlijke algoritmeresultaat van elke signerFreshOcspResponse-tijd- en DER-voorfilter, gevolgd door native controles van responderhandtekening, autoriteit en certificaat. De toegestane skew is 300 seconden, en producedAt en thisUpdate zijn beperkt tot één dag oudOnlineRetrieval=False schakelt native trust-network-fetching uit. Native Security.framework online-evaluatie volgt platformgedrag; UrlRetrievalTimeoutMs levert op deze backend niet de begrensde OpenSSL-transportdeadlineCollectSignerDiagnostics=True geeft afzonderlijke signersnapshots terug, begrensd door MaxSignerCount en een harde limiet van 64. Teruggegeven certificaatmateriaal is beperkt tot 4 MiB per certificaat en 64 MiB in totaal; een onvolledige verzameling rapporteert pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid betekent dat de verzameling compleet is, inclusief mislukte signeruitspraken. RevocationError draagt de native Security.framework-status, terwijl RevocationCertificate op deze backend leeg blijft