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 ist das macOS-Krypto-Backend, das FPdfCrypto und FPdfCms konsumieren, und es deckt beide Hälften der Plattformintegration ab: PAdES-Signierung über eine Keychain-Identität sowie CMS-Verifikation über den System-CMS-Decoder und die Vertrauensbewertung. Security.framework und CoreFoundation werden zur Laufzeit namenbasiert geladen und aufgelöst statt gelinkt, daher kompiliert die Unit für jedes Ziel und meldet zur Laufzeit, ob die Plattformdienste tatsächlich erreichbar sind
Auf der Signierseite implementiert TPdfKeychainSignerProvider IPadesSignerProvider. Seine Methode Resolve zählt die Keychain-Identitäten auf, wählt diejenige, deren Zertifikat zum SHA-1-Fingerprint aus TPadesSignerOptions passt, liest den Zertifikats-DER und die zugehörige Private-Key-Referenz und gibt einen TPadesResolvedSigner zurück, dessen ICmsSigner die CMS-signed Attributes über Security.framework signiert, sodass der Private Key die Keychain nie verlässt. Das über die Optionen angeforderte Padding-Schema wird mit dem abgeglichen, was der Schlüssel tatsächlich kann, und die RSASSA-PSS-Parameter sind dieselben, die die anderen Backends ausgeben, sodass ein auf macOS signiertes Dokument einen identischen AlgorithmIdentifier trägt. ConfigureKeychainSignerProvider baut den Provider, installiert ihn als aktives PAdES-Signatur-Backend und gibt die dabei registrierte Schnittstelle zurück
Zur Prüfung implementiert TPdfKeychainCmsVerifier IPdfCmsVerifier mit CMSDecoder und SecTrust; VerifyDetached verbindet die beiden signierten Bytebereiche um die Signaturlücke zum erwarteten abgetrennten Inhalt und prüft den CMS-Wert; VerifyAttached prüft CMS mit eigenem Inhalt, wie ein Zeitstempeltoken; beide liefern TPdfCmsVerifyResult mit getrennten Signatur-, Vertrauens- und Widerrufsergebnissen, optionalem Signaturzertifikat und evaluierter Kette und beachten Widerruf, Onlineabruf und Checkpoints aus TPdfCmsVerifyOptions; ConfigureKeychainCmsVerifier erstellt und installiert den aktiven Backend
Signaturgültigkeit und Zertifikatsvertrauen bleiben unabhängige Ergebnisse, sodass eine authentische Signatur unter einer nicht vertrauenswürdigen oder selbstsignierten Kette von manipulierten Inhalten unterscheidbar bleibt
Für angehängte RFC-3161-Token übergibt begrenztes DER-Parsing originale gekapselte TSTInfo-Bytes an den nativen Decoder, ohne Inhaltstyp oder signierte Attribute zu ändern; normale CMS-Prüfung entfernt unsignierte Attribute aus ihrer nativen Eingabe, damit automatische Zeitstempelverarbeitung Integrität und Kette der äußeren Signatur nicht ersetzt; sie validiert keine Gegensignaturen oder anderen unsignierten Attribute; ValidatePadesTrust prüft jedes originale Zeitstempeltoken, Hash, TSA-Rolle, Vertrauen und Widerruf separat
Übergeben Sie TPdfKeychainSignerProvider.Create einen Keychain-Dateipfad für eine auf diese Anfrage begrenzte Identitätssuche und registrieren Sie mit ConfigurePadesSignerProvider; leerer Pfad verwendet den aktuellen Benutzersuchbereich; Öffnen/Suchen ändert weder Standard-Keychain, Benutzersuchliste noch Systemvertrauen; ungültige Pfade oder fehlende Bereichssuchsymbole lösen EPdfKeychainError aus
Resolve exportiert die verfügbare Ausstellerkette über offline anfragelokale Zertifikatssuche und native Kettenbildung; Kandidaten sind auf 4096 Zertifikate, je 1 MiB und zusammen 16 MiB begrenzt; die gebildete Kette auf 32 einschließlich Blatt, das getrennt von ChainCertDer geliefert wird; Export begründet kein Vertrauen und installiert keinen Anker; fehlende Aussteller lassen sich nicht synthetisieren
| Funktion | Beschreibung |
|---|---|
KeychainAvailable | Gibt True zurück, wenn Security.framework und CoreFoundation geladen sind und jedes für das Signieren erforderliche Symbol aufgelöst wurde |
KeychainMissingSymbols | Gibt die nicht aufgelösten Namen, durch Leerzeichen getrennt, zurück, oder einen leeren String, wenn alles gebunden ist |
ConfigureKeychainSignerProvider | Baut einen TPdfKeychainSignerProvider, installiert ihn als PAdES-Signatur-Backend und gibt ihn als IPadesSignerProvider zurück |
TPdfKeychainSignerProvider.Create | Wählt eine optionale vorhandene Keychaindatei für begrenzte Identitätssuche; eingebettete NUL und Pfade über 4096 Stringeinheiten werden abgelehnt |
TPdfKeychainSignerProvider.BackendName | Gibt die Backend-Kennung zurück, die für den Signatur-Provider gemeldet wird |
TPdfKeychainSignerProvider.Resolve | Gleicht TPadesSignerOptions gegen die Keychain-Identitäten ab und gibt einen TPadesResolvedSigner mit Signer, Zertifikats-DER und Kette zurück |
| Funktion | Beschreibung |
|---|---|
KeychainVerificationAvailable | Gibt True zurück, wenn die Symbole für CMS-Decoder, Vertrauensrichtlinie und Vertrauensbewertung aufgelöst wurden |
ConfigureKeychainCmsVerifier | Baut einen TPdfKeychainCmsVerifier, installiert ihn als CMS-Verifikations-Backend und gibt ihn als IPdfCmsVerifier zurück |
ConfigureKeychainTrustAnchors | Klont explizite DER-Anker für spätere Prüfungen ergänzend zu Systemankern ohne Keychainänderung; Limits: 64 Zertifikate, je 4 MiB, zusammen 16 MiB; leeres Array entfernt sie |
ConfigureKeychainOcspResponses | Klont explizite DER-OCSP-Nachweise für native Security.framework-Prüfung; Limits: 8 Antworten, je 1 MiB, zusammen 4 MiB; leeres Array entfernt sie |
TPdfKeychainCmsVerifier.BackendName | Gibt die Backend-Kennung zurück, die für das Verifikations-Backend gemeldet wird |
TPdfKeychainCmsVerifier.VerifyDetached | Verifiziert einen getrennten CMS-Wert gegen die beiden vom Aufrufer bereitgestellten Inhaltssegmente, die Segment1, Segment1Length, Segment2 und Segment2Length beschreiben, unter Verwendung der übergebenen TPdfCmsVerifyOptions |
TPdfKeychainCmsVerifier.VerifyAttached | Verifiziert einen angehängten CMS-Wert, der seinen eigenen signierten Inhalt mitbringt, unter Verwendung der übergebenen TPdfCmsVerifyOptions |
| Typ | Member und Zweck |
|---|---|
EPdfKeychainError | Exception, die ausgelöst wird, wenn Security.framework nicht verfügbar ist, keine Keychain-Identität zum angeforderten Signer passt oder der plattformeigene Signaturaufruf fehlschlägt |
TPdfKeychainSignerProvider | PAdES-Signatur-Backend, das IPadesSignerProvider implementiert, mit BackendName und Resolve |
TPdfKeychainCmsVerifier | CMS-Verifikations-Backend, das IPdfCmsVerifier implementiert, mit BackendName, VerifyDetached und VerifyAttached |
KeychainAvailable und KeychainVerificationAvailable melden Signieren und Verifizieren getrennt, weil die beiden Hälften unterschiedliche Framework-Symbole brauchen - ein System kann also das eine binden und das andere nichtKeychainMissingSymbols nennt jedes Symbol, das nicht aufgelöst werden konnte - daran lässt sich ein fehlendes Framework von einem Bindungsproblem unterscheiden: Ein leeres Ergebnis bedeutet, dass alles gebunden ist; ein Ergebnis mit Framework-Pfaden bedeutet, dass sich die Frameworks nicht laden ließen; und ein Ergebnis mit einzelnen Einstiegspunkten bedeutet, dass die Frameworks geladen wurden, aber ein Name sich nicht auflösen ließKeychainAvailable und KeychainVerificationAvailable, leere KeychainMissingSymbols und EPdfKeychainError in KonfigurationsfunktionenTPadesSignerOptions keinen Zertifikats-Fingerprint, wird die erste nutzbare Identität in der Keychain gewählt - das taugt für einen Test, nicht für eine ProduktionssignaturpcvsUnsupported mit nativen Diagnosen statt gültiger/ungültiger Integrität; verwenden Sie OpenSSL dafür; gemischte Diagnosen erhalten das Algorithmusergebnis jedes SignierersFreshOcspResponse, dann native Responder-, Berechtigungs- und Zertifikatsprüfungen; erlaubte Abweichung 300 Sekunden, producedAt und thisUpdate höchstens einen Tag altOnlineRetrieval=False deaktiviert native Vertrauensnetzabrufe; Online-Security.framework folgt Plattformverhalten; UrlRetrievalTimeoutMs liefert hier nicht den begrenzten OpenSSL-TransportdeadlineCollectSignerDiagnostics=True liefert separate Snapshots, begrenzt durch MaxSignerCount und Maximum 64; zurückgegebene Zertifikate höchstens je 4 MiB und insgesamt 64 MiB; unvollständig meldet pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid bedeutet vollständige Sammlung einschließlich Fehlurteile; RevocationError trägt nativen Security.framework-Status, RevocationCertificate bleibt leer