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 المؤقتة بعد الاستخدام؛ والوحدة التي تفتقد مدخلًا مطلوبًا تبلغ عن خطأ بدل الفشل الصامت