TPDFlibPKCS11Client

Sicherheit und Signaturen

Beschreibung

Lädt ein PKCS-#11-Modul eines Herstellers zur Laufzeit und legt Zertifikate und private Schlüssel offen, die nicht bei Windows-CSP- oder KSP-Anbietern registriert sindDer Client zählt vorhandene Token auf, öffnet eine persistente Sitzung, authentifiziert den Benutzer, koppelt ein X.509-Zertifikat über die binäre

CKA_ID mit einem Signaturschlüssel und signiert bereits berechnete Digests über CKM_RSA_PKCS oder CKM_ECDSADie explizite Erkennung ohne Zertifikatspflicht kann einen ML-DSA-Privatschlüssel nach Label oder binärer ID auswählen, dessen

CKA_PARAMETER_SETCKM_ML_DSA

SignDigest validieren und Originalnachrichten über TPDFlibExternalDigestSignEvent signierenTPDFlib.OnExternalDigestSign implementiert

Einheit

PDFlibPKCS11

Konstruktion und Modullebenszyklus

Constructor TPDFlibPKCS11Client.Create;
Destructor TPDFlibPKCS11Client.Destroy;
Function TPDFlibPKCS11Client.LoadModule: Boolean;
Procedure TPDFlibPKCS11Client.UnloadModule;
Function TPDFlibPKCS11Client.UseFunctionList(FunctionList: PPLPKCS11FunctionList; AlreadyInitialized: Boolean): Boolean;

ModulePath bezeichnet eine Win32- oder Win64-PKCS-#11-DLL, die C_GetFunctionList exportiertClients mit demselben Pfad teilen sich ein geladenes Modul und einen ausgeglichenen

C_Initialize/C_Finalize-LebenszyklusDer Lader fordert zunächst

CKF_OS_LOCKING_OK

UseFunctionList an; Module, die keine interne Sperre bereitstellen können, werden durch eine gemeinsame Aufrufsperre geschützt, während konforme Module getrennte Clientsitzungen parallel laufen lassenUnloadModule unterstützt statisch gelinkte, eingebettete oder anwendungsverwaltete Anbieter; der Aufrufer muss die gelieferte Tabelle bis

Tokenerkennung und -verbindung

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 zählt vorhandene Slots mit begrenzten Wiederholungsversuchen auf, wenn ein Hot-Plug-Ereignis die Anzahl ändert, und TokenCount meldet, wie viele Token die letzte Aktualisierung gefunden hatWählen Sie ein Token über

SlotID, TokenLabel, TokenSerial oder eine Kombination; eine leere Auswahl ist nur erfolgreich, wenn genau ein vorhandenes Token existiert

TPDFlibPKCS11Token meldet Slotbeschreibung, Hersteller, Token-Label, Modell, Seriennummer, Flags und PIN-Längengrenzen

Parameter

CertificateLabelOptionaler UTF-8-CKA_LABEL-Filter für das X.509-Zertifikatsobjekt
CertificateIDOptionaler binärer CKA_ID-Filter, gespeichert in einem AnsiString
PrivateKeyLabelOptionaler UTF-8-CKA_LABEL-Filter für den privaten Signaturschlüssel
PrivateKeyIDOptionale binäre CKA_ID des privaten Schlüssels; ist sie leer, wird die Zertifikats-ID wiederverwendet
CertificateOptionalStandardmäßig False; bei True sind ein Label oder eine ID für den privaten Schlüssel erforderlich, und die Erkennung akzeptiert nur ML-DSA-Schlüssel ohne X.509-Zertifikat

CKA_SIGN=True

MLDSAParameterSet

CertificateDER, validiert das Zertifikats-DER und lehnt RSA/EC-Typabweichungen ab; die Erkennung ohne Zertifikatspflicht verlangt einen eindeutigen ML-DSA-Schlüssel und validiert den Parametersatz 44, 65 oder 87Der aufgelöste ML-DSA-Parametersatz wird über ResolvedPrivateKeyID offengelegtDas aufgelöste Zertifikat wird über

Authentifizierung

UserPINNur schreibbare, UTF-8-kodierte Benutzer-PIN, gegen die Token-Grenzen geprüft und beim Ersetzen oder Zerstören verworfen
UseProtectedAuthenticationPathÜbergibt eine Null-PIN, wenn das Token CKF_PROTECTED_AUTHENTICATION_PATH anbietet
ReadWriteSessionFügt CKF_RW_SESSION hinzu; das Signieren benötigt normalerweise nur die Standard-Lesesitzung

Schlüssel mit CKA_ALWAYS_AUTHENTICATE=True erhalten nach jedem erfolgreichen C_SignInit eine kontextspezifische Anmeldung

ClearPIN überschreibt die konfigurierte PIN und gibt sie frei

Signieren

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-Signaturen verwenden rohes CKM_RSA_PKCS mit einer lokal konstruierten DER-DigestInfo, sodass das Token den PDF-Digest nicht ein zweites Mal hashtECDSA-Signaturen verwenden rohes

CKM_ECDSA; die P1363-Ausgabe des Tokens wird für PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 unverändert zurückgegeben oder für PDF_EXTERNAL_SIGNATURE_ECDSA_DER in striktes DER konvertiert

SignMLDSA übergibt die ursprüngliche Nachricht an einteiliges CKM_ML_DSA mit leeren Mechanismusparametern und wählt den standardmäßigen leeren Kontext; es ist unabhängig von SignHash und dem CMS-Digest-Callback

Die Digest-Längen von SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 und SHA3-512 werden vor jeder Operation mit privatem Schlüssel validiert

C_SignInit fehlschlägt, bevor das Signieren beginnt; dies vermeidet doppelte Privatschlüssel-Operationen nach einem mehrdeutigen C_Sign-Fehler

Beispiel

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- und Fehlerverhalten

Connected, KeyType, MLDSAParameterSet, AlwaysAuthenticate, FunctionListMajor und FunctionListMinor legen den aktiven Anbieterzustand offenMethoden geben

False zurück und setzen sowohl LastReturnValue als auch LastError, wenn Modulladen, Token-Auswahl, Authentifizierung, Objekterkennung, Attributgrenzen, Mechanismusprüfungen oder das Signieren fehlschlagen

Siehe auch

OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient

PIN-Verwaltung

Function TPDFlibPKCS11Client.InitializeUserPIN(Const SecurityOfficerPIN, NewUserPIN: WideString): Boolean;
Function TPDFlibPKCS11Client.ChangeUserPIN(Const OldPIN, NewPIN: WideString): Boolean;

Beide Operationen öffnen ihre eigene Lese-/Schreibsitzung auf dem konfigurierten Token und lassen die Signiersitzung unberührt; InitializeUserPIN meldet sich als Sicherheitsbeauftragter an, bevor es C_InitPIN aufruft, ChangeUserPIN meldet sich als Nutzer an, bevor es C_SetPIN aufruft

PIN-Puffer werden nach der Nutzung gelöscht; ein Modul ohne den nötigen Einstiegspunkt meldet einen Fehler, statt still zu scheitern