diff options
author | NIIBE Yutaka <[email protected]> | 2020-09-25 01:35:45 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-10-06 02:42:23 +0000 |
commit | 11d8d1e0505645f7d14bcc1c01d17a566e033705 (patch) | |
tree | 77e84fc8f6b7799cf94a0292233352c61e9b0704 | |
parent | scd: Fix CCID internal driver for interrupt transfer. (diff) | |
download | gnupg-11d8d1e0505645f7d14bcc1c01d17a566e033705.tar.gz gnupg-11d8d1e0505645f7d14bcc1c01d17a566e033705.zip |
scd: For SPR532, submit the ESCape command at initialization.
* scd/ccid-driver.c (ccid_vendor_specific_init): Submit the ESC
command for VENDOR_SCM.
(ccid_transceive_secure): Don't submit the ESC command every time.
--
Backport master commit of:
4fae55f8ee11b3f710524e5e8b8a91b159949f2d
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | scd/ccid-driver.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index c924edc4f..ff058d459 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -1266,9 +1266,10 @@ ccid_get_reader_list (void) static int ccid_vendor_specific_init (ccid_driver_t handle) { + int r = 0; + if (handle->id_vendor == VENDOR_VEGA && handle->id_product == VEGA_ALPHA) { - int r; /* * Vega alpha has a feature to show retry counter on the pinpad * display. But it assumes that the card returns the value of @@ -1280,12 +1281,19 @@ ccid_vendor_specific_init (ccid_driver_t handle) const unsigned char cmd[] = { '\xb5', '\x01', '\x00', '\x03', '\x00' }; r = send_escape_cmd (handle, cmd, sizeof (cmd), NULL, 0, NULL); - if (r != 0 && r != CCID_DRIVER_ERR_CARD_INACTIVE - && r != CCID_DRIVER_ERR_NO_CARD) - return r; + } + else if (handle->id_vendor == VENDOR_SCM) + { + DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n"); + r = send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3, + NULL, 0, NULL); } - return 0; + if (r != 0 && r != CCID_DRIVER_ERR_CARD_INACTIVE + && r != CCID_DRIVER_ERR_NO_CARD) + return r; + else + return 0; } @@ -3539,15 +3547,6 @@ ccid_transceive_secure (ccid_driver_t handle, return CCID_DRIVER_ERR_NOT_SUPPORTED; msg = send_buffer; - if (handle->id_vendor == VENDOR_SCM) - { - DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n"); - rc = send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3, - NULL, 0, NULL); - if (rc) - return rc; - } - msg[0] = cherry_mode? 0x89 : PC_to_RDR_Secure; msg[5] = 0; /* slot */ msg[6] = seqno = handle->seqno++; |