Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

ScMinidriver - Get Smartcard Properties

See more ScMinidriver Examples

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

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.ScMinidriver,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  scmd: TScMinidriver;
  readerName: string;
  json: TJsonObject;
  strVal: string;
  bytesAvailable: Integer;
  containersAvailable: Integer;
  maxKeyContainers: Integer;
  capabilitiesFCertificateCompression: Boolean;
  capabilitiesFKeyGen: Boolean;
  keySizesMinimumBitlen: Integer;
  keySizesDefaultBitlen: Integer;
  keySizesMaximumBitlen: Integer;
  keySizesIncrementalBitlen: Integer;
  readOnly: Boolean;
  cacheMode: string;
  supportsWinX509Enrollment: Boolean;
  guid: string;
  serial: string;
  pinUserType: string;
  pinUserPurpose: string;
  pinUserCachePolicy: string;
  pinUserPolicyInfo: string;
  pinUserFlags: string;
  pinUserAcceptPlainTextPin: Boolean;
  pinUserGenerateSessionPin: Boolean;
  pinAdminType: string;
  pinAdminPurpose: string;
  pinAdminCachePolicy: string;
  pinAdminPolicyInfo: string;
  pinAdminFlags: string;
  pinRole3Type: string;
  pinRole3Purpose: string;
  pinRole3CachePolicy: string;
  pinRole3PolicyInfo: string;
  pinRole3Flags: string;
  pinRole3AcceptPlainTextPin: Boolean;
  pinRole3GenerateSessionPin: Boolean;
  pinRole4Type: string;
  pinRole4Purpose: string;
  pinRole4CachePolicy: string;
  pinRole4PolicyInfo: string;
  pinRole4Flags: string;
  pinRole4AcceptPlainTextPin: Boolean;
  pinRole4GenerateSessionPin: Boolean;
  i: Integer;
  count_i: Integer;

begin
  success := False;

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

  scmd := TScMinidriver.Create;

  //  Reader names (smart card readers or USB tokens) can be discovered
  //  via PCSC List Readers or PCSC Find Smart Cards
  readerName := 'Alcor Micro USB Smart Card Reader 0';
  success := scmd.AcquireContext(readerName);
  if (success = False) then
    begin
      WriteLn(scmd.LastErrorText);
      Exit;
    end;

  json := TJsonObject.Create;
  json.EmitCompact := False;

  success := scmd.GetCardProperties(json);
  if (success = False) then
    begin
      WriteLn(scmd.LastErrorText);
      Exit;
    end;

  WriteLn(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

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

  i := 0;
  count_i := json.SizeOfArray('pin.user.changePermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.user.changePermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pin.user.unblockPermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.user.unblockPermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pin.admin.changePermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.admin.changePermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pin.role3.changePermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.role3.changePermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pin.role3.unblockPermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.role3.unblockPermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pin.role4.changePermission');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pin.role4.changePermission[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('importSupport');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('importSupport[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('algorithms');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('algorithms[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('paddingSchemes');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('paddingSchemes[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('chainingModes');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('chainingModes[i]');
      i := i + 1;
    end;

  //  Delete the context when finished with the card.
  success := scmd.DeleteContext();
  if (success = False) then
    begin
      WriteLn(scmd.LastErrorText);
    end;


  scmd.Free;
  json.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.