PKCS11-TOOL(1)

okay bestie, welcome to pkcs11-tool(1) from OpenSC Tools. She's literally the utility for managing and using PKCS #11 security tokens, and she's about to spill every single flag. No cap, we're keeping all the details. ๐Ÿ’…


โœจ NAME โœจ

pkcs11-tool โ€” utility for managing and using PKCS #11 security tokens. That's the name, that's the whole vibe, periodt. ๐Ÿ’–

๐ŸŒธ SYNOPSIS ๐ŸŒธ

pkcs11-tool [OPTIONS]

She takes options. That's it. Simple. Elegant. Ate. โœจ

๐Ÿ’– DESCRIPTION ๐Ÿ’–

The pkcs11-tool utility is used to manage the data objects on smart cards and similar PKCS #11 security tokens. Users can list and read PINs, keys and certificates stored on the token. User PIN authentication is performed for those operations that require it.

So yes bestie, she's your token bestie: list stuff, read stuff, and do the PIN auth when the operation needs it. Slay. ๐Ÿ‘‘

๐Ÿ‘‘ OPTIONS ๐Ÿ‘‘

  • --attr-from filename โ€” Extract information from filename (DER-encoded certificate file) and create the corresponding attributes when writing an object to the token. Example: the certificate subject name is used to create the CKA_SUBJECT attribute. ๐Ÿ’–
  • --change-pin, -c โ€” Change the user PIN on the token. ๐Ÿ”‘
  • --unlock-pin โ€” Unlock User PIN (without --login unlock in logged in session; otherwise --login-type has to be 'context-specific'). ๐Ÿ”“
  • --hash, -h โ€” Hash some data. ๐ŸŒธ
  • --hash-algorithm mechanism โ€” Specify hash algorithm used with RSA-PKCS-PSS signature or RSA-OAEP decryption. Allowed values are "SHA-1", "SHA256", "SHA384", "SHA512", and some tokens may also allow "SHA224". Default is "SHA-1".
    • Note that the input to RSA-PKCS-PSS has to be of the size equal to the specified hash algorithm. E.g., for SHA256 the signature input must be exactly 32 bytes long (for mechanisms SHA256-RSA-PKCS-PSS there is no such restriction). For RSA-OAEP, the plaintext input size mLen must be at most keyLen - 2 - 2*hashLen. For example, for RSA 3072-bit key and SHA384, the longest plaintext to encrypt with RSA-OAEP is (with all sizes in bytes): 384 - 2 - 2*48 = 286, aka 286 bytes. ๐Ÿ˜ญ
  • --id id, -d id โ€” Specify the id of the object to operate on. ๐Ÿ†”
  • --init-pin โ€” Initializes the user PIN. This option differs from --change-pin in that it sets the user PIN for the first time. Once set, the user PIN can be changed using --change-pin. โœจ
  • --init-token โ€” Initialize a token: set the token label as well as a Security Officer PIN (the label must be specified using --label). ๐Ÿ”
  • --input-file filename, -i filename โ€” Specify the path to a file for input. ๐Ÿ“‚
  • --keypairgen, -k โ€” Generate a new key pair (public and private pair.) ๐Ÿ”‘๐Ÿ”‘
  • --keygen โ€” Generate a new key. ๐Ÿ—๏ธ
  • --key-type specification โ€” Specify the type and (not always compulsory) flavour (byte-wise symmetric key length, bit-wise asymmetric key length, elliptic curve identifier, etc.) of the key to create, for example RSA:2048, EC:prime256v1, EC:ED25519, EC:X448, GOSTR3410-2012-256:B, DES:8, DES3:24, AES:16, AES:, CHACHA20, POLY1305 or GENERIC:64. If the key type was incompletely specified, possible values are listed. ๐Ÿ”ฅ
  • --usage-sign โ€” Specify 'sign' key usage flag (sets SIGN in privkey, sets VERIFY in pubkey). โœ๏ธ
  • --usage-decrypt โ€” Specify 'decrypt' key usage flag.
    • For RSA keys, sets DECRYPT in privkey and ENCRYPT in pubkey. For secret keys, sets both DECRYPT and ENCRYPT. ๐Ÿ”“
  • --usage-derive โ€” Specify 'derive' key usage flag (EC only). ๐ŸŒฑ
  • --usage-wrap โ€” Specify 'wrap' key usage flag. ๐ŸŽ
  • --usage-encapsulate โ€” Specify 'encapsulate' key usage flag (sets DECAPSULATE in privkey, sets ENCAPSULATE in pubkey). ๐Ÿ“ฆ
  • --label name, -a name โ€” Specify the name of the object to operate on (or the token label when --init-token is used). ๐Ÿท๏ธ
  • --list-mechanisms, -M โ€” Display a list of mechanisms supported by the token. โš™๏ธ
  • --list-objects, -O โ€” Display a list of objects.
    • The options --keytype, --label, --id or --application-id can be used to filter the listed objects. ๐Ÿ“‹
  • --list-slots, -L โ€” Display a list of available slots on the token. ๐ŸŽฐ
  • --list-token-slots, -T โ€” List slots with tokens. ๐Ÿช™
  • --list-interfaces โ€” List interfaces of PKCS #11 3.0 library. ๐Ÿ”Œ
  • --session-rw, โ€” Forces to open the PKCS#11 session with CKF_RW_SESSION. โœ๏ธ
  • --login, -l โ€” Authenticate to the token before performing other operations. This option is not needed if a PIN is provided on the command line. ๐Ÿ”‘
  • --login-type โ€” Specify login type ('so', 'user', 'context-specific'; default:'user'). ๐Ÿ‘ค
  • --mechanism mechanism, -m mechanism โ€” Use the specified mechanism for token operations. See -M for a list of mechanisms supported by your token. The mechanism can also be specified in hexadecimal, e.g., 0x80001234. ๐Ÿ”ง
  • --mgf function โ€” Use the specified Message Generation Function (MGF) function for RSA-PKCS-PSS signatures or RSA-OAEP decryptions. Supported arguments are MGF1-SHA1 to MGF1-SHA512 if supported by the driver. The default is based on the hash selection. ๐ŸŒˆ
  • --module mod โ€” Specify a PKCS#11 module (or library) to load. ๐Ÿ“ฆ
  • --moz-cert filename, -z filename โ€” Test a Mozilla-like key pair generation and certificate request. Specify the filename to the certificate file. ๐ŸฆŠ
  • --output-file filename, -o filename โ€” Specify the path to a file for output. ๐Ÿ“ค
  • --pin pin, -p pin โ€” Use the given pin for token operations. If set to env:VARIABLE, the value of the environment variable VARIABLE is used. WARNING: Be careful using this option as other users may be able to read the command line from the system or if it is embedded in a script. If set to env:VARIABLE, the value of the environment variable VARIABLE is used.
    • This option will also set the --login option. ๐Ÿซฃ
  • --public-key-info โ€” Read public key from the module using "CKA_PUBLIC_KEY_INFO" (use with --read-object --type public). The output is a "SubjectPublicKeyInfo" i.e. as used in certificates and openssl. ๐Ÿ”‘
  • --puk puk โ€” Supply User PUK on the command line. ๐Ÿ”ข
  • --new-pin pin โ€” Supply new User PIN on the command line. โœจ
  • --sensitive โ€” Set the CKA_SENSITIVE attribute (object cannot be revealed in plaintext). ๐Ÿ™ˆ
  • --extractable โ€” Set the CKA_EXTRACTABLE attribute (object can be extracted). ๐Ÿ“ค
  • --undestroyable โ€” Set the CKA_DESTROYABLE attribute to false (object cannot be destroyed). ๐Ÿ›ก๏ธ
  • --set-id id, -e id โ€” Set the CKA_ID of the object. ๐Ÿ†”
  • --show-info, -I โ€” Display general token information. โ„น๏ธ
  • --sign, -s โ€” Sign some data. โœ๏ธ
  • --decrypt, โ€” Decrypt some data. ๐Ÿ”“
  • --encrypt, โ€” Encrypt some data. ๐Ÿ”’
  • --unwrap, โ€” Unwrap key. ๐ŸŽ
  • --wrap, โ€” Wrap key. ๐ŸŽ€
  • --derive, โ€” Derive a secret key using another key and some data. ๐ŸŒฑ
  • --derive-pass-der, โ€” Derive ECDHpass DER encoded pubkey for compatibility with some PKCS#11 implementations. ๐Ÿ”„
  • --salt-len bytes โ€” Specify how many bytes of salt should be used in RSA-PSS signatures. Accepts two special values: "-1" means salt length equals to digest length, "-2" or "-3" means use maximum permissible length. For verify operation "-2" means that the salt length is automatically recovered from signature. The value "-2" for the verify operation is supported for opensc pkcs#11 module only. Default is digest length (-1). ๐Ÿง‚
  • --slot id โ€” Specify the id of the slot to use (accepts HEX format with 0x.. prefix or decimal number). ๐ŸŽฐ
  • --slot-description description โ€” Specify the description of the slot to use. ๐Ÿ“
  • --slot-index index โ€” Specify the index of the slot to use. ๐Ÿ”ข
  • --object-index index โ€” Specify the index of the object to use. ๐Ÿ”ข
  • --use-locking โ€” Tell pkcs11 module it should use OS thread locking. ๐Ÿ”’
  • --test-threads options โ€” Test a pkcs11 module's thread implication. (See source code). ๐Ÿงต
  • --token-label label โ€” Specify the label of token. Will be used the first slot, that has the inserted token with this label. ๐Ÿท๏ธ
  • --so-pin pin โ€” Use the given pin as the Security Officer PIN for some token operations (token initialization, user PIN initialization, etc). If set to env:VARIABLE, the value of the environment variable VARIABLE is used. The same warning as --pin also applies here. ๐Ÿ‘ฎ
  • --test, -t โ€” Perform some tests on the token. This option is most useful when used with either --login or --pin. ๐Ÿงช
  • --test-hotplug โ€” Test hotplug capabilities (C_GetSlotList + C_WaitForSlotEvent). ๐Ÿ”Œ
  • --private โ€” Set the CKA_PRIVATE attribute (object is only viewable after a login). ๐Ÿ”
  • --always-auth โ€” Set the CKA_ALWAYS_AUTHENTICATE attribute to a private key object. If set, the user has to supply the PIN for each use (sign or decrypt) with the key. ๐Ÿ”‘
  • --allowed-mechanisms mechanisms โ€” Sets the CKA_ALLOWED_MECHANISMS attribute to a key objects when importing an object or generating a keys. The argument accepts comma-separated list of algorithmsm, that can be used with the given key. โš™๏ธ
  • --test-ec โ€” Test EC (best used with the --login or --pin option). ๐ŸŒฟ
  • --test-fork โ€” Test forking and calling C_Initialize() in the child. ๐Ÿด
  • --type type, -y type โ€” Specify the type of object to operate on. Valid value are cert, privkey, pubkey, secrkey and data. ๐Ÿ“
  • --verbose, -v โ€” Cause pkcs11-tool to be more verbose.
    • NB! This does not affect OpenSC debugging level! To set OpenSC PKCS#11 module into debug mode, set the OPENSC_DEBUG environment variable to a non-zero number. ๐Ÿ“ข
  • --verify, โ€” Verify signature of some data. โœ…
  • --read-object, -r โ€” Get object's CKA_VALUE attribute (use with --type). ๐Ÿ“–
  • --delete-object, -b โ€” Delete an object. ๐Ÿ—‘๏ธ
  • --application-label label โ€” Specify the application label of the data object (use with --type data). ๐Ÿท๏ธ
  • --application-id id โ€” Specify the application ID of the data object (use with --type data). ๐Ÿ†”
  • --issuer data โ€” Specify the issuer in hexadecimal format (use with --type cert). ๐Ÿ›๏ธ
  • --subject data โ€” Specify the subject in hexadecimal format (use with --type cert/privkey/pubkey). ๐Ÿ“œ
  • --signature-file filename โ€” The path to the signature file for signature verification. ๐Ÿ“
  • --signature-format format โ€” Format for ECDSA signature: 'rs' (default), 'sequence', 'openssl'. โœ๏ธ
  • --write-object filename, -w filename โ€” Write a key or certificate object to the token. filename points to the DER-encoded certificate or key file. ๐Ÿ“ฅ
  • --generate-random num โ€” Get num bytes of random data. ๐ŸŽฒ
  • --allow-sw โ€” Allow using software mechanisms that do not have the CKF_HW flag set. May be required when using software tokens and emulators. ๐Ÿ’ป
  • --iv data โ€” Initialization vector for symmetric ciphers. The data is hexadecimal number, i.e. "000013aa7bffa0". ๐Ÿ”ข
  • --mac-general-param num โ€” Sets the length of the MAC for the general-length MACing mechanisms to num bytes. ๐Ÿ”
  • --aad data โ€” extra authenticated data for AEAD ciphers ๐Ÿ’– bestie, this one's a hexadecimal number, so no sneaking in anything else, okay?
  • --tag-bits-len num โ€” sets the tag length for AEAD ciphers to num bits. that's it, that's the whole job โœจ
  • --salt-file filename โ€” points at the file holding the salt for HKDF. it's optional ๐Ÿง‚
  • --info-file filename โ€” points at the file holding the info for HKDF. also optional ๐Ÿซถ
  • --uri value โ€” drops the PKCS#11 URI for a module, slot, token or object. very main character of you ๐ŸŒˆ
  • --uri-with-slot-id โ€” throws the SlotId into the PKCS#11 URI too ๐Ÿ’…

