PDFium Delphi Component Docs

Unidad FPdfPkcs11

Unidad: FPdfPkcs11
Backend de firma PKCS#11 para PAdES, que resuelve un certificado de firmante y su clave privada desde un token y produce la firma SignerInfo dentro del token

Sintaxis

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;

Descripción

FPdfPkcs11 es el backend de firma PAdES portable y el homólogo del backend CNG de Windows. Resuelve un certificado de firmante y su clave privada desde un token PKCS#11 y devuelve un TPadesResolvedSigner cuyo ICmsSigner produce la firma SignerInfo a través del token, de modo que la clave nunca sale de él

El módulo se carga en tiempo de ejecución por ruta - opensc-pkcs11.so, libsofthsm2.so, una DLL del fabricante - de modo que nada se enlaza en tiempo de compilación y un módulo ausente se informa en lugar de ser fatal. Solo C_GetFunctionList se resuelve por nombre; todos los demás puntos de entrada salen de la tabla de funciones que este devuelve, que es como el estándar prevé llegar a un módulo

ConfigurePkcs11SignerProvider construye un TPdfPkcs11SignerProvider a partir de un valor TPdfPkcs11Options y lo instala como backend de firmantes PAdES activo, devolviendo la interfaz IPdfPkcs11SignerProvider que también incorpora los métodos de enumeración del token

Pkcs11ModuleAvailable y Pkcs11ModuleVersion informan de si un módulo dado se carga y expone una tabla de funciones utilizable, de modo que una aplicación puede decidir al arrancar si la firma con token es posible en esta máquina. Los módulos cargados se almacenan en caché por ruta, porque el estándar solo permite una inicialización por proceso y módulo

Resolve selecciona el certificado por TPadesSignerOptions.CertificateThumbprint cuando se suministra uno y por CertificateLabel en caso contrario, y después localiza el objeto de clave privada que lleva el mismo identificador de token que el certificado. El algoritmo de la clave del certificado decide la familia de algoritmos: una clave EC firma con ECDSA y su firma bruta se recodifica como la SEQUENCE DER que CMS espera, mientras que una clave RSA sigue el esquema de relleno solicitado

EnumerateSlots y EnumerateCertificates sirven a las interfaces de usuario de selección, permitiendo que una aplicación enumere las ranuras que informa un módulo y los certificados que contiene una ranura elegida antes de fijar cualquier opción de firma

Funciones

FunciónDescripción
Pkcs11ModuleAvailableDevuelve True cuando el módulo de la ruta indicada se carga y expone una tabla de funciones utilizable
Pkcs11ModuleVersionDevuelve la cadena de versión que informa el módulo, o una cadena vacía cuando el módulo no se carga
Pkcs11AbiLayoutDevuelve la disposición ABI que resolvió esta compilación, como ulong=<n> attr=<n> pss=<n> table=<n>
ConfigurePkcs11SignerProviderConstruye un proveedor a partir de las opciones suministradas, lo instala como backend de firmantes PAdES y lo devuelve como IPdfPkcs11SignerProvider

Tipos

TipoPropósito
EPdfPkcs11ErrorExcepción que se lanza cuando no hay ninguna ruta de módulo configurada, el módulo no se puede cargar, falla una llamada al token o no se encuentra ningún certificado o clave privada coincidente
TPdfPkcs11OptionsRecord que nombra el módulo, la ranura, el PIN y el certificado con los que trabaja el proveedor
TPdfPkcs11SignerProviderClase proveedora que implementa IPadesSignerProvider y IPdfPkcs11SignerProvider sobre un módulo PKCS#11

Campos de TPdfPkcs11Options

CampoDescripción
ModulePathRuta al módulo PKCS#11; obligatoria, porque qué módulo atiende un token es una decisión de despliegue y no existe un valor por omisión útil
SlotIdRanura de token que se abrirá, respetada solo cuando UseSpecificSlot es True
UseSpecificSlotDéjelo en False para tomar la primera ranura que informe de un token presente
PinPIN de usuario; el proveedor borra su propia copia una vez que el token la ha consumido, y la vida útil de la cadena que se pasa queda en manos de quien llama
CertificateLabelEtiqueta de objeto opcional del certificado con el que se firma; se usa solo cuando TPadesSignerOptions.CertificateThumbprint está vacía
DefaultFábrica estática que devuelve opciones con una ruta de módulo vacía, ranura 0, selección automática de ranura y sin PIN ni etiqueta

Miembros de TPdfPkcs11SignerProvider

MiembroDescripción
CreateConstruye el proveedor a partir de un valor TPdfPkcs11Options; el módulo en sí se abre en el primer uso
DestroyCierra cualquier sesión de token abierta antes de liberar la instancia
BackendNameDevuelve el nombre del backend, con el nombre del archivo del módulo añadido cuando hay una ruta de módulo configurada
ResolveResuelve TPadesSignerOptions en un TPadesResolvedSigner que contiene el firmante del token y el DER del certificado del firmante
EnumerateSlotsDevuelve todas las ranuras que informa el módulo como TPdfPkcs11Slots, incluidas las ranuras sin token presente
EnumerateCertificatesDevuelve los certificados contenidos en una ranura como TPdfPkcs11Certificates, abriendo antes una sesión en esa ranura
CloseProtectedSessionsCierra la sesión donde hubo inicio de sesión y cierra la sesión abierta, liberando el token para otros consumidores

Observaciones

Véase también

FPdfCrypto, FPdfCryptoWin, FPdfCms