Sample code for 30+ languages & platforms
Delphi DLL

ScMinidriver - Get Public Keys from Smart Card Key Container

See more ScMinidriver Examples

Demonstrates how to query a key container on a smart card (or USB token) to get the public part of the private keys that are present. A key container can hold two separate private keys -- one in the "signature" position, and the other in the "key exchange" position.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ScMinidriver, PublicKey;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
scmd: HCkScMinidriver;
readerName: PWideChar;
pubkey_sig: HCkPublicKey;
pubkey_kex: HCkPublicKey;

begin
success := False;

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

// Chilkat recommends the following free tool for interactively examining the contents of your smart card
// through the ScMinidriver interface:  MGTEK Tool for Minidriver enabled Smart Cards

// Let's first look at our smart card..
// Here's the view of our Gemalto (Thales) IDPrime MD T=0 smart card in the MGTEK tool:

// (image:https://example-code.com/images/gemalto_idprime_after_key_import.JPG/endImage)

scmd := CkScMinidriver_Create();

// First we need to acquire a context to the smart card in the reader where it is inserted.
// Reader names (smart card readers or USB tokens) can be discovered
// via List Readers or Find Smart Cards
readerName := 'Alcor Micro USB Smart Card Reader 0';
success := CkScMinidriver_AcquireContext(scmd,readerName);
if (success = False) then
  begin
    Memo1.Lines.Add(CkScMinidriver__lastErrorText(scmd));
    Exit;
  end;

// If successful, the name of the currently inserted smart card is available:
Memo1.Lines.Add('Card name: ' + CkScMinidriver__cardName(scmd));

// We likely shouldn't need to authenticate with the smart card (use a PIN) to simply get a public key,
// so we can skip the PIN authenticatin step..

// Let's get the key(s) present in Container #7.
// In our case (shown in the image above), there is a private key in the "key exchange" position, but no key in the "signature" position.
pubkey_sig := CkPublicKey_Create();
pubkey_kex := CkPublicKey_Create();

success := CkScMinidriver_GetContainerKeys(scmd,7,pubkey_sig,pubkey_kex);
if (success = False) then
  begin
    Memo1.Lines.Add(CkScMinidriver__lastErrorText(scmd));
    Exit;
  end;

if (CkPublicKey_getEmpty(pubkey_sig) = True) then
  begin
    Memo1.Lines.Add('No signature key is present.');
  end
else
  begin
    Memo1.Lines.Add('Signature key:');
    Memo1.Lines.Add(CkPublicKey__getPem(pubkey_sig,True));
  end;

if (CkPublicKey_getEmpty(pubkey_kex) = True) then
  begin
    Memo1.Lines.Add('No Key Exchange key is present.');
  end
else
  begin
    Memo1.Lines.Add('Key Exchange key:');
    Memo1.Lines.Add(CkPublicKey__getPem(pubkey_kex,True));
  end;

CkScMinidriver_DeleteContext(scmd);

Memo1.Lines.Add('Success.');

// Here's the output of the above sample code:

// Card name: IDPrime MD T=0
// No signature key is present.
// Key Exchange key:
// -----BEGIN RSA PUBLIC KEY-----
// MIIBCgKCAQEAsXeRhM55P13FbpNcXAMR3olbw2Wa6keZIHu5YTZYUBTlYWId+pNi
// wUz3zFIEo+0IfYR0H27ybIycQO+1IIzJofUFNMAL3tZps2OKPlsjuCPls6kXpXhv
// /gvhux8LrCtp4PcKWqJ6QVOZKChc7WAx40qFWzHi57ueqRTv3x0kESqGg/VjsqyT
// Evb55psJO2RsfhLT7+YVh3hImRM3RDaJdkTkPuOxeFyT6N7VXD09329sLuS3QkUb
// E9zEKDnz9X3d8dEQdJhSI9ba5fxl8R7fu8pB67ElfzFml96X1jLFtzy1pzOT5Fc4
// ROcaqlYckVzdBq9sxezm6MYmDBjNAcibRwIDAQAB
// -----END RSA PUBLIC KEY-----

CkScMinidriver_Dispose(scmd);
CkPublicKey_Dispose(pubkey_sig);
CkPublicKey_Dispose(pubkey_kex);

end;