Sample code for 30+ languages & platforms
B4X

PKCS11 Discover Readers and Smart Cards / Tokens

See more PKCS11 Examples

Example showing how to discover the readers (slots) and smart cards and tokens available through a vendor's PKCS11 Cryptoki module.

Note: This example requires Chilkat v9.5.0.88 or later.

Chilkat B4X Downloads

B4X
Dim success As Boolean = False

'  This example requires the Chilkat API to have been previously unlocked.
'  See Global Unlock Sample for sample code.

'  Note: Chilkat's PKCS11 implementation runs on Windows, Linux, Mac OS X, and other supported operating systems.

Dim pkcs11 As ChilkatPkcs11
pkcs11.Initialize

'  Specify the vendor's Cryptoki module DLL / shared lib.
pkcs11.SharedLibPath = "aetpkss1.dll"

success = pkcs11.InitializeLibrary
If success = False Then
    Log(pkcs11.LastErrorText)
    Return
End If


'  Call Discover to discover what's available.
'  Indicate that we only want to return slots (readers) where tokens (smart cards) are present.
'  (If the device is a USB token, such as an ePass300Auto, then by definition it has a "token" present.)
Dim onlyTokensPresent As Boolean = True
Dim json As ChilkatJsonObject
json.Initialize
success = pkcs11.Discover(onlyTokensPresent, json)
If success = False Then
    Log(pkcs11.LastErrorText)
    Return
End If


json.EmitCompact = False
Log(json.Emit)

'  Sample JSON output.
'  Code for parsing this JSON is shown below..

'  {
'    "cryptokiVersion": {
'      "major": 2,
'      "minor": 20
'    },
'    "manufacturerID": "A.E.T. Europe B.V.",
'    "libraryDescription": "Cryptographic Token Interface",
'    "libraryVersion": {
'      "major": 3,
'      "minor": 0
'    },
'    "slot": [
'      {
'        "id": 52482,
'        "slotDescription": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0",
'        "manufacturerID": "SCM Microsystems Inc. SCR33x USB",
'        "tokenPresent": true,
'        "removableDevice": true,
'        "hardwareSlot": true,
'        "hardwareVersion": {
'          "major": 0,
'          "minor": 0
'        },
'        "firmwareVersion": {
'          "major": 0,
'          "minor": 0
'        },
'        "token": {
'          "label": "chilkat",
'          "manufacturerID": "A.E.T. Europe B.V.",
'          "model": "19C40406010D00C0",
'          "serialNumber": "21619600583C4505",
'          "flags": [
'            "CKF_RNG",
'            "CKF_LOGIN_REQUIRED",
'            "CKF_USER_PIN_INITIALIZED",
'            "CKF_TOKEN_INITIALIZED"
'          ],
'          "maxSessionCount": 126,
'          "sessionCount": 0,
'          "maxRwSessionCount": 126,
'          "rwSessionCount": 0,
'          "maxPinLen": 15,
'          "minPinLen": 4,
'          "totalPublicMemory": 32767,
'          "freePublicMemory": 32767,
'          "totalPrivateMemory": 32767,
'          "freePrivateMemory": 32767,
'          "hardwareVersion": {
'            "major": 0,
'            "minor": 0
'          },
'          "firmwareVersion": {
'            "major": 0,
'            "minor": 0
'          },
'          "utcTime": "",
'          "rsa": {
'            "minKeySize": 768,
'            "maxKeySize": 2048
'          },
'          "mechanism": [
'            "CKM_RSA_PKCS",
'            "CKM_RSA_X_509",
'            "CKM_RSA_PKCS_OAEP",
'            "CKM_MD5_RSA_PKCS",
'            "CKM_SHA1_RSA_PKCS",
'            "CKM_SHA224_RSA_PKCS",
'            "CKM_SHA256_RSA_PKCS",
'            "CKM_SHA384_RSA_PKCS",
'            "CKM_SHA512_RSA_PKCS",
'            "CKM_RIPEMD160_RSA_PKCS",
'            "CKM_CPK_ECDSA",
'            "CKM_CPK_ECDSA_SHA1",
'            "CKM_CPK_ECIES",
'            "CKM_CPK_ECIES_STDDH_SHA1KDF_DES3CBC_PAD_SHA1HMAC",
'            "CKM_CPK_ECIES_STDDH_SHA1KDF_AES128CBC_PAD_SHA1HMAC",
'            "CKM_CPK_PKCS7_SIGNED",
'            "CKM_CPK_PKCS7_ENVELOPE_DES3CBC_PAD",
'            "CKM_RSA_PKCS_PSS",
'            "CKM_RSA_PKCS_KEY_PAIR_GEN",
'            "CKM_RC2_KEY_GEN",
'            "CKM_RC2_ECB",
'            "CKM_RC2_CBC",
'            "CKM_RC2_CBC_PAD",
'            "CKM_RC4_KEY_GEN",
'            "CKM_RC4",
'            "CKM_DES_KEY_GEN",
'            "CKM_DES2_KEY_GEN",
'            "CKM_DES3_KEY_GEN",
'            "CKM_DES_ECB",
'            "CKM_DES_CBC",
'            "CKM_DES3_ECB",
'            "CKM_DES3_CBC",
'            "CKM_DES_CBC_PAD",
'            "CKM_DES3_CBC_PAD",
'            "CKM_MD5",
'            "CKM_SHA_1",
'            "CKM_SHA224",
'            "CKM_SHA256",
'            "CKM_SHA384",
'            "CKM_SHA512",
'            "CKM_RIPEMD160"
'          ]
'        }
'      }
'    ]
'  }

