/[openpgpmdrv]/trunk/OpenPGPminidriver/SmartCard.c
ViewVC logotype

Diff of /trunk/OpenPGPminidriver/SmartCard.c

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

revision 6 by vletoux, Thu Mar 4 21:17:51 2010 UTC revision 12 by vletoux, Wed Mar 31 08:58:46 2010 UTC
# Line 24  Line 24 
24    
25  #pragma comment(lib,"Winscard")  #pragma comment(lib,"Winscard")
26    
27    DWORD SelectOpenPGPApplication(__in PCARD_DATA  pCardData);
28    
29  DWORD SCardSendCommand(__in PCARD_DATA  pCardData, __in PBYTE pbCmd, __in DWORD dwCmdSize)  /** called to re-select the Openpgp application when a SCARD_W_RESET occured */
30    DWORD OCardReconnect(__in PCARD_DATA  pCardData)
31    {
32            DWORD     dwAP;
33            DWORD dwReturn;
34            __try
35            {
36                    // reset the card
37                    Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
38                    dwReturn = SCardReconnect(pCardData->hScard,
39                             SCARD_SHARE_SHARED,
40                             SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
41                             SCARD_LEAVE_CARD,
42                             &dwAP );
43                    if (dwReturn)
44                    {
45                            Trace(WINEVENT_LEVEL_ERROR, L"SCardReconnect 0x%08X", dwReturn);
46                            __leave;
47                    }
48    
49                    dwReturn = SelectOpenPGPApplication(pCardData);
50            }
51            __finally
52            {
53            }
54            return dwReturn;
55    }
56    
57    /** send a command to the smart card with no response expected */
58    DWORD OCardSendCommand(__in PCARD_DATA  pCardData, __in PBYTE pbCmd, __in DWORD dwCmdSize)
59  {  {
60          DWORD             dwReturn = 0;          DWORD             dwReturn = 0;
61    
# Line 46  DWORD SCardSendCommand(__in PCARD_DATA Line 76  DWORD SCardSendCommand(__in PCARD_DATA
76                                                                          &recvlen);                                                                          &recvlen);
77                  if ( dwReturn != SCARD_S_SUCCESS )                  if ( dwReturn != SCARD_S_SUCCESS )
78                  {                  {
79                            if (dwReturn == SCARD_W_RESET_CARD)
80                            {
81                                    dwReturn = OCardReconnect(pCardData);
82                                    if (dwReturn)
83                                    {
84                                            __leave;
85                                    }
86                                    dwReturn = OCardSendCommand(pCardData,pbCmd, dwCmdSize);
87                                    __leave;
88                            }
89                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
90                          __leave;                          __leave;
91                  }                  }
92                  SW1 = recvbuf[recvlen-2];                  SW1 = recvbuf[recvlen-2];
93                  SW2 = recvbuf[recvlen-1];                  SW2 = recvbuf[recvlen-1];
94                    if ( (SW1 == 0x6A) && (SW2 == 0x88) )
95                    {
96                            Trace(WINEVENT_LEVEL_ERROR, L"card reset");
97                            recvlen = sizeof(recvbuf);
98                            dwReturn = SelectOpenPGPApplication(pCardData);
99                            if (dwReturn)
100                            {
101                                    __leave;
102                            }
103                            dwReturn = SCardTransmit(pCardData->hScard,
104                                                                            SCARD_PCI_T1,
105                                                                            pbCmd,
106                                                                            dwCmdSize,
107                                                                            NULL,
108                                                                            recvbuf,
109                                                                            &recvlen);
110                            SW1 = recvbuf[recvlen-2];
111                            SW2 = recvbuf[recvlen-1];
112                    }
113                  if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )                  if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )
114                  {                  {
115    
# Line 67  DWORD SCardSendCommand(__in PCARD_DATA Line 126  DWORD SCardSendCommand(__in PCARD_DATA
126                          dwReturn = SCARD_W_CHV_BLOCKED;                          dwReturn = SCARD_W_CHV_BLOCKED;
127                          __leave;                          __leave;
128                  }                  }
129                    else if ( (SW1 == 0x69) && (SW2 == 0x85) )
130                    {
131                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");
132                            dwReturn = SCARD_W_SECURITY_VIOLATION;
133                            __leave;
134                    }
135                  else                  else
136                  {                  {
137                          TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);                          TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);
# Line 81  DWORD SCardSendCommand(__in PCARD_DATA Line 146  DWORD SCardSendCommand(__in PCARD_DATA
146          return dwReturn;          return dwReturn;
147  }  }
148    
149    /** send the select open pgp application apdu */
150  DWORD SelectOpenPGPApplication(__in PCARD_DATA  pCardData)  DWORD SelectOpenPGPApplication(__in PCARD_DATA  pCardData)
151  {  {
152          BYTE pbCmd[] = {0x00,          BYTE pbCmd[] = {0x00,
# Line 92  DWORD SelectOpenPGPApplication(__in PCAR Line 158  DWORD SelectOpenPGPApplication(__in PCAR
158                                          0x00                                          0x00
159                                          };                                          };
160                    
161          return SCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));          return OCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));
162  }  }
163    
164    /** send a command to the smart card with response expected */
165  DWORD SCardGetData(__in PCARD_DATA  pCardData,  DWORD OCardGetData(__in PCARD_DATA  pCardData,
166                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,
167                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
168  {  {
# Line 129  DWORD SCardGetData(__in PCARD_DATA  pCar Line 195  DWORD SCardGetData(__in PCARD_DATA  pCar
195                  {                  {
196                          if ( dwReturn != SCARD_S_SUCCESS )                          if ( dwReturn != SCARD_S_SUCCESS )
197                          {                          {
198                                    if (dwReturn == SCARD_W_RESET_CARD)
199                                    {
200                                            dwReturn = OCardReconnect(pCardData);
201                                            if (dwReturn)
202                                            {
203                                                    __leave;
204                                            }
205                                            dwReturn = OCardGetData(pCardData,pbCmd, dwCmdSize,pbResponse, pdwResponseSize);
206                                            __leave;
207                                    }
208                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
209                                  __leave;                                  __leave;
210                          }                          }
211                          SW1 = recvbuf[recvlen-2];                          SW1 = recvbuf[recvlen-2];
212                          SW2 = recvbuf[recvlen-1];                          SW2 = recvbuf[recvlen-1];
213                            if ( (SW1 == 0x6A) && (SW2 == 0x88) )
214                            {
215                                    Trace(WINEVENT_LEVEL_ERROR, L"card reset");
216                                    recvlen = sizeof(recvbuf);
217                                    dwReturn = SelectOpenPGPApplication(pCardData);
218                                    if (dwReturn)
219                                    {
220                                            __leave;
221                                    }
222                                    dwReturn = SCardTransmit(pCardData->hScard,
223                                                                            SCARD_PCI_T1,
224                                                                            pbCmd,
225                                                                            dwCmdSize,
226                                                                            NULL,
227                                                                            recvbuf,
228                                                                            &recvlen);
229                                    SW1 = recvbuf[recvlen-2];
230                                    SW2 = recvbuf[recvlen-1];
231                            }
232                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )
233                          {                          {
234                                  dwDataSize = recvlen-2;                                  dwDataSize = recvlen-2;
# Line 178  DWORD SCardGetData(__in PCARD_DATA  pCar Line 273  DWORD SCardGetData(__in PCARD_DATA  pCar
273                                  dwReturn = SCARD_W_CHV_BLOCKED;                                  dwReturn = SCARD_W_CHV_BLOCKED;
274                                  __leave;                                  __leave;
275                          }                          }
276                          else if ( (SW1 == 0x6A) && (SW2 == 0x88) )                          else if ( (SW1 == 0x69) && (SW2 == 0x85) )
277                          {                          {
278                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND");                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");
279                                  dwReturn = SCARD_E_FILE_NOT_FOUND;                                  dwReturn = SCARD_W_SECURITY_VIOLATION;
280                                  __leave;                                  __leave;
281                          }                          }
282                          else                          else

Legend:
Removed from v.6  
changed lines
  Added in v.12

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26