[Pcsclite-cvs-commit] r2069 - trunk/HandlerTest/Host

Ludovic Rousseau rousseau at costa.debian.org
Tue May 30 20:16:57 UTC 2006


Author: rousseau
Date: 2006-05-30 20:16:56 +0000 (Tue, 30 May 2006)
New Revision: 2069

Modified:
   trunk/HandlerTest/Host/handler_test.c
Log:
add -e for extended APDU


Modified: trunk/HandlerTest/Host/handler_test.c
===================================================================
--- trunk/HandlerTest/Host/handler_test.c	2006-05-26 14:32:15 UTC (rev 2068)
+++ trunk/HandlerTest/Host/handler_test.c	2006-05-30 20:16:56 UTC (rev 2069)
@@ -32,6 +32,8 @@
 
 #include "debug.h"
 
+#define CONTACTLESS
+
 #define LUN 0
 #define ENV_LIBNAME "LIB"
 
@@ -47,6 +49,8 @@
 	UCHAR s[], DWORD s_length,
 	UCHAR r[], PDWORD r_length,
 	UCHAR e[], int e_length);
+int extended_apdu(int lun);
+int short_apdu(int lun);
 
 #define DLSYM(func)  f.func = dlsym(lib_handle, "" # func); \
 	if (f.func == NULL) { \
@@ -87,6 +91,7 @@
 char apdu = FALSE;
 char t1 = FALSE;
 char stop_on_error = TRUE;
+char extended = FALSE;
 
 /* getopt(3) */
 extern char *optarg;
@@ -102,6 +107,7 @@
 	printf("  -2 : test CASE 2 APDU\n");
 	printf("  -3 : test CASE 3 APDU\n");
 	printf("  -4 : test CASE 4 APDU\n");
+	printf("  -e : test extended APDU\n");
 	printf("  -A : use APDU\n");
 	printf("  -T : use TPDU\n");
 	printf("  -Z : use T=1 instead of default T=0\n");
@@ -128,7 +134,7 @@
 	int opt;
 	char *device_name = NULL;
 
-	while ((opt = getopt(argc, argv, "ft:1234ATZn")) != EOF)
+	while ((opt = getopt(argc, argv, "ft:1234ATZne")) != EOF)
 	{
 		switch (opt)
 		{
@@ -140,6 +146,11 @@
 				printf("test case: %c\n", opt);
 				break;
 
+			case 'e':
+				extended = TRUE;
+				printf("text extended APDU\n");
+				break;
+
 			case 'f':
 				full = TRUE;
 				printf("Full test (all APDU sizes)\n");
@@ -255,17 +266,9 @@
 
 int handler_test(int lun, int channel, char device_name[])
 {
-	int rv, i, len_i, len_o;
+	int rv;
 	UCHAR atr[MAX_ATR_SIZE];
 	DWORD atrlength;
-	UCHAR s[MAX_BUFFER_SIZE], r[MAX_BUFFER_SIZE];
-	DWORD dwSendLength, dwRecvLength;
-	SCARD_IO_HEADER SendPci, RecvPci;
-	UCHAR e[MAX_BUFFER_SIZE];	// expected result
-	int e_length;	// expected result length
-	char *text = NULL;
-	int time;
-	int start, end;
 
 	if (device_name)
 	{
@@ -341,11 +344,145 @@
 	if ((IFD_SUCCESS != rv) && (IFD_NOT_SUPPORTED != rv))
 		goto end;
 
+	if (extended)
+		extended_apdu(lun);
+	else
+		short_apdu(lun);
+
+end:
+	/* Close */
+	rv = f.IFDHCloseChannel(LUN);
+	PCSC_ERROR("IFDHCloseChannel");
+	if (rv != IFD_SUCCESS)
+		return 1;
+
+	return 0;
+} /* handler_test */
+
+int extended_apdu(int lun)
+{
+	int i, len_i, len_o;
+	SCARD_IO_HEADER SendPci, RecvPci;
+	UCHAR s[MAX_BUFFER_SIZE_EXTENDED], r[MAX_BUFFER_SIZE_EXTENDED];
+	DWORD dwSendLength, dwRecvLength;
+	UCHAR e[MAX_BUFFER_SIZE_EXTENDED];	// expected result
+	int e_length;	// expected result length
+	char *text = NULL;
+	int start, end;
+
 	memset(&SendPci, 0, sizeof(SendPci));
 	SendPci.Protocol = t1;
 
 	memset(&RecvPci, 0, sizeof(RecvPci));
 
+	if (cases & CASE2)
+	{
+		/* Case 2 */
+		text = "Case 2: CLA INS P1 P2 Le, L(Cmd) = 5";
+		start = end = 65535;
+		if (full)
+			start = 1;
+
+		for (len_i = start; len_i <= end; len_i++)
+		{
+#ifdef CONTACTLESS
+			s[0] = 0x00;
+			s[1] = 0xD6;
+			s[2] = 0x00;
+			s[3] = 0x00;
+#else
+			s[0] = 0x80;
+			s[1] = 0x12;
+			s[2] = 0x01;
+			s[3] = 0x80;
+#endif
+			s[4] = 0x00;	/* extended */
+			s[5] = len_i >> 8;
+			s[6] = len_i;
+
+			for (i=0; i<len_i; i++)
+				s[7+i] = i;
+
+			dwSendLength = len_i + 7;
+			dwRecvLength = sizeof(r);
+
+			e[0] = 0x90;
+			e[1] = 0x00;
+			e_length = 2;
+
+			if (exchange(text, lun, SendPci, &RecvPci,
+				s, dwSendLength, r, &dwRecvLength, e, e_length))
+				goto end;
+		}
+	}
+
+	if (cases & CASE3)
+	{
+		/* Case 3 */
+		/*
+		 * 252  (0xFC) is max size for one USB or GBP paquet
+		 * 256 (0x100) maximum, 1 minimum
+		 */
+		text = "Case 3: CLA INS P1 P2 Lc Data, L(Cmd) = 5 + Lc";
+		start = end = 65535;
+		if (full)
+			start = 1;
+
+		for (len_o = start; len_o <= end; len_o++)
+		{
+			char test_value = 0x42;
+
+#ifdef CONTACTLESS
+			s[0] = 0x00;
+			s[1] = 0xB0;
+			s[2] = 0x00;
+			s[3] = 0x00;
+#else
+			s[0] = 0x80;
+			s[1] = 0x00;
+			s[2] = 0x04;
+			s[3] = test_value;
+#endif
+			s[4] = 0x00;
+			s[5] = len_o >> 8;
+			s[6] = len_o;
+
+			dwSendLength = 7;
+			dwRecvLength = sizeof(r);
+
+			for (i=0; i<len_o; i++)
+				e[i] = test_value;
+			e[i++] = 0x90;
+			e[i++] = 0x00;
+			e_length = len_o+2;
+
+			if (exchange(text, lun, SendPci, &RecvPci,
+				s, dwSendLength, r, &dwRecvLength, e, e_length))
+				goto end;
+		}
+	}
+
+end:
+	return 0;
+} /* extended_apdu */
+
+int short_apdu(int lun)
+{
+	int i, len_i, len_o;
+	SCARD_IO_HEADER SendPci, RecvPci;
+	UCHAR s[MAX_BUFFER_SIZE], r[MAX_BUFFER_SIZE];
+	DWORD dwSendLength, dwRecvLength;
+	UCHAR e[MAX_BUFFER_SIZE];	// expected result
+	int e_length;	// expected result length
+	char *text = NULL;
+	int time;
+	int start, end;
+
+	memset(&SendPci, 0, sizeof(SendPci));
+	SendPci.Protocol = t1;
+
+	memset(&RecvPci, 0, sizeof(RecvPci));
+
 	/* Select applet */
 	text = "Select applet: ";
 	s[0] = 0x00;
@@ -727,14 +864,8 @@
 	}
 
 end:
-	/* Close */
-	rv = f.IFDHCloseChannel(LUN);
-	PCSC_ERROR("IFDHCloseChannel");
-	if (rv != IFD_SUCCESS)
-		return 1;
-
 	return 0;
-} /* handler_test */
+} /* short_apdu */
 
 char *ifd_error(int rv)
 {
@@ -798,6 +929,7 @@
 
 	rv = f.IFDHTransmitToICC(lun, SendPci, s, s_length, r, r_length, RecvPci);
 
+	log_msg(0, "Received %d (0x%04X) bytes", *r_length, *r_length);
 	log_xxd(0, "Received: ", r, *r_length);
 	if (rv)
 	{
@@ -814,6 +946,7 @@
 			return 1;
 	}
 
+#ifndef CONTACTLESS
 	/* check the received data */
 	for (i=0; i<e_length; i++)
 		if (r[i] != e[i])
@@ -824,6 +957,7 @@
 				return 1;
 			break;
 		}
+#endif
 
 	printf("--------> OK\n");
 




More information about the Pcsclite-cvs-commit mailing list