gnupg ccid-driver interoperability

This commit is contained in:
NIIBE Yutaka
2010-11-12 23:19:27 +09:00
parent 9ed509951c
commit f849e12d0c
3 changed files with 44 additions and 12 deletions

View File

@@ -1,3 +1,14 @@
2010-11-12 NIIBE Yutaka <gniibe@fsij.org>
* src/usb_desc.c (gnukConfigDescriptor): Change dwFeatures.
* src/usb-icc.c (icc_send_params): Always return fixed result.
(icc_handle_data): Support ICC_GET_PARAMS.
2010-11-10 NIIBE Yutaka <gniibe@fsij.org>
* src/usb_desc.c (gnukConfigDescriptor): Fix bmAttributes.
2010-11-09 NIIBE Yutaka <gniibe@fsij.org> 2010-11-09 NIIBE Yutaka <gniibe@fsij.org>
* Version 0.4. * Version 0.4.

View File

@@ -31,14 +31,15 @@
#include "hw_config.h" #include "hw_config.h"
#include "usb_istr.h" #include "usb_istr.h"
#define ICC_SET_PARAMS 0x61 #define ICC_SET_PARAMS 0x61 /* non-ICCD command */
#define ICC_POWER_ON 0x62 #define ICC_POWER_ON 0x62
#define ICC_POWER_OFF 0x63 #define ICC_POWER_OFF 0x63
#define ICC_SLOT_STATUS 0x65 #define ICC_SLOT_STATUS 0x65 /* non-ICCD command */
#define ICC_GET_PARAMS 0x6C /* non-ICCD command */
#define ICC_XFR_BLOCK 0x6F #define ICC_XFR_BLOCK 0x6F
#define ICC_DATA_BLOCK_RET 0x80 #define ICC_DATA_BLOCK_RET 0x80
#define ICC_SLOT_STATUS_RET 0x81 #define ICC_SLOT_STATUS_RET 0x81 /* non-ICCD result */
#define ICC_SET_PARAMS_RET 0x82 #define ICC_PARAMS_RET 0x82 /* non-ICCD result */
#define ICC_MSG_SEQ_OFFSET 6 #define ICC_MSG_SEQ_OFFSET 6
#define ICC_MSG_STATUS_OFFSET 7 #define ICC_MSG_STATUS_OFFSET 7
@@ -337,12 +338,23 @@ icc_send_data_block (uint8_t status, uint8_t error, uint8_t chain,
static void static void
icc_send_params (void) icc_send_params (void)
{ {
memcpy (icc_tx_data, icc_rcv_data, icc_tx_data[0] = ICC_PARAMS_RET;
ICC_MSG_HEADER_SIZE + icc_header->data_len); icc_tx_data[1] = 0x07; /* Length = 0x00000007 */
icc_tx_data[0] = ICC_SET_PARAMS_RET; icc_tx_data[2] = 0;
icc_tx_data[3] = 0;
icc_tx_data[4] = 0;
icc_tx_data[5] = 0x00; /* Slot */
icc_tx_data[ICC_MSG_SEQ_OFFSET] = icc_seq;
icc_tx_data[ICC_MSG_STATUS_OFFSET] = 0; icc_tx_data[ICC_MSG_STATUS_OFFSET] = 0;
icc_tx_data[ICC_MSG_ERROR_OFFSET] = 0; icc_tx_data[ICC_MSG_ERROR_OFFSET] = 0;
icc_tx_data[ICC_MSG_CHAIN_OFFSET] = icc_rcv_data[7]; icc_tx_data[ICC_MSG_CHAIN_OFFSET] = 0x01; /* ProtocolNum: T=1 */
icc_tx_data[ICC_MSG_DATA_OFFSET] = 0x11; /* bmFindexDindex */
icc_tx_data[ICC_MSG_DATA_OFFSET+1] = 0x11; /* bmTCCKST1 */
icc_tx_data[ICC_MSG_DATA_OFFSET+2] = 0xFE; /* bGuardTimeT1 */
icc_tx_data[ICC_MSG_DATA_OFFSET+3] = 0x55; /* bmWaitingIntegersT1 */
icc_tx_data[ICC_MSG_DATA_OFFSET+4] = 0x03; /* bClockStop */
icc_tx_data[ICC_MSG_DATA_OFFSET+5] = 0xFE; /* bIFSC */
icc_tx_data[ICC_MSG_DATA_OFFSET+6] = 0; /* bNadValue */
if (!icc_tx_ready ()) if (!icc_tx_ready ())
{ /* not ready to send */ { /* not ready to send */
@@ -414,7 +426,8 @@ icc_handle_data (void)
icc_error (ICC_OFFSET_PARAM); icc_error (ICC_OFFSET_PARAM);
} }
} }
else if (icc_header->msg_type == ICC_SET_PARAMS) else if (icc_header->msg_type == ICC_SET_PARAMS
|| icc_header->msg_type == ICC_GET_PARAMS)
icc_send_params (); icc_send_params ();
else else
{ {

View File

@@ -45,7 +45,11 @@ static const uint8_t gnukConfigDescriptor[] = {
NUM_INTERFACES, /* bNumInterfaces: */ NUM_INTERFACES, /* bNumInterfaces: */
0x01, /* bConfigurationValue: Configuration value */ 0x01, /* bConfigurationValue: Configuration value */
0x00, /* iConfiguration: Index of string descriptor describing the configuration */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */
#if defined(USB_SELF_POWERED)
0xC0, /* bmAttributes: self powered */ 0xC0, /* bmAttributes: self powered */
#else
0x80, /* bmAttributes: bus powered */
#endif
50, /* MaxPower 100 mA */ 50, /* MaxPower 100 mA */
/* Interface Descriptor */ /* Interface Descriptor */
@@ -76,15 +80,19 @@ static const uint8_t gnukConfigDescriptor[] = {
0, 0, 0, 0, /* dwSynchProtocols: FIXED VALUE */ 0, 0, 0, 0, /* dwSynchProtocols: FIXED VALUE */
0, 0, 0, 0, /* dwMechanical: FIXED VALUE */ 0, 0, 0, 0, /* dwMechanical: FIXED VALUE */
#ifdef DEBUG #ifdef DEBUG
0x80, 0x04, 0x04, 0x00, /* dwFeatures: 0x82, 0x04, 0x04, 0x00, /* dwFeatures:
* Short and extended APDU level: 0x40000 * Short and extended APDU level: 0x40000
* Automatic IFSD : 0x00400 * Automatic IFSD : 0x00400
* Automatic PPS CUR : 0x00080 * Automatic PPS CUR : 0x00080
*
* Automatic conf. based on ATR : 0x00002
*/ */
#else #else
0x40, 0x00, 0x04, 0x00, /* dwFeatures: 0x42, 0x00, 0x04, 0x00, /* dwFeatures:
* Short and extended APDU level: 0x40000 * Short and extended APDU level: 0x40000
* Automatic PPS PROP : 0x00040 * Automatic PPS PROP : 0x00040
*
* Automatic conf. based on ATR : 0x00002
*/ */
#endif #endif
0x40, 0x00, 0, 0, /* dwMaxCCIDMessageLength: 64 */ 0x40, 0x00, 0, 0, /* dwMaxCCIDMessageLength: 64 */
@@ -207,7 +215,7 @@ static const uint8_t gnukStringSerial[] = {
8*2+2, /* bLength */ 8*2+2, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'2', 0, '0', 0, '1', 0, '0', 0, '2', 0, '0', 0, '1', 0, '0', 0,
'1', 0, '1', 0, '0', 0, '9', 0 '1', 0, '1', 0, '1', 0, '2', 0
}; };
const ONE_DESCRIPTOR Device_Descriptor = { const ONE_DESCRIPTOR Device_Descriptor = {