Changeset 8512
- Timestamp:
- 03/08/13 11:25:16 (11 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/csctapi/ifd_pcsc.c
r8355 r8512 28 28 #define ERROR 1 29 29 30 struct pcsc_data { 31 bool pcsc_has_card; 32 char pcsc_name[128]; 33 SCARDCONTEXT hContext; 34 SCARDHANDLE hCard; 35 DWORD dwActiveProtocol; 36 }; 37 30 38 static int32_t pcsc_init(struct s_reader *pcsc_reader) 31 39 { … … 38 46 int32_t reader_nb; 39 47 40 pcsc_reader->pcsc_has_card=0;41 pcsc_reader->hCard=0;42 pcsc_reader->hContext=0;43 44 48 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC establish context for PCSC pcsc_reader %s", device); 45 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &pcsc_reader->hContext); 49 SCARDCONTEXT hContext; 50 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); 46 51 if ( rv == SCARD_S_SUCCESS ) { 52 if (!cs_malloc(&pcsc_reader->crdr_data, sizeof(struct pcsc_data))) 53 return ERROR; 54 struct pcsc_data *crdr_data = pcsc_reader->crdr_data; 55 crdr_data->hContext = hContext; 56 47 57 // here we need to list the pcsc readers and get the name from there, 48 58 // the pcsc_reader->device should contain the pcsc_reader number 49 // and after the actual device name is copied in pcsc_reader->pcsc_name .50 rv = SCardListReaders( pcsc_reader->hContext, NULL, NULL, &dwReaders);59 // and after the actual device name is copied in crdr_data->pcsc_name . 60 rv = SCardListReaders(crdr_data->hContext, NULL, NULL, &dwReaders); 51 61 if( rv != SCARD_S_SUCCESS ) { 52 62 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC failed listing readers [1] : (%lx)", (unsigned long)rv); … … 55 65 if (!cs_malloc(&mszReaders, dwReaders)) 56 66 return ERROR; 57 rv = SCardListReaders( pcsc_reader->hContext, NULL, mszReaders, &dwReaders);67 rv = SCardListReaders(crdr_data->hContext, NULL, mszReaders, &dwReaders); 58 68 if( rv != SCARD_S_SUCCESS ) { 59 69 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC failed listing readers [2]: (%lx)", (unsigned long)rv); … … 100 110 } 101 111 102 snprintf( pcsc_reader->pcsc_name,sizeof(pcsc_reader->pcsc_name),"%s",readers[reader_nb]);112 snprintf(crdr_data->pcsc_name,sizeof(crdr_data->pcsc_name),"%s",readers[reader_nb]); 103 113 free(mszReaders); 104 114 free(readers); … … 125 135 *cta_lr = 0; 126 136 127 if(pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0) { 137 struct pcsc_data *crdr_data = pcsc_reader->crdr_data; 138 if(crdr_data->dwActiveProtocol == SCARD_PROTOCOL_T0) { 128 139 // explanantion as to why we do the test on buf[4] : 129 140 // Issuing a command without exchanging data : … … 138 149 dwSendLength = l-1; 139 150 rdr_debug_mask(pcsc_reader, D_DEVICE, "sending %lu bytes to PCSC : %s", (unsigned long)dwSendLength,cs_hexdump(1,buf,l, tmp, sizeof(tmp))); 140 rv = SCardTransmit( (SCARDHANDLE)(pcsc_reader->hCard), SCARD_PCI_T0, (LPCBYTE) buf, dwSendLength, NULL, (LPBYTE) cta_res, (LPDWORD) &dwRecvLength);151 rv = SCardTransmit(crdr_data->hCard, SCARD_PCI_T0, (LPCBYTE) buf, dwSendLength, NULL, (LPBYTE) cta_res, (LPDWORD) &dwRecvLength); 141 152 *cta_lr=dwRecvLength; 142 153 } 143 else if( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T1) {154 else if(crdr_data->dwActiveProtocol == SCARD_PROTOCOL_T1) { 144 155 dwSendLength = l; 145 156 rdr_debug_mask(pcsc_reader, D_DEVICE, "sending %lu bytes to PCSC : %s", (unsigned long)dwSendLength,cs_hexdump(1,buf,l, tmp, sizeof(tmp))); 146 rv = SCardTransmit( (SCARDHANDLE)(pcsc_reader->hCard), SCARD_PCI_T1, (LPCBYTE) buf, dwSendLength, NULL, (LPBYTE) cta_res, (LPDWORD) &dwRecvLength);157 rv = SCardTransmit(crdr_data->hCard, SCARD_PCI_T1, (LPCBYTE) buf, dwSendLength, NULL, (LPBYTE) cta_res, (LPDWORD) &dwRecvLength); 147 158 *cta_lr=dwRecvLength; 148 159 } 149 160 else { 150 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC invalid protocol (T=%lu)", (unsigned long) pcsc_reader->dwActiveProtocol);161 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC invalid protocol (T=%lu)", (unsigned long)crdr_data->dwActiveProtocol); 151 162 return ERROR; 152 163 } … … 154 165 rdr_debug_mask(pcsc_reader, D_DEVICE, "received %d bytes from PCSC with rv=%lx : %s", *cta_lr, (unsigned long)rv,cs_hexdump(1,cta_res,*cta_lr, tmp, sizeof(tmp))); 155 166 156 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC doapi (%lx ) (T=%d), %d", (unsigned long)rv, ( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1), *cta_lr );167 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC doapi (%lx ) (T=%d), %d", (unsigned long)rv, ( crdr_data->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1), *cta_lr ); 157 168 158 169 if ( rv == SCARD_S_SUCCESS ){ … … 167 178 static int32_t pcsc_activate_card(struct s_reader *pcsc_reader, uchar *atr, uint16_t *atr_size) 168 179 { 180 struct pcsc_data *crdr_data = pcsc_reader->crdr_data; 169 181 LONG rv; 170 182 DWORD dwState, dwAtrLen, dwReaderLen; … … 172 184 char tmp[sizeof(pbAtr)*3+1]; 173 185 174 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC initializing card in (%s)", pcsc_reader->pcsc_name);186 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC initializing card in (%s)", crdr_data->pcsc_name); 175 187 dwAtrLen = sizeof(pbAtr); 176 188 dwReaderLen=0; 177 189 178 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC resetting card in (%s) with handle %ld", pcsc_reader->pcsc_name,(long)(pcsc_reader->hCard));179 rv = SCardReconnect( (SCARDHANDLE)(pcsc_reader->hCard), SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_RESET_CARD, &pcsc_reader->dwActiveProtocol);190 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC resetting card in (%s) with handle %ld", crdr_data->pcsc_name,(long)(crdr_data->hCard)); 191 rv = SCardReconnect(crdr_data->hCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_RESET_CARD, &crdr_data->dwActiveProtocol); 180 192 181 193 if ( rv != SCARD_S_SUCCESS ) { … … 184 196 } 185 197 186 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC resetting done on card in (%s)", pcsc_reader->pcsc_name);187 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC Protocol (T=%d)",( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1));188 189 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC getting ATR for card in (%s)", pcsc_reader->pcsc_name);190 rv = SCardStatus( (SCARDHANDLE)(pcsc_reader->hCard),NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen);198 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC resetting done on card in (%s)", crdr_data->pcsc_name); 199 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC Protocol (T=%d)",( crdr_data->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 200 201 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC getting ATR for card in (%s)", crdr_data->pcsc_name); 202 rv = SCardStatus(crdr_data->hCard, NULL, &dwReaderLen, &dwState, &crdr_data->dwActiveProtocol, pbAtr, &dwAtrLen); 191 203 if ( rv == SCARD_S_SUCCESS ) { 192 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC Protocol (T=%d)",( pcsc_reader->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1));204 rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC Protocol (T=%d)",( crdr_data->dwActiveProtocol == SCARD_PROTOCOL_T0 ? 0 : 1)); 193 205 memcpy(atr, pbAtr, dwAtrLen); 194 206 *atr_size=dwAtrLen; … … 221 233 static int32_t pcsc_check_card_inserted(struct s_reader *pcsc_reader) 222 234 { 235 struct pcsc_data *crdr_data = pcsc_reader->crdr_data; 223 236 DWORD dwState, dwAtrLen, dwReaderLen; 224 237 unsigned char pbAtr[64]; … … 231 244 232 245 // Do we have a card ? 233 if (! pcsc_reader->pcsc_has_card && !(SCARDHANDLE)(pcsc_reader->hCard)) {246 if (!crdr_data->pcsc_has_card && !crdr_data->hCard) { 234 247 // try connecting to the card 235 rv = SCardConnect( pcsc_reader->hContext, pcsc_reader->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &pcsc_reader->hCard, &pcsc_reader->dwActiveProtocol);248 rv = SCardConnect(crdr_data->hContext, crdr_data->pcsc_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &crdr_data->hCard, &crdr_data->dwActiveProtocol); 236 249 if (rv == (LONG)SCARD_E_NO_SMARTCARD) { 237 250 // no card in pcsc_reader 238 pcsc_reader->pcsc_has_card=0;239 if( (SCARDHANDLE)(pcsc_reader->hCard)) {240 SCardDisconnect( (SCARDHANDLE)(pcsc_reader->hCard),SCARD_RESET_CARD);241 pcsc_reader->hCard=0;251 crdr_data->pcsc_has_card=0; 252 if(crdr_data->hCard) { 253 SCardDisconnect(crdr_data->hCard, SCARD_RESET_CARD); 254 crdr_data->hCard=0; 242 255 } 243 // rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, (unsigned long)rv );256 // rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC card in %s removed / absent [dwstate=%lx rv=(%lx)]", crdr_data->pcsc_name, dwState, (unsigned long)rv ); 244 257 return OK; 245 258 } 246 259 else if (rv == (LONG)SCARD_W_UNRESPONSIVE_CARD) { 247 260 // there is a problem with the card in the pcsc_reader 248 pcsc_reader->pcsc_has_card=0;249 pcsc_reader->hCard=0;250 rdr_log(pcsc_reader, "PCSC card in %s is unresponsive. Eject and re-insert please.", pcsc_reader->pcsc_name);261 crdr_data->pcsc_has_card=0; 262 crdr_data->hCard=0; 263 rdr_log(pcsc_reader, "PCSC card in %s is unresponsive. Eject and re-insert please.", crdr_data->pcsc_name); 251 264 return ERROR; 252 265 } 253 266 else if( rv == SCARD_S_SUCCESS ) { 254 267 // we have a card 255 pcsc_reader->pcsc_has_card=1;256 rdr_log(pcsc_reader, "PCSC was opened with handle: %ld", (long) pcsc_reader->hCard);268 crdr_data->pcsc_has_card=1; 269 rdr_log(pcsc_reader, "PCSC was opened with handle: %ld", (long)crdr_data->hCard); 257 270 } 258 271 else { 259 272 // if we get here we have a bigger problem -> display status and debug 260 // rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC pcsc_reader %s status [dwstate=%lx rv=(%lx)]", pcsc_reader->pcsc_name, dwState, (unsigned long)rv );273 // rdr_debug_mask(pcsc_reader, D_DEVICE, "PCSC pcsc_reader %s status [dwstate=%lx rv=(%lx)]", crdr_data->pcsc_name, dwState, (unsigned long)rv ); 261 274 return ERROR; 262 275 } … … 265 278 266 279 // if we get there the card is ready, check its status 267 rv = SCardStatus( (SCARDHANDLE)(pcsc_reader->hCard), NULL, &dwReaderLen, &dwState, &pcsc_reader->dwActiveProtocol, pbAtr, &dwAtrLen);280 rv = SCardStatus(crdr_data->hCard, NULL, &dwReaderLen, &dwState, &crdr_data->dwActiveProtocol, pbAtr, &dwAtrLen); 268 281 269 282 if (rv == SCARD_S_SUCCESS && (dwState & (SCARD_PRESENT | SCARD_NEGOTIABLE | SCARD_POWERED ) )) { … … 271 284 } 272 285 else { 273 SCardDisconnect((SCARDHANDLE)(pcsc_reader->hCard),SCARD_RESET_CARD); 274 pcsc_reader->hCard=0; 275 pcsc_reader->pcsc_has_card=0; 286 SCardDisconnect(crdr_data->hCard, SCARD_RESET_CARD); 276 287 } 277 288 … … 280 291 281 292 static int32_t pcsc_get_status(struct s_reader *reader, int32_t *in) { 293 struct pcsc_data *crdr_data = reader->crdr_data; 282 294 int32_t ret = pcsc_check_card_inserted(reader); 283 *in = reader->pcsc_has_card;295 *in = crdr_data->pcsc_has_card; 284 296 return ret; 285 297 } … … 287 299 static int32_t pcsc_close(struct s_reader *pcsc_reader) 288 300 { 301 struct pcsc_data *crdr_data = pcsc_reader->crdr_data; 289 302 rdr_debug_mask(pcsc_reader, D_IFD, "PCSC : Closing device %s", pcsc_reader->device); 290 SCardDisconnect((SCARDHANDLE)(pcsc_reader->hCard),SCARD_LEAVE_CARD); 291 SCardReleaseContext(pcsc_reader->hContext); 292 pcsc_reader->hCard=0; 293 pcsc_reader->pcsc_has_card=0; 303 SCardDisconnect(crdr_data->hCard, SCARD_LEAVE_CARD); 304 SCardReleaseContext(crdr_data->hContext); 294 305 return OK; 295 306 } -
trunk/globals.h
r8507 r8512 125 125 #include <byteswap.h> 126 126 #endif 127 #endif128 129 #ifdef CARDREADER_PCSC130 #if defined(__CYGWIN__)131 #define __reserved132 #define __nullnullterminated133 #include <specstrings.h>134 #include "extapi/cygwin/WinSCard.h"135 #else136 #include <PCSC/pcsclite.h>137 #if defined(__APPLE__)138 #include <PCSC/wintypes.h>139 #else140 #include <PCSC/reader.h>141 #endif142 #endif143 127 #endif 144 128 … … 1240 1224 int32_t lbvalue; // loadbalance Value 1241 1225 #endif 1242 #ifdef CARDREADER_PCSC1243 char pcsc_name[128];1244 int8_t pcsc_has_card;1245 SCARDCONTEXT hContext;1246 SCARDHANDLE hCard;1247 DWORD dwActiveProtocol;1248 #endif1249 1226 #ifdef CARDREADER_SMART 1250 1227 struct s_sr_config *sr_config;
Note:
See TracChangeset
for help on using the changeset viewer.