The example logs below were copied from the Listener window (REPL console) on LispWorks 4.4 for Windows.
;; Compile and load YstokCard
(asdf:operate 'asdf:load-op 'ycard)
;; Specify PC/SC dynamic library name and location on *nix
#-win32
(setq card:*pcsc-module* "libpcsclite.so")
;; If needed, specify the OmniKey Sync API module location
(setq card:*oksa-module-pathname* #P"E:/util/cards/scardsyn.dll")
(ffc:load-foreign-module :omnikey-sync-api)
;; Device database queries
(card:list-device-groups)
;=> ("My group" "SCard$DefaultReaders")
(card:list-device-names)
;=> ("OMNIKEY CardMan 5x21 0" "OMNIKEY CardMan 5x21-CL 0")
;; Initialize context, create device and card objects
(setq card:*context* (card:establish-context))
;=> #<Pointer: HANDLE = #xCD020000;>
(setq device (card:ensure-device (second (card:list-device-names
"SCard$AllReaders"))))
;=> #<OMNIKEY "OMNIKEY CardMan 5x21-CL 0" (:PRESENT)>
(card:ask-device-state device)
;=> :PRESENT, NIL
(setq card (card:device-connect device))
;=> #<MIFARE-STD "Mifare Standard" EA010000>
; ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
(card:uid card)
;=> 678011255
(card:card-empty-p card)
;=> T
;; Write and read file 4 record 1
;; In Mifare terms, the first block (16 bytes) of sector 4
(card:put-object card 4 (make-octet-vector 16 :initial-element 66)
:record :first :key-kind :A :key card:+std-deliver-key+)
;=> T
(card:get-object card 4 t :record :first :key-kind :A :key card:+std-deliver-key+)
;=> #(66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66)
;; Internal authentication
(card:authenticate-call card 4 (list card:+std-deliver-key+))
;=> #(255 255 255 255 255 255), (#(255 255 255 255 255 255))
;; Write and read in lower level
(card:card-update-binary card device #v"00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F"
:file 4 :record :first)
;=> T
(card:card-read-binary card d :file 4 :record :first)
;=> #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
;; Restore file 4 to the delivery (empty card) contents
(card:card-update-binary card device #16v0 :file 4 :record :first)
;; Release objects
(card:card-disconnect card)
(card:release-devices)
(card:release-context card:*context*)
To start monitoring, load the file examples/test-monitor.lisp included into the distribution package (its contents is as follows):
;; Switch logging on and direct log records to console
(pushnew :ycard yl:*log-options*)
(setq yl:*log-stream* *standard-output*)
;; Switch print ATR on and customize the list of known ATRs
(setq card:*monitor-print-atr* t)
;(setq card:*smartcard-list-pathname* #P"E:/util/cards/smartcard_list.txt")
(card:start-monitor
:callback (lambda (device &key state mode atr)
(format t "~%** CALLBACK on ~s state ~s mode ~s"
device state mode)))
;(card:stop-monitor)
Windows supports the "ghost device" named "\\?PnP?\Notification". It helps monitoring plug-and-play events that occur when the USB connection cable of some real device is plugged or unplugged.
Start smart card monitoring at 2013-Dec-24 13:30:33.
Using PnP notification device mechanism.
Scanning attached devices...
Waiting for any device...
...found the following
Device \\?PnP?\Notification: state 20002
Scanning attached devices...
1: OMNIKEY CardMan 5x21 0
2: OMNIKEY CardMan 5x21-CL 0
Device OMNIKEY CardMan 5x21-CL 0: state :EMPTY
There is no card in the device.
Device OMNIKEY CardMan 5x21 0: state :EMPTY
There is no card in the device.
Device OMNIKEY CardMan 5x21-CL 0: state :PRESENT
There is a card in the device.
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
TS = 3B Direct Convention
T0 = 8F, Y(1): b8, K: 15 (historical bytes)
TA(1) = NIL TA(1) = NIL TC(1) = NIL TD(1) = 80
TA(2) = NIL TA(2) = NIL TC(2) = NIL TD(2) = 01
Historical bytes: 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00
Category indicator byte: 80 (compact TLV data object)
Tag: 4, Len: 15
Initial access data: 0C A0 00 00 03 06 03 00 01 00 00 00 00 "^L ..."Checksum = 6A
- Mifare Standard 1K (as per PCSC std part3)
- RFID - ISO 14443 Type A Part 3 (as per PCSC std part3)
- Philips MIFARE Standard (1 Kbytes EEPROM)
- http://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863]
- RFID - ISO 14443 Type A - Transport for London Oyster
- ACOS5/1k Mirfare
- RFID - ISO 14443 Type A - NXP Mifare card with 1k EEPROM
- vivotech ViVOcard Contactless Test Card
- Bangkok BTS Sky SmartPass
Device OMNIKEY CardMan 5x21-CL 0: state :EMPTY
There is no card in the device.
Device OMNIKEY CardMan 5x21 0: state :PRESENT
There is a card in the device.
ATR: 3B 6E 00 00 00 31 C0 65 D3 C1 02 01 28 71 D6 8C 61 33
TS = 3B Direct Convention
T0 = 6E, Y(1): b6, K: 14 (historical bytes)
Historical bytes: 00 00 00 31 C0 65 D3 C1 02 01 28 71 D6 8C
Category indicator byte: 00 (compact TLV data object)
Tag: 0, Len: 0
Value: ""
Tag: 0, Len: 0
Value: ""
Tag: 3, Len: 1
Card service data byte: C0
- Application selection: by full DF name
- Application selection: by partial DF name
- EF.DIR and EF.ATR access services: by GET RECORD(s) command
- Card with MF
Tag: 6, Len: 5
Data: D3 C1 02 01 28 "..^B^A("
Mandatory status indicator (3 last bytes)
LCS (life cycle status): 71 (Proprietary)
SW: D6 8C
Extra bytes: 61 33
- SberBank Silver Debit Card (VISA)
Device OMNIKEY CardMan 5x21 0: state :EMPTY
There is no card in the device.
Device \\?PnP?\Notification: state 10002
Device OMNIKEY CardMan 5x21-CL 0: state :UNAVAILABLE
This device is not available for use.
Scanning attached devices...
Waiting for any device...
...found the following
Device \\?PnP?\Notification: state 2
Device OMNIKEY CardMan 5x21 0: state :UNKNOWN
The given device name is not recognized by the Card Manager.
Scanning attached devices...
Waiting for any device...
Cancel smart card monitoring at 2013-Dec-25 13:50:09.
Aborted monitoring at 2013-Dec-25 13:50:09.