Fact-checked by Grok 2 weeks ago

PKCS 11

PKCS #11, also known as Cryptoki, is a Standard that defines a platform-independent () for cryptographic , enabling applications to perform operations such as , decryption, digital signing, and on devices like hardware security modules (HSMs), smart cards, and software without dependency on specific hardware details. The standard provides a C-language that abstracts the underlying cryptographic hardware or software, allowing multiple applications to share resources on a single while ensuring isolation and portability across platforms. It models cryptographic devices as "tokens" containing "objects" such as keys, certificates, and data, with attributes that control access and behavior, and supports mechanisms for various algorithms including , , and . Originally developed by Laboratories as part of the series in the mid-1990s to promote in , the standard's first version (v1.0) was published on April 28, 1995. Subsequent revisions addressed evolving needs, with version 2.20 (June 28, 2004) becoming the most widely adopted for its comprehensive support of and token management functions. In , maintenance transitioned to the PKCS 11 Technical Committee, which published version 2.40 as an official OASIS Standard on April 14, 2015, incorporating errata and enhancements for better integration with modern systems. The current version, 3.1, approved as an OASIS Standard on August 10, 2023, introduces advanced features like improved key derivation functions, support for mechanisms, and profiles for specific use cases such as and environments, while maintaining with prior versions. Key components of PKCS #11 include slots (physical or logical interfaces to tokens), sessions (connections between applications and tokens), and a rich set of functions prefixed with C_ (e.g., C_Initialize for library setup, C_CreateObject for object instantiation, and C_Sign for signature generation), all defined in the pkcs11.h header file. The API emphasizes security through user authentication (normal user and security officer roles), attribute-based access controls, and optional features like multi-threaded operation via mutex handling. Widely implemented in libraries like OpenSSL's engine_pkcs11 and used in standards-compliant systems from vendors such as IBM, Thales, and Entrust, PKCS #11 facilitates secure key storage and operations in environments ranging from enterprise servers to embedded devices.

Introduction

Overview

PKCS #11, also known as Cryptoki—from the words "cryptographic token interface"—is the Public-Key Cryptography Standards #11, a specification defining a platform-independent application programming interface (API) in the C programming language for managing cryptographic tokens. This standard provides a technology-independent, object-based model that allows applications to interface with cryptographic hardware or software without dependency on specific vendors or platforms. The primary goal of PKCS #11 is to enable secure and portable cryptographic operations, such as , decryption, digital signing, and , by abstracting the underlying implementation details of . It supports resource sharing among multiple applications and promotes , ensuring that cryptographic services can be accessed consistently across diverse environments. In this framework, a serves as a logical of a cryptographic , encompassing physical hardware like hardware security modules (HSMs) or smart cards, as well as software-based emulations. Tokens store cryptographic objects, including private keys, public keys, and certificates, and execute operations on them while maintaining isolation from the application's direct access to sensitive data. Originally developed and maintained by Laboratories as part of the broader series, the standard's oversight transitioned to the Organization for the Advancement of Structured Information Standards () in early 2013, where it continues to be updated by the OASIS PKCS #11 Technical Committee.

Purpose and Scope

PKCS #11, also known as Cryptoki, primarily aims to provide a platform-independent application programming () that enables applications to access cryptographic devices such as hardware security modules (HSMs) and smart cards in a portable manner, while allowing resource sharing among multiple applications and isolating them from the underlying hardware specifics. This standardization ensures that cryptographic operations can be performed consistently across diverse environments without dependence on vendor-specific implementations. The benefits of PKCS #11 include enhanced between applications and cryptographic tokens, supporting secure key storage and essential operations such as , digital signing, and . Its scope is delimited to a C-language for interacting with tokens, encompassing data types, functions, and basic interface components, but excludes wire protocols for communication or higher-level protocols. Limitations of the standard include the allowance for vendor-defined extensions, which, while providing flexibility, must not conflict with the core specification to maintain , though they may reduce across different vendors' implementations. Additionally, PKCS #11 does not mandate support for specific hardware or algorithms, leaving such decisions to implementers. In the broader context of , the standard facilitates compliance with and by enabling the validation of cryptographic modules that implement its interface.

History

Origins and Development

PKCS #11, part of the broader (PKCS) series developed by Laboratories starting in the early , emerged to standardize interfaces for implementations across diverse hardware and software environments. The project for PKCS #11 specifically launched in January 1994, driven by the increasing adoption of cryptographic hardware such as smart cards, PCMCIA tokens, and hardware security modules (HSMs), which necessitated a portable for applications to access these devices without vendor-specific dependencies. This effort addressed the growing needs of (PKI) by abstracting tokens as logical entities, enabling uniform management of cryptographic objects like keys and certificates. The initial version, PKCS #11 v1.0, was released in April 1995 following collaborative development involving over 130 contributors from industry, academia, and government representatives, including early integrations with vendors like for secure browser operations. Laboratories coordinated this process, soliciting feedback through public mailing lists to refine the Cryptoki interface, which provided functions for session management, object handling, and cryptographic operations while ensuring . The standard emphasized technology independence, allowing applications to interact with tokens via a C-language without knowledge of underlying hardware specifics, thus supporting the emerging ecosystem of secure and systems. A key milestone came with version 2.01 in December 1997, which introduced enhanced multi-threaded support through flags like CKF_OS_LOCKING_OK in the C_Initialize function, enabling concurrent access and mutex handling for improved performance in multi-application environments. This update also incorporated influences from contemporary standards to align PKCS #11 with broader interoperability goals. Development faced challenges in balancing strict standardization with vendor flexibility, resulting in numerous optional features—such as mechanism support and attribute behaviors—to accommodate diverse token capabilities without mandating uniform implementation across all devices. In 2013, stewardship transitioned to OASIS for continued evolution.

Major Versions

The PKCS #11 standard originated as a set of drafts and errata under Laboratories before transitioning to the PKCS 11 Technical Committee in early 2013, where subsequent development followed formal standardization processes. A separate historical mechanisms specification documents deprecated algorithms across versions for reference, ensuring continuity while focusing current implementations on supported operations. Version 2.01, released by Laboratories on December 22, 1997, introduced core session management functions such as C_OpenSession and C_CloseSession for handling application-token interactions, alongside basic cryptographic mechanisms including for public-key operations and for symmetric encryption. This version established the foundational structure, enabling platform-independent access to cryptographic tokens like smart cards and modules. Version 2.20, published by Inc. on June 28, 2004, standardized multi-part operations for functions like and hashing—allowing incremental processing of large data streams—and enhanced object handling with refined attribute management for keys and certificates. It gained widespread adoption due to its alignment with validation requirements for cryptographic modules, serving as the basis for many commercial implementations. Version 2.40, approved as an Standard on April 14, 2015, improved error handling by introducing return codes such as CKR_FUNCTION_NOT_PARALLEL to signal non-concurrent function execution, alongside clarifications on error priorities and conditions. It added new attributes for enhanced information, including CKA_START_DATE and CKA_END_DATE for validity periods, CKA_PUBLIC_KEY_INFO for details, and expansions to CK_TOKEN_INFO flags like CKF_USER_PIN_TO_BE_CHANGED to indicate PIN status. Version 3.0, published as an Standard on June 15, 2020, marked the first major revision since 1997 by introducing message-based interfaces such as C_MessageEncryptInit for efficient streaming cryptographic operations, particularly supporting with associated data (AEAD) modes like AES-GCM. It unified the base specification and mechanisms document into a single standard, incorporating new algorithms including hashes, key derivation for TLS 1.3, and AES-XTS, while adding the CKO_PROFILE object class for programmatic module capability queries. Version 3.1, approved as an Standard on July 23, 2023, provided minor refinements including enhanced conformance tests for object creation, attribute validation, and support to improve across consumer and provider implementations. It introduced new attributes like CKA_ALWAYS_AUTHENTICATE for private keys, requiring re-authentication per operation to bolster in sensitive environments, and added post-quantum support through mechanisms such as HSS (stateful hash-based signatures) per NIST SP 800-208. This remains the current version as of November 2025.

