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
PDFlibPKCS11Konstruktion 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
| CertificateLabel | Optionaler UTF-8-CKA_LABEL-Filter für das X.509-Zertifikatsobjekt |
|---|---|
| CertificateID | Optionaler binärer CKA_ID-Filter, gespeichert in einem AnsiString |
| PrivateKeyLabel | Optionaler UTF-8-CKA_LABEL-Filter für den privaten Signaturschlüssel |
| PrivateKeyID | Optionale binäre CKA_ID des privaten Schlüssels; ist sie leer, wird die Zertifikats-ID wiederverwendet |
| CertificateOptional | Standardmäß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
| UserPIN | Nur 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 |
| ReadWriteSession | Fü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