Pascal (Lazarus/Delphi)
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
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.