- Timestamp:
- 01/10/08 08:35:21 (4 years ago)
- File:
-
- 1 edited
-
trunk/src/ifd/ifd-rutoken.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifd/ifd-rutoken.c
r1010 r1012 3 3 * 4 4 * Copyright (C) 2007, Pavel Mironchik <rutoken@rutoken.ru> 5 * Copyright (C) 2007, Eugene Hermann <e_herman@ tut.by>5 * Copyright (C) 2007, Eugene Hermann <e_herman@rutoken.ru> 6 6 */ 7 7 8 #include <unistd.h> 9 #include <string.h> 8 10 #include "internal.h" 9 #include "stdio.h"10 #include "unistd.h"11 #include "string.h"12 11 13 12 #define MAX_BUF_T0_LEN 256 14 13 #define T0_HDR_LEN 5 15 16 14 17 15 #define USB_ICC_POWER_ON 0x62 … … 32 30 { 33 31 ifd_device_t *dev; 32 ifd_device_params_t params; 33 34 34 ifd_debug(1, "rutoken_open - %s\n", device_name); 35 35 ifd_debug(1, "%s:%d rutoken_open()", __FILE__, __LINE__); 36 36 37 reader->name = "ruToken driver .\n";37 reader->name = "ruToken driver"; 38 38 reader->nslots = 1; 39 39 if (!(dev = ifd_device_open(device_name))) … … 46 46 } 47 47 48 params = dev->settings; 49 params.usb.interface = 0; 50 if (ifd_device_set_parameters(dev, ¶ms) < 0) { 51 ct_error("ruToken driver: setting parameters failed", device_name); 52 ifd_device_close(dev); 53 return -1; 54 } 55 48 56 reader->device = dev; 49 57 dev->timeout = 1000; … … 65 73 } 66 74 67 // Get Status 0 - OK 68 // - ERROR 69 // 70 int rutoken_getstatus(ifd_reader_t * reader, char *status) 71 { 72 // TODO Chech for timeout 75 static int rutoken_getstatus(ifd_reader_t * reader, unsigned char *status) 76 { 73 77 //ifd_debug(1, ""); 74 if(!ifd_usb_control(reader->device, 0xc1, USB_ICC_GET_STATUS, 0, 0, status, 1, 1000) < 0 ) 78 if(ifd_usb_control(reader->device, 0xc1, USB_ICC_GET_STATUS, 79 0, 0, status, 1, 1000) < 0 ) 75 80 return -1; 76 81 if((*status & 0xF0) == ICC_STATUS_BUSY_COMMON){ 82 unsigned char prev_status; 77 83 int i; 78 for(i = 0; i < 100000; i++) { 79 if(!ifd_usb_control(reader->device, 0xc1, USB_ICC_GET_STATUS, 0, 0, status, 1, 1000) < 0 ) 84 for(i = 0; i < 200; i++) { // 2 s (200 * 10 ms) 85 do { 86 usleep(10000); // 10 ms 87 prev_status = *status; 88 if(ifd_usb_control(reader->device, 0xc1, 89 USB_ICC_GET_STATUS, 0, 0, 90 status, 1, 1000) < 0 91 ) 80 92 return -1; 81 93 if((*status & 0xF0) != ICC_STATUS_BUSY_COMMON) 82 return 0;83 usleep(1000);94 return *status; 95 } while((((prev_status & 0x0F) + 1) & 0x0F) == (*status & 0x0F)); 84 96 } 85 97 return -1; … … 100 112 return -1; 101 113 } 102 char status;114 unsigned char status; 103 115 if( rutoken_getstatus(reader, &status) < 0) 104 116 { … … 110 122 memset(buf, 0, OUR_ATR_LEN); 111 123 112 nLen = ifd_usb_control(reader->device, 0xc1, USB_ICC_POWER_ON, 0, 0, buf, OUR_ATR_LEN, 1000); 124 nLen = ifd_usb_control(reader->device, 0xc1, USB_ICC_POWER_ON, 0, 0, 125 buf, OUR_ATR_LEN, 1000); 113 126 if( nLen < 0 ) 114 127 { … … 175 188 { 176 189 int ret; 177 char status;190 unsigned char status; 178 191 ifd_debug(3, "usb send %s len %d", ct_hexdump(buffer, len), len); 179 ret = ifd_usb_control(reader->device, 0x41, USB_ICC_XFR_BLOCK, 0, 0, (void *)buffer, len, -1); 192 ret = ifd_usb_control(reader->device, 0x41, USB_ICC_XFR_BLOCK, 0, 0, 193 (void *)buffer, len, -1); 180 194 181 195 if (rutoken_getstatus(reader, &status) < 0) … … 190 204 unsigned char *buffer, size_t len, long timeout) 191 205 { 192 char status;206 unsigned char status; 193 207 int ret = len; 194 208 // USB_ICC_DATA_BLOCK 195 if( (ret = ifd_usb_control(reader->device, 0xc1, USB_ICC_DATA_BLOCK, 0, 0, buffer, len, timeout)) >= 0) 209 if( (ret = ifd_usb_control(reader->device, 0xc1, USB_ICC_DATA_BLOCK, 0, 0, 210 buffer, len, timeout)) >= 0) 196 211 if (rutoken_getstatus(reader, &status) < 0) 197 212 { … … 225 240 // sbuf - APDU bufer 226 241 // slen 227 static int rutoken_send_tpducomand(ifd_reader_t * reader, int dad, const void *sbuf, size_t slen, void *rbuf, size_t rlen, int iscase4) 242 static int rutoken_send_tpducomand(ifd_reader_t * reader, int dad, const void *sbuf, 243 size_t slen, void *rbuf, size_t rlen, int iscase4) 228 244 { 229 245 ifd_debug(1, "send tpdu command %s, len: %d", ct_hexdump(sbuf, slen), slen); … … 278 294 if (rrecv < 0) 279 295 return -2; 280 ifd_debug(1, "Get TPDU Anser %s", ct_hexdump(rbuf, iso.le)); 296 ifd_debug(1, "Get TPDU Anser %s", 297 ct_hexdump(rbuf, iso.le)); 281 298 } 282 299 if (rutoken_recv_sw(reader, 0, sw) < 0) … … 290 307 memcpy(sbuftmp, sbuf, slen); 291 308 sbuftmp[4] = sw[1]; 292 return rutoken_send_tpducomand(reader, dad, sbuftmp, slen, rbuf, rlen, 0);293 }294 309 return rutoken_send_tpducomand(reader, dad, sbuftmp, 310 slen, rbuf, rlen, 0); 311 } 295 312 break; 296 313 case IFD_APDU_CASE_3S: … … 299 316 if(rutoken_getstatus(reader, &status) == ICC_STATUS_READY_DATA) 300 317 { 301 ifd_debug(1, "Send TPDU Data %s", ct_hexdump(iso.data, iso.lc)); 302 if (rutoken_send(reader, 0, iso.data, iso.lc) < 0) return -4; 318 ifd_debug(1, "Send TPDU Data %s", 319 ct_hexdump(iso.data, iso.lc)); 320 if (rutoken_send(reader, 0, iso.data, iso.lc) < 0) 321 return -4; 303 322 } else return -3; 304 323 // get sw … … 315 334 hdr[4] = lx ; //lx (case 2) 316 335 if(iscase4) 317 return rutoken_send_tpducomand(reader, dad, hdr, T0_HDR_LEN, rbuf, rlen, 0); 336 return rutoken_send_tpducomand(reader, dad, hdr, 337 T0_HDR_LEN, rbuf, rlen, 0); 318 338 else { 319 int recvtmp = rutoken_send_tpducomand(reader, dad, hdr, T0_HDR_LEN, rbuf, rlen, 0); 339 int recvtmp = rutoken_send_tpducomand(reader,dad, 340 hdr, T0_HDR_LEN, rbuf, rlen, 0); 320 341 rrecv = 0; 321 memcpy(sw, rbuf+recvtmp-2, 2);342 memcpy(sw, (unsigned char*)rbuf+recvtmp-2, 2); 322 343 break; 323 344 } … … 332 353 hdr[4] = iso.le; // le (case 2) 333 354 if(iscase4) 334 return rutoken_send_tpducomand(reader, dad, hdr, T0_HDR_LEN, rbuf, rlen, 0); 355 return rutoken_send_tpducomand(reader, dad, hdr, 356 T0_HDR_LEN, rbuf, rlen, 0); 335 357 } 336 358 // NOT STANDART TPDU!!! END … … 345 367 ifd_debug(1, "Recv %d bytes", rrecv); 346 368 return rrecv; 347 348 } 349 369 } 350 370 351 371 static int rutoken_transparent( ifd_reader_t * reader, int dad, … … 363 383 case IFD_APDU_CASE_2S: 364 384 case IFD_APDU_CASE_3S: 365 return rutoken_send_tpducomand(reader, dad, sbuf, slen, rbuf, rlen, 0); 385 return rutoken_send_tpducomand(reader, dad, sbuf, slen, 386 rbuf, rlen, 0); 366 387 break; 367 388 case IFD_APDU_CASE_4S: 368 389 // make send case 4 command 369 rrecv = rutoken_send_tpducomand(reader, dad, sbuf, slen-1, rbuf, rlen, 1); 390 rrecv = rutoken_send_tpducomand(reader, dad, sbuf, slen-1, 391 rbuf, rlen, 1); 370 392 return rrecv; 371 393 break; … … 391 413 ifd_driver_register("rutoken", &rutoken_driver); 392 414 } 415
Note: See TracChangeset
for help on using the changeset viewer.