Architecture

Cryptoki Model

Cryptoki serves as the primary interface layer in PKCS #11, providing a portable, technology-independent that abstracts the complexities of diverse cryptographic devices into a uniform model for applications to interact with cryptographic . This abstraction allows software to manage security operations without direct dependence on underlying hardware specifics, such as smart cards, hardware security modules, or software-based , ensuring compatibility across implementations. In the high-level operational flow of the Cryptoki model, an application first initializes the PKCS #11 library using the C_Initialize function to establish the runtime environment. It then discovers available slots—logical positions for —via C_GetSlotList, opens sessions to specific within those slots using C_OpenSession, and manipulates cryptographic objects through handles obtained from operations like C_CreateObject. This sequence enables secure handling of keys, certificates, and other data while maintaining isolation from the physical token infrastructure. The model adheres to key principles that enhance its robustness and flexibility, including a logical where slots represent potential token holders independent of the actual tokens present, allowing for dynamic insertion and removal without disrupting the application. It supports concurrent sessions across multiple tokens, with each session maintaining its own state—such as read-only public or read-write user modes—to facilitate parallel operations while preserving security boundaries. Operations are inherently stateful, relying on session context to track ongoing cryptographic processes like or signing. Conceptually, the Cryptoki model can be visualized as a hierarchical structure: the PKCS #11 library at the top level interfaces with the application; it connects to one or more slots, each potentially containing a token; sessions are established within tokens to perform operations; and objects within sessions represent the manipulable cryptographic entities. This layered approach ensures modularity, with handles serving as opaque references to sessions and objects for efficient, secure access. Error handling in the Cryptoki model is standardized through return codes from all API functions, promoting reliability by explicitly signaling outcomes such as CKR_OK for successful completion or CKR_SLOT_ID_INVALID for attempts to access non-existent slots. These codes, defined in the specification, allow applications to gracefully manage failures like token absence or session limits, ensuring robust integration in varied environments.

Core Components

In the Cryptoki architecture of PKCS #11, slots represent logical positions where cryptographic tokens can be inserted, such as readers or interfaces. Each slot is identified by a unique CK_SLOT_ID, which is a CK_ULONG serving as an opaque . Applications discover available slots through the C_GetSlotList function, which returns an of slot IDs, allowing enumeration of all supported positions in the system. Slot information, including flags like CKF_TOKEN_PRESENT to indicate token presence, is retrieved via the CK_SLOT_INFO structure. Tokens provide the actual cryptographic capabilities within slots, embodying physical or logical devices that offer secure storage and processing functions. When inserted into a slot, a token is described by the CK_TOKEN_INFO structure, which includes details such as its label, , manufacturer , and various flags denoting supported features. For instance, the CKF_RNG flag signals the presence of a generator on the token, while other flags indicate capabilities like or requirements. Token details are queried using the C_GetTokenInfo function with the associated slot , enabling applications to assess the token's suitability for specific operations before establishing a . Sessions establish secure, logical connections between an application and a , facilitating access to its resources. Identified by a CK_SESSION_HANDLE, which is another CK_ULONG opaque value, sessions can be or user-initiated and may operate in read-only or read-write modes. Session states progress through phases such as read-only session (CKS_RO_PUBLIC_SESSION), read-write user functions (CKS_RW_USER_FUNCTIONS), and others, reflecting the level of and operational permissions. These states manage the context for cryptographic operations, with session information retrievable via C_GetSessionInfo to monitor concurrency limits or error conditions. Sessions are bound to a specific and , ensuring isolation and security during interactions. Objects serve as the fundamental data entities managed on tokens, encompassing keys, certificates, and other cryptographic items. Each object is referenced by a CK_OBJECT_HANDLE, a CK_ULONG opaque identifier unique within its session. Objects are classified by the CKA_CLASS attribute, which specifies types such as CKO_PUBLIC_KEY for public keys or CKO_CERTIFICATE for digital certificates. They exist in two scopes: persistent objects stored durably on the token (indicated by CKA_TOKEN set to CK_TRUE) and session objects that reside temporarily in memory during an active session. This distinction allows for secure, long-term storage of sensitive data while supporting ephemeral operations without token commitment. Handles across components—such as CK_SLOT_ID, CK_SESSION_HANDLE, and CK_OBJECT_HANDLE—act as secure, opaque references that abstract underlying implementations and prevent direct memory access. These handles ensure portability and security by invalidating upon events like user logout, token removal, or session closure, thereby protecting against unauthorized access or stale references in the Cryptoki interface. Through this hierarchy—slots containing tokens, sessions connecting to tokens, and objects accessible via sessions—PKCS #11 provides a robust framework for token-based cryptography.

Data Types and Objects

General Data Types

