/[winpt]/trunk/Src/wptCardPCSC.c
ViewVC logotype

Diff of /trunk/Src/wptCardPCSC.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 36 by werner, Thu Oct 27 15:25:13 2005 UTC revision 48 by werner, Mon Oct 31 21:14:11 2005 UTC
# Line 1  Line 1 
1  /* wptCardPCSC.cpp - PC/SC card API interface  /* wptCardPCSC.cpp - PC/SC card API interface
2   *      Copyright (C) 2003 Timo Schulz   *      Copyright (C) 2003 Timo Schulz
3     *      Copyright (C) 2003, 2004 Free Software Foundation, Inc.
4   *   *
5   * This file is part of WinPT.   * This file is part of WinPT.
6   *   *
# Line 25  Line 26 
26  #include <stdio.h>  #include <stdio.h>
27  #include <stdio.h>  #include <stdio.h>
28  #include <windows.h>  #include <windows.h>
 #include <winscard.h>  
29    
30  #include "gpgme.h"  #include "gpgme.h"
31  #include "wptTypes.h"  #include "wptTypes.h"
32  #include "wptCard.h"  #include "wptCard.h"
33    
34    
35    /* Definitions usually found in winscard.h but not used here becuase
36       mingw does not come with winscard and we dlopen the stuff
37       anyway. */
38    typedef unsigned long pcsc_context_t;
39    
40    struct pcsc_readerstate_s
41    {
42      const char *reader;
43      void *user_data;
44      unsigned long current_state;
45      unsigned long event_state;
46      unsigned long atrlen;
47      unsigned char atr[33];
48    };
49    
50    typedef struct pcsc_readerstate_s *pcsc_readerstate_t;
51    
52    /* PC/SC constants and function pointer. */
53    #define PCSC_SCOPE_USER      0
54    #define PCSC_SCOPE_TERMINAL  1
55    #define PCSC_SCOPE_SYSTEM    2
56    #define PCSC_SCOPE_GLOBAL    3
57    
58    #define PCSC_PROTOCOL_T0     1
59    #define PCSC_PROTOCOL_T1     2
60    #define PCSC_PROTOCOL_RAW    4
61    
62    #define PCSC_SHARE_EXCLUSIVE 1
63    #define PCSC_SHARE_SHARED    2
64    #define PCSC_SHARE_DIRECT    3
65    
66    #define PCSC_LEAVE_CARD      0
67    #define PCSC_RESET_CARD      1
68    #define PCSC_UNPOWER_CARD    2
69    #define PCSC_EJECT_CARD      3
70    
71    #define PCSC_UNKNOWN    0x0001
72    #define PCSC_ABSENT     0x0002  /* Card is absent.  */
73    #define PCSC_PRESENT    0x0004  /* Card is present.  */
74    #define PCSC_SWALLOWED  0x0008  /* Card is present and electrical connected. */
75    #define PCSC_POWERED    0x0010  /* Card is powered.  */
76    #define PCSC_NEGOTIABLE 0x0020  /* Card is awaiting PTS.  */
77    #define PCSC_SPECIFIC   0x0040  /* Card is ready for use.  */
78    
79    #define PCSC_STATE_UNAWARE     0x0000  /* Want status.  */
80    #define PCSC_STATE_IGNORE      0x0001  /* Ignore this reader.  */
81    #define PCSC_STATE_CHANGED     0x0002  /* State has changed.  */
82    #define PCSC_STATE_UNKNOWN     0x0004  /* Reader unknown.  */
83    #define PCSC_STATE_UNAVAILABLE 0x0008  /* Status unavailable.  */
84    #define PCSC_STATE_EMPTY       0x0010  /* Card removed.  */
85    #define PCSC_STATE_PRESENT     0x0020  /* Card inserted.  */
86    #define PCSC_STATE_ATRMATCH    0x0040  /* ATR matches card. */
87    #define PCSC_STATE_EXCLUSIVE   0x0080  /* Exclusive Mode.  */
88    #define PCSC_STATE_INUSE       0x0100  /* Shared mode.  */
89    #define PCSC_STATE_MUTE        0x0200  /* Unresponsive card.  */
90    
91    /* Some PC/SC error codes.  */
92    #define PCSC_E_CANCELLED               0x80100002
93    #define PCSC_E_CANT_DISPOSE            0x8010000E
94    #define PCSC_E_INSUFFICIENT_BUFFER     0x80100008
95    #define PCSC_E_INVALID_ATR             0x80100015
96    #define PCSC_E_INVALID_HANDLE          0x80100003
97    #define PCSC_E_INVALID_PARAMETER       0x80100004
98    #define PCSC_E_INVALID_TARGET          0x80100005
99    #define PCSC_E_INVALID_VALUE           0x80100011
100    #define PCSC_E_NO_MEMORY               0x80100006
101    #define PCSC_E_UNKNOWN_READER          0x80100009
102    #define PCSC_E_TIMEOUT                 0x8010000A
103    #define PCSC_E_SHARING_VIOLATION       0x8010000B
104    #define PCSC_E_NO_SMARTCARD            0x8010000C
105    #define PCSC_E_UNKNOWN_CARD            0x8010000D
106    #define PCSC_E_PROTO_MISMATCH          0x8010000F
107    #define PCSC_E_NOT_READY               0x80100010
108    #define PCSC_E_SYSTEM_CANCELLED        0x80100012
109    #define PCSC_E_NOT_TRANSACTED          0x80100016
110    #define PCSC_E_READER_UNAVAILABLE      0x80100017
111    #define PCSC_W_REMOVED_CARD            0x80100069
112    
113  /* Possible card states. */  /* Possible card states. */
114  enum card_state_t {  enum card_state_t {
115      CARD_STATE_NONE=0,      CARD_STATE_NONE=0,
# Line 46  enum card_state_t { Line 125  enum card_state_t {
125  #define MAX_READERS 8  #define MAX_READERS 8
126    
127  struct pcsc_reader_s {  struct pcsc_reader_s {
128      SCARD_READERSTATE_A reader_states[MAX_READERS];      struct pcsc_readerstate_s reader_states[MAX_READERS];
129      int nreaders;      int nreaders;
130      char * readers[MAX_READERS];      char * readers[MAX_READERS];
131  };  };
# Line 76  static LONG (WINAPI *pcsc_status) (unsig Line 155  static LONG (WINAPI *pcsc_status) (unsig
155                       unsigned char *atr, unsigned long *atrlen);                       unsigned char *atr, unsigned long *atrlen);
156  static LONG (WINAPI *pcsc_get_status_change)(unsigned long ctx,  static LONG (WINAPI *pcsc_get_status_change)(unsigned long ctx,
157                                               unsigned long timeout,                                               unsigned long timeout,
158                                               SCARD_READERSTATE * readerstate,                                               pcsc_readerstate_t readerstate,
159                                               unsigned long creaders);                                               unsigned long creaders);
160    
161  static int pcsc_init = 0;  static int pcsc_init = 0;
# Line 156  int Line 235  int
235  pcsc_scan_readers (pcsc_reader_t * ret_rd)  pcsc_scan_readers (pcsc_reader_t * ret_rd)
236  {  {
237      pcsc_reader_t rd;      pcsc_reader_t rd;
238      SCARDCONTEXT hctx;      pcsc_context_t hctx;
239      SCARD_READERSTATE_A rdstat;      struct pcsc_readerstate_s rdstat;
240      DWORD readers;      DWORD readers;
241      LPSTR rdrstr;      LPSTR rdrstr;
242      char * p;      char * p;
# Line 168  pcsc_scan_readers (pcsc_reader_t * ret_r Line 247  pcsc_scan_readers (pcsc_reader_t * ret_r
247      if (!pcsc_init)      if (!pcsc_init)
248          return -1;          return -1;
249    
250      rc = pcsc_establish_context (SCARD_SCOPE_SYSTEM, NULL, NULL, &hctx);      rc = pcsc_establish_context (PCSC_SCOPE_SYSTEM, NULL, NULL, &hctx);
251      if (rc != SCARD_S_SUCCESS)      if (rc)
252          return -1;          return -1;
253    
254      rc = pcsc_list_readers (hctx, NULL, NULL, &readers);      rc = pcsc_list_readers (hctx, NULL, NULL, &readers);
255      if (rc != SCARD_S_SUCCESS)      if (rc)
256          return -1;          return -1;
257    
258      rdrstr = malloc (sizeof(char)*readers);      rdrstr = malloc (sizeof(char)*readers);
# Line 181  pcsc_scan_readers (pcsc_reader_t * ret_r Line 260  pcsc_scan_readers (pcsc_reader_t * ret_r
260          BUG (0);          BUG (0);
261    
262      rc = pcsc_list_readers (hctx, NULL, rdrstr, &readers);      rc = pcsc_list_readers (hctx, NULL, rdrstr, &readers);
263      if (rc != SCARD_S_SUCCESS) {      if (rc) {
264          safe_free (rdrstr);          safe_free (rdrstr);
265          return -1;          return -1;
266      }      }
# Line 205  pcsc_scan_readers (pcsc_reader_t * ret_r Line 284  pcsc_scan_readers (pcsc_reader_t * ret_r
284    
285      /* set the initial states */      /* set the initial states */
286      for (i=0; i<rd->nreaders; i++) {      for (i=0; i<rd->nreaders; i++) {
287          rd->reader_states[i].szReader = rd->readers[i];          rd->reader_states[i].reader = rd->readers[i];
288          rd->reader_states[i].dwCurrentState = SCARD_STATE_EMPTY;          rd->reader_states[i].current_state = PCSC_STATE_EMPTY;
289      }      }
290    
291      while (1) {      while (1) {
292          rdstat = rd->reader_states[curr_rd];                      rdstat = rd->reader_states[curr_rd];            
293          rc = pcsc_get_status_change (hctx, 0, &rdstat, 1);          rc = pcsc_get_status_change (hctx, 0, &rdstat, 1);
294          if (rc == SCARD_E_TIMEOUT)          if (rc == PCSC_E_TIMEOUT)
295              continue;              continue;
296          if (rc != SCARD_S_SUCCESS)          if (rc)
297              ;            ; /* FIXME:  What is this?? */
298    
299          /* next reader */          /* next reader */
300          curr_rd++;          curr_rd++;
# Line 226  pcsc_scan_readers (pcsc_reader_t * ret_r Line 305  pcsc_scan_readers (pcsc_reader_t * ret_r
305      safe_free (rdrstr);      safe_free (rdrstr);
306      *ret_rd = rd;      *ret_rd = rd;
307      rc = pcsc_release_context (hctx);      rc = pcsc_release_context (hctx);
308      if (rc != SCARD_S_SUCCESS)      if (rc)
309          return -1;          return -1;
310      return 0;      return 0;
311  }  }
# Line 236  int Line 315  int
315  pcsc_get_card_status (void)  pcsc_get_card_status (void)
316  {  {
317      pcsc_reader_t rd;      pcsc_reader_t rd;
318      SCARD_READERSTATE_A rdstat;      struct pcsc_readerstate_s rdstat;
319      int rc, stat=0;      int rc, stat=0;
320    
321      rc = pcsc_scan_readers (&rd);      rc = pcsc_scan_readers (&rd);
322      if (rc)      if (rc)
323          return -1;          return -1;
324      rdstat = rd->reader_states[0];      rdstat = rd->reader_states[0];
325      if (rdstat.dwCurrentState & SCARD_STATE_UNAVAILABLE)      if (rdstat.current_state & PCSC_STATE_UNAVAILABLE)
326          stat |= CARD_STATE_UNAVAIL;          stat |= CARD_STATE_UNAVAIL;
327      if (rdstat.dwCurrentState & SCARD_STATE_EMPTY)      if (rdstat.current_state & PCSC_STATE_EMPTY)
328          stat |= CARD_STATE_EMPTY;          stat |= CARD_STATE_EMPTY;
329      if (rdstat.dwCurrentState & SCARD_STATE_INUSE)      if (rdstat.current_state & PCSC_STATE_INUSE)
330          stat |= CARD_STATE_INUSE;          stat |= CARD_STATE_INUSE;
331      if (rdstat.dwCurrentState & SCARD_STATE_EXCLUSIVE)      if (rdstat.current_state & PCSC_STATE_EXCLUSIVE)
332          stat |= CARD_STATE_EXCLUSI;          stat |= CARD_STATE_EXCLUSI;
333      return stat;      return stat;
334  }  }

Legend:
Removed from v.36  
changed lines
  Added in v.48

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26