Blame src/ccid.h

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