[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