Sample code for 30+ languages & platforms
Rust

ScMinidriver - Get Smartcard Properties

See more ScMinidriver Examples

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

Chilkat Rust Downloads

Rust

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

let scmd = chilkat::ScMinidriver::new();

// Reader names (smart card readers or USB tokens) can be discovered
// via PCSC List Readers or PCSC Find Smart Cards
let reader_name = "Alcor Micro USB Smart Card Reader 0".to_string();
if scmd.acquire_context(&reader_name).is_err() {
    println!("{}", scmd.last_error_text());
    return;
}

let json = chilkat::JsonObject::new();
json.set_emit_compact(false);

if scmd.get_card_properties(&json).is_err() {
    println!("{}", scmd.last_error_text());
    return;
}

println!("{}", json.emit().unwrap_or_default());

// 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

let bytes_available = json.int_of("bytesAvailable");
let containers_available = json.int_of("containersAvailable");
let max_key_containers = json.int_of("maxKeyContainers");
let capabilities_f_certificate_compression = json.bool_of("capabilities.fCertificateCompression");
let capabilities_f_key_gen = json.bool_of("capabilities.fKeyGen");
let key_sizes_minimum_bitlen = json.int_of("keySizes.minimumBitlen");
let key_sizes_default_bitlen = json.int_of("keySizes.defaultBitlen");
let key_sizes_maximum_bitlen = json.int_of("keySizes.maximumBitlen");
let key_sizes_incremental_bitlen = json.int_of("keySizes.incrementalBitlen");
let read_only = json.bool_of("readOnly");
let cache_mode = json.string_of("cacheMode").unwrap_or_default();
let supports_win_x509_enrollment = json.bool_of("supportsWinX509Enrollment");
let guid = json.string_of("guid").unwrap_or_default();
let serial = json.string_of("serial").unwrap_or_default();
let pin_user_type = json.string_of("pin.user.type").unwrap_or_default();
let pin_user_purpose = json.string_of("pin.user.purpose").unwrap_or_default();
let pin_user_cache_policy = json.string_of("pin.user.cachePolicy").unwrap_or_default();
let pin_user_policy_info = json.string_of("pin.user.policyInfo").unwrap_or_default();
let pin_user_flags = json.string_of("pin.user.flags").unwrap_or_default();
let pin_user_accept_plain_text_pin = json.bool_of("pin.user.acceptPlainTextPin");
let pin_user_generate_session_pin = json.bool_of("pin.user.generateSessionPin");
let pin_admin_type = json.string_of("pin.admin.type").unwrap_or_default();
let pin_admin_purpose = json.string_of("pin.admin.purpose").unwrap_or_default();
let pin_admin_cache_policy = json.string_of("pin.admin.cachePolicy").unwrap_or_default();
let pin_admin_policy_info = json.string_of("pin.admin.policyInfo").unwrap_or_default();
let pin_admin_flags = json.string_of("pin.admin.flags").unwrap_or_default();
let pin_role3_type = json.string_of("pin.role3.type").unwrap_or_default();
let pin_role3_purpose = json.string_of("pin.role3.purpose").unwrap_or_default();
let pin_role3_cache_policy = json.string_of("pin.role3.cachePolicy").unwrap_or_default();
let pin_role3_policy_info = json.string_of("pin.role3.policyInfo").unwrap_or_default();
let pin_role3_flags = json.string_of("pin.role3.flags").unwrap_or_default();
let pin_role3_accept_plain_text_pin = json.bool_of("pin.role3.acceptPlainTextPin");
let pin_role3_generate_session_pin = json.bool_of("pin.role3.generateSessionPin");
let pin_role4_type = json.string_of("pin.role4.type").unwrap_or_default();
let pin_role4_purpose = json.string_of("pin.role4.purpose").unwrap_or_default();
let pin_role4_cache_policy = json.string_of("pin.role4.cachePolicy").unwrap_or_default();
let pin_role4_policy_info = json.string_of("pin.role4.policyInfo").unwrap_or_default();
let pin_role4_flags = json.string_of("pin.role4.flags").unwrap_or_default();
let pin_role4_accept_plain_text_pin = json.bool_of("pin.role4.acceptPlainTextPin");
let pin_role4_generate_session_pin = json.bool_of("pin.role4.generateSessionPin");
let mut i = 0;
let mut count_i = json.size_of_array("pins");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pins[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.user.changePermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.user.changePermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.user.unblockPermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.user.unblockPermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.admin.changePermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.admin.changePermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.role3.changePermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.role3.changePermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.role3.unblockPermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.role3.unblockPermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("pin.role4.changePermission");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("pin.role4.changePermission[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("importSupport");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("importSupport[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("algorithms");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("algorithms[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("paddingSchemes");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("paddingSchemes[i]").unwrap_or_default();
    i = i + 1;
}

i = 0;
count_i = json.size_of_array("chainingModes");
while i < count_i {
    json.set_i(i);
    let _ = json.string_of("chainingModes[i]").unwrap_or_default();
    i = i + 1;
}

// Delete the context when finished with the card.
if scmd.delete_context().is_err() {
    println!("{}", scmd.last_error_text());
}