scd: Fix CCID driver for SCM SPR332/SPR532.

* scd/ccid-driver.c (ccid_vendor_specific_pinpad_setup): New.
(ccid_vendor_specific_setup): Only send CLEAR_HALT.
(ccid_transceive_secure): Each time, use send_escape_cmd.

--

GnuPG-bug-id: 5297
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2021-04-08 13:41:28 +09:00
parent d82dae5d22
commit ab66c43575
1 changed files with 13 additions and 1 deletions

View File

@ -1288,13 +1288,23 @@ ccid_vendor_specific_init (ccid_driver_t handle)
static int
ccid_vendor_specific_setup (ccid_driver_t handle)
{
if (handle->id_vendor == VENDOR_SCM && handle->id_product == SCM_SPR532)
{
libusb_clear_halt (handle->idev, handle->ep_intr);
}
return 0;
}
static int
ccid_vendor_specific_pinpad_setup (ccid_driver_t handle)
{
if (handle->id_vendor == VENDOR_SCM && handle->id_product == SCM_SPR532)
{
DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n");
send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3,
NULL, 0, NULL);
libusb_clear_halt (handle->idev, handle->ep_intr);
}
return 0;
}
@ -3587,6 +3597,8 @@ ccid_transceive_secure (ccid_driver_t handle,
if (pininfo->fixedlen < 0 || pininfo->fixedlen >= 16)
return CCID_DRIVER_ERR_NOT_SUPPORTED;
ccid_vendor_specific_pinpad_setup (handle);
msg = send_buffer;
msg[0] = cherry_mode? 0x89 : PC_to_RDR_Secure;
msg[5] = 0; /* slot */