PCSC sample in Prolog

Here is the PCSC sample in Prolog language I promised in PC/SC sample in different languages.

Renaud Mariana wrote a PC/SC wrapper for GNU Prolog. The latest version is 1.01 dated 2003 and is available in GNU Prolog contributions PC/SC Lite interface for GNU Prolog.

Installation


You first need to install GNU Prolog:

apt-get install gprolog

Then apply some patches to the wrapper project, see my mail in the users-prolog mailing list. Then the compilation succeeds without any problem.

gplpcsc/contribs/gplpcsc$ make
gplc -c -C "-Wall -g `pkg-config --cflags libpcsclite`" pcsc/muscle_c.c
gplc -o testapdu pcsc/muscle_c.o -L "`pkg-config --libs libpcsclite` -lcrypto -lpthread" testapdu.pl util_pcsc/util.pl

Source code


:- include('pcsc/muscle').

start :-
scard_establish_context,
scard_connect,

% print ATR data
scard_status(_, Atr),
print('ATR: '), print_hex_list(Atr), nl,

% enable trace
scard_enable_verbose(true),

Commande = [0,0xA4,4,0,0x0A,0xA0,0,0,0,0x62,3,1,0x0C,6,1],
scard_transmit(Commande, _ApduOut1, _Sw1, _Time1),

print_hex_list(_ApduOut1),
print_hex_list(_Sw1), nl,

scard_transmit([0,0,0,0,0], _ApduOut2, _Sw2, _Time2),

print_hex_list(_ApduOut2),
print_hex_list(_Sw2), nl,
print_ASCII_list(_ApduOut2), nl.

print_ASCII_list(L) :-
( list(L) ->
print('['), '$print_ASCII_list'(L,[]), print(']')
;
print('print_ASCII_list error, argument is not a list')
).

'$print_ASCII_list' --> [], !.
'$print_ASCII_list' --> [A], { format('%c',[A]) },
'$print_ASCII_list'.

:- initialization(start).

Output


ATR: [3B FA 94 00 00 81 31 20 43 80 65 A2 01 01 01 3D 72 D6 43 21 ]
tr: 00a404000aa00000006203010c0601 - 9000, t= 15ms.
[][90 00 ]
tr: 0000000000 - 48656c6c6f20776f726c64219000, t= 23ms.
[48 65 6C 6C 6F 20 77 6F 72 6C 64 21 ][90 00 ]
[Hello world!]
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?-

Conclusion


Nothing more to add. If you are a Prolog user you may be interested by this wrapper.


Flattr this
Previous
Next Post »