PKCS #11 defines a set of fundamental data types to ensure portability across platforms, forming the basis for the Cryptoki API's interactions with cryptographic tokens. These types include basic scalar and pointer types, as well as composite structures for conveying information about libraries, slots, tokens, sessions, and mechanisms. All structures are designed with fixed-size fields to promote consistency, and the specification mandates the use of #pragma pack(1) directives to enforce byte-aligned packing without padding, preventing platform-specific alignment issues. Basic scalar types in PKCS #11 primarily revolve around unsigned integers and characters for simplicity and efficiency. The core type CK_ULONG is an unsigned long integer, guaranteed to be at least 32 bits wide, used extensively for indices, lengths, counts, and flags throughout the . Pointer types include CK_BYTE_PTR, which is a pointer to an array of CK_BYTE (an unsigned 8-bit value), for handling buffers, and CK_VOID_PTR for generic opaque data pointers where the exact type is not specified. Additionally, CK_FLAGS is a type based on CK_ULONG, enabling compact representation of boolean options and capabilities. Key structures begin with CK_VERSION, a simple pair of CK_BYTE fields for major and minor version numbers, used to indicate the version of the Cryptoki library or a token's /. The CK_INFO structure provides comprehensive details about the Cryptoki library, including its cryptokiVersion (a CK_VERSION), a 32-character manufacturerID and libraryDescription (as CK_UTF8CHAR arrays), a flags field for library capabilities, and the libraryVersion (another CK_VERSION). For cryptographic operations, the CK_MECHANISM structure specifies the algorithm via a mechanism field (an enumerated CK_MECHANISM_TYPE, such as CKM_RSA_PKCS for PKCS#1 signing), along with a pParameter (CK_VOID_PTR) and ulParameterLen (CK_ULONG) for mechanism-specific parameters. Slot and token information is captured in dedicated structures to describe hardware and token states. CK_SLOT_INFO details a physical or logical slot, featuring a 64-character slotDescription and 32-character manufacturerID (both CK_UTF8CHAR), a flags field (e.g., CKF_TOKEN_PRESENT bit set if a token is inserted, CKF_REMOVABLE_DEVICE for hot-swappable slots), and hardwareVersion and firmwareVersion (both CK_VERSION). The CK_TOKEN_INFO structure extends this for the token itself, with fields like a 32-character label, 32-character manufacturerID, 16-character model and serialNumber, various ul* counters (CK_ULONG) for session limits, PIN lengths, and memory capacities (public/private), a flags field (e.g., CKF_RNG if the token has a , CKF_WRITE_PROTECTED for read-only status), versions, and a 16-character utcTime for the token's clock. Session uses CK_SESSION_INFO, which includes the slotID (CK_ULONG), state (an enumerated CK_STATE like CKS_RO_USER_FUNCTIONS for read-only user sessions), flags (e.g., CKF_RW_SESSION for read-write access), and ulDeviceError (CK_ULONG) for hardware faults. Return values from API functions are standardized as CK_RV, a typedef of CK_ULONG representing enumerated outcomes, with CKR_OK defined as 0 for success and others like CKR_PIN_INCORRECT (0x000000A0) or CKR_DEVICE_ERROR (0x00000030) indicating specific failures. To handle platform variations in pointer definitions, the specification employs CK_PTR as a macro (typically expanding to * or nothing in C++ contexts) for conditional pointers in structures, ensuring compatibility across compilers. These general types underpin object attributes and API parameters, providing a consistent foundation for token operations.

Objects and Attributes

In PKCS #11, objects represent the fundamental units of data storage and cryptographic material within a , each characterized by a set of attributes that define their properties, values, and behaviors. These attributes are managed through the CK_ATTRIBUTE structure, which consists of a type field (CK_ATTRIBUTE_TYPE, an unsigned long identifying the attribute, such as CKA_CLASS), a pointer to the value (void *pValue), and the length of the value in bytes (CK_ULONG ulValueLen). Objects are created, queried, or modified using templates, which are arrays of CK_ATTRIBUTE structures specifying the desired attributes and their values for validation against the token's policies. Objects are classified by their class via the CKA_CLASS attribute, which takes values from the CK_OBJECT_CLASS enumeration. The defined classes include CKO_DATA for general-purpose , CKO_CERTIFICATE for certificates, CKO_PUBLIC_KEY for public keys, CKO_PRIVATE_KEY for private keys, CKO_SECRET_KEY for symmetric keys, CKO_HW_FEATURE for hardware features like clocks or counters, CKO_DOMAIN_PARAMETERS for algorithm-specific parameters used in , CKO_MECHANISM for mechanism objects, CKO_OTP_KEY for keys, and CKO_PROFILE for profile objects. Each class determines the applicable attributes, with common ones shared across classes and class-specific ones providing detailed properties. Common attributes apply to most objects and include CKA_TOKEN (boolean, true if stored persistently on the , default false), CKA_PRIVATE (boolean, true if requiring for access, default depends on token), CKA_SENSITIVE (boolean, true if the object contains sensitive data that cannot be revealed in ), and CKA_EXTRACTABLE (boolean, true if the object can be extracted from the token, often false for private keys). Another special attribute is CKA_NEVER_EXTRACTABLE (boolean, true if the object is permanently non-extractable, preventing future changes to extractability). These attributes enforce policies, such as protecting sensitive keys from export. For key objects, the CKA_KEY_TYPE attribute specifies the algorithm via CK_KEY_TYPE values, such as CKK_RSA for RSA or CKK_AES for AES. Public key objects include attributes like CKA_MODULUS (byte array for RSA modulus) and usage flags such as CKA_ENCRYPT (boolean, true if usable for encryption) and CKA_VERIFY (boolean, true if usable for signature verification). Private key objects feature CKA_DECRYPT and CKA_SIGN for usage, alongside CKA_SENSITIVE and CKA_EXTRACTABLE to control access and export. Secret key objects use CKA_VALUE (byte array holding the key bits) and support symmetric operations via flags like CKA_ENCRYPT, CKA_DECRYPT, CKA_SIGN, and CKA_VERIFY. Certificate objects are defined by attributes such as CKA_CERTIFICATE_TYPE (CK_CERTIFICATE_TYPE, e.g., CKC_X_509 for certificates), CKA_SUBJECT (byte array with DER-encoded subject name), and CKA_VALUE (byte array containing the encoded ). These allow storage of public-key or attribute certificates with like and . During object creation, templates are validated against token policies; for instance, attempting to set an invalid attribute type returns CKR_ATTRIBUTE_TYPE_INVALID, while inconsistent values (e.g., mismatched key type and parameters) yield CKR_TEMPLATE_INCONSISTENT, and read-only attributes like CKA_CLASS cannot be modified post-creation. Copying objects preserves attributes unless explicitly modified in the template, subject to the same policy checks.

API Functions

Session and General Management

