TPDFlibPKCS11Client

Zabezpieczenia i podpisy

Opis

Wczytuje moduł PKCS #11 dostawcy w czasie działania i udostępnia certyfikaty oraz klucze prywatne niezarejestrowane u dostawców Windows CSP albo KSPKlient wylicza obecne tokeny, otwiera trwałą sesję, uwierzytelnia użytkownika, paruje certyfikat X.509 z kluczem podpisującym po binarnym

CKA_ID i podpisuje już wyliczone skróty przez CKM_RSA_PKCS albo CKM_ECDSAOdkrywanie z opcjonalnym certyfikatem może wybrać klucz prywatny ML-DSA po etykiecie albo binarnym ID, zwalidować jego

CKA_PARAMETER_SETCKM_ML_DSA

SignDigest i podpisywać pierwotne komunikaty przez TPDFlibExternalDigestSignEventTPDFlib.OnExternalDigestSign implementuje

Jednostka

PDFlibPKCS11

Konstrukcja i cykl życia modułu

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

ModulePath identyfikuje bibliotekę DLL PKCS #11 dla Win32 albo Win64 eksportującą C_GetFunctionListKlienci używający tej samej ścieżki współdzielą jeden wczytany moduł i jeden zrównoważony cykl życia

C_Initialize/C_FinalizeWczytywacz najpierw żąda

CKF_OS_LOCKING_OK

UseFunctionList; moduły, które nie mogą zapewnić wewnętrznej blokady, są chronione współdzieloną blokadą wywołań, podczas gdy zgodne moduły pozwalają równolegle działać osobnym sesjom klientówUnloadModule obsługuje dostawców linkowanych statycznie, osadzonych albo zarządzanych przez aplikację; wywołujący musi utrzymać przekazaną tabelę przy życiu do

Wykrywanie i łączenie tokenów

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 wylicza obecne sloty z ograniczoną liczbą ponowień, gdy zdarzenie wymiany na gorąco zmieni ich liczbę, a TokenCount raportuje, ile tokenów znalazło ostatnie odświeżenieWybierz token przez

SlotID, TokenLabel, TokenSerial albo ich kombinację; pusty wybór kończy się sukcesem tylko wtedy, gdy istnieje dokładnie jeden obecny token

TPDFlibPKCS11Token raportuje opis slotu, producenta, etykietę tokenu, model, numer seryjny, flagi i granice długości PIN

Parametry

CertificateLabelOpcjonalny filtr CKA_LABEL w UTF-8 dla obiektu certyfikatu X.509
CertificateIDOpcjonalny binarny filtr CKA_ID przechowywany w AnsiString
PrivateKeyLabelOpcjonalny filtr CKA_LABEL w UTF-8 dla prywatnego klucza podpisującego
PrivateKeyIDOpcjonalny binarny CKA_ID klucza prywatnego; gdy pusty, ponownie używane jest ID certyfikatu
CertificateOptionalDomyślnie False; przy True wymagana jest etykieta albo ID klucza prywatnego, a odkrywanie przyjmuje tylko klucze ML-DSA bez certyfikatu X.509

CKA_SIGN=True

MLDSAParameterSet

CertificateDER, waliduje DER certyfikatu i odrzuca niedopasowania typów RSA/EC; odkrywanie z opcjonalnym certyfikatem wymaga jednoznacznego klucza ML-DSA i waliduje zestaw parametrów 44, 65 albo 87Rozstrzygnięty zestaw parametrów ML-DSA jest ujawniany przez ResolvedPrivateKeyIDRozstrzygnięty certyfikat jest ujawniany przez

Uwierzytelnianie

UserPINPIN użytkownika tylko do zapisu, kodowany w UTF-8, sprawdzany względem granic tokenu i wymazywany przy zastąpieniu albo zniszczeniu
UseProtectedAuthenticationPathPrzekazuje pusty PIN, gdy token zgłasza CKF_PROTECTED_AUTHENTICATION_PATH
ReadWriteSessionDodaje CKF_RW_SESSION; podpisywanie normalnie potrzebuje tylko domyślnej sesji tylko do odczytu

Klucze z CKA_ALWAYS_AUTHENTICATE=True otrzymują logowanie kontekstowe po każdym udanym C_SignInit

ClearPIN nadpisuje i zwalnia skonfigurowany PIN

Podpisywanie

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;

Podpisy RSA używają surowego CKM_RSA_PKCS z lokalnie skonstruowanym DER DigestInfo, więc token nie haszuje skrótu PDF drugi raz

Podpisy ECDSA używają surowego CKM_ECDSA; wyjście P1363 tokenu jest zwracane bez zmian dla PDF_EXTERNAL_SIGNATURE_ECDSA_P1363 albo konwertowane na ścisły DER dla PDF_EXTERNAL_SIGNATURE_ECDSA_DER

SignMLDSA przekazuje pierwotną wiadomość do jednoczęściowego CKM_ML_DSA z pustymi parametrami mechanizmu, wybierając domyślny pusty kontekst; jest niezależny od SignHash i zwrotnego wywołania skrótu CMS

Długości skrótów SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 i SHA3-512 są walidowane przed jakąkolwiek operacją klucza prywatnego

Utracona sesja jest ponownie otwierana i ponawiana tylko, gdy C_SignInit zawiedzie przed rozpoczęciem podpisywania, co unika zduplikowanych operacji klucza prywatnego po niejasnym niepowodzeniu C_Sign

Przykład

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;

Stan i zachowanie w przypadku błędu

Connected, KeyType, MLDSAParameterSet, AlwaysAuthenticate, FunctionListMajor i FunctionListMinor ujawniają stan aktywnego dostawcyMetody zwracają

False i ustawiają zarówno LastReturnValue, jak i LastError, gdy wczytywanie modułu, wybór tokenu, uwierzytelnianie, odkrywanie obiektów, granice atrybutów, sprawdzanie mechanizmów albo podpisywanie zawiedzie

Zobacz również

OnExternalDigestSign, SetSignProcessExternalDigestSigner, SetSignProcessDigestAlgorithm, TPDFlibCSCClient

Zarządzanie kodem PIN

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

Obie operacje otwierają własną sesję odczytu/zapisu na skonfigurowanym tokenie i zostawiają sesję podpisującą nietkniętą; InitializeUserPIN loguje się jako oficer bezpieczeństwa przed wywołaniem C_InitPIN, a ChangeUserPIN jako użytkownik przed wywołaniem C_SetPIN

Bufory PIN są wycierane po użyciu; moduł bez wymaganego punktu wejścia raportuje błąd zamiast zawieść po cichu