Blame src/ccid.h

Packit 9f0df5
/*
Packit 9f0df5
    ccid.h: CCID structures
Packit 9f0df5
    Copyright (C) 2003-2010   Ludovic Rousseau
Packit 9f0df5
Packit 9f0df5
    This library is free software; you can redistribute it and/or
Packit 9f0df5
    modify it under the terms of the GNU Lesser General Public
Packit 9f0df5
    License as published by the Free Software Foundation; either
Packit 9f0df5
    version 2.1 of the License, or (at your option) any later version.
Packit 9f0df5
Packit 9f0df5
    This library is distributed in the hope that it will be useful,
Packit 9f0df5
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 9f0df5
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 9f0df5
    Lesser General Public License for more details.
Packit 9f0df5
Packit 9f0df5
	You should have received a copy of the GNU Lesser General Public License
Packit 9f0df5
	along with this library; if not, write to the Free Software Foundation,
Packit 9f0df5
	Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit 9f0df5
*/
Packit 9f0df5
Packit 9f0df5
typedef struct
Packit 9f0df5
{
Packit 9f0df5
	/*
Packit 9f0df5
	 * CCID Sequence number
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned char *pbSeq;
Packit 9f0df5
	unsigned char real_bSeq;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * VendorID << 16 + ProductID
Packit 9f0df5
	 */
Packit 9f0df5
	int readerID;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Maximum message length
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned int dwMaxCCIDMessageLength;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Maximum IFSD
Packit 9f0df5
	 */
Packit 9f0df5
	int dwMaxIFSD;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Features supported by the reader (directly from Class Descriptor)
Packit 9f0df5
	 */
Packit 9f0df5
	int dwFeatures;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * PIN support of the reader (directly from Class Descriptor)
Packit 9f0df5
	 */
Packit 9f0df5
	char bPINSupport;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Display dimensions of the reader (directly from Class Descriptor)
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned int wLcdLayout;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Default Clock
Packit 9f0df5
	 */
Packit 9f0df5
	int dwDefaultClock;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Max Data Rate
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned int dwMaxDataRate;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Number of available slots
Packit 9f0df5
	 */
Packit 9f0df5
	char bMaxSlotIndex;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Slot in use
Packit 9f0df5
	 */
Packit 9f0df5
	char bCurrentSlotIndex;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * The array of data rates supported by the reader
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned int *arrayOfSupportedDataRates;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Read communication port timeout
Packit 9f0df5
	 * value is milliseconds
Packit 9f0df5
	 * this value can evolve dynamically if card request it (time processing).
Packit 9f0df5
	 */
Packit 9f0df5
	unsigned int readTimeout;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Card protocol
Packit 9f0df5
	 */
Packit 9f0df5
	int cardProtocol;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * bInterfaceProtocol (CCID, ICCD-A, ICCD-B)
Packit 9f0df5
	 */
Packit 9f0df5
	int bInterfaceProtocol;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * bNumEndpoints
Packit 9f0df5
	 */
Packit 9f0df5
	int bNumEndpoints;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * GemCore SIM PRO slot status management
Packit 9f0df5
	 * The reader always reports a card present even if no card is inserted.
Packit 9f0df5
	 * If the Power Up fails the driver will report IFD_ICC_NOT_PRESENT instead
Packit 9f0df5
	 * of IFD_ICC_PRESENT
Packit 9f0df5
	 */
Packit 9f0df5
	int dwSlotStatus;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * bVoltageSupport (bit field)
Packit 9f0df5
	 * 1 = 5.0V
Packit 9f0df5
	 * 2 = 3.0V
Packit 9f0df5
	 * 4 = 1.8V
Packit 9f0df5
	 */
Packit 9f0df5
	int bVoltageSupport;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * USB serial number of the device (if any)
Packit 9f0df5
	 */
Packit 9f0df5
	char *sIFD_serial_number;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * USB iManufacturer string
Packit 9f0df5
	 */
Packit 9f0df5
	char *sIFD_iManufacturer;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * USB bcdDevice
Packit 9f0df5
	 */
Packit 9f0df5
	int IFD_bcdDevice;
Packit 9f0df5
Packit 9f0df5
	/*
Packit 9f0df5
	 * Gemalto extra features, if any
Packit 9f0df5
	 */
Packit 9f0df5
	struct GEMALTO_FIRMWARE_FEATURES *gemalto_firmware_features;
Packit 9f0df5
Packit 9f0df5
#ifdef ENABLE_ZLP
Packit 9f0df5
	/*
Packit 9f0df5
	 * Zero Length Packet fixup (boolean)
Packit 9f0df5
	 */
Packit 9f0df5
	char zlp;
Packit 9f0df5
#endif
Packit Service bce6fb
	unsigned int dwNonStandardFlags;
Packit 9f0df5
} _ccid_descriptor;
Packit 9f0df5
Packit 9f0df5
/* Features from dwFeatures */
Packit 9f0df5
#define CCID_CLASS_AUTO_CONF_ATR	0x00000002
Packit 9f0df5
#define CCID_CLASS_AUTO_ACTIVATION	0x00000004
Packit 9f0df5
#define CCID_CLASS_AUTO_VOLTAGE		0x00000008
Packit 9f0df5
#define CCID_CLASS_AUTO_BAUD		0x00000020
Packit 9f0df5
#define CCID_CLASS_AUTO_PPS_PROP	0x00000040
Packit 9f0df5
#define CCID_CLASS_AUTO_PPS_CUR		0x00000080
Packit 9f0df5
#define CCID_CLASS_AUTO_IFSD		0x00000400
Packit 9f0df5
#define CCID_CLASS_CHARACTER		0x00000000
Packit 9f0df5
#define CCID_CLASS_TPDU				0x00010000
Packit 9f0df5
#define CCID_CLASS_SHORT_APDU		0x00020000
Packit 9f0df5
#define CCID_CLASS_EXTENDED_APDU	0x00040000
Packit 9f0df5
#define CCID_CLASS_EXCHANGE_MASK	0x00070000
Packit 9f0df5
Packit Service bce6fb
/* Features from the swNonStandardFlags */
Packit Service bce6fb
#define CCID_NON_STAND_OMK_3121_T1	0x00000001
Packit Service bce6fb
Packit 9f0df5
/* Features from bPINSupport */
Packit 9f0df5
#define CCID_CLASS_PIN_VERIFY		0x01
Packit 9f0df5
#define CCID_CLASS_PIN_MODIFY		0x02
Packit 9f0df5
Packit 9f0df5
/* See CCID specs ch. 4.2.1 */
Packit 9f0df5
#define CCID_ICC_PRESENT_ACTIVE		0x00	/* 00 0000 00 */
Packit 9f0df5
#define CCID_ICC_PRESENT_INACTIVE	0x01	/* 00 0000 01 */
Packit 9f0df5
#define CCID_ICC_ABSENT				0x02	/* 00 0000 10 */
Packit 9f0df5
#define CCID_ICC_STATUS_MASK		0x03	/* 00 0000 11 */
Packit 9f0df5
Packit 9f0df5
#define CCID_COMMAND_FAILED			0x40	/* 01 0000 00 */
Packit 9f0df5
#define CCID_TIME_EXTENSION			0x80	/* 10 0000 00 */
Packit 9f0df5
Packit 9f0df5
/* bInterfaceProtocol for ICCD */
Packit 9f0df5
#define PROTOCOL_CCID	0	/* plain CCID */
Packit 9f0df5
#define PROTOCOL_ICCD_A	1	/* ICCD Version A */
Packit 9f0df5
#define PROTOCOL_ICCD_B	2	/* ICCD Version B */
Packit 9f0df5
Packit 9f0df5
/* Product identification for special treatments */
Packit 9f0df5
#define GEMPC433	0x08E64433
Packit 9f0df5
#define GEMPCKEY	0x08E63438
Packit 9f0df5
#define GEMPCTWIN	0x08E63437
Packit 9f0df5
#define GEMPCPINPAD 0x08E63478
Packit 9f0df5
#define GEMCORESIMPRO 0x08E63480
Packit 9f0df5
#define GEMCORESIMPRO2 0x08E60000 /* Does NOT match a real VID/PID as new firmware release exposes same VID/PID */
Packit 9f0df5
#define GEMCOREPOSPRO 0x08E63479
Packit 9f0df5
#define GEMALTOPROXDU 0x08E65503
Packit 9f0df5
#define GEMALTOPROXSU 0x08E65504
Packit 9f0df5
#define GEMALTO_EZIO_CBP 0x08E634C3
Packit 9f0df5
#define CARDMAN3121	0x076B3021
Packit 9f0df5
#define LTC31		0x07830003
Packit 9f0df5
#define C3PO_LTC31_v2 0x07830006
Packit 9f0df5
#define SCR331DI	0x04E65111
Packit 9f0df5
#define SCR331DINTTCOM	0x04E65120
Packit 9f0df5
#define SDI010		0x04E65121
Packit 9f0df5
#define SEC1210	0x04241202
Packit 9f0df5
#define CHERRYXX33	0x046A0005
Packit 9f0df5
#define CHERRYST2000	0x046A003E
Packit 9f0df5
#define OZ776		0x0B977762
Packit 9f0df5
#define OZ776_7772	0x0B977772
Packit 9f0df5
#define SPR532		0x04E6E003
Packit 9f0df5
#define MYSMARTPAD	0x09BE0002
Packit 9f0df5
#define CHERRYXX44	0x046a0010
Packit 9f0df5
#define CL1356D		0x0B810200
Packit 9f0df5
#define REINER_SCT	0x0C4B0300
Packit 9f0df5
#define SEG			0x08E68000
Packit 9f0df5
#define BLUDRIVEII_CCID	0x1B0E1078
Packit 9f0df5
#define DELLSCRK    0x413C2101
Packit 9f0df5
#define DELLSK      0x413C2100
Packit 9f0df5
#define KOBIL_TRIBANK	0x0D463010
Packit 9f0df5
#define KOBIL_MIDENTITY_VISUAL	0x0D464289
Packit 9f0df5
#define VEGAALPHA   0x09820008
Packit 9f0df5
#define HPSMARTCARDKEYBOARD 0x03F01024
Packit 9f0df5
#define HP_CCIDSMARTCARDKEYBOARD 0x03F00036
Packit 9f0df5
#define KOBIL_IDTOKEN 0x0D46301D
Packit 9f0df5
#define FUJITSUSMARTKEYB 0x0BF81017
Packit 9f0df5
#define FEITIANR502DUAL 0x096E060D
Packit 9f0df5
#define MICROCHIP_SEC1100 0x04241104
Packit 9f0df5
#define CHERRY_KC1000SC 0x046A00A1
Packit 9f0df5
#define ElatecTWN4_CCID_CDC	0x09D80427
Packit 9f0df5
#define ElatecTWN4_CCID	0x09D80428
Packit 9f0df5
#define SCM_SCL011 0x04E65293
Packit 9f0df5
#define HID_AVIATOR	0x076B3A21
Packit 9f0df5
#define HID_OMNIKEY_5422 0x076B5422
Packit 9f0df5
#define HID_OMNIKEY_3X21 0x076B3031 /* OMNIKEY 3121 or 3021 or 1021 */
Packit 9f0df5
#define HID_OMNIKEY_6121 0x076B6632 /* OMNIKEY 6121 */
Packit 9f0df5
#define CHERRY_XX44	0x046A00A7 /* Cherry Smart Terminal xx44 */
Packit 9f0df5
#define FUJITSU_D323 0x0BF81024 /* Fujitsu Smartcard Reader D323 */
Packit 9f0df5
Packit 9f0df5
#define VENDOR_GEMALTO 0x08E6
Packit 9f0df5
#define GET_VENDOR(readerID) ((readerID >> 16) & 0xFFFF)
Packit 9f0df5
Packit 9f0df5
/*
Packit 9f0df5
 * The O2Micro OZ776S reader has a wrong USB descriptor
Packit 9f0df5
 * The extra[] field is associated with the last endpoint instead of the
Packit 9f0df5
 * main USB descriptor
Packit 9f0df5
 */