The session and general management functions in PKCS #11 provide the foundational for initializing the Cryptoki library, enumerating and querying hardware slots and , establishing and controlling sessions, authenticating users, and supporting asynchronous operations where applicable, as defined in PKCS#11 version 3.1. These functions enable applications to interact with cryptographic in a platform-independent manner, ensuring proper resource allocation and security boundaries before performing higher-level operations. Library initialization begins with C_Initialize, which prepares the Cryptoki library for use by setting up threading models and other runtime parameters via an optional CK_C_INITIALIZE_ARGS structure; this function must be the first called and supports flags like CKF_LIBRARY_CANT_CREATE_OS_THREADS for custom mutex handling. Following initialization, C_GetInfo retrieves essential library details, including the Cryptoki version, manufacturer ID, and flags indicating capabilities such as library threading support. To conclude library usage, C_Finalize terminates all sessions, releases resources, and shuts down the library, ensuring no further function calls occur afterward. Slot and token management functions allow discovery and configuration of physical or cryptographic devices. C_GetSlotList enumerates available , optionally filtering for those containing via the tokenPresent parameter, returning an array of CK_SLOT_ID values up to a specified count. For a specific slot, C_GetTokenInfo queries the inserted 's properties, such as its , , maximum session count, and flags like CKF_RNG for support. Event handling is facilitated by C_WaitForSlotEvent, which polls or blocks for changes like token insertion, using flags such as CKF_DONT_BLOCK for non-blocking behavior and returning the affected slot ID. Token initialization via C_InitToken formats a new or uninitialized , requiring the Security Officer (SO) PIN (CKU_SO user type) to set a new SO PIN and token , effectively erasing existing contents. Sessions represent logical connections to and are managed through handles of type CK_SESSION_HANDLE (as defined in the general data types). C_OpenSession creates a new session for a given , specifying flags like CKF_RW_SESSION for read-write access or CKF_SERIAL_SESSION for serialized operations to prevent parallelism, along with an optional application-defined pointer and notification callback. To end a specific session, C_CloseSession releases its resources and aborts any ongoing operations, while C_CloseAll terminates all sessions for the calling application on a particular . Session status can be queried with C_GetSessionInfo, which returns details like the current state (public, user logged in, or SO logged in), device error code, and active flags. User authentication within sessions is handled by login and PIN management functions, distinguishing between the normal user (CKU_USER) and the Security Officer (CKU_SO). C_Login authenticates a user by providing their PIN in a session, enabling access to protected resources and returning errors like CKR_PIN_INCORRECT if invalid; it requires the session to be in a public state. Conversely, C_Logout revokes authentication, transitioning the session back to public and clearing sensitive credentials. Administrative PIN operations include C_InitPIN, which the SO uses to set the initial user PIN in a read-write session, and C_SetPIN, allowing logged-in users to change their own PIN or the SO to modify the user PIN by supplying the old and new values. Support for parallel or asynchronous operations is provided through monitoring and cancellation functions, though many implementations return CKR_FUNCTION_NOT_PARALLEL if unsupported. C_GetFunctionStatus checks whether an ongoing operation in the session has completed, useful in multi-threaded environments. Similarly, C_CancelFunction attempts to abort a running operation, ensuring graceful interruption where parallelism is enabled. Vendor extensions enhance flexibility in these management areas, particularly through mechanisms like CKM_VENDOR_DEFINED, which reserves mechanism codes starting from 0x80000000 for proprietary implementations of session-related behaviors or interactions, allowing vendors to extend functionality without conflicting with core PKCS #11 definitions.

Cryptographic Operations

PKCS #11 provides a suite of functions for performing cryptographic operations on , enabling secure , data transformation, and within a session, as defined in PKCS#11 version 3.1. These operations are designed to interact with cryptographic objects such as keys and certificates, leveraging specified to ensure portability across modules (HSMs) and software . All operations require an active session, as established through prior initialization functions. Object management functions allow creation, modification, duplication, and deletion of cryptographic objects. The C_CreateObject function creates a new object on a or in a session using an attribute that specifies properties like , key type, and ; it requires a valid session handle and returns an object handle upon success, failing with errors such as CKR_TEMPLATE_INCONSISTENT if attributes are invalid or incomplete. The C_CopyObject function duplicates an existing object, applying a to modify attributes like CKA_TOKEN or CKA_PRIVATE, but only if the original object's CKA_COPYABLE attribute is true; it produces a new object handle while preserving sensitive attributes unless overridden. To delete an object, C_DestroyObject removes it from the , succeeding only if the object's CKA_DESTROYABLE attribute permits it and the session has appropriate rights. Attribute inspection and updates are handled by C_GetAttributeValue and C_SetAttributeValue, which query or modify object properties via a ; the former returns lengths or values (or CK_UNAVAILABLE_INFORMATION for sensitive attributes), while the latter fails on read-only attributes like CKA_VALUE for secret s, supporting partial updates for large attributes by first querying lengths. Searching for objects uses a three-step process to efficiently locate matching items without enumerating all token contents. C_FindObjectsInit initializes the search with an attribute defining criteria, such as CKA_CLASS for keys or CKA_ID for identification, excluding hardware feature objects unless specified. C_FindObjects then retrieves up to a specified maximum number of matching object handles into an array, returning the actual count and continuing from the previous state until no more objects are found. The search is terminated by C_FindObjectsFinal, which releases resources and must be called to avoid resource leaks, failing if no operation was initialized. Key generation and wrapping functions support secure creation and transport of cryptographic keys. C_GenerateKey produces a symmetric secret using a specified (e.g., for ) and , returning a handle for the new key object with attributes like CKA_VALUE_LEN. For asymmetric , C_GenerateKeyPair generates a public-private key pair via a like , using separate for each key's attributes (e.g., modulus size for public, private exponent for private), and returns handles for both. Key wrapping secures export with C_WrapKey, which encrypts a target key using a wrapping key and , outputting the wrapped data or its length in a single-part . Conversely, C_UnwrapKey decrypts wrapped key data with an unwrapping key, creating a new key object from a that defines its properties. Encryption and decryption operations follow a similar pattern, supporting both single-part and multi-part processing for efficiency with large inputs. C_EncryptInit prepares a session for by specifying a and key handle, binding the operation to that . For single-part , C_Encrypt processes the entire , returning the encrypted output or its . Multi-part uses C_EncryptUpdate to encrypt sequential chunks, accumulating state, followed by C_EncryptFinal to produce any final output (e.g., ) and complete the operation. Decryption mirrors this with C_DecryptInit, C_Decrypt, C_DecryptUpdate, and C_DecryptFinal, verifying and recovering while handling errors like invalid . Signing and verification functions enable digital signatures for and . C_SignInit initializes signing with a and private key handle, preparing the session for . C_Sign generates a for single-part data, while multi-part uses C_SignUpdate and C_SignFinal for streaming. Verification begins with C_VerifyInit using a public key, followed by C_Verify for single-part checks (returning CKR_SIGNATURE_INVALID on failure) or C_VerifyUpdate/C_VerifyFinal for multi-part. Hashing and provide foundational primitives. C_DigestInit sets up a hash operation with a (e.g., SHA-256), and C_Digest computes the digest for single-part data, with multi-part options via C_DigestUpdate and C_DigestFinal for incremental processing. Randomness is managed by C_SeedRandom, which seeds the token's RNG with provided , and C_GenerateRandom, which produces cryptographically secure random bytes up to a specified length, essential for nonces and keys. Introduced in version 3.0, the message interface enhances streaming operations for , decryption, signing, and more, allowing finer control over partial processing without full multi-part commitment. C_MessageEncryptInit initializes message-based with a mechanism and key, enabling subsequent calls. C_MessageEncrypt encrypts single-part messages, while C_MessageEncryptUpdate handles partial data and C_MessageEncryptFinal completes the stream, supporting use cases like network protocols with variable-length payloads. Similar functions exist for decryption (C_MessageDecrypt*), signing (C_MessageSign*), and verification (C_MessageVerify*), providing a unified streaming model.

Mechanisms

Mechanism Framework

