scd: Better handling of timeout and time extension.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 4 Apr 2019 06:58:21 +0000 (15:58 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 4 Apr 2019 06:58:21 +0000 (15:58 +0900)
* scd/ccid-driver.c (CCID_CMD_TIMEOUT_LONGER): Remove.
(ccid_transceive): Don't use x4 blindly for bBWI, but use dynamically
determined value.  Use value from variable wait_more for bulk_in.
Set wait_more by the value of time extension request.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
scd/ccid-driver.c

index 69df173..dca8340 100644 (file)
 
 /* CCID command timeout.  */
 #define CCID_CMD_TIMEOUT (5*1000)
-/* OpenPGPcard v2.1 requires huge timeout for key generation.  */
-#define CCID_CMD_TIMEOUT_LONGER (60*1000)
 
 /* Depending on how this source is used we either define our error
    output to go to stderr or to the GnuPG based logging functions.  We
@@ -3094,7 +3092,7 @@ ccid_transceive (ccid_driver_t handle,
           msg[0] = PC_to_RDR_XfrBlock;
           msg[5] = 0; /* slot */
           msg[6] = seqno = handle->seqno++;
-          msg[7] = 4; /* bBWI */
+          msg[7] = (wait_more ? wait_more : 1); /* bBWI */
           msg[8] = 0; /* RFU */
           msg[9] = 0; /* RFU */
           set_msg_len (msg, tpdulen);
@@ -3120,7 +3118,7 @@ ccid_transceive (ccid_driver_t handle,
       msg = recv_buffer;
       rc = bulk_in (handle, msg, sizeof recv_buffer, &msglen,
                     via_escape? RDR_to_PC_Escape : RDR_to_PC_DataBlock, seqno,
-                    wait_more? CCID_CMD_TIMEOUT_LONGER: CCID_CMD_TIMEOUT, 0);
+                    (wait_more ? wait_more : 1) * CCID_CMD_TIMEOUT, 0);
       if (rc)
         return rc;
 
@@ -3150,6 +3148,7 @@ ccid_transceive (ccid_driver_t handle,
                     (!(msg[pcboff] & 0x80) && (msg[pcboff] & 0x20)?
                      " [more]":""));
 
+      wait_more = 0;
       if (!(tpdu[1] & 0x80))
         { /* This is an I-block. */
           retries = 0;
@@ -3295,9 +3294,7 @@ ccid_transceive (ccid_driver_t handle,
               /* Wait time extension request. */
               unsigned char bwi = tpdu[3];
 
-              /* Check if it's unusual value which can't be expressed in ATR.  */
-              if (bwi > 15)
-                wait_more = 1;
+             wait_more = bwi;
 
               msg = send_buffer;
               tpdu = msg + hdrlen;