PDFium Delphi Component Docs

Модуль FPdfPkcs11

Модуль: FPdfPkcs11
Бэкенд подписи PKCS#11 для PAdES: получает сертификат подписанта и его закрытый ключ из токена и формирует подпись SignerInfo внутри токена

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;

Description

FPdfPkcs11 — переносимый бэкенд подписи PAdES и аналог бэкенда CNG на Windows. Он получает сертификат подписанта и его закрытый ключ из токена PKCS#11, а затем возвращает TPadesResolvedSigner, чей ICmsSigner формирует подпись SignerInfo через токен, так что ключ его никогда не покидает

Модуль загружается во время выполнения по пути — opensc-pkcs11.so, libsofthsm2.so, DLL производителя, — поэтому при сборке ничего не линкуется, а отсутствие модуля сообщается, а не становится фатальным. По имени разрешается только C_GetFunctionList; все остальные точки входа берутся из таблицы функций, которую он возвращает, — именно так стандарт предполагает обращаться с модулем

ConfigurePkcs11SignerProvider создаёт TPdfPkcs11SignerProvider из значения TPdfPkcs11Options и устанавливает его активным бэкендом подписантов PAdES, возвращая интерфейс IPdfPkcs11SignerProvider, который несёт также методы перечисления токена

Pkcs11ModuleAvailable и Pkcs11ModuleVersion сообщают, загружается ли данный модуль и предоставляет ли он пригодную таблицу функций, поэтому приложение может решить при запуске, возможна ли подпись через токен на этой машине. Загруженные модули кешируются по пути, потому что стандарт допускает только одну инициализацию модуля на процесс

Resolve выбирает сертификат по TPadesSignerOptions.CertificateThumbprint, если отпечаток передан, иначе по CertificateLabel, и затем находит объект закрытого ключа, несущий тот же идентификатор токена, что и сертификат. Алгоритм ключа сертификата определяет семейство алгоритмов: ключ EC подписывает через ECDSA, и его сырая подпись перекодируется в DER SEQUENCE, которую ожидает CMS, а ключ RSA следует запрошенной схеме дополнения

EnumerateSlots и EnumerateCertificates служат для пользовательских интерфейсов выбора: приложение может перечислить слоты, которые сообщает модуль, и сертификаты выбранного слота, прежде чем какой-либо вариант подписи будет зафиксирован

Functions

FunctionDescription
Pkcs11ModuleAvailableВозвращает True, когда модуль по указанному пути загружается и предоставляет пригодную таблицу функций
Pkcs11ModuleVersionВозвращает строку версии, которую сообщает модуль, либо пустую строку, если модуль не загружается
Pkcs11AbiLayoutВозвращает раскладку ABI, которую определила эта сборка, в виде ulong=<n> attr=<n> pss=<n> table=<n>
ConfigurePkcs11SignerProviderСоздаёт провайдера из переданных опций, устанавливает его бэкендом подписантов PAdES и возвращает как IPdfPkcs11SignerProvider

Types

TypePurpose
EPdfPkcs11ErrorИсключение, возникающее, когда путь к модулю не настроен, модуль не загружается, вызов токена завершается ошибкой или не найден подходящий сертификат либо закрытый ключ
TPdfPkcs11OptionsЗапись, задающая модуль, слот, PIN и сертификат, с которыми работает провайдер
TPdfPkcs11SignerProviderКласс-провайдер, реализующий IPadesSignerProvider и IPdfPkcs11SignerProvider поверх модуля PKCS#11

TPdfPkcs11Options fields

FieldDescription
ModulePathПуть к модулю PKCS#11; обязателен, потому что выбор модуля, обслуживающего токен, — решение развёртывания, и полезного значения по умолчанию нет
SlotIdОткрываемый слот токена; учитывается, только когда UseSpecificSlot равно True
UseSpecificSlotОставьте False, чтобы взять первый слот, сообщающий о присутствии токена
PinПользовательский PIN; провайдер стирает свою копию, как только токен её использовал, а вызывающий код по-прежнему отвечает за время жизни переданной строки
CertificateLabelНеобязательная объектная метка сертификата для подписи; используется, только когда TPadesSignerOptions.CertificateThumbprint пуст
DefaultСтатическая фабрика, возвращающая опции с пустым путём модуля, слотом 0, автоматическим выбором слота и без PIN и метки

TPdfPkcs11SignerProvider members

MemberDescription
CreateСоздаёт провайдера из значения TPdfPkcs11Options; сам модуль открывается при первом использовании
DestroyЗакрывает любой открытый сеанс токена перед освобождением экземпляра
BackendNameВозвращает имя бэкенда, с добавленным именем файла модуля, если путь к модулю настроен
ResolveПревращает TPadesSignerOptions в TPadesResolvedSigner с токеновым подписантом и DER сертификата подписанта
EnumerateSlotsВозвращает все слоты, которые сообщает модуль, как TPdfPkcs11Slots, включая слоты без присутствующего токена
EnumerateCertificatesВозвращает сертификаты одного слота как TPdfPkcs11Certificates, сначала открывая сеанс на этом слоте
CloseProtectedSessionsВыполняет выход там, где был выполнен вход, и закрывает открытый сеанс, освобождая токен для других потребителей

Remarks

See Also

FPdfCrypto, FPdfCryptoWin, FPdfCms