In PKCS #11, the mechanism framework provides a standardized way to specify and invoke cryptographic algorithms through the Cryptoki interface, allowing tokens to support a variety of operations while maintaining portability across implementations. A mechanism is defined by the CK_MECHANISM structure, which includes a mechanism type identifier (from the CKM_* constants), a pointer to algorithm-specific parameters (pParameter), and the length of those parameters in bytes (ulParameterLen). For example, the basic RSA PKCS #1 v1.5 mechanism (CKM_RSA_PKCS) typically requires no parameters, so pParameter is set to NULL and ulParameterLen to 0. In contrast, the AES CBC mode (CKM_AES_CBC) uses a CK_AES_CBC_PARAMS structure containing an initialization vector (IV) as a byte pointer and its length. Similarly, the ECDH key derivation mechanism (CKM_ECDH1_DERIVE) employs a CK_ECDH1_DERIVE_PARAMS structure that includes the peer's public value (as a byte array and length), an optional ephemeral public key handle, and key derivation function details. The framework enables mechanisms to declare support for specific cryptographic operations, such as , decryption, signing, , and key derivation, through flags in the CK_MECHANISM_INFO . These flags include CKF_ENCRYPT for encryption capability, CKF_SIGN for signing, CKF_VERIFY for , and CKF_DERIVE for key derivation, among others like CKF_HW indicating . Mechanism policies are token-specific and can be queried using the C_GetMechanismInfo , which returns the CK_MECHANISM_INFO for a given slot and type, including minimum and maximum key sizes (ulMinKeySize and ulMaxKeySize) as well as supported flags such as CKG_MGF1 for mask generation functions in certain padding schemes. This allows applications to discover and select appropriate s dynamically. For handling large or streaming data, the framework supports multi-part operations following an initialize-update-finalize pattern, applicable to mechanisms that set relevant flags like CKF_SIGN or CKF_ENCRYPT. These operations begin with an initialization call (e.g., C_EncryptInit), process data in chunks via update functions (e.g., C_EncryptUpdate), and conclude with a finalization step (e.g., C_EncryptFinal), enabling efficient processing without loading entire datasets into memory. In version 3.1 of the specification, the framework is extended with message-based mechanisms to support more flexible cryptographic processing, including new operations like C_MessageEncryptInit and dedicated flags such as CKF_MESSAGE_ENCRYPT, alongside additions like the CKM_SHA256_KDF for SHA-256-based key derivation. These enhancements build on the core structure while integrating with functions like C_EncryptInit for traditional use cases, as detailed in the cryptographic operations section.

Supported Algorithms

PKCS #11 supports a wide range of cryptographic algorithms through its mechanism framework, which defines standardized identifiers (CKM_ constants) for operations such as encryption, signing, and key derivation. These mechanisms are implemented by tokens and can be queried to determine token-specific support. For public-key cryptography, PKCS #11 includes RSA mechanisms such as CKM_RSA_PKCS for basic padding and CKM_RSA_PKCS_OAEP for optimal asymmetric encryption padding, often combined with hash functions like SHA-256. DSA is supported via CKM_DSA for signature generation and verification, while ECDSA uses CKM_ECDSA with elliptic curve parameters specified through the CKA_EC_PARAMS attribute to support various NIST and other curves. Symmetric algorithms encompass in modes including CKM_AES_ECB, CKM_AES_CBC, and CKM_AES_GCM, with key lengths from 128 to 256 bits. Legacy support includes and via CKM_DES_CBC and CKM_DES3_CBC, and through mechanisms like CKM_CAMELLIA_CBC. Hashing mechanisms cover the SHA family, including CKM_SHA_1 (legacy), CKM_SHA256, and variants like CKM_SHA3_256, alongside (CKM_MD5, deprecated in modern use) and BLAKE2b (CKM_BLAKE2B). Message authentication codes (MACs) are provided by mechanisms such as CKM_SHA256_HMAC and CMAC for via CKM_AES_CMAC. Key derivation functions include CKM_CONCATENATE_BASE_AND_KEY for protocols like TLS, ECDH derivation with CKM_ECDH1_DERIVE, and through CKM_PKCS5_PBKD2. Specific to signing and verification, RSA-PSS padding is available via CKM_RSA_PKCS_PSS, and recoverable signatures are supported in mechanisms like CKM_RSA_PKCS for certain operations. Version 3.1 introduces post-quantum support with the HSS mechanism (CKM_HSS) for hash-based signatures, enhancing resistance to quantum attacks. Token support for these mechanisms is determined using functions like C_GetMechanismList to retrieve the list of supported CKM_ types and C_GetMechanismInfo to query flags such as encrypt, , or derive capabilities.

Usage and Integration

Common Applications

PKCS #11 is widely employed in (PKI) systems for secure key storage and generation, particularly for certificate authorities (CAs) that manage certificates. It enables the creation of private keys within protected environments and their use in signing operations, such as generating certificates via integration with tools like . For instance, PKCS #11 modules allow to offload key generation and signing to hardware tokens, ensuring that sensitive CA keys remain unexportable and protected from extraction. In (HSM) integrations, PKCS #11 facilitates secure key operations in cloud environments, such as AWS CloudHSM, where it provides a standardized interface for , decryption, and signing without exposing keys outside the HSM. This is particularly critical in banking applications for transaction signing, as demonstrated in the instant payment system (Pix), where AWS CloudHSM clusters handle high-throughput signatures for secure transmissions, supporting up to 1100 transactions per second per HSM to meet regulatory compliance like PCI DSS. PKCS #11 supports smart card-based authentication in web browsers, notably through the Network Security Services (NSS) library in , which loads PKCS #11 modules to access certificates and keys stored on smart cards for user authentication. Devices like YubiKeys, configured in mode, leverage this interface for secure logon, prompting for PIN entry during TLS client authentication sessions. Additionally, TPMs and HSMs expose PKCS #11 interfaces for FIDO2 and protocols, enabling hardware-bound key operations for in web applications. Software emulations of PKCS #11 tokens, such as SoftHSM, provide a file-based implementation for testing and development purposes, allowing developers to simulate HSM behavior without hardware. These tools support key generation, storage, and cryptographic operations in non-production environments, facilitating for applications that rely on the PKCS #11 . SoftHSM is commonly used in scenarios like Fabric setups to validate PKCS #11-compliant workflows before deploying to physical tokens. Practical examples of PKCS #11 deployment include VPN endpoint authentication, where clients like use PKCS #11 URIs to access certificates for mutual TLS authentication during connection establishment. It also underpins processes, such as with jarsigner, by interfacing with HSMs to sign executables while keeping private keys secure. In secure boot mechanisms, PKCS #11 tokens store root keys for verifying integrity during initialization. Furthermore, the session features of PKCS #11 enable multi-application sharing of a single token, allowing concurrent read/write access to objects across processes without key duplication. For performance-critical scenarios, PKCS #11 enables in high-volume operations like TLS handshakes, offloading or ECDSA computations to HSMs integrated with web servers such as via mod_ssl. This integration reduces CPU load on the host system, achieving significant throughput gains. The API's ensures efficient wrapping and unwrapping during handshakes, minimizing in cloud-based deployments.

Software and Hardware Implementations