Packit 9f0df5
#define O2MICRO_OZ776_PATCH
Packit 9f0df5
Packit 9f0df5
/* Escape sequence codes */
Packit 9f0df5
#define ESC_GEMPC_SET_ISO_MODE		1
Packit 9f0df5
#define ESC_GEMPC_SET_APDU_MODE		2
Packit 9f0df5
Packit 9f0df5
/*
Packit 9f0df5
 * Possible values :
Packit 9f0df5
 * 3 -> 1.8V, 3V, 5V
Packit 9f0df5
 * 2 -> 3V, 5V, 1.8V
Packit 9f0df5
 * 1 -> 5V, 1.8V, 3V
Packit 9f0df5
 * 0 -> automatic (selection made by the reader)
Packit 9f0df5
 */
Packit 9f0df5
/*
Packit 9f0df5
 * The default is to start at 5V
Packit 9f0df5
 * otherwise we would have to parse the ATR and get the value of TAi (i>2) when
Packit 9f0df5
 * in T=15
Packit 9f0df5
 */
Packit 9f0df5
#define VOLTAGE_AUTO 0
Packit 9f0df5
#define VOLTAGE_5V 1
Packit 9f0df5
#define VOLTAGE_3V 2
Packit 9f0df5
#define VOLTAGE_1_8V 3
Packit 9f0df5
Packit 9f0df5
int ccid_open_hack_pre(unsigned int reader_index);
Packit 9f0df5
int ccid_open_hack_post(unsigned int reader_index);
Packit 9f0df5
void ccid_error(int log_level, int error, const char *file, int line,
Packit 9f0df5
	const char *function);
