TPDFlibPKCS11Client
Beveiliging en handtekeningen
Beschrijving
Laadt tijdens runtime een PKCS #11-module van een leverancier en legt certificaten en privésleutels bloot die niet bij Windows CSP- of KSP-providers zijn geregistreerd
CKA_ID aan een ondertekeningssleutel en ondertekent al berekende digests via CKM_RSA_PKCS of CKM_ECDSADiscovery zonder verplicht certificaat kan een ML-DSA-privésleutel via label of binaire ID selecteren, diens
Ontdekking met optioneel certificaat kan een ML-DSA-privésleutel op label of binaire ID selecteren, haar CKA_PARAMETER_SET valideren en originele berichten ondertekenen via CKM_ML_DSA
SignDigest valideren en originele berichten via TPDFlibExternalDigestSignEvent ondertekenenTPDFlib.OnExternalDigestSign implementeert
Eenheid
PDFlibPKCS11Constructie en modulelevensduur
Constructor TPDFlibPKCS11Client.Create;
Destructor TPDFlibPKCS11Client.Destroy;
Function TPDFlibPKCS11Client.LoadModule: Boolean;
Procedure TPDFlibPKCS11Client.UnloadModule;
Function TPDFlibPKCS11Client.UseFunctionList(FunctionList: PPLPKCS11FunctionList; AlreadyInitialized: Boolean): Boolean;ModulePath identificeert een Win32- of Win64-PKCS #11-DLL die C_GetFunctionList exporteert
C_Initialize/C_Finalize-levensduurDe loader vraagt eerst
De loader vraagt eerst CKF_OS_LOCKING_OK; modules die geen interne vergrendeling kunnen bieden worden beschermd door een gedeelde aanroepvergrendeling, terwijl conforme modules afzonderlijke clientsessies gelijktijdig laten draaien
UseFunctionList ondersteunt statisch gekoppelde, ingebedde of door de toepassing beheerde providers; de caller moet de meegegeven tabel in leven houden tot UnloadModule of vernietiging
Tokendetectie en verbinding
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 enumereert aanwezige slots met begrensde herpoging wanneer een hot-plug-gebeurtenis het aantal verandert, en TokenCount rapporteert hoeveel tokens de laatste verversing vondKies een token met
SlotID, TokenLabel, TokenSerial of een combinatie; een lege selectie slaagt alleen wanneer er precies één aanwezig token bestaat
TPDFlibPKCS11Token rapporteert slotbeschrijving, fabrikant, tokenlabel, model, serienummer, vlaggen en PIN-lengtegrenzen
Parameters
| CertificateLabel | Optioneel UTF-8 CKA_LABEL-filter voor het X.509-certificaatobject |
|---|---|
| CertificateID | Optioneel binair CKA_ID-filter bewaard in een AnsiString |
| PrivateKeyLabel | Optioneel UTF-8 CKA_LABEL-filter voor de privésleutel voor ondertekening |
| PrivateKeyID | Optionele binaire CKA_ID van de privésleutel; wanneer leeg wordt het certificaat-ID hergebruikt |
| CertificateOptional | Standaard False; wanneer True is een label of ID van de privésleutel vereist en accepteert discovery alleen ML-DSA-sleutels zonder X.509-certificaat |
Standaardontdekking vereist één ondubbelzinnig certificaat en één sleutel, vereist CKA_SIGN=True, valideert certificaat-DER en wijst RSA/EC-typemismatches af; ontdekking met optioneel certificaat vereist een ondubbelzinnige ML-DSA-sleutel en valideert parameterset 44, 65 of 87
MLDSAParameterSet
Het opgeloste certificaat wordt blootgelegd via CertificateDER en de geselecteerde sleutel-ID via ResolvedPrivateKeyID
Authenticatie
| UserPIN | Alleen-schrijven gebruikers-PIN gecodeerd als UTF-8, gecontroleerd tegen tokengrenzen en gewist bij vervanging of vernietiging |
|---|---|
| UseProtectedAuthenticationPath | Geeft een null-PIN door wanneer het token CKF_PROTECTED_AUTHENTICATION_PATH aanbiedt |
| ReadWriteSession | Voegt CKF_RW_SESSION toe; ondertekening heeft normaal alleen de standaard seriële alleen-lezen sessie nodig |
Sleutels met CKA_ALWAYS_AUTHENTICATE=True ontvangen een contextspecifieke aanmelding na elke geslaagde C_SignInit
ClearPIN overschrijft de geconfigureerde PIN en geeft haar vrij
Ondertekenen
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-handtekeningen gebruiken rauwe CKM_RSA_PKCS met een lokaal geconstrueerde DER DigestInfo, zodat het token de PDF-digest geen tweede keer hashtECDSA-handtekeningen gebruiken rauwe
CKM_ECDSA; P1363-uitvoer van het token wordt ongewijzigd teruggegeven voor PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 of omgezet naar strikte DER voor PDF_EXTERNAL_SIGNATURE_ECDSA_DER
SignMLDSA geeft het originele bericht door aan single-part CKM_ML_DSA met lege mechanismeparameters, waarbij de standaard lege context wordt gekozen; hij is onafhankelijk van SignHash en de CMS-digestcallback
Digestlengtes van SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 en SHA3-512 worden gevalideerd vóór elke privésleutelbewerking
C_SignInit faalt vóórdat het ondertekenen begint, zodat geen dubbele privésleutelbewerkingen plaatsvinden na een dubbelzinnig falen van C_Sign
Voorbeeld
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;Status en gedrag bij fouten
Connected, KeyType, MLDSAParameterSet, AlwaysAuthenticate, FunctionListMajor en FunctionListMinor leggen de actieve providerstatus blootMethoden geven
False terug en zetten zowel LastReturnValue als LastError wanneer het laden van de module, het kiezen van het token, authenticatie, objectdiscovery, attribuutgrenzen, mechanismecontroles of ondertekening faalt
Zie ook
OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient
PIN-beheer
Function TPDFlibPKCS11Client.InitializeUserPIN(Const SecurityOfficerPIN, NewUserPIN: WideString): Boolean;
Function TPDFlibPKCS11Client.ChangeUserPIN(Const OldPIN, NewPIN: WideString): Boolean;Beide bewerkingen openen hun eigen lees/schrijfsessie op het ingestelde token en laten de ondertekensessie onaangeroerd; InitializeUserPIN logt in als security officer vóór C_InitPIN, en ChangeUserPIN logt in als gebruiker vóór C_SetPIN
PIN-buffers worden na gebruik gewist; een module zonder het vereiste invoerpunt meldt een fout in plaats van stilletjes te falen