00001
00002
00003
00004
00005
00006
00007 #ifndef OPENCT_IFD_H
00008 #define OPENCT_IFD_H
00009
00010 #ifdef __cplusplus
00011 extern "C" {
00012 #endif
00013
00014 #include <sys/types.h>
00015 #include <openct/openct.h>
00016 #include <openct/apdu.h>
00017
00018 typedef struct ifd_device ifd_device_t;
00019 typedef union ifd_device_params ifd_device_params_t;
00020
00021 enum {
00022 IFD_PROTOCOL_DEFAULT = -1,
00023 IFD_PROTOCOL_T0 = 0,
00024 IFD_PROTOCOL_T1,
00025 IFD_PROTOCOL_2WIRE = 16,
00026 IFD_PROTOCOL_3WIRE,
00027 IFD_PROTOCOL_I2C_SHORT,
00028 IFD_PROTOCOL_I2C_LONG,
00029 IFD_PROTOCOL_TLP,
00030 IFD_PROTOCOL_GBP,
00031 IFD_PROTOCOL_EUROCHIP,
00032 IFD_PROTOCOL_TCL,
00033 IFD_PROTOCOL_ESCAPE,
00034 IFD_PROTOCOL_TRANSPARENT = 128
00035 };
00036
00037 typedef struct ifd_protocol ifd_protocol_t;
00038
00039 typedef struct ifd_driver {
00040 const char * name;
00041 struct ifd_driver_ops * ops;
00042 } ifd_driver_t;
00043
00044 #define IFD_MAX_ATR_LEN 64
00045 typedef struct ifd_slot {
00046 unsigned int handle;
00047
00048 int status;
00049 time_t next_update;
00050
00051 unsigned char dad;
00052 unsigned int atr_len;
00053 unsigned char atr[IFD_MAX_ATR_LEN];
00054
00055 ifd_protocol_t * proto;
00056 void * reader_data;
00057 } ifd_slot_t;
00058
00059 typedef struct ifd_reader {
00060 unsigned int num;
00061 unsigned int handle;
00062
00063 const char * name;
00064 unsigned int flags;
00065 unsigned int nslots;
00066 ifd_slot_t slot[OPENCT_MAX_SLOTS];
00067
00068 const ifd_driver_t * driver;
00069 ifd_device_t * device;
00070 ct_info_t * status;
00071
00072
00073 void * driver_data;
00074 } ifd_reader_t;
00075
00076 #define IFD_READER_ACTIVE 0x0001
00077 #define IFD_READER_HOTPLUG 0x0002
00078 #define IFD_READER_DISPLAY 0x0100
00079 #define IFD_READER_KEYPAD 0x0200
00080
00081 enum {
00082 IFD_PROTOCOL_RECV_TIMEOUT = 0x0000,
00083 IFD_PROTOCOL_BLOCK_ORIENTED,
00084
00085
00086 __IFD_PROTOCOL_T0_PARAM_BASE = IFD_PROTOCOL_T0 << 16,
00087
00088
00089 __IFD_PROTOCOL_T1_PARAM_BASE = IFD_PROTOCOL_T1 << 16,
00090 IFD_PROTOCOL_T1_BLOCKSIZE,
00091 IFD_PROTOCOL_T1_CHECKSUM_CRC,
00092 IFD_PROTOCOL_T1_CHECKSUM_LRC,
00093 IFD_PROTOCOL_T1_IFSC,
00094 IFD_PROTOCOL_T1_IFSD,
00095 IFD_PROTOCOL_T1_STATE,
00096 IFD_PROTOCOL_T1_MORE
00097 };
00098
00099 enum {
00100 IFD_DAD_HOST = 0,
00101 IFD_DAD_IFD,
00102 IFD_DAD_ICC1,
00103 IFD_DAD_ICC2
00104 };
00105
00106
00107 extern int ifd_init(void);
00108
00109 extern ifd_reader_t * ifd_open(const char *driver_name,
00110 const char *device_name);
00111 extern void ifd_close(ifd_reader_t *);
00112 extern int ifd_reader_count(void);
00113 extern int ifd_attach(ifd_reader_t *);
00114 extern void ifd_detach(ifd_reader_t *);
00115 extern ifd_reader_t * ifd_reader_by_handle(unsigned int handle);
00116 extern ifd_reader_t * ifd_reader_by_index(unsigned int index);
00117
00118 extern int ifd_spawn_handler(const char *, const char *, int);
00119 extern int ifd_scan_usb(void);
00120
00121 extern int ifd_activate(ifd_reader_t *);
00122 extern int ifd_deactivate(ifd_reader_t *);
00123 extern int ifd_output(ifd_reader_t *, const char *);
00124
00125 extern int ifd_atr_complete(const unsigned char *, size_t);
00126
00127 extern int ifd_set_protocol(ifd_reader_t *reader,
00128 unsigned int slot,
00129 int id);
00130 extern int ifd_card_command(ifd_reader_t *reader,
00131 unsigned int slot,
00132 const void *sbuf, size_t slen,
00133 void *rbuf, size_t rlen);
00134 extern int ifd_card_status(ifd_reader_t *reader,
00135 unsigned int slot,
00136 int *status);
00137 extern int ifd_card_reset(ifd_reader_t *reader,
00138 unsigned int slot,
00139 void *atr_buf,
00140 size_t atr_len);
00141 extern int ifd_card_request(ifd_reader_t *reader,
00142 unsigned int slot,
00143 time_t timeout,
00144 const char *message,
00145 void *atr_buf,
00146 size_t atr_len);
00147 extern int ifd_card_eject(ifd_reader_t *reader,
00148 unsigned int slot,
00149 time_t timeout,
00150 const char *message);
00151 extern int ifd_card_perform_verify(ifd_reader_t *reader,
00152 unsigned int slot,
00153 time_t timeout,
00154 const char *message,
00155 const unsigned char *data, size_t data_len,
00156 unsigned char *resp, size_t resp_len);
00157 extern int ifd_card_read_memory(ifd_reader_t *,
00158 unsigned int, unsigned short,
00159 unsigned char *, size_t);
00160 extern int ifd_card_write_memory(ifd_reader_t *,
00161 unsigned int, unsigned short,
00162 const unsigned char *, size_t);
00163
00164 extern ifd_protocol_t * ifd_protocol_new(int id,
00165 ifd_reader_t *reader,
00166 unsigned int dad);
00167 extern int ifd_protocol_set_parameter(ifd_protocol_t *p,
00168 int type,
00169 long value);
00170 extern int ifd_protocol_get_parameter(ifd_protocol_t *p,
00171 int type,
00172 long *value);
00173 extern int ifd_protocol_read_memory(ifd_protocol_t *,
00174 int, unsigned short,
00175 unsigned char *, size_t);
00176 extern int ifd_protocol_write_memory(ifd_protocol_t *,
00177 int, unsigned short,
00178 const unsigned char *, size_t);
00179 extern void ifd_protocol_free(ifd_protocol_t *);
00180 extern int ifd_before_command(ifd_reader_t *);
00181 extern int ifd_after_command(ifd_reader_t *);
00182 extern int ifd_get_eventfd(ifd_reader_t *, short *);
00183 extern void ifd_poll(ifd_reader_t *);
00184 extern int id_event(ifd_reader_t *);
00185
00186
00187 #ifdef __GNUC__
00188 #define ifd_debug(level, fmt, args...) \
00189 do { \
00190 if ((level) <= ct_config.debug) \
00191 ct_debug("%s: " fmt, __FUNCTION__ , ##args); \
00192 } while (0)
00193 #else
00194 extern void ifd_debug(int level, const char *fmt, ...);
00195 #endif
00196
00197 #ifdef __cplusplus
00198 }
00199 #endif
00200
00201 #endif