Packit 9f0df5
_ccid_descriptor *get_ccid_descriptor(unsigned int reader_index);
Packit 9f0df5
Packit 9f0df5
/* convert a 4 byte integer in USB format into an int */
Packit 9f0df5
#define dw2i(a, x) (unsigned int)((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x])
Packit 9f0df5
Packit 9f0df5
/* all the data rates specified by ISO 7816-3 Fi/Di tables */
Packit 9f0df5
#define ISO_DATA_RATES 10753, 14337, 15625, 17204, \
Packit 9f0df5
		20833, 21505, 23438, 25806, 28674, \
Packit 9f0df5
		31250, 32258, 34409, 39063, 41667, \
Packit 9f0df5
		43011, 46875, 52083, 53763, 57348, \
Packit 9f0df5
		62500, 64516, 68817, 71685, 78125, \
Packit 9f0df5
		83333, 86022, 93750, 104167, 107527, \
Packit 9f0df5
		114695, 125000, 129032, 143369, 156250, \
Packit 9f0df5
		166667, 172043, 215054, 229391, 250000, \
Packit 9f0df5
		344086
Packit 9f0df5
Packit 9f0df5
/* data rates supported by the secondary slots on the GemCore Pos Pro & SIM Pro */
Packit 9f0df5
#define GEMPLUS_CUSTOM_DATA_RATES 10753, 21505, 43011, 125000
Packit 9f0df5
Packit 9f0df5
/* data rates for GemCore SIM Pro 2 */
Packit 9f0df5
#define SIMPRO2_ISO_DATA_RATES 8709, 10322, 12403, 12500, \
Packit 9f0df5
		12903, 17204, 18750, 20645, 24806, \
