TPDFlibPKCS11Client

Sicurezza e firme

Descrizione

Carica a runtime un modulo PKCS #11 del fornitore ed espone certificati e chiavi private non registrati presso i provider Windows CSP o KSPIl client enumera i token presenti, apre una sessione persistente, autentica l'utente, abbina un certificato X.509 a una chiave di firma tramite

CKA_ID binario e firma digest già calcolati attraverso CKM_RSA_PKCS oppure CKM_ECDSAL'individuazione facoltativa senza certificato può selezionare una chiave privata ML-DSA per etichetta o ID binario, validarne il

CKA_PARAMETER_SETCKM_ML_DSA

SignDigest e firmare messaggi originali attraverso TPDFlibExternalDigestSignEventTPDFlib.OnExternalDigestSign implementa

Unità

PDFlibPKCS11

Costruzione e ciclo di vita del modulo

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

ModulePath identifica una DLL PKCS #11 Win32 oppure Win64 che esporta C_GetFunctionListI client che usano lo stesso percorso condividono un unico modulo caricato e un'unica durata bilanciata

C_Initialize/C_FinalizeIl loader richiede prima

CKF_OS_LOCKING_OK

UseFunctionList; i moduli che non possono fornire il locking interno sono protetti da un lock di chiamata condiviso, mentre i moduli conformi consentono a sessioni client separate di girare in concorrenzaUnloadModule supporta provider collegati staticamente, incorporati oppure gestiti dall'applicazione; il chiamante deve mantenere viva la tabella fornita finché

Individuazione e connessione del token

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 enumera gli slot presenti con tentativi limitati quando un evento hot-plug cambia il conteggio, e TokenCount riporta quanti token l'ultimo refresh ha trovatoSelezionare un token con

SlotID, TokenLabel, TokenSerial oppure una combinazione; una selezione vuota riesce solo quando esiste esattamente un token presente

TPDFlibPKCS11Token riporta la descrizione dello slot, il produttore, l'etichetta del token, il modello, il numero di serie, i flag e i limiti di lunghezza del PIN

Parametri

CertificateLabelFiltro facoltativo CKA_LABEL UTF-8 per l'oggetto certificato X.509
CertificateIDFiltro facoltativo CKA_ID binario memorizzato in una AnsiString
PrivateKeyLabelFiltro facoltativo CKA_LABEL UTF-8 per la chiave privata di firma
PrivateKeyIDCKA_ID binario facoltativo della chiave privata; quando vuoto, viene riutilizzato l'ID del certificato
CertificateOptionalValore predefinito False; quando True, è richiesta un'etichetta oppure un ID della chiave privata e l'individuazione accetta solo chiavi ML-DSA senza certificato X.509

CKA_SIGN=True

MLDSAParameterSet

CertificateDER, valida il DER del certificato e rifiuta le mancate corrispondenze di tipo RSA/EC; l'individuazione senza certificato richiede una chiave ML-DSA non ambigua e valida il set di parametri 44, 65 oppure 87Il set di parametri ML-DSA risolto è esposto tramite ResolvedPrivateKeyIDIl certificato risolto è esposto tramite

Autenticazione

UserPINPIN utente di sola scrittura codificato in UTF-8, controllato rispetto ai limiti del token e azzerato quando viene sostituito o distrutto
UseProtectedAuthenticationPathPassa un PIN null quando il token dichiara CKF_PROTECTED_AUTHENTICATION_PATH
ReadWriteSessionAggiunge CKF_RW_SESSION; la firma di norma richiede solo la sessione seriale di sola lettura predefinita

Le chiavi con CKA_ALWAYS_AUTHENTICATE=True ricevono un login specifico del contesto dopo ogni C_SignInit riuscito

ClearPIN sovrascrive e rilascia il PIN configurato

Firma

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;

Le firme RSA usano CKM_RSA_PKCS raw con un DigestInfo DER costruito localmente, così il token non esegue una seconda volta l'hashing del digest PDFLe firme ECDSA usano

CKM_ECDSA raw; l'output P1363 del token viene restituito invariato per PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 oppure convertito in DER rigoroso per PDF_EXTERNAL_SIGNATURE_ECDSA_DER

SignMLDSA passa il messaggio originale a CKM_ML_DSA a parte singola con parametri di meccanismo vuoti, selezionando il contesto vuoto predefinito; è indipendente da SignHash e dal callback di digest CMS

Le lunghezze di digest SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 e SHA3-512 vengono validate prima di qualsiasi operazione con chiave privata

C_SignInit fallisce prima dell'inizio della firma, evitando operazioni duplicate con la chiave privata dopo un fallimento ambiguo di C_Sign

Esempio

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;

Stato e comportamento in caso di errore

Connected, KeyType, MLDSAParameterSet, AlwaysAuthenticate, FunctionListMajor e FunctionListMinor espongono lo stato attivo del providerI metodi restituiscono

False e impostano sia LastReturnValue sia LastError quando il caricamento del modulo, la selezione del token, l'autenticazione, l'individuazione degli oggetti, i limiti degli attributi, i controlli dei meccanismi oppure la firma falliscono

Vedere anche

OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient

Amministrazione del PIN

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

Entrambe le operazioni aprono la propria sessione di lettura/scrittura sul token configurato e lasciano intatta la sessione di firma; InitializeUserPIN accede come ufficiale di sicurezza prima di chiamare C_InitPIN, e ChangeUserPIN accede come utente prima di chiamare C_SetPIN

I buffer del PIN vengono cancellati dopo l'uso; un modulo senza il punto d'ingresso richiesto segnala un errore invece di fallire in silenzio