Sample code for 30+ languages & platforms
Perl

ScMinidriver - Get Smartcard Properties

See more ScMinidriver Examples

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

Chilkat Perl Downloads

Chilkat2 Perl
use strict;
use warnings;
use Chilkat2;

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

my $scmd = Chilkat2::ScMinidriver->new;

# Reader names (smart card readers or USB tokens) can be discovered
# via PCSC List Readers or PCSC Find Smart Cards
my $readerName = 'Alcor Micro USB Smart Card Reader 0';
my $success = $scmd->AcquireContext($readerName);
if (!$success) {
    print $scmd->LastErrorText, "\n";
    exit;
}

my $json = Chilkat2::JsonObject->new;
$json->EmitCompact(0);

$success = $scmd->GetCardProperties($json);
if (!$success) {
    print $scmd->LastErrorText, "\n";
    exit;
}

print $json->Emit(), "\n";

# 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

my $strVal = '';

my $bytesAvailable = $json->IntOf('bytesAvailable');
my $containersAvailable = $json->IntOf('containersAvailable');
my $maxKeyContainers = $json->IntOf('maxKeyContainers');
my $capabilitiesFCertificateCompression = $json->BoolOf('capabilities.fCertificateCompression');
my $capabilitiesFKeyGen = $json->BoolOf('capabilities.fKeyGen');
my $keySizesMinimumBitlen = $json->IntOf('keySizes.minimumBitlen');
my $keySizesDefaultBitlen = $json->IntOf('keySizes.defaultBitlen');
my $keySizesMaximumBitlen = $json->IntOf('keySizes.maximumBitlen');
my $keySizesIncrementalBitlen = $json->IntOf('keySizes.incrementalBitlen');
my $readOnly = $json->BoolOf('readOnly');
my $cacheMode = $json->StringOf('cacheMode');
my $supportsWinX509Enrollment = $json->BoolOf('supportsWinX509Enrollment');
my $guid = $json->StringOf('guid');
my $serial = $json->StringOf('serial');
my $pinUserType = $json->StringOf('pin.user.type');
my $pinUserPurpose = $json->StringOf('pin.user.purpose');
my $pinUserCachePolicy = $json->StringOf('pin.user.cachePolicy');
my $pinUserPolicyInfo = $json->StringOf('pin.user.policyInfo');
my $pinUserFlags = $json->StringOf('pin.user.flags');
my $pinUserAcceptPlainTextPin = $json->BoolOf('pin.user.acceptPlainTextPin');
my $pinUserGenerateSessionPin = $json->BoolOf('pin.user.generateSessionPin');
my $pinAdminType = $json->StringOf('pin.admin.type');
my $pinAdminPurpose = $json->StringOf('pin.admin.purpose');
my $pinAdminCachePolicy = $json->StringOf('pin.admin.cachePolicy');
my $pinAdminPolicyInfo = $json->StringOf('pin.admin.policyInfo');
my $pinAdminFlags = $json->StringOf('pin.admin.flags');
my $pinRole3Type = $json->StringOf('pin.role3.type');
my $pinRole3Purpose = $json->StringOf('pin.role3.purpose');
my $pinRole3CachePolicy = $json->StringOf('pin.role3.cachePolicy');
my $pinRole3PolicyInfo = $json->StringOf('pin.role3.policyInfo');
my $pinRole3Flags = $json->StringOf('pin.role3.flags');
my $pinRole3AcceptPlainTextPin = $json->BoolOf('pin.role3.acceptPlainTextPin');
my $pinRole3GenerateSessionPin = $json->BoolOf('pin.role3.generateSessionPin');
my $pinRole4Type = $json->StringOf('pin.role4.type');
my $pinRole4Purpose = $json->StringOf('pin.role4.purpose');
my $pinRole4CachePolicy = $json->StringOf('pin.role4.cachePolicy');
my $pinRole4PolicyInfo = $json->StringOf('pin.role4.policyInfo');
my $pinRole4Flags = $json->StringOf('pin.role4.flags');
my $pinRole4AcceptPlainTextPin = $json->BoolOf('pin.role4.acceptPlainTextPin');
my $pinRole4GenerateSessionPin = $json->BoolOf('pin.role4.generateSessionPin');
my $i = 0;
my $count_i = $json->SizeOfArray('pins');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pins[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.user.changePermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.user.changePermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.user.unblockPermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.user.unblockPermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.admin.changePermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.admin.changePermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.role3.changePermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.role3.changePermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.role3.unblockPermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.role3.unblockPermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('pin.role4.changePermission');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('pin.role4.changePermission[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('importSupport');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('importSupport[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('algorithms');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('algorithms[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('paddingSchemes');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('paddingSchemes[i]');
    $i = $i + 1;
}

$i = 0;
$count_i = $json->SizeOfArray('chainingModes');
while ($i < $count_i) {
    $json->I($i);
    $strVal = $json->StringOf('chainingModes[i]');
    $i = $i + 1;
}

# Delete the context when finished with the card.
$success = $scmd->DeleteContext();
if (!$success) {
    print $scmd->LastErrorText, "\n";
}