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 to zaplecze kryptograficzne macOS używane przez FPdfCrypto i FPdfCms, obejmujące obie połówki integracji platformowej: podpisywanie PAdES przez tożsamość z Keychain oraz weryfikację CMS przez systemowy dekoder CMS i ocenę zaufania. Security.framework i CoreFoundation są ładowane i rozwiązywane po nazwie w czasie działania, a nie konsolidowane, więc moduł kompiluje się na każdym celu, a w czasie działania raportuje, czy usługi platformy są faktycznie osiągalne
Po stronie podpisywania TPdfKeychainSignerProvider implementuje IPadesSignerProvider. Jego metoda Resolve wylicza tożsamości z Keychain, wybiera tę, której certyfikat pasuje do odcisku SHA-1 przekazanego w TPadesSignerOptions, odczytuje certyfikat DER i odpowiadającą mu referencję klucza prywatnego, a zwraca TPadesResolvedSigner, którego ICmsSigner podpisuje atrybuty podpisane CMS przez Security.framework, więc klucz prywatny nigdy nie opuszcza Keychain. Schemat dopełnienia żądany w opcjach jest uzgadniany z tym, co klucz faktycznie potrafi, a parametry RSASSA-PSS są takie same jak emitowane przez pozostałe zaplecza, więc dokument podpisany na macOS niesie identyczny AlgorithmIdentifier. ConfigureKeychainSignerProvider buduje dostawcę i instaluje go jako aktywne zaplecze podpisywania PAdES, zwracając zarejestrowany interfejs
Po stronie weryfikacji TPdfKeychainCmsVerifier implementuje IPdfCmsVerifier na bazie CMSDecoder i SecTrust. VerifyDetached skleja dwa podpisane zakresy bajtów po obu stronach dziury podpisu w treść odłączoną, której oczekuje dekoder, a następnie weryfikuje wartość CMS względem niej; VerifyAttached weryfikuje wartość CMS niosącą własną treść, czego wymaga token znacznika czasu. Obie metody zwracają TPdfCmsVerifyResult, który osobno zgłasza status podpisu, status zaufania i status unieważnień, opcjonalnie zbierając certyfikat podpisującego i oceniony łańcuch, i obie respektują ustawienia unieważnień, pobierania online i punktów kontrolnych z TPdfCmsVerifyOptions. ConfigureKeychainCmsVerifier buduje weryfikator i instaluje go jako aktywne zaplecze weryfikacji CMS
Ważność podpisu i zaufanie do certyfikatów pozostają odrębnymi wynikami, więc prawdziwy podpis pod niezaufanym lub samopodpisanym łańcuchem pozostaje odróżnialny od zmodyfikowanej treści
Dla dołączonego tokena RFC 3161 ograniczone parsowanie DER dostarcza natywnemu dekoderowi oryginalne enkapsulowane oktety TSTInfo, nie zmieniając ich typu treści ani atrybutów podpisanych. Zwykły przebieg weryfikacji CMS wyklucza atrybuty niepodpisane ze swojego natywnego wejścia, więc automatyczne przetwarzanie znaczników czasu nie może zastąpić integralności ani wyniku łańcucha samego zewnętrznego podpisu. Ten przebieg nie waliduje kontrpodpisów ani innych atrybutów niepodpisanych; ValidatePadesTrust osobno weryfikuje każdy oryginalny token znacznika czasu, odcisk wiadomości, rolę certyfikatu TSA, zaufanie i wynik unieważnienia
Przekaż ścieżkę pliku Keychain do TPdfKeychainSignerProvider.Create, aby ograniczyć wyszukiwanie tożsamości do tego Keychain przez lokalną dla zapytania listę wyszukiwania, a następnie zarejestruj dostawcę przez ConfigurePadesSignerProvider. Pusta ścieżka używa bieżącego zakresu wyszukiwania użytkownika. Otwarcie lub przeszukanie wybranego Keychain nie modyfikuje domyślnego Keychain, listy wyszukiwania użytkownika ani konfiguracji zaufania systemu; nieprawidłowe ścieżki i niedostępne symbole wyszukiwania zakresowego zgłaszają EPdfKeychainError
Resolve eksportuje także dostępny łańcuch wydawców certyfikatu podpisującego przez offline'owe, lokalne dla zapytania wyszukiwanie certyfikatów i natywne budowanie łańcucha. Certyfikaty kandydujące są ograniczone do 4096 elementów, 1 MiB każdy i 16 MiB łącznie; zbudowany łańcuch jest ograniczony do 32 certyfikatów wraz z liściem, który jest zwracany osobno z ChainCertDer. Eksport materiału certyfikatów nie ustanawia zaufania ani nie instaluje kotwicy zaufania, a niedostępnego wydawcy nie można zsyntetyzować
| Function | Description |
|---|---|
KeychainAvailable | Zwraca True, gdy Security.framework i CoreFoundation zostały załadowane, a każdy symbol wymagany do podpisywania został rozwiązany |
KeychainMissingSymbols | Zwraca nazwy, których nie udało się rozwiązać, rozdzielone spacjami, albo pusty ciąg, gdy wszystko powiązano |
ConfigureKeychainSignerProvider | Buduje TPdfKeychainSignerProvider, instaluje go jako zaplecze podpisywania PAdES i zwraca jako IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Wybiera opcjonalny istniejący plik Keychain do wyszukiwania tożsamości w zakresie, odrzucając osadzone znaki NUL oraz ścieżki dłuższe niż 4096 jednostek kodu ciągu |
TPdfKeychainSignerProvider.BackendName | Zwraca identyfikator zaplecza zgłaszany dla dostawcy podpisującego |
TPdfKeychainSignerProvider.Resolve | Dopasowuje TPadesSignerOptions do tożsamości z Keychain i zwraca TPadesResolvedSigner z podpisującym, certyfikatem DER i łańcuchem |
| Function | Description |
|---|---|
KeychainVerificationAvailable | Zwraca True, gdy symbole dekodera CMS, polityki zaufania i oceny zaufania zostały rozwiązane |
ConfigureKeychainCmsVerifier | Buduje TPdfKeychainCmsVerifier, instaluje go jako zaplecze weryfikacji CMS i zwraca jako IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Klonuje jawne kotwice DER dla każdej późniejszej oceny zaufania, uzupełniając kotwice systemowe bez modyfikowania Keychain; limity to 64 certyfikaty, 4 MiB każdy i 16 MiB łącznie, a pusta tablica je czyści |
ConfigureKeychainOcspResponses | Klonuje jawne dowody OCSP w DER do natywnej oceny Security.framework; limity to 8 odpowiedzi, 1 MiB każda i 4 MiB łącznie, a pusta tablica je czyści |
TPdfKeychainCmsVerifier.BackendName | Zwraca identyfikator zaplecza zgłaszany dla zaplecza weryfikacji |
TPdfKeychainCmsVerifier.VerifyDetached | Weryfikuje odłączoną wartość CMS względem dwóch należących do wywołującego segmentów treści opisanych przez Segment1, Segment1Length, Segment2 i Segment2Length, z użyciem przekazanych TPdfCmsVerifyOptions |
TPdfKeychainCmsVerifier.VerifyAttached | Weryfikuje dołączoną wartość CMS niosącą własną podpisaną treść, z użyciem przekazanych TPdfCmsVerifyOptions |
| Type | Members and purpose |
|---|---|
EPdfKeychainError | Wyjątek zgłaszany, gdy Security.framework jest niedostępny, gdy żadna tożsamość z Keychain nie pasuje do żądanego podpisującego albo gdy wywołanie podpisujące platformy zawodzi |
TPdfKeychainSignerProvider | Zaplecze podpisywania PAdES implementujące IPadesSignerProvider, z BackendName i Resolve |
TPdfKeychainCmsVerifier | Zaplecze weryfikacji CMS implementujące IPdfCmsVerifier, z BackendName, VerifyDetached i VerifyAttached |
KeychainAvailable i KeychainVerificationAvailable zgłaszają podpisywanie i weryfikację osobno, ponieważ obie połówki wymagają innych symboli frameworków, więc system może powiązać jedną, a drugiej nieKeychainMissingSymbols wymienia każdy symbol, którego nie udało się rozwiązać, co pozwala odróżnić nieobecny framework od problemu z wiązaniem: pusty wynik oznacza, że wszystko powiązano, wynik ze ścieżkami frameworków oznacza, że frameworki się nie załadowały, a wynik z pojedynczymi punktami wejścia oznacza, że frameworki się załadowały, ale któraś nazwa się nie rozwiązałaKeychainAvailable i KeychainVerificationAvailable zwracają False, KeychainMissingSymbols zwraca pusty ciąg, a funkcje konfigurujące zgłaszają EPdfKeychainErrorTPadesSignerOptions nie niesie odcisku certyfikatu, wybierana jest pierwsza użyteczna tożsamość w Keychain, co pasuje do testu, a nie do podpisu produkcyjnegopcvsUnsupported, zachowując natywną diagnostykę, zamiast raportować poprawną lub niepoprawną integralność. Dla takich wartości użyj weryfikatora CMS OpenSSL; mieszane migawki podpisujących zachowują osobny wynik algorytmu każdego podpisującegoFreshOcspResponse, a następnie natywne sprawdzenia podpisu respondera, autorytetu i certyfikatu. Dopuszczalne odchylenie wynosi 300 sekund, a producedAt i thisUpdate są ograniczone do jednego dnia wiekuOnlineRetrieval=False wyłącza natywne pobieranie z sieci zaufania. Natywna ocena online Security.framework działa zgodnie z zachowaniem platformy; UrlRetrievalTimeoutMs nie zapewnia na tym zapleczu ograniczonego terminu transportu OpenSSLCollectSignerDiagnostics=True zwraca osobne migawki podpisujących, ograniczone przez MaxSignerCount i twardy limit 64. Zwracany materiał certyfikatów jest ograniczony do 4 MiB na certyfikat i 64 MiB łącznie; niekompletne zbieranie zgłasza pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid oznacza, że zbieranie jest kompletne, w tym nieudane werdykty podpisujących. RevocationError niesie natywny status Security.framework, natomiast RevocationCertificate pozostaje puste na tym zapleczu