Changeset 817 for branches/smartreader
- Timestamp:
- 12/13/09 03:58:44 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/reader-pcsc.c
r815 r817 4 4 int pcsc_reader_init(struct s_reader *pcsc_reader, char *device) 5 5 { 6 ULONG rv; 7 DWORD dwReaders; 8 LPSTR mszReaders = NULL; 9 char *ptr, **readers = NULL; 10 int nbReaders; 11 int reader_nb; 12 13 cs_debug("PCSC establish context for PCSC reader %s", device); 14 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &pcsc_reader->hContext); 15 if ( rv == SCARD_S_SUCCESS ) { 16 // here we need to list the pcsc readers and get the name from there, 17 // the pcsc_reader->device should contain the reader number 18 // and after the actual device name is copied in pcsc_reader->pcsc_name . 19 rv = SCardListReaders(pcsc_reader->hContext, NULL, NULL, &dwReaders); 20 if( rv != SCARD_S_SUCCESS ) { 21 cs_debug("PCSC failed listing readers [1] : (%lx)", rv); 22 return 0; 23 } 24 mszReaders = malloc(sizeof(char)*dwReaders); 25 if (mszReaders == NULL) { 26 cs_debug("PCSC failed malloc"); 27 return 0; 28 } 29 rv = SCardListReaders(pcsc_reader->hContext, NULL, mszReaders, &dwReaders); 30 if( rv != SCARD_S_SUCCESS ) { 31 cs_debug("PCSC failed listing readers [2]: (%lx)", rv); 32 return 0; 33 } 34 /* Extract readers from the null separated string and get the total 35 * number of readers */ 36 nbReaders = 0; 37 ptr = mszReaders; 38 while (*ptr != '\0') { 39 ptr += strlen(ptr)+1; 40 nbReaders++; 41 } 42 43 if (nbReaders == 0) { 44 cs_debug("PCSC : no reader found"); 45 return 0; 46 } 47 48 readers = calloc(nbReaders, sizeof(char *)); 49 if (readers == NULL) { 50 cs_debug("PCSC failed malloc"); 51 return 0; 52 } 53 54 /* fill the readers table */ 55 nbReaders = 0; 56 ptr = mszReaders; 57 while (*ptr != '\0') { 58 cs_debug("%d: %s\n", nbReaders, ptr); 59 readers[nbReaders] = ptr; 60 ptr += strlen(ptr)+1; 61 nbReaders++; 62 } 63 reader_nb=atoi((const char *)&pcsc_reader->device); 64 if (reader_nb < 0 || reader_nb >= nbReaders) { 65 cs_debug("Wrong reader index: %d\n", reader_nb); 66 return 0; 67 } 68 snprintf(pcsc_reader->pcsc_name,sizeof(pcsc_reader->pcsc_name),"%s",readers[reader_nb]); 69 cs_log("PCSC initializing reader (%s)", &pcsc_reader->pcsc_name); 70 rv = SCardConnect(pcsc_reader->hContext, &pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol); 71 cs_debug("PCSC initializing result (%lx) protocol (T=%lx)", rv, ( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 72 if (rv==SCARD_S_SUCCESS) { 73 pcsc_reader->pcsc_has_card=1; 74 return 0; 75 } 76 else if (rv==SCARD_E_NO_SMARTCARD) { 77 pcsc_reader->pcsc_has_card=0; 78 return 0; 79 } 80 else { 81 pcsc_reader->pcsc_has_card=0; 82 return 2; 83 } 84 85 } 86 else { 87 cs_debug("PCSC failed establish context (%lx)", rv); 88 return 0; 89 } 90 6 ULONG rv; 7 DWORD dwReaders; 8 LPSTR mszReaders = NULL; 9 char *ptr, **readers = NULL; 10 int nbReaders; 11 int reader_nb; 12 13 cs_debug("PCSC establish context for PCSC reader %s", device); 14 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &pcsc_reader->hContext); 15 if ( rv == SCARD_S_SUCCESS ) { 16 // here we need to list the pcsc readers and get the name from there, 17 // the pcsc_reader->device should contain the reader number 18 // and after the actual device name is copied in pcsc_reader->pcsc_name . 19 rv = SCardListReaders(pcsc_reader->hContext, NULL, NULL, &dwReaders); 20 if( rv != SCARD_S_SUCCESS ) { 21 cs_debug("PCSC failed listing readers [1] : (%lx)", rv); 22 return 0; 23 } 24 mszReaders = malloc(sizeof(char)*dwReaders); 25 if (mszReaders == NULL) { 26 cs_debug("PCSC failed malloc"); 27 return 0; 28 } 29 rv = SCardListReaders(pcsc_reader->hContext, NULL, mszReaders, &dwReaders); 30 if( rv != SCARD_S_SUCCESS ) { 31 cs_debug("PCSC failed listing readers [2]: (%lx)", rv); 32 return 0; 33 } 34 /* Extract readers from the null separated string and get the total 35 * number of readers */ 36 nbReaders = 0; 37 ptr = mszReaders; 38 while (*ptr != '\0') { 39 ptr += strlen(ptr)+1; 40 nbReaders++; 41 } 42 43 if (nbReaders == 0) { 44 cs_debug("PCSC : no reader found"); 45 return 0; 46 } 47 48 readers = calloc(nbReaders, sizeof(char *)); 49 if (readers == NULL) { 50 cs_debug("PCSC failed malloc"); 51 return 0; 52 } 53 54 /* fill the readers table */ 55 nbReaders = 0; 56 ptr = mszReaders; 57 while (*ptr != '\0') { 58 cs_debug("PCSC reader %d: %s", nbReaders, ptr); 59 readers[nbReaders] = ptr; 60 ptr += strlen(ptr)+1; 61 nbReaders++; 62 } 63 64 reader_nb=atoi((const char *)&pcsc_reader->device); 65 if (reader_nb < 0 || reader_nb >= nbReaders) { 66 cs_debug("Wrong reader index: %d\n", reader_nb); 67 return 0; 68 } 69 70 snprintf(pcsc_reader->pcsc_name,sizeof(pcsc_reader->pcsc_name),"%s",readers[reader_nb]); 71 cs_log("PCSC initializing reader (%s)", &pcsc_reader->pcsc_name); 72 rv = SCardConnect(pcsc_reader->hContext, &pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol); 73 cs_debug("PCSC initializing result (%lx) protocol (T=%lx)", rv, ( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 74 if (rv==SCARD_S_SUCCESS) { 75 pcsc_reader->pcsc_has_card=1; 76 return 0; 77 } 78 else if (rv==SCARD_E_NO_SMARTCARD) { 79 pcsc_reader->pcsc_has_card=0; 80 return 0; 81 } 82 else { 83 pcsc_reader->pcsc_has_card=0; 84 return 2; 85 } 86 87 } 88 else { 89 cs_debug("PCSC failed establish context (%lx)", rv); 90 } 91 92 return 0; 91 93 } 92 94 … … 143 145 } 144 146 145 146 147 rv=SCardBeginTransaction(pcsc_reader->hCard); 148 if (rv!=SCARD_S_SUCCESS) { 147 149 cs_log("PCSC reader %s Failed to begin transaction", pcsc_reader->pcsc_name); 148 150 return 0; 149 } 150 151 cs_debug("PCSC getting ATR for card in (%s)", pcsc_reader->pcsc_name); 152 rv = SCardStatus(pcsc_reader->hCard, NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen); 153 if ( rv == SCARD_S_SUCCESS ) { 154 cs_debug("PCSC Protocol (T=%d)",( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 155 memcpy(atr, pbAtr, dwAtrLen); 156 *atr_size=dwAtrLen; 157 #ifdef CS_RDR_INIT_HIST 158 pcsc_reader->init_history_pos=0; 159 memset(pcsc_reader->init_history, 0, sizeof(pcsc_reader->init_history)); 160 #endif 161 cs_ri_log("ATR: %s", cs_hexdump(1, (uchar *)pbAtr, dwAtrLen)); 162 sleep(1); 163 return(1); 164 165 } else { 166 cs_debug("Error PCSC failed to get ATR for card (%lx)", rv); 167 return(0); 168 } 169 151 } 152 153 cs_debug("PCSC getting ATR for card in (%s)", pcsc_reader->pcsc_name); 154 rv = SCardStatus(pcsc_reader->hCard, NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen); 155 if ( rv == SCARD_S_SUCCESS ) { 156 cs_debug("PCSC Protocol (T=%d)",( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 157 memcpy(atr, pbAtr, dwAtrLen); 158 *atr_size=dwAtrLen; 159 #ifdef CS_RDR_INIT_HIST 160 pcsc_reader->init_history_pos=0; 161 memset(pcsc_reader->init_history, 0, sizeof(pcsc_reader->init_history)); 162 #endif 163 cs_ri_log("ATR: %s", cs_hexdump(1, (uchar *)pbAtr, dwAtrLen)); 164 return(1); 165 } 166 else { 167 cs_debug("Error PCSC failed to get ATR for card (%lx)", rv); 168 } 169 170 return(0); 170 171 } 171 172 … … 173 174 int pcsc_check_card_inserted(struct s_reader *pcsc_reader) 174 175 { 175 DWORD dwState, dwAtrLen, dwReaderLen; 176 BYTE pbAtr[64]; 177 ULONG rv; 176 DWORD dwState, dwAtrLen, dwReaderLen; 177 BYTE pbAtr[64]; 178 ULONG rv; 179 180 dwAtrLen = sizeof(pbAtr); 181 182 // this is to take care of the case of a reader being started with no card ... we need something better. 183 if (!pcsc_reader->pcsc_has_card) { 184 rv = SCardConnect(pcsc_reader->hContext, &pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol); 185 if (rv==SCARD_E_NO_SMARTCARD) { 186 pcsc_reader->pcsc_has_card=0; 187 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 188 return 0; 189 } 190 else if( rv == SCARD_S_SUCCESS ) { 191 pcsc_reader->pcsc_has_card=1; 192 } 178 193 179 dwAtrLen = sizeof(pbAtr); 180 181 // this is to take care of the case of a reader being started with no card ... we need something better. 182 if (!pcsc_reader->pcsc_has_card) { 194 } 195 196 rv = SCardStatus(pcsc_reader->hCard, NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen); 197 cs_debug("PCSC reader %s dwstate=%lx rv=(%lx)", pcsc_reader->pcsc_name, dwState, rv ); 198 199 if(rv==SCARD_E_INVALID_HANDLE){ 200 SCardEndTransaction(pcsc_reader->hCard,SCARD_LEAVE_CARD); 201 SCardDisconnect(pcsc_reader->hCard,SCARD_LEAVE_CARD); 202 } 203 else if (rv == SCARD_S_SUCCESS && (dwState & (SCARD_PRESENT | SCARD_NEGOTIABLE | SCARD_POWERED ) )) { 204 cs_debug("PCSC card IS inserted in %s card state [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState,rv); 205 return 3; 206 } 207 else { 208 if ( (rv==SCARD_W_RESET_CARD) && (dwState == 0) ) { 209 cs_debug("PCSC check card reinserted in %s [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 210 SCardDisconnect(pcsc_reader->hCard,SCARD_LEAVE_CARD); 183 211 rv = SCardConnect(pcsc_reader->hContext, &pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol); 184 if (rv==SCARD_E_NO_SMARTCARD) { 185 pcsc_reader->pcsc_has_card=0; 186 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 187 return 0; 188 } 189 else if( rv == SCARD_S_SUCCESS ) { 190 pcsc_reader->pcsc_has_card=1; 191 } 192 193 } 194 195 rv = SCardStatus(pcsc_reader->hCard, NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen); 196 cs_debug("PCSC reader %s dwstate=%lx rv=(%lx)", pcsc_reader->pcsc_name, dwState, rv ); 197 198 if(rv==SCARD_E_INVALID_HANDLE){ 199 SCardEndTransaction(pcsc_reader->hCard,SCARD_LEAVE_CARD); 200 SCardDisconnect(pcsc_reader->hCard,SCARD_LEAVE_CARD); 201 } 202 if (rv == SCARD_S_SUCCESS && (dwState & (SCARD_PRESENT | SCARD_NEGOTIABLE | SCARD_POWERED ) )) { 203 cs_debug("PCSC card IS inserted in %s card state [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState,rv); 204 //cs_debug("ATR: %s", cs_hexdump(1, (uchar *)pbAtr, dwAtrLen)); 205 return 3; 206 } 207 else { 208 if ( (rv==SCARD_W_RESET_CARD) && (dwState == 0) ) { 209 cs_debug("PCSC check card reinserted in %s [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 210 SCardDisconnect(pcsc_reader->hCard,SCARD_LEAVE_CARD); 211 rv = SCardConnect(pcsc_reader->hContext, &pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol); 212 return ((rv != SCARD_S_SUCCESS) ? 2 : 0); 213 } else if ( rv == SCARD_W_REMOVED_CARD && (dwState | SCARD_ABSENT) ) { 214 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 215 } else { 216 cs_debug("PCSC card inserted FAILURE in %s (%lx) card state (%x) (T=%d)", pcsc_reader->pcsc_name, rv, dwState, ( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 217 } 218 return 0; 219 } 220 212 return ((rv != SCARD_S_SUCCESS) ? 2 : 0); 213 } 214 else if ( rv == SCARD_W_REMOVED_CARD && (dwState | SCARD_ABSENT) ) { 215 cs_debug("PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, rv ); 216 } 217 else { 218 cs_debug("PCSC card inserted FAILURE in %s (%lx) card state (%x) (T=%d)", pcsc_reader->pcsc_name, rv, dwState, ( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 219 } 220 221 } 222 223 return 0; 221 224 } 222 225 #endif
Note:
See TracChangeset
for help on using the changeset viewer.