PKCS#11 implementations span a range of software libraries and devices, enabling applications to interact with cryptographic tokens in a standardized manner. Software solutions often serve as or emulators for testing and , while implementations provide secure key storage and operations in dedicated modules. OpenSC is an open-source library that implements the PKCS#11 interface primarily for smart cards and similar removable cryptographic devices, facilitating access to certificates, keys, and signing operations across platforms like , Windows, and macOS. It supports a wide array of card types through drivers and includes utilities for managing token objects. SoftHSM, developed under the OpenDNSSEC project, offers a software-based PKCS#11 token that emulates a (HSM) by storing keys and objects in encrypted files on disk, making it suitable for environments without physical . This implementation supports , , and signing mechanisms, with SoftHSM v2 compliant with PKCS#11 v2.40. PKCS#11 , such as those integrated in remote HSM setups, enable applications to access distant tokens over networks by tunneling calls, addressing scenarios where physical proximity to the HSM is impractical. (Note: proxy example from p11-kit discussions) Language bindings extend PKCS#11 accessibility beyond C APIs. The SunPKCS11 provider in the Java Runtime Environment (JRE) allows applications to load PKCS#11 modules as security providers, enabling seamless integration for tasks like keystore management and cryptographic operations via the (JCA). In Python, the python-pkcs11 library provides high-level, object-oriented wrappers around the native PKCS#11 API, supporting session management, object manipulation, and mechanism invocation while handling data type conversions to Pythonic formats. For .NET environments, developers typically use P/Invoke to directly call the PKCS#11 DLL from C# or other managed languages, requiring manual marshaling of structures like CK_ATTRIBUTE for cross-platform compatibility. Hardware implementations embed PKCS#11 support in secure processors to protect sensitive operations. Thales (formerly nCipher) HSMs provide full PKCS#11 v2.40 compliance through their SDK, supporting high-performance , , and multi-tenancy in network-attached or PCIe form factors. Yubico's YubiHSM 2 and related smart cards implement PKCS#11 for portable and signing, with the yubihsm_pkcs11 library enabling access to tamper-resistant Level 3 validated hardware. Cloud-based options include AWS CloudHSM, which offers a PKCS#11 library in its Client SDK 5 for single-tenant HSM clusters supporting mechanisms like and , and Managed HSM, compliant with PKCS#11 v2.40 via a TLS offload library for key protection in virtualized environments. Cryptographic providers bridge PKCS#11 to broader ecosystems. Mozilla's Network Security Services (NSS) library natively uses PKCS#11 modules for token access, powering browser and handling in . OpenSSL integrates PKCS#11 via the engine_pkcs11 plugin, which loads external tokens for operations like private key signing without exposing keys to the host application. On Windows, the (CNG) can interface with PKCS#11 through bridges like the Microsoft CAPI-to-PKCS#11 adapter, allowing legacy applications to leverage modern tokens. Testing and validation tools ensure implementation reliability. The OASIS PKCS#11 Technical Committee provides a conformance test suite for version 3.1, consisting of automated scripts to verify API functions, mechanisms, and error handling against the specification. OpenSC's pkcs11-tool utility offers practical testing capabilities, including slot enumeration, object listing, key generation, and mechanism tests via command-line options like --test for basic validation. A notable challenge in PKCS#11 development is handling vendor-specific extensions, such as IBM's CKM_IBM_* mechanisms for proprietary algorithms, which often necessitate conditional compilation directives (e.g., #ifdefs) in portable code to avoid compilation errors or runtime incompatibilities across providers. This fragmentation requires careful abstraction in multi-vendor environments to maintain standards compliance.

Standards and Relationships

Conformance Requirements

Conformance to the PKCS #11 standard ensures interoperability and security in cryptographic token interfaces, with requirements defined for both consumer applications and provider libraries or tokens. Consumer conformance mandates that applications handle standard functions, return values, and error codes appropriately, while gracefully managing optional mechanisms and unsupported features by checking return codes such as CKR_FUNCTION_NOT_SUPPORTED or CKR_MECHANISM_INVALID. Providers, including libraries and tokens, must implement all mandatory functions, such as C_Initialize for library initialization and C_GetMechanismList to declare supported mechanisms, along with stubs returning appropriate errors for any unsupported mandatory elements. Conformance levels are structured around profiles outlined in the PKCS #11 Profiles specification, including a base level covering core functions, data types, and attributes; mechanism levels distinguishing current and historical algorithms; and specialized profiles for environments like or in version 3.1, such as the Baseline Provider (requiring basic functions like C_GetFunctionList) and Complete Provider (adding full cryptographic operations). An implementation is conformant if it meets all conditions in at least one , with unless specified otherwise. Validation of conformance involves testing against OASIS-provided XML test cases for version 3.1, which cover mandatory scenarios like object creation, session management, and multi-threaded access, as well as optional ones for extended features. For validated modules implementing PKCS #11, a subset of the interface is tested to ensure approved cryptographic algorithms and security services align with NIST requirements, including self-tests and without compromising non-approved functions. Security requirements emphasize protection of sensitive data, such as requiring to prevent revelation of attributes when the is set to CK_TRUE, and secure PIN handling via functions like C_SetPIN with support for protected paths. Implementations must issue warnings or restrictions on extractable keys to mitigate risks of key exposure outside the . Reporting obligations include populating the CK_INFO structure with the Cryptoki version, manufacturer details, and library version upon C_GetInfo calls, ensuring vendor-defined extensions or mechanisms are prefixed to avoid conflicts, such as using vendor-specific OIDs. Error conditions must be reported via standardized return codes, like CKR_OK for success or for authentication failures.

Relations to Other Standards