'  Use this online tool to generate parsing code from sample JSON: 
'  Generate Parsing Code from JSON



Dim id As Int
Dim slotDescription As String
Dim tokenPresent As Boolean
Dim removableDevice As Boolean
Dim hardwareSlot As Boolean
Dim hardwareVersionMajor As Int
Dim hardwareVersionMinor As Int
Dim firmwareVersionMajor As Int
Dim firmwareVersionMinor As Int
Dim tokenLabel As String
Dim tokenManufacturerID As String
Dim tokenModel As String
Dim tokenSerialNumber As String
Dim tokenMaxSessionCount As Int
Dim tokenSessionCount As Int
Dim tokenMaxRwSessionCount As Int
Dim tokenRwSessionCount As Int
Dim tokenMaxPinLen As Int
Dim tokenMinPinLen As Int
Dim tokenTotalPublicMemory As Int
Dim tokenFreePublicMemory As Int
Dim tokenTotalPrivateMemory As Int
Dim tokenFreePrivateMemory As Int
Dim tokenHardwareVersionMajor As Int
Dim tokenHardwareVersionMinor As Int
Dim tokenFirmwareVersionMajor As Int
Dim tokenFirmwareVersionMinor As Int
Dim tokenUtcTime As String
Dim tokenRsaMinKeySize As Int
Dim tokenRsaMaxKeySize As Int
Dim j As Int
Dim count_j As Int
Dim strVal As String

'  Use this online tool to generate parsing code from sample JSON: 
'  Generate Parsing Code from JSON

Dim cryptokiVersionMajor As Int = json.IntOf("cryptokiVersion.major")
Dim cryptokiVersionMinor As Int = json.IntOf("cryptokiVersion.minor")
Dim manufacturerID As String = json.StringOf("manufacturerID")
Dim libraryDescription As String = json.StringOf("libraryDescription")
Dim libraryVersionMajor As Int = json.IntOf("libraryVersion.major")
Dim libraryVersionMinor As Int = json.IntOf("libraryVersion.minor")
Dim i As Int = 0
Dim count_i As Int = json.SizeOfArray("slot")
Do While i < count_i
    json.I = i
    id = json.IntOf("slot[i].id")
    slotDescription = json.StringOf("slot[i].slotDescription")
    manufacturerID = json.StringOf("slot[i].manufacturerID")
    tokenPresent = json.BoolOf("slot[i].tokenPresent")
    removableDevice = json.BoolOf("slot[i].removableDevice")
    hardwareSlot = json.BoolOf("slot[i].hardwareSlot")
    hardwareVersionMajor = json.IntOf("slot[i].hardwareVersion.major")
    hardwareVersionMinor = json.IntOf("slot[i].hardwareVersion.minor")
    firmwareVersionMajor = json.IntOf("slot[i].firmwareVersion.major")
    firmwareVersionMinor = json.IntOf("slot[i].firmwareVersion.minor")
    tokenLabel = json.StringOf("slot[i].token.label")
    tokenManufacturerID = json.StringOf("slot[i].token.manufacturerID")
    tokenModel = json.StringOf("slot[i].token.model")
    tokenSerialNumber = json.StringOf("slot[i].token.serialNumber")
    tokenMaxSessionCount = json.IntOf("slot[i].token.maxSessionCount")
    tokenSessionCount = json.IntOf("slot[i].token.sessionCount")
    tokenMaxRwSessionCount = json.IntOf("slot[i].token.maxRwSessionCount")
    tokenRwSessionCount = json.IntOf("slot[i].token.rwSessionCount")
    tokenMaxPinLen = json.IntOf("slot[i].token.maxPinLen")
    tokenMinPinLen = json.IntOf("slot[i].token.minPinLen")
    tokenTotalPublicMemory = json.IntOf("slot[i].token.totalPublicMemory")
    tokenFreePublicMemory = json.IntOf("slot[i].token.freePublicMemory")
    tokenTotalPrivateMemory = json.IntOf("slot[i].token.totalPrivateMemory")
    tokenFreePrivateMemory = json.IntOf("slot[i].token.freePrivateMemory")
    tokenHardwareVersionMajor = json.IntOf("slot[i].token.hardwareVersion.major")
    tokenHardwareVersionMinor = json.IntOf("slot[i].token.hardwareVersion.minor")
    tokenFirmwareVersionMajor = json.IntOf("slot[i].token.firmwareVersion.major")
    tokenFirmwareVersionMinor = json.IntOf("slot[i].token.firmwareVersion.minor")
    tokenUtcTime = json.StringOf("slot[i].token.utcTime")
    tokenRsaMinKeySize = json.IntOf("slot[i].token.rsa.minKeySize")
    tokenRsaMaxKeySize = json.IntOf("slot[i].token.rsa.maxKeySize")
    j = 0
    count_j = json.SizeOfArray("slot[i].token.flags")
    Do While j < count_j
        json.J = j
        strVal = json.StringOf("slot[i].token.flags[j]")
        j = j + 1
    Loop
    j = 0
    count_j = json.SizeOfArray("slot[i].token.mechanism")
    Do While j < count_j
        json.J = j
        strVal = json.StringOf("slot[i].token.mechanism[j]")
        j = j + 1
    Loop
    i = i + 1
Loop