PDFium Delphi Component Docs

FPdfPkcs11 Unit

Unit: FPdfPkcs11
PKCS#11-Signatur-Backend für PAdES, das ein Signer-Zertifikat samt Private Key aus einem Token auflöst und die SignerInfo-Signatur im Token erzeugt

Syntax

EPdfPkcs11Error = class(Exception);

TPdfPkcs11Options = record
  ModulePath: string;
  SlotId: UInt64;
  UseSpecificSlot: Boolean;
  Pin: string;
  CertificateLabel: string;
  class function Default: TPdfPkcs11Options; static;
end;

TPdfPkcs11SignerProvider = class(TInterfacedObject, IPadesSignerProvider,
  IPdfPkcs11SignerProvider)
  constructor Create(const Options: TPdfPkcs11Options);
  destructor Destroy; override;
  function BackendName: string;
  function Resolve(const Options: TPadesSignerOptions): TPadesResolvedSigner;
  function EnumerateSlots: TPdfPkcs11Slots;
  function EnumerateCertificates(SlotID: UInt64): TPdfPkcs11Certificates;
  procedure CloseProtectedSessions;
end;

function Pkcs11ModuleAvailable(const ModulePath: string): Boolean;
function Pkcs11ModuleVersion(const ModulePath: string): string;
function Pkcs11AbiLayout: string;
function ConfigurePkcs11SignerProvider(
  const Options: TPdfPkcs11Options): IPdfPkcs11SignerProvider;

Beschreibung

FPdfPkcs11 ist das portable PAdES-Signatur-Backend und das Gegenstück zum Windows-CNG-Backend. Es löst ein Signer-Zertifikat samt Private Key aus einem PKCS#11-Token auf und gibt einen TPadesResolvedSigner zurück, dessen ICmsSigner die SignerInfo-Signatur durch das Token erzeugt, sodass der Schlüssel es nie verlässt

Das Modul wird zur Laufzeit per Pfad geladen - opensc-pkcs11.so, libsofthsm2.so, eine Vendor-DLL - nichts wird zur Build-Zeit gelinkt, und ein fehlendes Modul wird gemeldet, statt fatal zu enden. Nur C_GetFunctionList wird namenbasiert aufgelöst; alle anderen Einstiegspunkte stammen aus der Funktionstabelle, die es zurückgibt - so ist es vom Standard vorgesehen

ConfigurePkcs11SignerProvider baut aus einem TPdfPkcs11Options-Wert einen TPdfPkcs11SignerProvider und installiert ihn als aktives PAdES-Signer-Backend, zurück kommt das IPdfPkcs11SignerProvider-Interface, das auch die Token-Aufzählungsmethoden mitbringt

Pkcs11ModuleAvailable und Pkcs11ModuleVersion melden, ob ein gegebenes Modul lädt und eine brauchbare Funktionstabelle vorweist, sodass eine Anwendung beim Start entscheiden kann, ob Token-Signierung auf dieser Maschine möglich ist. Geladene Module werden nach Pfad zwischengespeichert, denn der Standard erlaubt nur eine Initialisierung pro Prozess und Modul

Resolve wählt das Zertifikat über TPadesSignerOptions.CertificateThumbprint, wenn einer übergeben wurde, sonst über CertificateLabel, und sucht dann das Private-Key-Objekt, das denselben Token-Bezeichner trägt wie das Zertifikat. Der Schlüsselalgorithmus des Zertifikats bestimmt die Algorithmusfamilie: Ein EC-Schlüssel signiert mit ECDSA, und seine Rohsignatur wird in die DER-SEQUENCE umkodiert, die CMS erwartet; ein RSA-Schlüssel folgt dem angeforderten Padding-Schema

EnumerateSlots und EnumerateCertificates dienen Auswahl-Oberflächen: Sie lassen eine Anwendung die Slots auflisten, die ein Modul meldet, und die Zertifikate, die ein gewählter Slot hält, bevor eine Signaturoption festgelegt wird

Funktionen

FunktionBeschreibung
Pkcs11ModuleAvailableGibt True zurück, wenn das Modul am angegebenen Pfad lädt und eine brauchbare Funktionstabelle vorweist
Pkcs11ModuleVersionGibt die vom Modul gemeldete Versionszeichenkette zurück, oder einen leeren String, wenn das Modul nicht lädt
Pkcs11AbiLayoutGibt das von diesem Build aufgelöste ABI-Layout zurück, als ulong=<n> attr=<n> pss=<n> table=<n>
ConfigurePkcs11SignerProviderBaut aus den übergebenen Optionen einen Provider, installiert ihn als PAdES-Signer-Backend und gibt ihn als IPdfPkcs11SignerProvider zurück

Typen

TypZweck
EPdfPkcs11ErrorException, die ausgelöst wird, wenn kein Modulpfad konfiguriert ist, das Modul nicht geladen werden kann, ein Token-Aufruf fehlschlägt oder kein passendes Zertifikat beziehungsweise kein passender Private Key gefunden wird
TPdfPkcs11OptionsRecord, der Modul, Slot, PIN und Zertifikat benennt, mit denen der Provider arbeitet
TPdfPkcs11SignerProviderProvider-Klasse, die IPadesSignerProvider und IPdfPkcs11SignerProvider auf einem PKCS#11-Modul implementiert

TPdfPkcs11Options-Felder

FeldBeschreibung
ModulePathPfad zum PKCS#11-Modul; erforderlich, denn welches Modul einen Token bedient, ist eine Deployment-Entscheidung, und einen brauchbaren Standardwert gibt es nicht
SlotIdZu öffnender Token-Slot, wird nur beachtet, wenn UseSpecificSlot True ist
UseSpecificSlotAuf False lassen, um den ersten Slot zu nehmen, der einen Token vorweist
PinBenutzer-PIN; der Provider löscht seine eigene Kopie, sobald der Token sie verbraucht hat, und für die Lebensdauer des übergebenen Strings bleibt der Aufrufer verantwortlich
CertificateLabelOptionales Objekt-Label des Zertifikats, mit dem signiert wird; wird nur verwendet, wenn TPadesSignerOptions.CertificateThumbprint leer ist
DefaultStatische Fabrik, die Optionen mit leerem Modulpfad, Slot 0, automatischer Slot-Auswahl und ohne PIN oder Label liefert

TPdfPkcs11SignerProvider-Member

MemberBeschreibung
CreateKonstruiert den Provider aus einem TPdfPkcs11Options-Wert; das Modul selbst wird bei der ersten Nutzung geöffnet
DestroySchließt eine offene Token-Session, bevor die Instanz freigegeben wird
BackendNameGibt den Backend-Namen zurück, ergänzt um den Moduldateinamen, wenn ein Modulpfad konfiguriert ist
ResolveLöst TPadesSignerOptions in einen TPadesResolvedSigner auf, der Token-Signer und Signer-Zertifikats-DER enthält
EnumerateSlotsLiefert jeden Slot, den das Modul meldet, als TPdfPkcs11Slots, einschließlich Slots ohne Token
EnumerateCertificatesLiefert die Zertifikate eines Slots als TPdfPkcs11Certificates und öffnet zuvor eine Session auf diesem Slot
CloseProtectedSessionsMeldet sich dort ab, wo eine Anmeldung erfolgte, und schließt die offene Session, um den Token für andere Konsumenten freizugeben

Hinweise

Siehe auch

FPdfCrypto, FPdfCryptoWin, FPdfCms