Packit 9f0df5
		25000, 25806, 28125, 30967, 34408, \
Packit 9f0df5
		37500, 41290, 46875, 49612, 50000, \
Packit 9f0df5
		51612, 56250, 62500, 64516, 68817, \
Packit 9f0df5
		74418, 75000, 82580, 86021, 93750, \
Packit 9f0df5
		99224, 100000, 103225, 112500, 124031, \
Packit 9f0df5
		125000, 137634, 150000, 154838, 165161, \
Packit 9f0df5
		172043, 187500, 198449, 200000, 206451, \
Packit 9f0df5
		258064, 275268, 300000, 396899, 400000, \
Packit 9f0df5
		412903, 550537, 600000, 825806
Packit 9f0df5
Packit 9f0df5
/* Structure returned by Gemalto readers for the CCID Escape command 0x6A */
Packit 9f0df5
struct GEMALTO_FIRMWARE_FEATURES
Packit 9f0df5
{
Packit 9f0df5
	unsigned char	bLogicalLCDLineNumber;	/* Logical number of LCD lines */
Packit 9f0df5
	unsigned char	bLogicalLCDRowNumber;	/* Logical number of characters per LCD line */
Packit 9f0df5
	unsigned char	bLcdInfo;				/* b0 indicates if scrolling is available */
Packit 9f0df5
	unsigned char	bEntryValidationCondition;	/* See PIN_PROPERTIES */
Packit 9f0df5
Packit 9f0df5
	/* Here come the PC/SC bit features to report */
Packit 9f0df5
	unsigned char	VerifyPinStart:1;
Packit 9f0df5
	unsigned char	VerifyPinFinish:1;
Packit 9f0df5
	unsigned char	ModifyPinStart:1;
Packit 9f0df5
	unsigned char	ModifyPinFinish:1;
Packit 9f0df5
	unsigned char	GetKeyPressed:1;
Packit 9f0df5
	unsigned char	VerifyPinDirect:1;
Packit 9f0df5
	unsigned char	ModifyPinDirect:1;
Packit 9f0df5
	unsigned char	Abort:1;
Packit 9f0df5
Packit 9f0df5
	unsigned char	GetKey:1;
Packit 9f0df5
	unsigned char	WriteDisplay:1;
Packit 9f0df5
	unsigned char	SetSpeMessage:1;
Packit 9f0df5
	unsigned char	RFUb1:5;
Packit 9f0df5
Packit 9f0df5
	unsigned char	RFUb2[2];
Packit 9f0df5
Packit 9f0df5
	/* Additional flags */
Packit 9f0df5
	unsigned char	bTimeOut2:1;
Packit 9f0df5
	unsigned char	bListSupportedLanguages:1;	/* Reader is able to indicate
Packit 9f0df5
	   the list of supported languages through CCID-ESC 0x6B */
Packit 9f0df5
	unsigned char	bNumberMessageFix:1;	/* Reader handles correctly shifts
Packit 9f0df5
		made by bNumberMessage in PIN modification data structure */
Packit 9f0df5
	unsigned char	bPPDUSupportOverXferBlock:1;	/* Reader supports PPDU over
Packit 9f0df5
		PC_to_RDR_XferBlock command */
Packit 9f0df5
	unsigned char	bPPDUSupportOverEscape:1;	/* Reader supports PPDU over
Packit 9f0df5
		PC_to_RDR_Escape command with abData[0]=0xFF */
Packit 9f0df5
	unsigned char	RFUb3:3;
Packit 9f0df5
Packit 9f0df5
	unsigned char	RFUb4[3];
Packit 9f0df5
Packit 9f0df5
	unsigned char	VersionNumber;	/* ?? */
Packit 9f0df5
	unsigned char	MinimumPINSize;	/* for Verify and Modify */
Packit 9f0df5
	unsigned char	MaximumPINSize;
Packit 9f0df5
Packit 9f0df5
	/* Miscellaneous reader features */
Packit 9f0df5
	unsigned char	Firewall:1;
Packit 9f0df5
	unsigned char	RFUb5:7;
Packit 9f0df5
Packit 9f0df5
	/* The following fields, FirewalledCommand_SW1 and
Packit 9f0df5
	 * FirewalledCommand_SW2 are only valid if Firewall=1
Packit 9f0df5
	 * These fields give the SW1 SW2 value used by the reader to
Packit 9f0df5
	 * indicate a command has been firewalled */
Packit 9f0df5
	unsigned char	FirewalledCommand_SW1;
Packit 9f0df5
	unsigned char	FirewalledCommand_SW2;
Packit 9f0df5
	unsigned char	RFUb6[3];
Packit 9f0df5
};
Packit 9f0df5