PKCS #11 serves as a foundational API within the broader Public-Key Cryptography Standards (PKCS) family, building upon several related specifications for cryptographic primitives and data formats. It incorporates RSA encryption and signature mechanisms defined in PKCS #1, enabling support for asymmetric operations like key generation and signing using RSA algorithms. Similarly, PKCS #7's Cryptographic Message Syntax (CMS) is referenced for attributes such as issuer and serial number in certificate objects, facilitating compatibility in message signing and verification workflows. PKCS #12 provides the structure for personal information exchange, including key stores that PKCS #11 can interact with for exporting or importing protected objects like private keys and certificates. In contrast, PKCS #15 focuses on the logical content structure of smart cards and cryptographic tokens, defining object formats and file systems, whereas PKCS #11 emphasizes the programmatic interface for accessing those contents without prescribing the underlying storage layout. The (KMIP), developed by , complements PKCS #11 by offering a network-based for remote key management, often encapsulating PKCS #11 function calls to enable distributed operations on hardware security modules (HSMs). KMIP profiles explicitly map PKCS #11 operations, such as initialization, , and attribute retrieval, into KMIP messages, allowing client applications to perform token-like interactions over a without direct local access. This integration supports scenarios where HSMs expose PKCS #11 interfaces remotely via KMIP servers, enhancing scalability in enterprise environments. PKCS #11 interfaces with platform-specific cryptographic APIs through bridges and providers. On Windows, Cryptography API (CAPI) and its successor, Cryptography API: Next Generation (CNG), provide native key storage and operations but rely on third-party providers to interface with PKCS #11-compliant tokens, such as HSMs or smart cards; for instance, OpenSC implements a CNG key storage provider that translates PKCS #11 calls for use in Windows applications. In Java environments, the Cryptography (JCA) integrates PKCS #11 via the SunPKCS11 provider, which allows applications to access tokens using standard JCA/JCE APIs for tasks like and signing, treating the token as a keystore without loading sensitive keys into JVM memory. Alignment with IETF and NIST standards ensures PKCS #11's relevance in standardized environments. RFC 7512 defines the PKCS #11 URI scheme (pkcs11://), which identifies objects, tokens, slots, and libraries using attribute-value pairs (e.g., pkcs11:object=label;type=private;id=%01), promoting by enabling uniform referencing across systems and applications like or . For algorithm transitions, PKCS #11 adheres to NIST SP 800-131A recommendations by supporting approved key lengths and phasing out deprecated mechanisms, such as single-DES, through its extensible mechanism framework that references FIPS 186-4 for digital signatures. Evolutions in PKCS #11 reflect influences from hardware security standards and emerging threats. It provides a basis for interfaces in Trusted Platform Module (TPM) 2.0 implementations, where libraries like tpm2-pkcs11 expose TPM functionality as a PKCS #11 token, allowing applications to perform operations like key attestation without native TPM API knowledge. For post-quantum cryptography, PKCS #11 v3.1 (OASIS Standard, July 2023) introduces initial support for algorithms like LMS/HSS, with ongoing efforts to harmonize with NIST's post-quantum standards (e.g., FIPS 203 for ML-KEM, FIPS 204 for ML-DSA, FIPS 205 for SLH-DSA) through mechanisms incorporated in the draft v3.2 specification (Committee Specification Draft 01, April 2025) to ensure future-proof token support. Interoperability is further enhanced by the PKCS #11 URI scheme, which facilitates cross-system references to objects (e.g., pkcs11:token=HSM1;object=private-key;id=01), enabling seamless integration in protocols like TLS or SSH without exposing underlying details.

