source: trunk/src/ifd/ifd-etoken.c @ 1137

Revision 1137, 4.0 KB checked in by alonbl, 3 years ago (diff)

Allow driver to specify events to poll

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * eToken driver
3 *
4 * Copyright (C) 2003, Olaf Kirch <okir@suse.de>
5 *
6 * Based on information from the etoken driver by
7 * Andreas Jellinghaus <aj@dungeon.inka.de>.
8 */
9
10#include "internal.h"
11#include <stdlib.h>
12#include <string.h>
13
14#define ET_TIMEOUT      1000
15
16static int et_magic(ifd_device_t *);
17
18/*
19 * Initialize the device
20 */
21static int et_open(ifd_reader_t * reader, const char *device_name)
22{
23        ifd_device_t *dev;
24        ifd_device_params_t params;
25
26        reader->name = "Aladdin eToken PRO";
27        reader->nslots = 1;
28        if (!(dev = ifd_device_open(device_name)))
29                return -1;
30        if (ifd_device_type(dev) != IFD_DEVICE_TYPE_USB) {
31                ct_error("etoken: device %s is not a USB device", device_name);
32                ifd_device_close(dev);
33                return -1;
34        }
35
36        params = dev->settings;
37        params.usb.interface = 0;
38        if (ifd_device_set_parameters(dev, &params) < 0) {
39                ct_error("etoken: setting parameters failed", device_name);
40                ifd_device_close(dev);
41                return -1;
42        }
43
44        reader->device = dev;
45
46        return 0;
47}
48
49/* Some magic incantations copied from Andreas
50 * Jellinghaus' eToken driver
51 * */
52static int et_magic(ifd_device_t * dev)
53{
54        unsigned char cookie[] = { 0x00, 0x00, 0x01, 0x00, 0x88, 0x13 };
55        unsigned char buffer[256];
56
57        if (ifd_usb_control(dev, 0x40, 0x03, 0, 0, NULL, 0, -1) < 0
58            || ifd_usb_control(dev, 0xc0, 0x83, 0, 0, buffer, 13, -1) != 13
59            || ifd_usb_control(dev, 0x40, 0x02, 0, 0, cookie, sizeof(cookie),
60                               -1) < 0
61            || ifd_usb_control(dev, 0xc0, 0x82, 0, 0, buffer, 1, -1) != 1
62            || buffer[0] != 0)
63                return -1;
64
65        return 0;
66}
67
68/*
69 * Power up the reader
70 */
71static int et_activate(ifd_reader_t * reader)
72{
73        return 0;
74}
75
76static int et_deactivate(ifd_reader_t * reader)
77{
78        return -1;
79}
80
81/*
82 * Card status - always present
83 */
84static int et_card_status(ifd_reader_t * reader, int slot, int *status)
85{
86        *status = IFD_CARD_PRESENT;
87        return 0;
88}
89
90/*
91 * Reset - nothing to be done?
92 * We should do something to make it come back with all state zapped
93 */
94static int et_card_reset(ifd_reader_t * reader, int slot, void *atr,
95                         size_t size)
96{
97        ifd_device_t *dev = reader->device;
98        unsigned char buffer[256];
99        int rc, n, atrlen;
100
101        /* Request the ATR */
102        rc = ifd_usb_control(dev, 0x40, 0x01, 0, 0, NULL, 0, ET_TIMEOUT);
103        if (rc < 0)
104                goto failed;
105
106        /* Receive the ATR */
107        rc = ifd_usb_control(dev, 0xc0, 0x81, 0, 0, buffer, 0x23, ET_TIMEOUT);
108        if (rc <= 0)
109                goto failed;
110
111        n = buffer[0];
112        if (n + 1 > rc)
113                goto failed;
114        if (n > IFD_MAX_ATR_LEN)
115                goto failed;
116
117        if (n > size)
118                n = size;
119        atrlen = n;
120        memcpy(atr, buffer + 1, atrlen);
121
122        if (et_magic(dev) < 0)
123                goto failed;
124        return atrlen;
125
126      failed:
127        ct_error("etoken: failed to activate token");
128        return -1;
129}
130
131/*
132 * Send/receive routines
133 */
134static int et_send(ifd_reader_t * reader, unsigned int dad,
135                   const unsigned char *buffer, size_t len)
136{
137        return ifd_usb_control(reader->device, 0x40, 0x06, 0, 0,
138                               (void *)buffer, len, -1);
139}
140
141static int et_recv(ifd_reader_t * reader, unsigned int dad,
142                   unsigned char *buffer, size_t len, long timeout)
143{
144        return ifd_usb_control(reader->device, 0xc0, 0x86, 0, 0,
145                               buffer, len, timeout);
146}
147
148static int et_get_eventfd(ifd_reader_t * reader, short *events)
149{
150        ifd_debug(1, "called.");
151
152        return ifd_device_get_eventfd(reader->device, events);
153}
154
155static int et_event(ifd_reader_t * reader, int *status, size_t status_size)
156{
157        (void)reader;
158        (void)status;
159        (void)status_size;
160
161        ifd_debug(1, "called.");
162
163        return 0;
164}
165
166static int et_error(ifd_reader_t * reader)
167{
168        (void)reader;
169
170        ifd_debug(1, "called.");
171
172        return IFD_ERROR_DEVICE_DISCONNECTED;
173}
174
175/*
176 * Driver operations
177 */
178static struct ifd_driver_ops etoken_driver;
179
180/*
181 * Initialize this module
182 */
183void ifd_etoken_register(void)
184{
185        etoken_driver.open = et_open;
186        etoken_driver.activate = et_activate;
187        etoken_driver.deactivate = et_deactivate;
188        etoken_driver.card_status = et_card_status;
189        etoken_driver.card_reset = et_card_reset;
190        etoken_driver.send = et_send;
191        etoken_driver.recv = et_recv;
192        etoken_driver.get_eventfd = et_get_eventfd;
193        etoken_driver.event = et_event;
194        etoken_driver.error = et_error;
195
196        ifd_driver_register("etoken", &etoken_driver);
197}
Note: See TracBrowser for help on using the repository browser.