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 est le backend de signature PAdES portable et le pendant du backend CNG de Windows. Il résout un certificat de signataire et sa clé privée depuis un jeton PKCS#11, puis renvoie un TPadesResolvedSigner dont l’ICmsSigner produit la signature SignerInfo à travers le jeton, de sorte que la clé ne le quitte jamais
Le module est chargé à l’exécution par chemin - opensc-pkcs11.so, libsofthsm2.so, une DLL fournisseur - donc rien n’est lié au moment du build et un module absent est signalé au lieu d’être fatal. Seul C_GetFunctionList est résolu par nom ; tout autre point d’entrée sort de la table de fonctions qu’il renvoie, ce qui correspond à la façon dont la norme entend qu’on joigne un module
ConfigurePkcs11SignerProvider construit un TPdfPkcs11SignerProvider à partir d’une valeur TPdfPkcs11Options et l’installe comme backend de signataires PAdES actif, en renvoyant l’interface IPdfPkcs11SignerProvider qui porte aussi les méthodes d’énumération du jeton
Pkcs11ModuleAvailable et Pkcs11ModuleVersion signalent si un module donné se charge et expose une table de fonctions utilisable, si bien qu’une application peut décider au démarrage si la signature par jeton est possible sur cette machine. Les modules chargés sont mis en cache par chemin, car la norme n’autorise qu’une seule initialisation par processus et par module
Resolve sélectionne le certificat par TPadesSignerOptions.CertificateThumbprint lorsqu’une empreinte est fournie et par CertificateLabel sinon, puis localise l’objet de clé privée qui porte le même identifiant de jeton que le certificat. L’algorithme de la clé du certificat décide de la famille d’algorithmes : une clé EC signe avec ECDSA et sa signature brute est réencodée dans la SEQUENCE DER qu’attend CMS, tandis qu’une clé RSA suit le schéma de remplissage demandé
EnumerateSlots et EnumerateCertificates servent aux interfaces utilisateur de sélection, permettant à une application de lister les emplacements qu’un module signale et les certificats qu’un emplacement choisi contient avant de fixer une option de signature
| Function | Description |
|---|---|
Pkcs11ModuleAvailable | Renvoie True lorsque le module du chemin donné se charge et expose une table de fonctions utilisable |
Pkcs11ModuleVersion | Renvoie la chaîne de version que le module signale, ou une chaîne vide lorsque le module ne se charge pas |
Pkcs11AbiLayout | Renvoie la disposition ABI que ce build a résolue, sous la forme ulong=<n> attr=<n> pss=<n> table=<n> |
ConfigurePkcs11SignerProvider | Construit un fournisseur à partir des options fournies, l’installe comme backend de signataires PAdES et le renvoie comme IPdfPkcs11SignerProvider |
| Type | Purpose |
|---|---|
EPdfPkcs11Error | Exception levée lorsqu’aucun chemin de module n’est configuré, que le module ne peut pas être chargé, qu’un appel au jeton échoue ou qu’aucun certificat ou clé privée correspondante n’est trouvé |
TPdfPkcs11Options | Enregistrement nommant le module, l’emplacement, le PIN et le certificat avec lesquels le fournisseur travaille |
TPdfPkcs11SignerProvider | Classe fournisseur implémentant IPadesSignerProvider et IPdfPkcs11SignerProvider par-dessus un module PKCS#11 |
| Field | Description |
|---|---|
ModulePath | Chemin du module PKCS#11 ; requis, car le module qui dessert un jeton est une décision de déploiement et il n’existe aucun défaut utile |
SlotId | Emplacement de jeton à ouvrir, honoré uniquement lorsque UseSpecificSlot est True |
UseSpecificSlot | Laissez False pour prendre le premier emplacement qui signale un jeton présent |
Pin | PIN utilisateur ; le fournisseur efface sa propre copie une fois que le jeton l’a consommé, et l’appelant reste responsable de la durée de vie de la chaîne qu’il passe |
CertificateLabel | Étiquette d’objet facultative du certificat avec lequel signer, utilisée uniquement lorsque TPadesSignerOptions.CertificateThumbprint est vide |
Default | Fabrique statique renvoyant des options avec un chemin de module vide, l’emplacement 0, la sélection automatique d’emplacement, et ni PIN ni étiquette |
| Member | Description |
|---|---|
Create | Construit le fournisseur à partir d’une valeur TPdfPkcs11Options ; le module lui-même est ouvert à la première utilisation |
Destroy | Ferme toute session de jeton ouverte avant que l’instance ne soit libérée |
BackendName | Renvoie le nom du backend, avec le nom de fichier du module ajouté lorsqu’un chemin de module est configuré |
Resolve | Résout TPadesSignerOptions en un TPadesResolvedSigner contenant le signataire du jeton et le DER du certificat du signataire |
EnumerateSlots | Renvoie chaque emplacement que le module signale comme TPdfPkcs11Slots, y compris les emplacements sans jeton présent |
EnumerateCertificates | Renvoie les certificats détenus dans un emplacement comme TPdfPkcs11Certificates, en ouvrant d’abord une session sur cet emplacement |
CloseProtectedSessions | Se déconnecte là où une connexion a eu lieu et ferme la session ouverte, libérant le jeton pour d’autres consommateurs |
CK_ULONG suit le unsigned long C, il fait donc 4 octets sous Windows (LLP64) et 8 octets sous Linux et macOS (LP64) ; chaque handle, compteur et type d’attribut est un CK_ULONGPkcs11AbiLayout signale la disposition que ce build a résolue, de sorte qu’une incompatibilité soit diagnosticable plutôt qu’un crash silencieux : Win32 signale ulong=4 attr=12 pss=12 table=2, Win64 signale ulong=4 attr=16 pss=12 table=2, et une cible LP64 signale ulong=8 attr=24 pss=24 table=8CertificateLabel, le premier certificat du jeton l’emporte, ce qui convient à un jeton à certificat unique et à aucun déploiement de production