David Corcoran wrote:
> 
> Hello,
> 
> Well, I have written a hot_plug plugin for pcsc-lite for USB and a quick
> driver for a USB reader.  I will probably make a release of the new
> pcsc-lite with USB support next week.
> 
> Also, I'm going to begin releasing RPM's and source from the website and I
> have about 5 different test platforms.  Is there anyone out there that
> would like to provide a PC/SC API automated test that tries to send bogus
> and non-bogus commands to the PC/SC API and does it also under Windows ?
> I feel that I'm a bit too biased to create this test and it would really
> help checking builds before release.

I can't promise I will find the time to build a full testing program but
here is a little contribution :

I have a small program (in attachment) that :
- connects to a reader and shares its connection.
- reconnects to the same reader performing a reset (but still shares the
reader)
- set a transaction on the reader
- waits a fair amount of time (15 sec)
- sends some data
- end the transaction and leave the card untouched...
- closes up every thing (connection, context, etc...) but leave the card
untouched.

Then when I run this piece of code concurently. (say A first then B one
or 2 seconds after A) :
- B gives up with setting up the transaction as A has a lock on the
reader (timeout)
- however B has successfully reseted the card with reconnect()
- A wakes up and tries to send data but complains the reader has gone
reset (which is true)...

Two questions about this :
- shouldn't Reconnect() fails with E_SHARING_VIOLATION when B attempt to
reconnect and reset a temporarily locked reader ?
- does Windows behaves in a similar way ? <- if so then I suppose it is
a normal feature but still what is allowed/disallowed while a
transaction is on is fuzzy.

...

This mail is already long enough so I believe I can consume some extra
bytes and add a few words to appologize for being so descriptive... most
of you have probably hit the delete button already... many thanks to
those who didn't ;o)

-- 
Lionel VICTOR - Security Engineer, Gemplus Software.
#include <unistd.h>
#include <winscard.h>
#include <stdio.h>

int main () {
	SCARDCONTEXT hContext;
	LONG         nError;
	SCARDHANDLE  hCard;
	DWORD        nProto;
	BYTE s[7], r[20];
	DWORD dwSendLength, dwRecvLength;
	SCARD_IO_REQUEST sRecvPci;

	// Getting the context
	nError = SCardEstablishContext (SCARD_SCOPE_GLOBAL, NULL, NULL, &hContext);
	if (nError != SCARD_S_SUCCESS) {
		fprintf (stderr, "Can't establish the context : %s\n", pcsc_stringify_error(nError));
		exit(0);
	}
	nError = SCardConnect (hContext, "GCR410 0 0", SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, &hCard, &nProto);
	if (nError != SCARD_S_SUCCESS) {
		fprintf (stderr, "Can't connect to the card : %s\n", pcsc_stringify_error(nError));
		exit(0);
	}
	nError = SCardReconnect (hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, SCARD_RESET_CARD, &nProto);
	if (nError != SCARD_S_SUCCESS) {
		fprintf (stderr, "Can't reset the card : %s\n", pcsc_stringify_error(nError));
		exit(0);
	}
	nError = SCardBeginTransaction (hCard);
	if (nError != SCARD_S_SUCCESS) {
		fprintf (stderr, "Can't initiate transaction : %s\n", pcsc_stringify_error(nError));
		exit(0);
	}
	sleep (15);

	s[0] = 0x00;  s[1] = 0xA4;
	s[2] = 0x01;  s[3] = 0x00;
	s[4] = 0x02;  s[5] = 0x10;
	s[6] = 0x00;  dwSendLength = 7;

	nError = SCardTransmit (hCard, SCARD_PCI_T0, s, dwSendLength, &sRecvPci, r, &dwRecvLength);
	if (nError != SCARD_S_SUCCESS) {
		fprintf (stderr, "Can't initiate transaction : %s\n", pcsc_stringify_error(nError));
		exit(0);
	}
	fprintf (stdout, "Received %X%X\n", r[0], r[1]);
	SCardEndTransaction (hCard, SCARD_LEAVE_CARD);
	SCardDisconnect (hCard, SCARD_LEAVE_CARD);
	SCardReleaseContext (hContext);
}

/* End of File */

Reply via email to