Changeset 810 for branches/smartreader
- Timestamp:
- 12/12/09 19:24:49 (14 years ago)
- Location:
- branches/smartreader
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/Maketype
r792 r810 34 34 $(LIBFILE1)(reader-common.o) \ 35 35 $(LIBFILE1)(reader-irdeto.o) \ 36 $(LIBFILE1)(reader-pcsc.o) \ 36 37 $(LIBFILE1)(reader-viaccess.o) \ 37 38 $(LIBFILE1)(reader-videoguard2.o) \ -
branches/smartreader/globals.h
r808 r810 763 763 extern int reader_emm(EMM_PACKET *); 764 764 765 #ifdef HAVE_PCSC 766 // reader-pcsc 767 extern int pcsc_reader_do_api(struct s_reader *pcsc_reader, uchar *buf, uchar *cta_res, ushort *cta_lr,int l, int dbg); 768 extern int pcsc_activate_card(struct s_reader *pcsc_reader, uchar *atr, ushort *atr_size); 769 extern int pcsc_check_card_inserted(struct s_reader *pcsc_reader); 770 extern int pcsc_reader_init(struct s_reader *pcsc_reader, char *device); 771 #endif 772 765 773 // reader-irdeto 766 774 extern int irdeto_card_init(uchar *, int); -
branches/smartreader/reader-common.c
r808 r810 71 71 #ifdef HAVE_PCSC 72 72 if (reader[ridx].typ == R_PCSC) { 73 ULONG rv; 74 SCARD_IO_REQUEST pioRecvPci; 75 DWORD dwSendLength, dwRecvLength; 76 77 dwSendLength = l; 78 dwRecvLength = sizeof(cta_res); 79 80 //cs_ddump(buf, dwSendLength, "sending %d bytes to PCSC", dwSendLength); 81 82 if(reader[ridx].dwActiveProtocol == SCARD_PROTOCOL_T0) 83 rv = SCardTransmit(reader[ridx].hCard, SCARD_PCI_T0, buf, dwSendLength, &pioRecvPci, &cta_res, &dwRecvLength); 84 else if(reader[ridx].dwActiveProtocol == SCARD_PROTOCOL_T1) 85 rv = SCardTransmit(reader[ridx].hCard, SCARD_PCI_T1, buf, dwSendLength, &pioRecvPci, &cta_res, &dwRecvLength); 86 else { 87 cs_debug("PCSC invalid protocol (T=%d)", reader[ridx].dwActiveProtocol); 88 return ERR_INVALID; 89 } 90 91 cta_lr=dwRecvLength; 92 // cs_ddump(cta_res, cta_lr, "received %d bytes from PCSC with rv=%lx", cta_lr, rv); 93 94 cs_debug("PCSC doapi (%lx ) (T=%d)", rv, reader[ridx].dwActiveProtocol ); 95 if ( rv == SCARD_S_SUCCESS ){ 96 return OK; 97 } else { 98 return ERR_INVALID; 99 } 73 pcsc_reader_do_api(&reader[ridx], buf, cta_res, &cta_lr,l,dbg); 100 74 } 101 75 … … 156 130 #ifdef HAVE_PCSC 157 131 if (reader[ridx].typ == R_PCSC) { 158 cs_debug("PCSC initializing card in (%s)", &reader[ridx].pcsc_name); 159 ULONG rv; 160 DWORD dwState, dwAtrLen, dwReaderLen; 161 BYTE pbAtr[64]; 162 dwAtrLen = sizeof(pbAtr); 163 164 cs_debug("PCSC resetting card in (%s)", &reader[ridx].pcsc_name); 165 rv = SCardReconnect(reader[ridx].hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_RESET_CARD, &reader[ridx].dwActiveProtocol); 166 cs_debug("PCSC resetting done on card in (%s)", &reader[ridx].pcsc_name); 167 cs_debug("PCSC Protocol (T=%d)",reader[ridx].dwActiveProtocol); 168 169 if ( rv != SCARD_S_SUCCESS ) { 170 cs_debug("Error PCSC failed to reset card (%lx)", rv); 171 return(0); 172 } 173 174 rv=SCardBeginTransaction(reader[ridx].hCard); 175 if (rv!=SCARD_S_SUCCESS) { 176 cs_log("PCSC reader %s Failed to begin transaction", reader[ridx].pcsc_name); 177 return 0; 178 } 179 180 cs_debug("PCSC getting ATR for card in (%s)", &reader[ridx].pcsc_name); 181 rv = SCardStatus(reader[ridx].hCard, NULL, &dwReaderLen, &dwState, &reader[ridx].dwActiveProtocol, pbAtr, &dwAtrLen); 182 if ( rv == SCARD_S_SUCCESS ) { 183 cs_debug("PCSC Protocol (T=%d)",reader[ridx].dwActiveProtocol); 184 185 /* 186 DWORD currentClk, currentClkLen; 187 currentClkLen = sizeof(currentClk); 188 rv = SCardGetAttrib(reader[ridx].hCard, SCARD_ATTR_CURRENT_CLK , ¤tClk, ¤tClkLen); 189 cs_debug("PCSC rv=(%lx) Current clk = %lx Khz",rv, currentClk); 190 */ 191 192 // TODO: merge better 193 memcpy(atr, pbAtr, dwAtrLen); 194 atr_size=dwAtrLen; 195 #ifdef CS_RDR_INIT_HIST 196 reader[ridx].init_history_pos=0; 197 memset(reader[ridx].init_history, 0, sizeof(reader[ridx].init_history)); 198 #endif 199 cs_ri_log("ATR: %s", cs_hexdump(1, (uchar *)pbAtr, dwAtrLen)); 200 sleep(1); 201 return(1); 202 203 } else { 204 cs_debug("Error PCSC failed to get ATR for card (%lx)", rv); 205 return(0); 206 } 132 return (pcsc_activate_card(&reader[ridx], atr, &atr_size)); 207 133 } 208 134 #endif … … 366 292 #ifdef HAVE_PCSC 367 293 if (reader[ridx].typ == R_PCSC) { 368 DWORD dwState, dwAtrLen, dwReaderLen; 369 BYTE pbAtr[64]; 370 ULONG rv; 371 372 dwAtrLen = sizeof(pbAtr); 373 374 // this is to take care of the case of a reader being started with no card ... we need something better. 375 if (!reader[ridx].pcsc_has_card) { 376 rv = SCardConnect(reader[ridx].hContext, &reader[ridx].pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &reader[ridx].hCard, &reader[ridx].dwActiveProtocol); 377 if (rv==SCARD_E_NO_SMARTCARD) { 378 reader[ridx].pcsc_has_card=0; 379 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", reader[ridx].pcsc_name, dwState, rv ); 380 return 0; 381 } 382 else if( rv == SCARD_S_SUCCESS ) { 383 reader[ridx].pcsc_has_card=1; 384 } 385 386 } 387 388 rv = SCardStatus(reader[ridx].hCard, NULL, &dwReaderLen, &dwState, &reader[ridx].dwActiveProtocol, pbAtr, &dwAtrLen); 389 cs_debug("PCSC rader %s dwstate=%lx rv=(%lx)", reader[ridx].pcsc_name, dwState, rv ); 390 391 if(rv==SCARD_E_INVALID_HANDLE){ 392 SCardEndTransaction(reader[ridx].hCard,SCARD_LEAVE_CARD); 393 SCardDisconnect(reader[ridx].hCard,SCARD_LEAVE_CARD); 394 } 395 if (rv == SCARD_S_SUCCESS && (dwState & (SCARD_PRESENT | SCARD_NEGOTIABLE | SCARD_POWERED ) )) { 396 cs_debug("PCSC card IS inserted in %s card state [dwstate=%lx rv=(%lx)]", reader[ridx].pcsc_name, dwState,rv); 397 //cs_debug("ATR: %s", cs_hexdump(1, (uchar *)pbAtr, dwAtrLen)); 398 return 3; 399 } 400 else { 401 if ( (rv==SCARD_W_RESET_CARD) && (dwState == 0) ) { 402 cs_debug("PCSC check card reinserted in %s [dwstate=%lx rv=(%lx)]", reader[ridx].pcsc_name, dwState, rv ); 403 SCardDisconnect(reader[ridx].hCard,SCARD_LEAVE_CARD); 404 rv = SCardConnect(reader[ridx].hContext, &reader[ridx].pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &reader[ridx].hCard, &reader[ridx].dwActiveProtocol); 405 return ((rv != SCARD_S_SUCCESS) ? 2 : 0); 406 } else if ( rv == SCARD_W_REMOVED_CARD && (dwState | SCARD_ABSENT) ) { 407 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", reader[ridx].pcsc_name, dwState, rv ); 408 } else { 409 cs_debug("PCSC card inserted FAILURE in %s (%lx) card state (%x) (T=%d)", reader[ridx].pcsc_name, rv, dwState, reader[ridx].dwActiveProtocol); 410 } 411 return 0; 412 } 294 return(pcsc_check_card_inserted(&reader[ridx])); 295 413 296 } 414 297 #endif … … 427 310 #ifdef HAVE_PCSC 428 311 if (reader[ridx].typ == R_PCSC) { 429 ULONG rv; 430 DWORD dwReaders; 431 LPSTR mszReaders = NULL; 432 char *ptr, **readers = NULL; 433 int nbReaders; 434 int reader_nb; 435 436 cs_debug("PCSC establish context for PCSC reader %s", device); 437 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &reader[ridx].hContext); 438 if ( rv == SCARD_S_SUCCESS ) { 439 // here we need to list the pcsc readers and get the name from there, 440 // the reader[ridx].device should contain the reader number 441 // and after the actual device name is copied in reader[ridx].pcsc_name . 442 rv = SCardListReaders(reader[ridx].hContext, NULL, NULL, &dwReaders); 443 if( rv != SCARD_S_SUCCESS ) { 444 cs_debug("PCSC failed listing readers [1] : (%lx)", rv); 445 return 0; 446 } 447 mszReaders = malloc(sizeof(char)*dwReaders); 448 if (mszReaders == NULL) { 449 cs_debug("PCSC failed malloc"); 450 return 0; 451 } 452 rv = SCardListReaders(reader[ridx].hContext, NULL, mszReaders, &dwReaders); 453 if( rv != SCARD_S_SUCCESS ) { 454 cs_debug("PCSC failed listing readers [2]: (%lx)", rv); 455 return 0; 456 } 457 /* Extract readers from the null separated string and get the total 458 * number of readers */ 459 nbReaders = 0; 460 ptr = mszReaders; 461 while (*ptr != '\0') { 462 ptr += strlen(ptr)+1; 463 nbReaders++; 464 } 465 466 if (nbReaders == 0) { 467 cs_debug("PCSC : no reader found"); 468 return 0; 469 } 470 471 readers = calloc(nbReaders, sizeof(char *)); 472 if (readers == NULL) { 473 cs_debug("PCSC failed malloc"); 474 return 0; 475 } 476 477 /* fill the readers table */ 478 nbReaders = 0; 479 ptr = mszReaders; 480 while (*ptr != '\0') { 481 cs_debug("%d: %s\n", nbReaders, ptr); 482 readers[nbReaders] = ptr; 483 ptr += strlen(ptr)+1; 484 nbReaders++; 485 } 486 reader_nb=atoi((const char *)&reader[ridx].device); 487 if (reader_nb < 0 || reader_nb >= nbReaders) { 488 cs_debug("Wrong reader index: %d\n", reader_nb); 489 return 0; 490 } 491 snprintf(reader[ridx].pcsc_name,sizeof(reader[ridx].pcsc_name),"%s",readers[reader_nb]); 492 cs_log("PCSC initializing reader (%s)", &reader[ridx].pcsc_name); 493 rv = SCardConnect(reader[ridx].hContext, &reader[ridx].pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &reader[ridx].hCard, &reader[ridx].dwActiveProtocol); 494 cs_debug("PCSC initializing result (%lx) protocol (T=%lx)", rv, reader[ridx].dwActiveProtocol ); 495 if (rv==SCARD_S_SUCCESS) { 496 reader[ridx].pcsc_has_card=1; 497 return 0; 498 } 499 else if (rv==SCARD_E_NO_SMARTCARD) { 500 reader[ridx].pcsc_has_card=0; 501 return 0; 502 } 503 else { 504 reader[ridx].pcsc_has_card=0; 505 return 2; 506 } 507 508 } 509 else { 510 cs_debug("PCSC failed establish context (%lx)", rv); 511 return 0; 512 } 312 return (pcsc_reader_init(&reader[ridx], device)); 513 313 } 514 314 #endif
Note:
See TracChangeset
for help on using the changeset viewer.