p11-kit
wraps PKCS#11 modules to manage
them and customize their functionality so that they are able
to be shared between multiple callers in the same process.
Each caller that uses the
p11_kit_modules_load()
or p11_kit_module_load()
function gets independent wrapped PKCS#11 module(s). This is unless a caller
or module configuration specifies that a module should be used in an
unmanaged fashion.
When modules are managed, the following aspects are wrapped and coordinated:
-
Calls to
C_Initialize
andC_Finalize
can be called by multiple callers.The first time that the managed module
C_Initialize
is called, the PKCS#11 module's actualC_Initialize
function is called. Subsequent calls by other callers will causep11-kit
to increment an internal initialization count, rather than callingC_Initialize
again.Multiple callers can call the managed
C_Initialize
function concurrently from different threads andp11-kit
will guarantee that this managed in a thread-safe manner. -
When the managed module
C_Finalize
is used to finalize a module, each time it is called it decrements the internal initialization count for that module. When the internal initialization count reaches zero, the module's actualC_Finalize
function is called.Multiple callers can call the managed
C_Finalize
function concurrently from different threads andp11-kit
will guarantee that this managed in a thread-safe manner. Call to
C_CloseAllSessions
only close the sessions that the caller of the managed module has opened. This allows theC_CloseAllSessions
function to be used without closing sessions for other callers of the same PKCS#11 module.Managed modules have ability to log PKCS#11 method calls for debugging purposes. See the
log-calls = yes
module configuration option.Managed modules have the ability to be remoted to another machine or isolated in their own process. See the
remote = ...
module configuration option.