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;
FPdfPkcs11 is de draagbare PAdES-ondertekeningsbackend en de tegenhanger van de Windows-CNG-backend. Hij haalt een signercertificaat en de bijbehorende private sleutel uit een PKCS#11-token en geeft vervolgens een TPadesResolvedSigner terug waarvan de ICmsSigner de SignerInfo-handtekening via het token produceert, zodat de sleutel het token nooit verlaat
De module wordt tijdens runtime op pad geladen - opensc-pkcs11.so, libsofthsm2.so, een DLL van de leverancier - dus er wordt niets gekoppeld tijdens het bouwen en een ontbrekende module wordt gemeld in plaats van fataal te zijn. Alleen C_GetFunctionList wordt op naam opgezocht; alle andere entry points komen uit de functietabel die hij teruggeeft, precies zoals de standaard bedoelt dat een module wordt benaderd
ConfigurePkcs11SignerProvider bouwt een TPdfPkcs11SignerProvider op basis van een TPdfPkcs11Options-waarde en installeert hem als de actieve PAdES-signerbackend, met als retour de IPdfPkcs11SignerProvider-interface die ook de token-enumeratiemethoden draagt
Pkcs11ModuleAvailable en Pkcs11ModuleVersion rapporteren of een gegeven module laadt en een bruikbare functietabel blootlegt, zodat een toepassing bij het opstarten kan beslissen of tokenondertekening op deze machine mogelijk is. Geladen modules worden op pad gecacht, omdat de standaard per proces per module slechts één initialisatie toestaat
Resolve kiest het certificaat via TPadesSignerOptions.CertificateThumbprint wanneer die is opgegeven en anders via CertificateLabel, en zoekt vervolgens het private-sleutelobject dat dezelfde token-identificatie draagt als het certificaat. Het sleutelalgoritme van het certificaat bepaalt de algoritmefamilie: een EC-sleutel ondertekent met ECDSA en zijn ruwe handtekening wordt opnieuw gecodeerd als de DER SEQUENCE die CMS verwacht, terwijl een RSA-sleutel het gevraagde paddingschema volgt
EnumerateSlots en EnumerateCertificates dienen voor keuze-interfaces, zodat een toepassing de slots kan opnoemen die een module rapporteert en de certificaten die een gekozen slot bevat, voordat een ondertekeningsoptie is vastgelegd
| Function | Description |
|---|---|
Pkcs11ModuleAvailable | Geeft True terug wanneer de module op het gegeven pad laadt en een bruikbare functietabel blootlegt |
Pkcs11ModuleVersion | Geeft de versiestring terug die de module rapporteert, of een lege string wanneer de module niet laadt |
Pkcs11AbiLayout | Geeft de ABI-layout terug die deze build heeft bepaald, als ulong=<n> attr=<n> pss=<n> table=<n> |
ConfigurePkcs11SignerProvider | Bouwt een provider op basis van de opgegeven opties, installeert hem als de PAdES-signerbackend en geeft hem terug als IPdfPkcs11SignerProvider |
| Type | Purpose |
|---|---|
EPdfPkcs11Error | Exceptie die wordt verhoogd wanneer geen modulepad is geconfigureerd, de module niet kan worden geladen, een token-aanroep faalt, of geen overeenkomend certificaat of private sleutel wordt gevonden |
TPdfPkcs11Options | Record dat de module, het slot, de PIN en het certificaat noemt waarmee de provider werkt |
TPdfPkcs11SignerProvider | Providerklasse die IPadesSignerProvider en IPdfPkcs11SignerProvider implementeert bovenop een PKCS#11-module |
| Field | Description |
|---|---|
ModulePath | Pad naar de PKCS#11-module; verplicht, want welke module een token bedient is een inzettingskeuze en er is geen nuttige standaardwaarde |
SlotId | Te openen token-slot, alleen van kracht wanneer UseSpecificSlot True is |
UseSpecificSlot | Laat False staan om het eerste slot te nemen dat een aanwezig token rapporteert |
Pin | Gebruikers-PIN; de provider wist zijn eigen exemplaar zodra het token die heeft verbruikt, en de aanroeper blijft verantwoordelijk voor de levensduur van de string die hij doorgeeft |
CertificateLabel | Optioneel objectlabel van het certificaat waarmee wordt ondertekend, alleen gebruikt wanneer TPadesSignerOptions.CertificateThumbprint leeg is |
Default | Statische factory die opties teruggeeft met een leeg modulepad, slot 0, automatische slotkeuze, en geen PIN of label |
| Member | Description |
|---|---|
Create | Construeert de provider op basis van een TPdfPkcs11Options-waarde; de module zelf wordt geopend bij eerste gebruik |
Destroy | Sluit elke open tokensessie voordat de instantie wordt vrijgegeven |
BackendName | Geeft de backendnaam terug, aangevuld met de modulebestandsnaam wanneer een modulepad is geconfigureerd |
Resolve | Zet TPadesSignerOptions om in een TPadesResolvedSigner met de tokensigner en het certificaat-DER van de signer |
EnumerateSlots | Geeft elk slot dat de module rapporteert terug als TPdfPkcs11Slots, inclusief slots zonder aanwezig token |
EnumerateCertificates | Geeft de certificaten in één slot terug als TPdfPkcs11Certificates, na eerst een sessie op dat slot te openen |
CloseProtectedSessions | Meldt af waar een aanmelding heeft plaatsgevonden en sluit de open sessie, waarmee het token voor andere gebruikers wordt vrijgegeven |
CK_ULONG volgt de C unsigned long, dus die is 4 bytes op Windows (LLP64) en 8 bytes op Linux en macOS (LP64); elke handle, elk aantal en elk attribuuttype is een CK_ULONGPkcs11AbiLayout rapporteert de layout die deze build heeft bepaald, zodat een mismatch diagnoseerbaar is in plaats van een stille crash: Win32 rapporteert ulong=4 attr=12 pss=12 table=2, Win64 rapporteert ulong=4 attr=16 pss=12 table=2, en een LP64-doel rapporteert ulong=8 attr=24 pss=24 table=8CertificateLabel wint het eerste certificaat op het token, wat past bij een token met één certificaat en bij geen enkele productie-inzet