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

PDFlibPKCS11

Constructie 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

CertificateLabelOptioneel UTF-8 CKA_LABEL-filter voor het X.509-certificaatobject
CertificateIDOptioneel binair CKA_ID-filter bewaard in een AnsiString
PrivateKeyLabelOptioneel UTF-8 CKA_LABEL-filter voor de privésleutel voor ondertekening
PrivateKeyIDOptionele binaire CKA_ID van de privésleutel; wanneer leeg wordt het certificaat-ID hergebruikt
CertificateOptionalStandaard 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

UserPINAlleen-schrijven gebruikers-PIN gecodeerd als UTF-8, gecontroleerd tegen tokengrenzen en gewist bij vervanging of vernietiging
UseProtectedAuthenticationPathGeeft een null-PIN door wanneer het token CKF_PROTECTED_AUTHENTICATION_PATH aanbiedt
ReadWriteSessionVoegt 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