โœจ EXAMPLES โœจ

okay this is the part where it all clicks, i promise ๐ŸŽ€

Do a basic functionality test of the card:

pkcs11-tool --test --login

List every certificate sitting on the smart card:

pkcs11-tool --list-objects --type cert

Read the certificate with ID CERT_ID off the card in DER format, then hand it to OpenSSL so it becomes PEM:

pkcs11-tool --read-object --id $CERT_ID --type cert \
                         --output-file cert.der
openssl x509 -inform DER -in cert.der -outform PEM > cert.pem

Write a certificate onto the token:

pkcs11-tool --login --write-object certificate.der --type cert

Generate a brand new RSA key pair:

pkcs11-tool --login --keypairgen --key-type RSA:2048

Generate a brand new extractable RSA key pair (yes, extractable, she said what she said ๐Ÿ”ฅ):

pkcs11-tool --login --keypairgen --key-type RSA:2048 --extractable

Generate an elliptic curve key pair with OpenSSL and import it to the card as $ID:

openssl genpkey -out EC_private.der -outform DER \
     -algorithm EC -pkeyopt ec_paramgen_curve:P-521
pkcs11-tool --write-object EC_private.der --id "$ID" \
     --type privkey --label "EC private key" -p "$PIN"
openssl pkey -in EC_private.der -out EC_public.der \
     -pubout -inform DER -outform DER
