TPDFlibPKCS11Client
الأمان والتواقيع
الوصف
تحمّل وحدة PKCS #11 من المورد وقت التشغيل وتكشف الشهادات والمفاتيح الخاصة غير المسجلة لدى مزودي Windows CSP أو KSPيعدد العميل الرموز المميزة الحاضرة ويفتح جلسة دائمة ويصادق المستخدم ويقرن شهادة X.509 بمفتاح توقيع عبر
CKA_ID الثنائي ويوقّع الملخصات المحسوبة سلفًا عبر CKM_RSA_PKCS أو CKM_ECDSAيستطيع الاكتشاف الصريح الذي يجعل الشهادة اختيارية اختيار مفتاح خاص ML-DSA بالتسمية أو المعرّف الثنائي والتحقق من
CKA_PARAMETER_SETCKM_ML_DSA
SignDigest له وتوقيع الرسائل الأصلية عبر TPDFlibExternalDigestSignEventينفذ TPDFlib.OnExternalDigestSign الواجهة
الوحدة
PDFlibPKCS11البناء ودورة حياة الوحدة
Constructor TPDFlibPKCS11Client.Create;
Destructor TPDFlibPKCS11Client.Destroy;
Function TPDFlibPKCS11Client.LoadModule: Boolean;
Procedure TPDFlibPKCS11Client.UnloadModule;
Function TPDFlibPKCS11Client.UseFunctionList(FunctionList: PPLPKCS11FunctionList; AlreadyInitialized: Boolean): Boolean;يعين ModulePath مكتبة DLL من نوع PKCS #11 لـ Win32 أو Win64 تصدّر C_GetFunctionListيتقاسم العملاء الذين يستخدمون المسار نفسه وحدة محمّلة واحدة وعمر
C_Initialize/C_Finalize واحدًا متوازنًايطلب المحمّل أولًا
CKF_OS_LOCKING_OK
UseFunctionList؛ وتحمي قفل نداء مشترك الوحدات التي لا تستطيع توفير قفل داخلي، بينما تسمح الوحدات المتوافقة لجلسات العملاء المنفصلة بالعمل بشكل متزامنيدعم UnloadModule المزودين المرتبطين ساكنًا أو المضمّنين أو المُدارين من التطبيق؛ وعلى المستدعي إبقاء الجدول المورد حيًا حتى
اكتشاف الرموز المميزة والاتصال
Function TPDFlibPKCS11Client.RefreshTokens: Boolean;
Function TPDFlibPKCS11Client.GetToken(Index: Integer; Out Token: TPDFlibPKCS11Token): Boolean;
Function TPDFlibPKCS11Client.Connect: Boolean;
Procedure TPDFlibPKCS11Client.Disconnect;
Function TPDFlibPKCS11Client.GetSelectedToken(Out Token: TPDFlibPKCS11Token): Boolean;
Property TPDFlibPKCS11Client.TokenCount: Integer;يعدد RefreshTokens الفتحات الحاضرة بإعادة محاولة مقيَّدة عندما يغيّر حدث توصيل ساخن العدد، ويبلّغ TokenCount عن عدد الرموز المميزة التي وجدها آخر تحديثاختر رمزًا مميزًا عبر
SlotID أو TokenLabel أو TokenSerial أو مزيجًا منها؛ ولا ينجح الاختيار الفارغ إلا عندما يوجد رمز مميز حاضر واحد بالضبطيبلّغ
TPDFlibPKCS11Token عن وصف الفتحة والصانع وتسمية الرمز المميز والطراز والرقم التسلسلي والأعلام وحدود طول PIN
المعاملات
| CertificateLabel | مرشح CKA_LABEL اختياري بترميز UTF-8 لكائن شهادة X.509 |
|---|---|
| CertificateID | مرشح CKA_ID ثنائي اختياري مخزن في AnsiString |
| PrivateKeyLabel | مرشح CKA_LABEL اختياري بترميز UTF-8 لمفتاح التوقيع الخاص |
| PrivateKeyID | مرشح CKA_ID ثنائي اختياري للمفتاح الخاص؛ وعندما يكون فارغًا يعاد استخدام معرّف الشهادة |
| CertificateOptional | الافتراضي False؛ وعندما تكون True يلزم تسمية أو معرّف للمفتاح الخاص ويقبل الاكتشاف مفاتيح ML-DSA فقط بلا شهادة X.509 |
CKA_SIGN=True
MLDSAParameterSet
CertificateDER ويتحقق من DER للشهادة ويرفض عدم تطابق نوع RSA/EC؛ ويتطلب الاكتشاف الذي يجعل الشهادة اختيارية مفتاح ML-DSA بلا غموض ويتحقق من مجموعة معاملات 44 أو 65 أو 87تكشف مجموعة معاملات ML-DSA المحسومة عبر ResolvedPrivateKeyIDتكشف الشهادة المحسومة عبر
المصادقة
| UserPIN | رمز PIN للمستخدم للكتابة فقط مرمّز بـ UTF-8، يُفحص مقابل حدود الرمز المميز ويُمحى عند استبداله أو الإتلاف |
|---|---|
| UseProtectedAuthenticationPath | يمرر رمز PIN فارغًا عندما يعلن الرمز المميز عن CKF_PROTECTED_AUTHENTICATION_PATH |
| ReadWriteSession | يضيف CKF_RW_SESSION؛ ولا يحتاج التوقيع عادة إلا جلسة التسلسل الافتراضية للقراءة فقط |
تتلقى المفاتيح ذات CKA_ALWAYS_AUTHENTICATE=True دخولًا خاصًا بالسياق بعد كل C_SignInit ناجحيكتب
ClearPIN فوق رمز PIN المضبوط ويحرره
التوقيع
Function TPDFlibPKCS11Client.SupportsMechanism(MechanismType: Cardinal): Boolean;
Function TPDFlibPKCS11Client.SupportsAlgorithm(DigestAlgorithm, SignatureAlgorithm: Integer): Boolean;
Function TPDFlibPKCS11Client.SignMLDSA(Const Message: AnsiString; Out Signature: AnsiString): Boolean;
Function TPDFlibPKCS11Client.SignHash(Const Digest: AnsiString; DigestAlgorithm, SignatureAlgorithm: Integer; Out Signature: AnsiString): Boolean;
Function TPDFlibPKCS11Client.SignDigest(Sender: TObject; SignProcessID: Integer; Const Digest: AnsiString; DigestAlgorithm, SignatureAlgorithm: Integer; Var Signature: AnsiString): Boolean;تستخدم تواقيع RSA آلية CKM_RSA_PKCS الخام مع DigestInfo بصيغة DER مبنية محليًا، فلا يجزئ الرمز المميز ملخص PDF مرة ثانيةتستخدم تواقيع ECDSA آلية
CKM_ECDSA الخام؛ ويُرجع خرج P1363 من الرمز المميز دون تغيير من أجل PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 أو يحوَّل إلى DER صارم من أجل PDF_EXTERNAL_SIGNATURE_ECDSA_DERيمرر
يمرر SignMLDSA الرسالة الأصلية إلى CKM_ML_DSA أحادي الجزء بمعاملات آلية فارغة مختارًا السياق الفارغ الافتراضي؛ وهو مستقل عن SignHash ورد نداء بصمة CMS
يتحقق من أطوال بصمات SHA-1 وSHA-256 وSHA-384 وSHA-512 وSHA3-256 وSHA3-384 وSHA3-512 قبل أي عملية مفتاح خاص
C_SignInit قبل بدء التوقيع، متجنبًا عمليات مفتاح خاص مكررة بعد إخفاق C_Sign غامض
مثال
var
Token: TPDFlibPKCS11Client;
ProcessID: Integer;
begin
Token:= TPDFlibPKCS11Client.Create;
try
Token.ModulePath:= 'C:\Program Files\Vendor\pkcs11.dll';
Token.TokenLabel:= 'Signing token';
Token.CertificateLabel:= 'Document signer';
Token.UserPIN:= UserPIN;
if not Token.Connect then
raise Exception.Create(String(Token.LastError));
PDF.OnExternalDigestSign:= Token.SignDigest;
ProcessID:= PDF.NewSignProcessFromFile(InputFile, '');
PDF.SetSignProcessField(ProcessID, 'Approval');
PDF.SetSignProcessDigestAlgorithm(ProcessID, 2);
PDF.SetSignProcessExternalDigestSigner(ProcessID,
Token.CertificateDER, PDF_EXTERNAL_SIGNATURE_RSA_PKCS1, 512);
PDF.EndSignProcessToFile(ProcessID, OutputFile);
finally
Token.Free;
end;
end;الحالة وسلوك الفشل
تكشف Connected وKeyType وMLDSAParameterSet وAlwaysAuthenticate وFunctionListMajor وFunctionListMinor عن حالة المزود النشطةتُرجع الطرق
False وتضبط LastReturnValue وLastError معًا عندما يفشل تحميل الوحدة أو اختيار الرمز المميز أو المصادقة أو اكتشاف الكائنات أو حدود السمات أو فحوص الآليات أو التوقيع
انظر أيضًا
OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient
إدارة رمز PIN
Function TPDFlibPKCS11Client.InitializeUserPIN(Const SecurityOfficerPIN, NewUserPIN: WideString): Boolean;
Function TPDFlibPKCS11Client.ChangeUserPIN(Const OldPIN, NewPIN: WideString): Boolean;تفتح كلتا العمليتين جلستهما للقراءة/الكتابة على الرمز المميز المضبوط وتترك جلسة التوقيع دون مساس؛ ويسجل InitializeUserPIN الدخول بصفته ضابط أمن قبل استدعاء C_InitPIN، ويسجل ChangeUserPIN الدخول بصفته مستخدمًا قبل استدعاء C_SetPINتُمحى مخازن PIN المؤقتة بعد الاستخدام؛ وتبلّغ الوحدة التي تفتقر إلى نقطة الدخول المطلوبة عن خطأ بدل الإخفاق بصمت
تمسح مخازن PIN المؤقتة بعد الاستخدام؛ والوحدة التي تفتقد مدخلًا مطلوبًا تبلغ عن خطأ بدل الفشل الصامت