TPDFlibPKCS11Client
Güvenlik ve imzalar
Açıklama
Çalışma zamanında bir satıcı PKCS #11 modülü yükler ve Windows CSP veya KSP sağlayıcılarına kayıtlı olmayan sertifikaları ve özel anahtarları açığa çıkarır
İstemci, mevcut token'ları numaralandırır, kalıcı bir oturum açar, kullanıcıyı kimliklendirir, bir X.509 sertifikasını ikili CKA_ID üzerinden bir imzalama anahtarıyla eşleştirir ve hâlihazırda hesaplanmış özetleri CKM_RSA_PKCS veya CKM_ECDSA üzerinden imzalar
Açık sertifika-isteğe bağlı keşif, bir ML-DSA özel anahtarını etiketle veya ikili ID ile seçebilir, CKA_PARAMETER_SET'ini doğrulayabilir ve özgün mesajları CKM_ML_DSA üzerinden imzalayabilir
SignDigest, TPDFlibExternalDigestSignEvent'i uygular ve doğrudan TPDFlib.OnExternalDigestSign'e atanabilir
Birim
PDFlibPKCS11Yapılandırma ve modül yaşam döngüsü
Constructor TPDFlibPKCS11Client.Create;
Destructor TPDFlibPKCS11Client.Destroy;
Function TPDFlibPKCS11Client.LoadModule: Boolean;
Procedure TPDFlibPKCS11Client.UnloadModule;
Function TPDFlibPKCS11Client.UseFunctionList(FunctionList: PPLPKCS11FunctionList; AlreadyInitialized: Boolean): Boolean;ModulePath, C_GetFunctionList dışa aktaran Win32 veya Win64 bir PKCS #11 DLL'sini tanımlar
Aynı yolu kullanan istemciler tek bir yüklenmiş modülü ve dengeli tek bir C_Initialize/C_Finalize ömrünü paylaşır
Yükleyici önce CKF_OS_LOCKING_OK ister; iç kilitleme sağlayamayan modüller paylaşımlı bir çağrı kilidiyle korunur, uyumlu modüller ise ayrı istemci oturumlarının eşzamanlı çalışmasına izin verir
UseFunctionList; statik bağlantılı, gömülü veya uygulama tarafından yönetilen sağlayıcıları destekler. Çağıran, verilen tabloyu UnloadModule'e veya yok edilişe dek canlı tutmalıdır
Token keşfi ve bağlantı
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, bir anlık takma olay sayıyı değiştirdiğinde sınırlı yeniden denemeyle mevcut yuvaları numaralandırır ve TokenCount, son yenilemenin kaç belirteç bulduğunu bildirirBir belirteci
SlotID, TokenLabel, TokenSerial veya bir bileşimle seçin; boş bir seçim yalnızca tam olarak bir mevcut belirteç bulunduğunda başarılı olur
TPDFlibPKCS11Token, yuva açıklamasını, üreticiyi, belirteç etiketini, modeli, seri numarasını, bayrakları ve PIN uzunluk sınırlarını bildirir
Kimlik seçimi
| CertificateLabel | X.509 sertifika nesnesi için isteğe bağlı UTF-8 CKA_LABEL filtresi |
|---|---|
| CertificateID | Bir AnsiString içinde saklanan isteğe bağlı ikili CKA_ID filtresi |
| PrivateKeyLabel | Özel imzalama anahtarı için isteğe bağlı UTF-8 CKA_LABEL filtresi |
| PrivateKeyID | İsteğe bağlı ikili özel anahtar CKA_ID; boşken sertifika ID'si yeniden kullanılır |
| CertificateOptional | Varsayılanı False'dur; True olduğunda bir özel anahtar etiketi veya ID'si gerekir ve keşif, X.509 sertifikası olmayan yalnızca ML-DSA anahtarlarını kabul eder |
Varsayılan keşif, tek bir anlaşılır sertifika ve anahtar ister, CKA_SIGN=True gerektirir, sertifika DER'ini doğrular ve RSA/EC tür uyuşmazlıklarını reddeder; sertifika-isteğe bağlı keşif anlaşılır bir ML-DSA anahtarı ister ve 44, 65 veya 87 parametre kümesini doğrular
Çözümlenen ML-DSA parametre kümesi MLDSAParameterSet üzerinden açığa çıkarılır
Çözümlenen sertifika CertificateDER ile, seçilen anahtar ID'si ResolvedPrivateKeyID ile açığa çıkarılır
Kimlik doğrulama
| UserPIN | UTF-8 olarak kodlanmış, salt yazılır kullanıcı PIN'i; belirteç sınırlarına göre denetlenir ve değiştirildiğinde ya da yok edildiğinde silinir |
|---|---|
| UseProtectedAuthenticationPath | Belirteç CKF_PROTECTED_AUTHENTICATION_PATH duyurduğunda boş bir PIN geçirir |
| ReadWriteSession | CKF_RW_SESSION ekler; imzalama normalde yalnızca varsayılan salt okunur seri oturuma gereksinim duyar |
CKA_ALWAYS_AUTHENTICATE=True bayraklı anahtarlar, her başarılı C_SignInit sonrasında bağlama özgü bir oturum açma alır
ClearPIN, yapılandırılmış PIN'in üzerine yazar ve onu serbest bırakır
İmzalama
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 imzaları, yerel olarak kurulmuş DER DigestInfo ile ham CKM_RSA_PKCS kullanır; böylece token PDF özetini ikinci kez özetlemez
ECDSA imzaları ham CKM_ECDSA kullanır; token P1363 çıktısı PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 için değişmeden döndürülür veya PDF_EXTERNAL_SIGNATURE_ECDSA_DER için katı DER'ye dönüştürülür
SignMLDSA özgün mesajı, boş mekanizma parametreleriyle tek parçalı CKM_ML_DSA'ya geçiren ve varsayılan boş bağlamı seçen bir işlevdir; SignHash'ten ve CMS özet geri çağrımından bağımsızdır
SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 ve SHA3-512 özet uzunlukları herhangi bir özel anahtar işleminden önce doğrulanır
Kaybedilmiş bir oturum yalnızca imza başlamadan C_SignInit başarısız olduğunda yeniden açılır ve yeniden denenir; böylece belirsiz bir C_Sign başarısızlığından sonra yinelenen özel anahtar işlemlerinden kaçınılır
Örnek
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;Durum ve hata davranışı
Connected, KeyType, MLDSAParameterSet, AlwaysAuthenticate, FunctionListMajor ve FunctionListMinor etkin sağlayıcı durumunu açığa çıkarırYöntemler, modül yükleme, belirteç seçimi, kimlik doğrulama, nesne keşfi, öznitelik sınırları, mekanizma denetimleri veya imzalama başarısız olduğunda
False döndürür ve hem LastReturnValue hem de LastError değerlerini ayarlar
Ayrıca bkz
OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient
PIN yönetimi
Function TPDFlibPKCS11Client.InitializeUserPIN(Const SecurityOfficerPIN, NewUserPIN: WideString): Boolean;
Function TPDFlibPKCS11Client.ChangeUserPIN(Const OldPIN, NewPIN: WideString): Boolean;İki işlem de yapılandırılmış token üzerinde kendi okuma/yazma oturumunu açar ve imzalama oturumuna dokunmaz; InitializeUserPIN C_InitPIN'i çağırmadan önce güvenlik görevlisi olarak oturum açar, ChangeUserPIN C_SetPIN'i çağırmadan önce kullanıcı olarak oturum açar
PIN tamponları kullanımdan sonra silinir; gereken giriş noktası olmayan bir modül sessizce başarısız olmak yerine hata bildirir