Sample code for 30+ languages & platforms
Lua

ScMinidriver - Get Smartcard Properties

See more ScMinidriver Examples

Gets information about the smart card currently inserted in the reader (or USB token).

Chilkat Lua Downloads

Lua
local chilkat = require("chilkat")

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

local scmd = chilkat.ScMinidriver.new()

-- Reader names (smart card readers or USB tokens) can be discovered
-- via PCSC List Readers or PCSC Find Smart Cards
local readerName = "Alcor Micro USB Smart Card Reader 0"
local success = scmd:acquire_context(readerName)
if not success then
    print(scmd.last_error_text)
    return
end

local json = chilkat.JsonObject.new()
json.emit_compact = false

success = scmd:get_card_properties(json)
if not success then
    print(scmd.last_error_text)
    return
end

print(json:emit())

-- Here is sample output:
-- See below for sample code to parse the JSON.
--
-- NOTE: Not all smart cards support all properties.
-- The GetCardProperties method will return information for all properties supported by the card.

-- {
--   "bytesAvailable": 74752,
--   "containersAvailable": 18,
--   "maxKeyContainers": 20,
--   "capabilities": {
--     "fCertificateCompression": false,
--     "fKeyGen": true
--   },
--   "keySizes": {
--     "minimumBitlen": 2048,
--     "defaultBitlen": 2048,
--     "maximumBitlen": 4096,
--     "incrementalBitlen": 1024
--   },
--   "readOnly": false,
--   "cacheMode": "global",
--   "supportsWinX509Enrollment": true,
--   "guid": "1201803d-03e6-772a-3d80-0112e6032a77",
--   "serial": "e6032a773d800112e6032a77",
--   "pins": [
--     "user",
--     "admin",
--     "role3",
--     "role4"
--   ],
--   "pin": {
--     "user": {
--       "type": "regular",
--       "purpose": "primaryCard",
--       "changePermission": [
--         "user"
--       ],
--       "unblockPermission": [
--         "admin"
--       ],
--       "cachePolicy": "normal",
--       "policyInfo": "00000000",
--       "flags": "00000000",
--       "acceptPlainTextPin": true,
--       "generateSessionPin": false
--     },
--     "admin": {
--       "type": "challenge/response",
--       "purpose": "administrator",
--       "changePermission": [
--         "admin"
--       ],
--       "cachePolicy": "normal",
--       "policyInfo": "00000000",
--       "flags": "00000000"
--     },
--     "role3": {
--       "type": "regular",
--       "purpose": "digitalSignature",
--       "changePermission": [
--         "role3"
--       ],
--       "unblockPermission": [
--         "role4"
--       ],
--       "cachePolicy": "alwaysPrompt",
--       "policyInfo": "00000000",
--       "flags": "00000000",
--       "acceptPlainTextPin": true,
--       "generateSessionPin": false
--     },
--     "role4": {
--       "type": "regular",
--       "purpose": "unblockOnly",
--       "changePermission": [
--         "role4"
--       ],
--       "cachePolicy": "normal",
--       "policyInfo": "00000000",
--       "flags": "00000000",
--       "acceptPlainTextPin": true,
--       "generateSessionPin": false
--     }
--   },
--   "importSupport": [
--     "plainText",
--     "rsaKeyest",
--     "eccKeyest",
--     "symmetric"
--   ],
--   "algorithms": [
--     "AES"
--   ],
--   "paddingSchemes": [
--     "block",
--     "pkcs1",
--     "pss",
--     "oaep"
--   ],
--   "chainingModes": [
--     "ChainingModeCBC"
--   ]
-- }

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

local strVal = ""

local bytesAvailable = json:int_of("bytesAvailable")
local containersAvailable = json:int_of("containersAvailable")
local maxKeyContainers = json:int_of("maxKeyContainers")
local capabilitiesFCertificateCompression = json:bool_of("capabilities.fCertificateCompression")
local capabilitiesFKeyGen = json:bool_of("capabilities.fKeyGen")
local keySizesMinimumBitlen = json:int_of("keySizes.minimumBitlen")
local keySizesDefaultBitlen = json:int_of("keySizes.defaultBitlen")
local keySizesMaximumBitlen = json:int_of("keySizes.maximumBitlen")
local keySizesIncrementalBitlen = json:int_of("keySizes.incrementalBitlen")
local readOnly = json:bool_of("readOnly")
local cacheMode = json:string_of("cacheMode")
local supportsWinX509Enrollment = json:bool_of("supportsWinX509Enrollment")
local guid = json:string_of("guid")
local serial = json:string_of("serial")
local pinUserType = json:string_of("pin.user.type")
local pinUserPurpose = json:string_of("pin.user.purpose")
local pinUserCachePolicy = json:string_of("pin.user.cachePolicy")
local pinUserPolicyInfo = json:string_of("pin.user.policyInfo")
local pinUserFlags = json:string_of("pin.user.flags")
local pinUserAcceptPlainTextPin = json:bool_of("pin.user.acceptPlainTextPin")
local pinUserGenerateSessionPin = json:bool_of("pin.user.generateSessionPin")
local pinAdminType = json:string_of("pin.admin.type")
local pinAdminPurpose = json:string_of("pin.admin.purpose")
local pinAdminCachePolicy = json:string_of("pin.admin.cachePolicy")
local pinAdminPolicyInfo = json:string_of("pin.admin.policyInfo")
local pinAdminFlags = json:string_of("pin.admin.flags")
local pinRole3Type = json:string_of("pin.role3.type")
local pinRole3Purpose = json:string_of("pin.role3.purpose")
local pinRole3CachePolicy = json:string_of("pin.role3.cachePolicy")
local pinRole3PolicyInfo = json:string_of("pin.role3.policyInfo")
local pinRole3Flags = json:string_of("pin.role3.flags")
local pinRole3AcceptPlainTextPin = json:bool_of("pin.role3.acceptPlainTextPin")
local pinRole3GenerateSessionPin = json:bool_of("pin.role3.generateSessionPin")
local pinRole4Type = json:string_of("pin.role4.type")
local pinRole4Purpose = json:string_of("pin.role4.purpose")
local pinRole4CachePolicy = json:string_of("pin.role4.cachePolicy")
local pinRole4PolicyInfo = json:string_of("pin.role4.policyInfo")
local pinRole4Flags = json:string_of("pin.role4.flags")
local pinRole4AcceptPlainTextPin = json:bool_of("pin.role4.acceptPlainTextPin")
local pinRole4GenerateSessionPin = json:bool_of("pin.role4.generateSessionPin")
local i = 0
local count_i = json:size_of_array("pins")
while i < count_i do
    json.i = i
    strVal = json:string_of("pins[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.user.changePermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.user.changePermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.user.unblockPermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.user.unblockPermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.admin.changePermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.admin.changePermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.role3.changePermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.role3.changePermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.role3.unblockPermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.role3.unblockPermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("pin.role4.changePermission")
while i < count_i do
    json.i = i
    strVal = json:string_of("pin.role4.changePermission[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("importSupport")
while i < count_i do
    json.i = i
    strVal = json:string_of("importSupport[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("algorithms")
while i < count_i do
    json.i = i
    strVal = json:string_of("algorithms[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("paddingSchemes")
while i < count_i do
    json.i = i
    strVal = json:string_of("paddingSchemes[i]")
    i = i + 1
end

i = 0
count_i = json:size_of_array("chainingModes")
while i < count_i do
    json.i = i
    strVal = json:string_of("chainingModes[i]")
    i = i + 1
end

-- Delete the context when finished with the card.
success = scmd:delete_context()
if not success then
    print(scmd.last_error_text)
end