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, FPdfCrypto ve FPdfCms tarafından kullanılan macOS kripto arka ucudur ve platform bütünleştirmesinin iki yarısını da kapsar: bir Keychain kimliği üzerinden PAdES imzalama ve sistem CMS çözücüsü ile güven değerlendirmesi üzerinden CMS doğrulaması. Security.framework ve CoreFoundation bağlanmak yerine çalışma zamanında ada göre yüklenip çözülür; böylece birim her hedefte derlenir ve platform hizmetlerinin gerçekten erişilebilir olup olmadığını çalışma zamanında bildirir
İmzalama tarafında TPdfKeychainSignerProvider, IPadesSignerProvider arayüzünü uygular. Resolve methodu Keychain kimliklerini numaralandırır, sertifikası TPadesSignerOptions içindeki SHA-1 parmak iziyle eşleşen kimliği seçer, sertifika DER'i ve eşleşen özel anahtar başvurusunu okur ve ICmsSigner imzası CMS imzalı özniteliklerini Security.framework üzerinden atan bir TPadesResolvedSigner döndürür; böylece özel anahtar asla Keychain'den ayrılmaz. Seçeneklerle istenen dolgu şeması, anahtarın gerçekte yapabildiğiyle uzlaştırılır ve RSASSA-PSS parametreleri diğer arka uçların ürettikleridir; böylece macOS'ta imzalanan bir belge özdeş bir AlgorithmIdentifier taşır. ConfigureKeychainSignerProvider sağlayıcıyı kurar, etkin PAdES imzalama arka ucu olarak yükler ve kaydettiği arayüzü döndürür
Doğrulama tarafında TPdfKeychainCmsVerifier, CMSDecoder ve SecTrust üzerine IPdfCmsVerifier arayüzünü uygular. VerifyDetached, imza boşluğunun iki yanındaki imzalı bayt aralıklarını çözücünün beklediği ayrık içerikte birleştirir ve CMS değerini buna karşı doğrular; VerifyAttached kendi içeriğini taşıyan bir CMS değerini doğrular, zaman damgası token'ının gereksinimi de budur. İkisi de imza durumunu, güven durumunu ve iptal durumunu ayrı ayrı bildiren bir TPdfCmsVerifyResult döndürür, isteğe bağlı olarak imzalayan sertifikasını ve değerlendirilen zinciri toplar ve ikisi de TPdfCmsVerifyOptions içindeki iptal, çevrimiçi getirme ve checkpoint ayarlarına uyar. ConfigureKeychainCmsVerifier doğrulayıcıyı kurar ve etkin CMS doğrulama arka ucu olarak yükler
İmza geçerliliği ile sertifika güveni bağımsız sonuçlar olarak kalır; böylece güvenilmeyen ya da kendinden imzalı bir zincir altındaki gerçek bir imza, değiştirilmiş içerikten ayırt edilebilir kalır
Bağlı bir RFC 3161 token'ı için sınırlı DER ayrıştırma, özgün kapsüllenmiş TSTInfo oktetlerini içerik türlerini ya da imzalı özniteliklerini değiştirmeden yerel çözücüye sağlar. Sıradan CMS doğrulama geçişi, otomatik zaman damgası işlemesinin dış imzanın kendi bütünlük ya da zincir sonucunu değiştirememesi için yerel girdisinden imzasız öznitelikleri hariç tutar. Bu geçiş countersignature'ları ya da diğer imzasız öznitelikleri doğrulamaz; ValidatePadesTrust her özgün zaman damgası token'ını, mesaj damgasını, TSA sertifika rolünü, güvenini ve iptal sonucunu ayrı ayrı doğrular
Kimlik aramasını sorguya yerel bir arama listesi üzerinden o Keychain ile sınırlamak için TPdfKeychainSignerProvider.Create işlevine bir Keychain dosya yolu geçin, ardından sağlayıcıyı ConfigurePadesSignerProvider ile kaydedin. Boş bir yol, geçerli kullanıcı arama kapsamını kullanır. Seçili Keychain'i açmak veya aramak varsayılan Keychain'i, kullanıcı arama listesini ya da sistem güven yapılandırmasını değiştirmez; geçersiz yollar ve kullanılamayan scoped-search simgeleri EPdfKeychainError fırlatır
Resolve ayrıca imzalayan sertifikasının kullanılabilir veren zincirini çevrimdışı, sorguya yerel bir sertifika araması ve yerel zincir kurulumu üzerinden dışa aktarır. Aday sertifikalar 4096 öğe, her biri 1 MiB ve toplam 16 MiB ile sınırlıdır; kurulan zincir, yaprak dahil 32 sertifika ile sınırlıdır ve yaprak ChainCertDer değerinden ayrı döndürülür. Sertifika materyalini dışa aktarmak güven tesis etmez ya da bir güven çapası kurmaz ve kullanılamayan bir veren sentezlenemez
| Function | Description |
|---|---|
KeychainAvailable | Security.framework ve CoreFoundation yüklendiğinde ve imzalama için gerekli her simge çözüldüğünde True döndürür |
KeychainMissingSymbols | Çözülemeyen adları boşluklarla ayırarak döndürür; her şey bağlandığında boş bir dize döndürür |
ConfigureKeychainSignerProvider | Bir TPdfKeychainSignerProvider kurar, PAdES imzalama arka ucu olarak yükler ve IPadesSignerProvider olarak döndürür |
TPdfKeychainSignerProvider.Create | Kapsamlı kimlik araması için isteğe bağlı mevcut bir Keychain dosyası seçer; gömülü NUL karakterlerini ve 4096 dize kod biriminden uzun yolları reddeder |
TPdfKeychainSignerProvider.BackendName | İmzalama sağlayıcısı için bildirilen arka uç tanımlayıcısını döndürür |
TPdfKeychainSignerProvider.Resolve | TPadesSignerOptions değerini Keychain kimlikleriyle eşleştirir ve imzalayanı, sertifika DER'ini ve zinciri taşıyan bir TPadesResolvedSigner döndürür |
| Function | Description |
|---|---|
KeychainVerificationAvailable | CMS çözücüsü, güven ilkesi ve güven değerlendirmesi simgeleri çözüldüğünde True döndürür |
ConfigureKeychainCmsVerifier | Bir TPdfKeychainCmsVerifier kurar, CMS doğrulama arka ucu olarak yükler ve IPdfCmsVerifier olarak döndürür |
ConfigureKeychainTrustAnchors | Sonraki her güven değerlendirmesi için açık DER çapalarını klonlar; Keychain'i değiştirmeden sistem çapalarını tamamlar; sınırlar 64 sertifika, her biri 4 MiB ve toplam 16 MiB'dır ve boş bir dizi bunları temizler |
ConfigureKeychainOcspResponses | Yerel Security.framework değerlendirmesi için açık DER OCSP kanıtlarını klonlar; sınırlar 8 yanıt, her biri 1 MiB ve toplam 4 MiB'dır ve boş bir dizi bunları temizler |
TPdfKeychainCmsVerifier.BackendName | Doğrulama arka ucu için bildirilen arka uç tanımlayıcısını döndürür |
TPdfKeychainCmsVerifier.VerifyDetached | Segment1, Segment1Length, Segment2 ve Segment2Length ile tanımlanan, çağıranın sahip olduğu iki içerik segmentine karşı ayrık CMS değerini, sağlanan TPdfCmsVerifyOptions ile doğrular |
TPdfKeychainCmsVerifier.VerifyAttached | Kendi imzalı içeriğini taşıyan bağlı (attached) bir CMS değerini, sağlanan TPdfCmsVerifyOptions ile doğrular |
| Type | Members and purpose |
|---|---|
EPdfKeychainError | Security.framework kullanılamadığında, hiçbir Keychain kimliği istenen imzalayanla eşleşmediğinde ya da platform imzalama çağrısı başarısız olduğunda fırlatılan istisna |
TPdfKeychainSignerProvider | IPadesSignerProvider arayüzünü BackendName ve Resolve ile uygulayan PAdES imzalama arka ucu |
TPdfKeychainCmsVerifier | IPdfCmsVerifier arayüzünü BackendName, VerifyDetached ve VerifyAttached ile uygulayan CMS doğrulama arka ucu |
KeychainAvailable ve KeychainVerificationAvailable imzalamayı ve doğrulamayı ayrı ayrı bildirir; çünkü iki taraf farklı framework simgelerine gereksinim duyar, böylece bir sistem birine sahip olup diğerine sahip olmayabilirKeychainMissingSymbols, çözülemeyen her simgeyi adlandırır; bu, eksik bir framework ile bağlama sorununu ayırt etmeyi sağlar: boş sonuç her şeyin bağlandığı, framework yollarını adlandıran bir sonuç framework'lerin yüklenmediği, tek tek giriş noktalarını adlandıran bir sonuç ise framework'lerin yüklendiği ama bir adın çözülemediği anlamına gelirKeychainAvailable ve KeychainVerificationAvailable için False döndürür, boş bir KeychainMissingSymbols döndürür ve yapılandırma işlevlerinden EPdfKeychainError fırlatırTPadesSignerOptions sertifika parmak izi taşımıyorsa Keychain'deki ilk kullanılabilir kimlik seçilir; bu bir üretim imzası için değil bir test için uygundurpcvsUnsupported bildirir. Bu değerler için OpenSSL CMS doğrulayıcısını kullanın; karışık imzalayan tanılaması her imzalayanın ayrı algoritma sonucunu korurFreshOcspResponse zaman ve DER ön filtresinden, ardından yerel yanıtlayıcı imzası, yetki ve sertifika denetimlerinden geçer. İzin verilen sapma 300 saniyedir ve producedAt ile thisUpdate bir günlük yaşla sınırlıdırOnlineRetrieval=False yerel güven ağı getirmesini devre dışı bırakır. Yerel Security.framework çevrimiçi değerlendirmesi platform davranışını izler; UrlRetrievalTimeoutMs bu arka uçta sınırlı OpenSSL taşıma son tarihini sağlamazCollectSignerDiagnostics=True ayrı imzalayan anlık görüntüleri döndürür; bunlar MaxSignerCount ve 64'lük sabit bir sınırla kısıtlanır. Döndürülen sertifika materyali sertifika başına 4 MiB ve toplam 64 MiB ile sınırlıdır; eksik toplama pcvsIndeterminate bildirirSignerDiagnosticsStatus=pcvsValid, başarısız imzalayan kararları dahil toplamanın tamamlandığı anlamına gelir. RevocationError yerel Security.framework durumunu taşırken RevocationCertificate bu arka uçta boş kalır