ifd.h

00001 /*
00002  * Core functions of the IFD handler library
00003  *
00004  * Copyright (C) 2003, Olaf Kirch <okir@suse.de>
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,               /* older Gemplus protocol */
00030         IFD_PROTOCOL_GBP,               /* Gemplus block protocol */
00031         IFD_PROTOCOL_EUROCHIP,          /* Eurochip Countercard */
00032         IFD_PROTOCOL_TCL,               /* ISO 14443-4 T=CL */
00033         IFD_PROTOCOL_ESCAPE,            /* Virtual 'escape' protocol */
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;    /* address when using T=1 */
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         /* In case the IFD needs to keep state */
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         /* T=0 specific parameters */
00086         __IFD_PROTOCOL_T0_PARAM_BASE = IFD_PROTOCOL_T0 << 16,
00087 
00088         /* T=1 specific parameters */
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 /* Debugging macro */
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 /* OPENCT_IFD_H */

libp11, Copyright (C) 2005 Olaf Kirch <okir@lst.de>OpenSC-Project.org Logo