Tuesday, June 8, 2010

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