[Pcsclite-cvs-commit] r4886 - /trunk/Drivers/ccid/src/commands.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Sun Apr 18 18:53:28 UTC 2010


Author: rousseau
Date: Sun Apr 18 18:53:27 2010
New Revision: 4886

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4886
Log:
CmdXfrBlockCHAR_T0(): debug ICCD type A algorithm

Thanks to Alexander Abarzhi for the patch

Modified:
    trunk/Drivers/ccid/src/commands.c

Modified: trunk/Drivers/ccid/src/commands.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/commands.c?rev=4886&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/commands.c (original)
+++ trunk/Drivers/ccid/src/commands.c Sun Apr 18 18:53:27 2010
@@ -1802,6 +1802,7 @@
 	unsigned char tmp_buf[512];
 	unsigned int exp_len, in_len;
 	unsigned char ins, *in_buf;
+	unsigned char backup_len = *rcv_len;
 	RESPONSECODE return_value = IFD_SUCCESS;
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 
@@ -1842,40 +1843,48 @@
 		if (return_value != IFD_SUCCESS)
 			return return_value;
 
-		if ((0x20 != pcbuffer[0]) && (snd_len > 0))
-		{
-			/* continue sending the APDU */
-			return_value = CCID_Transmit(reader_index, snd_len, snd_buf, 0, 0);
-			if (return_value != IFD_SUCCESS)
-				return return_value;
-		}
-		else
-		{
-			if ((0x20 == pcbuffer[0]) && (*rcv_len > 2))
-				/* we will just read SW1-SW2 */
-				*rcv_len = 2;
-
-			return_value = CCID_Receive(reader_index, rcv_len, rcv_buf, NULL);
-			if (return_value != IFD_SUCCESS)
-				DEBUG_CRITICAL("CCID_Receive failed");
-
-			return return_value;
-		}
-
-		/* wait for ready */
+		if (0x10 == pcbuffer[0])
+		{
+			if (snd_len > 0)
+			{
+				/* continue sending the APDU */
+				return_value = CCID_Transmit(reader_index, snd_len, snd_buf,
+					0, 0);
+				if (return_value != IFD_SUCCESS)
+					return return_value;
+			}
+			else
+			{
+				/* read apdu data */
+				return_value = CCID_Receive(reader_index, rcv_len, rcv_buf,
+						NULL);
+				if (return_value != IFD_SUCCESS)
+					return return_value;
+			}
+		}
+
 		return_value = CmdGetSlotStatus(reader_index, pcbuffer);
 		if (return_value != IFD_SUCCESS)
 			return return_value;
 
-		if ((0x20 == pcbuffer[0]) && (*rcv_len > 2))
-			/* we will just read SW1-SW2 */
+		/* SW1-SW2 available */
+		if (0x20 == pcbuffer[0])
+		{
+			/* backup apdu data length */
+			/* if no data recieved before - backup length must be zero */
+			backup_len = (backup_len == *rcv_len) ? 0 : *rcv_len;
+
+			/* wait for 2 bytes (SW1-SW2) */
 			*rcv_len = 2;
 
-		/* read SW1-SW2 */
-		return_value = CCID_Receive(reader_index, rcv_len, rcv_buf, NULL);
-		if (return_value != IFD_SUCCESS)
-			DEBUG_CRITICAL("CCID_Receive failed");
-
+			return_value = CCID_Receive(reader_index, rcv_len,
+				rcv_buf + backup_len, NULL);
+			if (return_value != IFD_SUCCESS)
+				DEBUG_CRITICAL("CCID_Receive failed");
+
+			/* restore recieved length */
+			*rcv_len += backup_len;
+		}
 		return return_value;
 	}
 




More information about the Pcsclite-cvs-commit mailing list