/* ccid.h: CCID structures Copyright (C) 2003 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Id: ccid.h 2685 2007-11-15 23:10:36Z rousseau $ */ typedef struct { /* * CCID Sequence number */ unsigned char *pbSeq; unsigned char real_bSeq; /* * VendorID << 16 + ProductID */ int readerID; /* * Maximum message length */ unsigned int dwMaxCCIDMessageLength; /* * Maximum IFSD */ int dwMaxIFSD; /* * Features supported by the reader (directly from Class Descriptor) */ int dwFeatures; /* * PIN support of the reader (directly from Class Descriptor) */ char bPINSupport; /* * Default Clock */ int dwDefaultClock; /* * Max Data Rate */ unsigned int dwMaxDataRate; /* * Number of available slots */ char bMaxSlotIndex; /* * Slot in use */ char bCurrentSlotIndex; /* * The array of data rates supported by the reader */ unsigned int *arrayOfSupportedDataRates; /* * Read communication port timeout * value is seconds * this value can evolve dynamically if card request it (time processing). */ unsigned int readTimeout; /* * Card protocol */ int cardProtocol; /* * bInterfaceProtocol (CCID, ICCD-A, ICCD-B) */ int bInterfaceProtocol; } _ccid_descriptor; /* Features from dwFeatures */ #define CCID_CLASS_AUTO_CONF_ATR 0x00000002 #define CCID_CLASS_AUTO_VOLTAGE 0x00000008 #define CCID_CLASS_AUTO_BAUD 0x00000020 #define CCID_CLASS_AUTO_PPS_PROP 0x00000040 #define CCID_CLASS_AUTO_PPS_CUR 0x00000080 #define CCID_CLASS_AUTO_IFSD 0x00000400 #define CCID_CLASS_CHARACTER 0x00000000 #define CCID_CLASS_TPDU 0x00010000 #define CCID_CLASS_SHORT_APDU 0x00020000 #define CCID_CLASS_EXTENDED_APDU 0x00040000 #define CCID_CLASS_EXCHANGE_MASK 0x00070000 /* Features from bPINSupport */ #define CCID_CLASS_PIN_VERIFY 0x01 #define CCID_CLASS_PIN_MODIFY 0x02 /* See CCID specs ch. 4.2.1 */ #define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */ #define CCID_ICC_PRESENT_INACTIVE 0x01 /* 00 0000 01 */ #define CCID_ICC_ABSENT 0x02 /* 00 0000 10 */ #define CCID_ICC_STATUS_MASK 0x03 /* 00 0000 11 */ #define CCID_COMMAND_FAILED 0x40 /* 01 0000 00 */ #define CCID_TIME_EXTENSION 0x80 /* 10 0000 00 */ /* bInterfaceProtocol for ICCD */ #define ICCD_A 1 /* ICCD Version A */ #define ICCD_B 2 /* ICCD Version B */ /* Product identification for special treatments */ #define GEMPC433 0x08E64433 #define GEMPCKEY 0x08E63438 #define GEMPCTWIN 0x08E63437 #define GEMPCPINPAD 0x08E63478 #define GEMCORESIMPRO 0x08E63480 #define GEMCOREPOSPRO 0x08E63479 #define CARDMAN3121 0x076B3021 #define LTC31 0x07830003 #define SCR331DI 0x04E65111 #define SCR331DINTTCOM 0x04E65120 #define SDI010 0x04E65121 #define CHERRYXX33 0x046A0005 #define CHERRYST2000 0x046A003E #define OZ776 0x0B977762 #define OZ776_7772 0x0B977772 #define SPR532 0x04E6E003 #define MYSMARTPAD 0x09BE0002 #define CHERRYXX44 0x046a0010 #define CL1356D 0x0B810200 #define REINER_SCT 0x0C4B0300 /* * The O2Micro OZ776S reader has a wrong USB descriptor * The extra[] field is associated with the last endpoint instead of the * main USB descriptor */ #define O2MICRO_OZ776_PATCH /* Escape sequence codes */ #define ESC_GEMPC_SET_ISO_MODE 1 #define ESC_GEMPC_SET_APDU_MODE 2 /* * Possible values : * 3 -> 1.8V, 3V, 5V * 2 -> 3V, 5V * 1 -> 5V only * 0 -> automatic (selection made by the reader) */ /* * To be safe we default to 5V * otherwise we would have to parse the ATR and get the value of TAi (i>2) when * in T=15 */ #define VOLTAGE_AUTO 0 #define VOLTAGE_5V 1 #define VOLTAGE_3V 2 #define VOLTAGE_1_8V 3 int ccid_open_hack(unsigned int reader_index); void ccid_error(int error, const char *file, int line, const char *function); _ccid_descriptor *get_ccid_descriptor(unsigned int reader_index); /* convert a 4 byte integer in USB format into an int */ #define dw2i(a, x) ((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x]) /* all the data rates specified by ISO 7816-3 Fi/Di tables */ #define ISO_DATA_RATES 10753, 14337, 15625, 17204, \ 20833, 21505, 23438, 25806, 28674, \ 31250, 32258, 34409, 39063, 41667, \ 43011, 46875, 52083, 53763, 57348, \ 62500, 64516, 68817, 71685, 78125, \ 83333, 86022, 93750, 104167, 107527, \ 114695, 125000, 129032, 143369, 156250, \ 166667, 172043, 215054, 229391, 250000, \ 344086 /* data rates supported by the secondary slots on the GemCore Pos Pro & SIM Pro */ #define GEMPLUS_CUSTOM_DATA_RATES 10753, 21505, 43011, 125000