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 هو خلفية تعمية macOS التي تستهلكها FPdfCrypto و FPdfCms، ويغطي نصفَي تكامل المنصة: توقيع PAdES عبر هُوية Keychain، والتحقق من CMS عبر مفكك CMS النظامي وتقييم الثقة. تُحمَّل Security.framework و CoreFoundation وتُحل أسماؤها عند التشغيل بدل الربط، فتُصرَّف الوحدة على كل الأهداف وتُبلِّغ عند التشغيل عمّا إذا كانت خدمات المنصة قابلة للوصول فعلًا
على جهة التوقيع، ينفذ TPdfKeychainSignerProvider الواجهة IPadesSignerProvider. يحصي أسلوب Resolve الخاص به هُويات Keychain، وينتقي الهُوية التي تطابق شهادتها بصمة SHA-1 التي يحملها TPadesSignerOptions، ويقرأ DER الشهادة ومرجع المفتاح الخاص المطابق، ويعيد TPadesResolvedSigner يوقِّع ICmsSigner الخاص به سمات CMS الموقَّعة عبر Security.framework، فلا يغادر المفتاح الخاص Keychain أبدًا. تُوفَّق مخطط الحشو المطلوب عبر الخيارات مع ما يستطيع المفتاح فعله فعلًا، ومعاملات RSASSA-PSS هي ذاتها التي تصدرها الخلفيات الأخرى، فيحمل المستند الموقَّع على macOS معرف AlgorithmIdentifier مطابقًا. يبني ConfigureKeychainSignerProvider المزوِّد ويثبته كخلفية توقيع PAdES النشطة، ويعيد الواجهة التي سجلها
ينفذ TPdfKeychainCmsVerifier IPdfCmsVerifier فوق CMSDecoder و SecTrust؛ تجمع VerifyDetached النطاقين الموقعين حول فجوة التوقيع كمحتوى منفصل وتتحقق من CMS؛ تفحص VerifyAttached CMS ذا المحتوى المرفق مثل token الوقت؛ تعيدان TPdfCmsVerifyResult بنتائج توقيع وثقة وإلغاء مستقلة وشهادة الموقع والسلسلة اختياريًا، وتحترمان خيارات الإلغاء والجلب و checkpoints في TPdfCmsVerifyOptions؛ تبني ConfigureKeychainCmsVerifier الخلفية وتثبتها
تبقى صلاحية التوقيع وثقة الشهادة نتيجتين مستقلتين، فيبقى التوقيع الأمين تحت سلسلة غير موثوقة أو موقَّعة ذاتيًا قابلًا للتمييز عن المحتوى العبث به
يمرر تحليل DER المحدود بايتات TSTInfo المغلفة الأصلية لـ RFC 3161 إلى المفكك دون تغيير النوع أو السمات الموقعة؛ يستبعد تحقق CMS العادي السمات غير الموقعة من المدخل الأصلي لمنع فحص الوقت التلقائي من استبدال سلامة التوقيع الخارجي أو سلسلته؛ لا يفحص countersignatures أو بقية السمات غير الموقعة؛ تفحص ValidatePadesTrust كل token أصلي و imprint ودور TSA وثقته وإلغاءه مستقلاً
مرر مسار Keychain إلى TPdfKeychainSignerProvider.Create لقصر بحث الهوية عليه بقائمة خاصة بالاستعلام، ثم سجل عبر ConfigurePadesSignerProvider؛ الفارغ يستخدم نطاق المستخدم الحالي؛ لا يغير فتح Keychain أو البحث فيه الافتراضي أو قائمة المستخدم أو ثقة النظام؛ ترفع المسارات غير الصالحة والرموز غير المتاحة EPdfKeychainError
تصدّر Resolve سلسلة المُصدر المتاحة عبر بحث شهادات خاص بالاستعلام بلا شبكة وبناء سلسلة أصلي؛ المرشحون محدودون بـ 4096 شهادة و 1 MiB لكل منها و 16 MiB إجمالًا؛ السلسلة 32 شهادة تشمل الورقة المعادة منفصلة عن ChainCertDer؛ التصدير لا يثبت الثقة أو يثبت مرتكزًا، ولا يولد مُصدرًا مفقودًا
| الدالة | الوصف |
|---|---|
KeychainAvailable | يعيد True عندما تُحمَّل Security.framework و CoreFoundation ويُحل كل رمز يلزم للتوقيع |
KeychainMissingSymbols | يعيد الأسماء التي تعذر حلها مفصولة بمسافات، أو سلسلة فارغة عندما ينجح كل الربط |
ConfigureKeychainSignerProvider | يبني TPdfKeychainSignerProvider ويثبته كخلفية توقيع PAdES ويعيده كـ IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | تختار ملف Keychain موجودًا اختياريًا للبحث المقيد وترفض NUL المضمن ومسارًا أطول من 4096 وحدة نص |
TPdfKeychainSignerProvider.BackendName | يعيد معرف الخلفية المُبلَّغ عنه لمزوِّد التوقيع |
TPdfKeychainSignerProvider.Resolve | يقابل TPadesSignerOptions مع هُويات Keychain ويعيد TPadesResolvedSigner يحمل الموقِّع و DER الشهادة والسلسلة |
| الدالة | الوصف |
|---|---|
KeychainVerificationAvailable | يعيد True عندما تُحل رموز مفكك CMS وسياسة الثقة وتقييم الثقة |
ConfigureKeychainCmsVerifier | يبني TPdfKeychainCmsVerifier ويثبته كخلفية التحقق من CMS ويعيده كـ IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | تنسخ مرتكزات DER صريحة لكل تقييم لاحق مكملة للنظام دون تعديل Keychain؛ الحدود 64 شهادة و 4 MiB لكل منها و 16 MiB إجمالًا؛ يزيلها الجدول الفارغ |
ConfigureKeychainOcspResponses | تنسخ أدلة OCSP DER لـ Security.framework؛ الحدود 8 استجابات و 1 MiB لكل منها و 4 MiB إجمالًا؛ يزيلها الجدول الفارغ |
TPdfKeychainCmsVerifier.BackendName | يعيد معرف الخلفية المُبلَّغ عنه لخلفية التحقق |
TPdfKeychainCmsVerifier.VerifyDetached | يتحقق من قيمة CMS منفصلة مقابل مقطعَي المحتوى اللذين يملكهما المستدعي والموصوفين بـ Segment1 و Segment1Length و Segment2 و Segment2Length، مستخدمًا TPdfCmsVerifyOptions المُزوَّدة |
TPdfKeychainCmsVerifier.VerifyAttached | يتحقق من قيمة CMS مرفقة تحمل محتواها الموقَّع بنفسها، مستخدمًا TPdfCmsVerifyOptions المُزوَّدة |
| النوع | الأعضاء والغرض |
|---|---|
EPdfKeychainError | استثناء يُرفع عندما تكون Security.framework غير متاحة، أو عندما لا تطابق أي هُوية Keychain الموقِّع المطلوب، أو عندما يفشل استدعاء التوقيع على المنصة |
TPdfKeychainSignerProvider | خلفية توقيع PAdES تنفذ IPadesSignerProvider، مع BackendName و Resolve |
TPdfKeychainCmsVerifier | خلفية تحقق من CMS تنفذ IPdfCmsVerifier، مع BackendName و VerifyDetached و VerifyAttached |
KeychainAvailable و KeychainVerificationAvailable عن التوقيع والتحقق كل على حدة لأن النصفين يحتاجان رموز إطارات مختلفة، فيمكن لنظام أن يربط أحدهما دون الآخرKeychainMissingSymbols كل رمز تعذر حله، وهو ما يجعل الإطار الغائب قابلًا للتمييز عن مشكلة ربط: النتيجة الفارغة تعني نجاح كل الربط، والنتيجة التي تسمّي مسارات الإطارات تعني أن الإطارات لم تُحمَّل، والنتيجة التي تسمّي نقاط دخول بعينها تعني أن الإطارات حُمِّلت لكن اسمًا ما لم يُحلKeychainAvailable و KeychainVerificationAvailable وقائمة KeychainMissingSymbols فارغة وترفع EPdfKeychainError من التهيئةTPadesSignerOptions بصمة شهادة تُنتقى أول هُوية صالحة للاستخدام في Keychain، وهو ما يناسب اختبارًا لا توقيع إنتاجpcvsUnsupported مع التشخيصات الأصلية بدل valid أو invalid؛ استخدم OpenSSL، وتحفظ تشخيصات الموقعين المختلطة نتيجة كل خوارزمية مستقلةFreshOcspResponse ثم توقيع المستجيب وصلاحيته وشهادته أصليًا؛ الانحراف 300 ثانية وعمر producedAt و thisUpdate يوم واحد كحد أقصىOnlineRetrieval=False جلب الثقة الأصلي؛ تتبع الشبكة Security.framework سلوك المنصة؛ لا توفر UrlRetrievalTimeoutMs هنا مهلة OpenSSL المحدودةCollectSignerDiagnostics=True snapshots مستقلة بحد MaxSignerCount والسقف 64؛ حد الشهادات 4 MiB لكل منها و 64 MiB إجمالًا؛ يبلغ الجمع الناقص pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid اكتمال الجمع حتى مع أحكام فاشلة؛ تحمل RevocationError حالة Security.framework الأصلية وتبقى RevocationCertificate فارغة