pkcs11-tool --write-object EC_public.der --id "$ID" \
     --type pubkey  --label "EC public key" -p $PIN

List the private keys:

pkcs11-tool --login --list-objects --type privkey

Sign some data stored in file data using the private key with ID ID, with the RSA-PKCS mechanism:

pkcs11-tool --sign --id $ID --mechanism RSA-PKCS \
     --input-file data --output-file data.sig

Same energy, but you pipe the data in from stdin instead of naming an input file:

dd if=data bs=128 count=1 \
     | pkcs11-tool --sign --id $ID --mechanism RSA-PKCS \
     > data.sig

Verify the signed data:

pkcs11-tool --id ID --verify -m RSA-PKCS \
     --input-file data --signature-file data.sig

Encrypt a file using the AES key with ID 85 and the AES-CBC mechanism with padding:

pkcs11-tool --login --encrypt --id 85 -m AES-CBC-PAD \
     --iv "00000000000000000000000000000000" \
     -i file.txt -o encrypted_file.data

Decipher that encrypted file:

pkcs11-tool --login --decrypt --id 85 -m AES-CBC-PAD \
     --iv "00000000000000000000000000000000" \
     --i encrypted_file.data -o decrypted.txt

Use the key with ID 75, mechanism AES-CBC-PAD, and initialization vector "00000000000000000000000000000000" to wrap the key with ID 76 into the output file exported_aes.key:

pkcs11-tool --login --wrap --id 75 --mechanism AES-CBC-PAD \
     --iv "00000000000000000000000000000000" \
     --application-id 76 \
     --output-file exported_aes.key

Use the key with ID 22 and mechanism RSA-PKCS to unwrap a key from file aes_wrapped.key. After a successful unwrap operation, a new AES key is created on the token. Its ID is set to 90 and its label is set to unwrapped-key.

โš ๏ธ note bestie: for the MyEID card, the AES key size must be present in the key specification, i.e. AES:16 ๐Ÿ’€
pkcs11-tool --login --unwrap --mechanism RSA-PKCS --id 22 \
     -i aes_wrapped.key --key-type AES: \
     --application-id 90 --application-label unwrapped-key

Use the SO-PIN to initialize or re-set the PIN:

pkcs11-tool --login --login-type so --init-pin

๐Ÿ‘‘ AUTHORS ๐Ÿ‘‘

pkcs11-tool was written by Olaf Kirch <okir@suse.de>. absolute legend behaviour, we stan ๐Ÿซถ


aaaand that's the whole page, bestie!! ๐ŸŒธ this one shipped as part of opensc and the page itself is dated 04/19/2026. go forth and handle your keys responsibly, ily, mwah ๐Ÿ’–โœจ๐ŸŽ€๐Ÿฆ‹

๐Ÿ“ฆ where this page comes from