If you are a lisp user (whichever your preference is), you would already know S-expression is the best way to write DSL. I have been writing a library which allows you to read (in future write) a smart card via winscard or PCSC (it's not tested, though). You can download it from
here. It's still under development state so be aware the APIs or commands might be changed in future.
The simple use of this library is really simple, you only need to write a Scheme script and run it with
load.scm contained in the library. Let me introduce a simple script.
(import (rnrs)
(pcsc operations control) ;; for apdu-pretty-print
(pcsc shell commands)
(pcsc dictionary gp)
(srfi :39))
(establish-context)
(card-connect)
;; transmit a select command without any parameter
(select)
(define key #xFFFFFFFFFFFFFFFFFFFFFF) ;; your key must be here
(channel :security *security-level-mac*
:option #x55
:enc-key key
:mac-key key
:dek-key key)
(parameterize ((*tag-dictionary* *gp-dictionary*))
(print "applications")
(apdu-pretty-print (strip-return-code
(invoke-command get-status applications))))
(card-disconnect)
(release-context)
Looks really a Scheme code right? The commands are influenced by GPShell, so if you know it, it would be familiar for you. The result would be like this;
$ sash.exe -Lsrc -Lcontrib load.scm -f status.scm
applications
[Tag] E3: GlobalPlatform Registry related data
[Tag] 4F: AID
[Data] �0��: A0 00 00 00 30 80 00 00 00 04 A6 00 01
[Tag] 9F70: Life Cycle State
[Data] 07 01
[Tag] C5: Privileges
[Data] 00 00 00
[Tag] EA: TS 102 226 specific template
[Tag] 80
[Data]
[Tag] C4: Application's Executable Load File AID
[Data] A0 00 00 00 30 80 00 00 00 04 A6 00
[Tag] CC: Associated Security Domain AID
[Data] A0 00 00 01 51 00 00 00
... so on if you've got any result
The Sagittarius version must be 0.4.2 (current HEAD version) otherwise
apdu-pretty-print raises an error. The document is not really done yet. There are 2 ways to refer which command does what, 1 is looking up the code, the other one is starting the REPL and type
(help 'command) like this;
$ sash.exe -Lsrc -Lcontrib start.scm
pcsc> (help 'select)
select :key aid
Sends select command.
;; If you evaluate (help), the it will show all defined commands.
pcsc> (help)
help [command]
Show help message.
When [command] option is given, show the help of given command.
Following commands are defined:
card-connect
card-disconnect
card-readers
card-status
channel
close-channel
establish-context
exit
get-status
help
load-script
release-context
select
send-apdu
set-keys!
trace-off
trace-on
Note: even though it shows the help string, it is better to look up the code when you really want to understand for now. I will write the document later.
There are a lot of missing features such as DELETE commands or LOAD, INSTALL etc. I will add those eventually.
Again, it's still under development state, so your feedback and contribution are always welcome :-)