References

  1. [1]
    PKCS #11 Specification Version 3.1
    Summary of each segment:
  2. [2]
    An Introduction to PKCS#11 - Thales Docs
    PKCS#11 defines the interface between an application and a cryptographic device. This chapter gives a general outline of PKCS#11 and some of its basic concepts.
  3. [3]
    PKCS#11: Cryptographic Token Interface Standard
    The RSA PKCS#11 development process did not officially move this standard beyond draft despite the 30 day public final draft review ending 28-Oct-2009. Many ...
  4. [4]
    OASIS PKCS 11 TC
    The latest documents for PKCS #11 V2.40 are official OASIS standards as of April 2015. This standard builds on the foundation of PKCS #11 V2.30, and is ...Announcements · Overview · Technical Work Produced by...
  5. [5]
    Introducing PKCS #11 and openCryptoki - IBM
    This document describes the use of openCryptoki, which is an open source implementation of a C/C++ API standard defined by PKCS #11, called Cryptoki.<|control11|><|separator|>
  6. [6]
    Cryptographic Algorithm Validation Program | CSRC
    The PKCS #11, is used as the interface to hardware-based cryptographic modules. Version. 1.0. Type. SOFTWARE. Vendor. Entrust Datacard Corporation Two Lincoln ...
  7. [7]
    PKCS #11 Specification Version 3.1 - Index of / - OASIS Open
    This document describes the basic PKCS#11 token interface and token behavior. The PKCS#11 standard specifies an application programming interface (API) ...
  8. [8]
    [PDF] FIPS 140-2 Non-Proprietary Security Policy
    May 10, 2019 · Most PKCS #11 functions, including all the functions that output data via the data output interface, check the sftk_fatalError state.
  9. [9]
    What are Public-Key Cryptography Standards (PKCS)? - TechTarget
    Jan 11, 2022 · To provide PKCS users with more flexibility, PKCS developers have left some open issues across several standards. PKCS Standards, Open Issues ...
  10. [10]
    [PDF] PKCS#11 Goes to 3.0!!! ICMC17
    May 18, 2017 · • March 2013: PKCS#11 standard moved to OASIS. • May 2016: PKCS#11 2.40 Errata 01 published. PKCS#11: A Brief History. Page 6. 6. • Well, lots ...
  11. [11]
    [PDF] PKCS #11: Cryptographic Token Interface Standard - Cryptsoft
    Apr 28, 1995 · PKCS is offered by RSA Laboratories to developers of computer systems employing public-key technology. It is RSA Laboratories' intention to ...
  12. [12]
    PKCS 11 - Wikipedia
    PKCS #11 is a Public-Key Cryptography Standard that defines a C programming interface to create and manipulate cryptographic tokens that may contain secret ...
  13. [13]
    [PDF] PKCS #11 v2.20: Cryptographic Token Interface Standard - Cryptsoft
    Apr 12, 2016 · License to copy this document is granted provided that it is identified as “RSA Security Inc. Public-Key Cryptography Standards (PKCS)” in all ...
  14. [14]
    PKCS#11 Cryptographic Token Interface Base Specification OASIS ...
    This document defines data types, functions and other basic components of the PKCS #11 Cryptoki interface.
  15. [15]
    On the Security of PKCS #11 - SpringerLink
    RSA Security Inc. PKCS #11: Cryptographic Token Interface Standard. An RSA Laboratories Technical Note, Version 2.01, December 22 (1997). Google Scholar.
  16. [16]
    Public-Key Cryptography Standard (PKCS) #11 v 3.0 has ... - Red Hat
    Dec 9, 2020 · OASIS has announced that its members have approved Version 3.0 of the Public-Key Cryptography Standard (PKCS) #11.<|control11|><|separator|>
  17. [17]
    Four PKCS #11 OASIS Standards published
    Jul 22, 2020 · These PKCS #11 specifications define a platform-independent API to cryptographic tokens, such as hardware security modules and smart cards. The ...
  18. [18]
    [PDF] pkcs11-spec-v3.1-os.pdf - PKCS #11 Specification Version 3.1
    Jul 23, 2023 · This document defines data types, functions and other basic components of the PKCS #11 Cryptoki interface. Page 2. pkcs11-spec-v3.1-os. 23 July ...
  19. [19]
  20. [20]
  21. [21]
  22. [22]
  23. [23]
  24. [24]
  25. [25]
  26. [26]
  27. [27]
  28. [28]
    PKCS #11 Cryptographic Token Interface Base Specification ...
    This document defines data types, functions and other basic components of the PKCS #11 Cryptoki interface.
  29. [29]
  30. [30]
    PKCS #11 Specification Version 3.2 - Index of / - OASIS Open
    This document describes the basic PKCS #11 token interface and token behavior. The PKCS #11 standard specifies an application programming interface (API), ...Object types. 34 · Function types. 40 · Public key objects. 67 · Private key objects. 68
  31. [31]
  32. [32]
  33. [33]
  34. [34]
  35. [35]
  36. [36]
  37. [37]
  38. [38]
  39. [39]
  40. [40]
    Key Management via PKCS#11 - Securosys Docs
    Oct 15, 2025 · This tutorial shows how to do basic key management (listing keys, generating keys, creating certificates) with PKCS#11 command line tools, ...
  41. [41]
    Using pkcs11 tool and OpenSSL - GitHub
    May 3, 2024 · Using pkcs11-tool and OpenSSL · Functionality of card · Reading objects from card · Generate keys · Sign/Verify using private key/certificate · RSA- ...
  42. [42]
    Sign software artifacts with OpenSSL using PKCS11 library
    Follow these instructions to sign directly using OpenSSL and securely reference your private key stored in Software Trust Manager via our PKCS11 library.
  43. [43]
    PKCS #11 library for AWS CloudHSM Client SDK 5
    PKCS #11 is a standard for performing cryptographic operations on hardware security modules (HSMs). AWS CloudHSM offers implementations of the PKCS #11 library.Missing: banking transaction
  44. [44]
    Supporting digital signature and secure message transmissions for ...
    Jul 27, 2020 · Each HSM supports 1100 TPS(transactions per second), and it is possible to add 28 HSMs in the same AWS CloudHSM cluster. To have scalability, ...
  45. [45]
    PKCS11 FAQ — Firefox Source Docs documentation - NSS-Crypto.org
    Multipart functions, such as bulk encryption, hashing, and mac functions (for example, C_Digest and C_Sign) and those that require overlapped operation ( ...
  46. [46]
    Enabling Smart Card in Firefox on Windows - Yubico Support
    Apr 14, 2021 · This article covers configuring Firefox on Windows for use with the YubiKey's PIV smart card application.Missing: NSS TPM
  47. [47]
    Smart Card Logon for Firefox Browser - IDManagement.gov
    This guide will help you configure Firefox by using an open source software package. In addition to open source solutions, commercial software may be used.Missing: NSS TPM
  48. [48]
    PKCS#11 hardware security module | PingDS - Ping Identity Docs
    The examples on this page use a SoftHSM PKCS#11 software device for evaluation, development, and testing. The command to configure the SoftHSM build in this ...
  49. [49]
    softhsm/SoftHSMv2: SoftHSM version 2 - GitHub
    SoftHSM is designed to meet the requirements of OpenDNSSEC, but can also work together with other cryptographic products because of the PKCS#11 interface.
  50. [50]
    Testing for Hardware Security Module via PKCS#11 interface
    This tutorial illustrates the different ways of installing, configuring and testing the Hardware Security Module SoftHSM via PKCS#11 interface with a ...Missing: development | Show results with:development
  51. [51]
    Smart Card / PKCS#11 support - OpenConnect VPN client.
    In order to use a certificate or key with OpenConnect, you must provide a PKCS#11 URI which identifies it sufficiently. That can be as simple as the following ...Missing: boot multi- app sessions<|separator|>
  52. [52]
    Perform Signing with Jarsigner and PKCS#11 Library
    Mar 12, 2025 · Encryption Consulting's PKCS#11 library offers a powerful solution for performing code signing with Jarsigner across multiple operating systems.Missing: VPN boot sessions
  53. [53]
    14.3.6. Signing an SSH Certificate Using a PKCS#11 Token
    It is possible to sign a host key using a CA key stored in a PKCS#11 token by providing the token library using the -D and identifying the CA key.
  54. [54]
    Applied PKCS #11 - python-pkcs11 - Read the Docs
    PKCS #11 is the name given to a standard defining an API for cryptographic hardware. While it was developed by RSA, as part of a suite of standards.
  55. [55]
    [PDF] Apache HTTP Server: nShield® HSM Integration Guide - PKCS #11
    Nov 4, 2020 · This guide describes integrating an nShield HSM with Apache HTTP Server using PKCS #11, storing the SSL key in the HSM, and using mod_ssl.
  56. [56]
    [PDF] Performance Characteristics of Application-level Security Protocols
    5.3 Encryption Hardware Performance. PKCS #11 is the standard interface for crypto hardware devices, supported by virtually all encryption hardware from.
  57. [57]
    Supported mechanisms for the PKCS #11 library for AWS ...
    AWS CloudHSM Client SDK 3 supports PKCS #11 mechanisms for encryption, signing, hashing, key derivation, and key wrapping. November 8, 2025.
  58. [58]
    5 PKCS#11 Reference Guide - Java - Oracle Help Center
    This document describes how native PKCS#11 tokens can be configured into the Java platform for use by Java applications.Missing: multi- introduction
  59. [59]
    Azure Managed HSM TLS Offload Library - Microsoft Learn
    Apr 14, 2025 · Azure Managed HSM offers a TLS Offload library, which is compliant with PKCS#11 version 2.40. Azure Managed HSM doesn't support all ...Missing: hardware Thales nCipher Yubico AWS
  60. [60]
    None
    ### Summary of PKCS #11 Profiles v3.1 (OASIS Standard, 23 July 2023)
  61. [61]
    None
    Below is a merged summary of PKCS #11 mentions and related requirements in the FIPS 140-3 Implementation Guidance (IG), consolidating all information from the provided segments into a dense, structured format. To maximize detail retention, I’ve used a table in CSV format for key sections, supplemented by narrative text where appropriate. The response retains all mentions, requirements, processes, and security considerations, organized for clarity and completeness.
  62. [62]
  63. [63]
    Key Management Interoperability Protocol Profiles Version 2.1
    The PKCS profile specifies the use of KMIP to encapsulate PKCS#11 calls. 5.18.1 PKCS#11 Encoding. PKCS#11 function calls are mapped into a KMIP PKCS#11 ...
  64. [64]
    5 PKCS#11 Reference Guide - Java - Oracle Help Center
    Java applications can use the existing JCA and JCE APIs to access PKCS#11 tokens through the SunPKCS11 provider. Token Login. You can login to the keystore ...
  65. [65]
    Example to use OpenSC with Microsoft CNG and CryptoAPI - GitHub
    May 3, 2024 · Open source smart card tools and middleware. PKCS#11/MiniDriver/Tokend - Example to use OpenSC with Microsoft CNG and CryptoAPI ...
  66. [66]
    RFC 7512: The PKCS #11 URI Scheme
    The URI scheme is based on how PKCS #11 objects, tokens, slots, and libraries are identified in "PKCS #11 v2.20: Cryptographic Token Interface Standard".
  67. [67]
    SP 800-131A Rev. 1, Transitions: Recommendation for Transitioning ...
    This Recommendation (SP 800-131A) provides more specific guidance for transitions to the use of stronger cryptographic keys and more robust algorithms.Missing: PKCS | Show results with:PKCS
  68. [68]
    tpm2-software/tpm2-pkcs11: A PKCS#11 interface for TPM2 hardware
    PKCS #11 is a Public-Key Cryptography Standard that defines a standard method to access cryptographic services from tokens/ devices.
  69. [69]
    Post Quantum Signatures - comments | OASIS PKCS 11 TC
    These all use the wording as described initially in [NIST SP-800-5x] . If we are going to document these pre-hash variants (which I m fine with or without them ...