#!/usr/bin/perl
# single_reader.pl: test the pcsc Perl wrapper with one reader
# copyright (c) 2001 Lionel Victor, 2003 Ludovic Rousseau
#
# this program is free software; you can redistribute it and/or modify
# it under the terms of the gnu general public license as published by
# the free software foundation; either version 2 of the license, or
# (at your option) any later version.
#
# this program is distributed in the hope that it will be useful,
# but without any warranty; without even the implied warranty of
# merchantability or fitness for a particular purpose. see the
# gnu general public license for more details.
#
# you should have received a copy of the gnu general public license
# along with this program; if not, write to the free software
# foundation, inc., 59 temple place, suite 330, boston, ma 02111-1307 usa
# $Id: single_reader.pl,v 1.11 2006-08-12 17:35:54 rousseau Exp $
use ExtUtils::testlib;
use Chipcard::PCSC;
use Chipcard::PCSC::Card;
use warnings;
use strict;
#my $current_protocol;
#my @StatusResult;
my $hContext;
my @ReadersList;
my $hCard;
my @StatusResult;
my $tmpVal;
my $SendData;
my $RecvData;
#my @ConnectionContext;
#-------------------------------------------------------------------------------
print "Getting context:\n";
$hContext = new Chipcard::PCSC();
die ("Can't create the pcsc object: $Chipcard::PCSC::errno\n") unless (defined $hContext);
print '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
print "Retrieving readers'list:\n";
@ReadersList = $hContext->ListReaders ();
die ("Can't get readers' list: $Chipcard::PCSC::errno\n") unless (defined($ReadersList[0]));
$, = "\n ";
$" = "\n ";
print " @ReadersList\n" . '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
print "Connecting to the card:\n";
$hCard = new Chipcard::PCSC::Card ($hContext, $ReadersList[0]);
die ("Can't connect to the reader '$ReadersList[0]': $Chipcard::PCSC::errno\n") unless (defined($hCard));
print '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
if ($hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_T0 &&
$hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_T1 &&
$hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_RAW)
{
print "Don't understand the active protocol, reconnecting to the card:\n";
my $active_protocol = $hCard->Reconnect($Chipcard::PCSC::SCARD_SHARE_EXCLUSIVE,
$Chipcard::PCSC::SCARD_PROTOCOL_T1,
$Chipcard::PCSC::SCARD_RESET_CARD);
die ("Failed to reconnect to '$ReadersList[0]': $Chipcard::PCSC::errno\n") unless (defined($active_protocol));
if ($hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_T0 &&
$hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_T1 &&
$hCard->{dwProtocol}!=$Chipcard::PCSC::SCARD_PROTOCOL_RAW)
{
print "here is '$hCard->{dwProtocol}'";
die ("Still don't understand the active current protocol: the card may be mute.\n");
} else {
print '.'x40 . " OK\n";
}
}
#-------------------------------------------------------------------------------
print "Getting Status:\n";
@StatusResult = $hCard->Status ();
die ("Can't get card status: $Chipcard::PCSC::errno\n") unless (defined ($StatusResult[0]));
printf " ReaderName = %s\n Status = %X\n Protocol = %X\n ATR = ",
$StatusResult[0], $StatusResult[1], $StatusResult[2];
foreach $tmpVal (@{$StatusResult[3]}) {
printf ("%02X ", $tmpVal);
} print "\n";
print '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
print ("Exchanging data:\n");
$SendData = [0x00,0xA4,0x01,0x00, 0x02, 0x10, 0x00];
$RecvData = $hCard->Transmit($SendData);
die ("Can't transmit data: $Chipcard::PCSC::errno") unless (defined ($RecvData));
print " Send = ";
foreach $tmpVal (@{$SendData}) {
printf ("%02X ", $tmpVal);
} print "\n";
print " Recv = ";
foreach $tmpVal (@{$RecvData}) {
printf ("%02X ", $tmpVal);
} print "\n";
print '.'x40 . " OK\n";
# sleep (3);
#-------------------------------------------------------------------------------
# This test is commented since it is reader/driver specific and may do bad
# things for another reader. Reader your reader and driver
# specifications to know what data to use.
#
#print "Control:\n";
#$SendData = [ 0x02 ];
#$RecvData = $hCard->Control(0x42000001, $SendData);
#die ("Can't Control: $Chipcard::PCSC::errno") unless (defined ($RecvData));
#
#print " Send = ";
#foreach $tmpVal (@{$SendData}) {
# printf ("%02X ", $tmpVal);
#} print "\n";
#
#print " Recv = ";
#foreach $tmpVal (@{$RecvData}) {
# printf ("%02X ", $tmpVal);
#} print "\n";
#print '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
print "Disconnecting the card:\n";
$hCard->Disconnect($Chipcard::PCSC::SCARD_LEAVE_CARD);
undef $hCard;
print '.'x40 . " OK\n";
#-------------------------------------------------------------------------------
print "Closing context:\n";
$hContext = undef;
print '.'x40 . " OK\n";
# End of File #