/[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 11 by vletoux, Thu Mar 18 16:03:39 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)  DWORD OCardReconnect(__in PCARD_DATA  pCardData)
30    {
31            DWORD     dwAP;
32            DWORD dwReturn;
33            __try
34            {
35                    // reset the card
36                    Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
37                    dwReturn = SCardReconnect(pCardData->hScard,
38                             SCARD_SHARE_SHARED,
39                             SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
40                             SCARD_LEAVE_CARD,
41                             &dwAP );
42                    if (dwReturn)
43                    {
44                            Trace(WINEVENT_LEVEL_ERROR, L"SCardReconnect 0x%08X", dwReturn);
45                            __leave;
46                    }
47    
48                    dwReturn = SelectOpenPGPApplication(pCardData);
49            }
50            __finally
51            {
52            }
53            return dwReturn;
54    }
55    
56    DWORD OCardSendCommand(__in PCARD_DATA  pCardData, __in PBYTE pbCmd, __in DWORD dwCmdSize)
57  {  {
58          DWORD             dwReturn = 0;          DWORD             dwReturn = 0;
59    
# Line 46  DWORD SCardSendCommand(__in PCARD_DATA Line 74  DWORD SCardSendCommand(__in PCARD_DATA
74                                                                          &recvlen);                                                                          &recvlen);
75                  if ( dwReturn != SCARD_S_SUCCESS )                  if ( dwReturn != SCARD_S_SUCCESS )
76                  {                  {
77                            if (dwReturn == SCARD_W_RESET_CARD)
78                            {
79                                    dwReturn = OCardReconnect(pCardData);
80                                    if (dwReturn)
81                                    {
82                                            __leave;
83                                    }
84                                    dwReturn = OCardSendCommand(pCardData,pbCmd, dwCmdSize);
85                                    __leave;
86                            }
87                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
88                          __leave;                          __leave;
89                  }                  }
90                  SW1 = recvbuf[recvlen-2];                  SW1 = recvbuf[recvlen-2];
91                  SW2 = recvbuf[recvlen-1];                  SW2 = recvbuf[recvlen-1];
92                    if ( (SW1 == 0x6A) && (SW2 == 0x88) )
93                    {
94                            Trace(WINEVENT_LEVEL_ERROR, L"card reset");
95                            recvlen = sizeof(recvbuf);
96                            dwReturn = SelectOpenPGPApplication(pCardData);
97                            if (dwReturn)
98                            {
99                                    __leave;
100                            }
101                            dwReturn = SCardTransmit(pCardData->hScard,
102                                                                            SCARD_PCI_T1,
103                                                                            pbCmd,
104                                                                            dwCmdSize,
105                                                                            NULL,
106                                                                            recvbuf,
107                                                                            &recvlen);
108                            SW1 = recvbuf[recvlen-2];
109                            SW2 = recvbuf[recvlen-1];
110                    }
111                  if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )                  if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )
112                  {                  {
113    
# Line 67  DWORD SCardSendCommand(__in PCARD_DATA Line 124  DWORD SCardSendCommand(__in PCARD_DATA
124                          dwReturn = SCARD_W_CHV_BLOCKED;                          dwReturn = SCARD_W_CHV_BLOCKED;
125                          __leave;                          __leave;
126                  }                  }
127                    else if ( (SW1 == 0x69) && (SW2 == 0x85) )
128                    {
129                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");
130                            dwReturn = SCARD_W_SECURITY_VIOLATION;
131                            __leave;
132                    }
133                  else                  else
134                  {                  {
135                          TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);                          TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);
# Line 92  DWORD SelectOpenPGPApplication(__in PCAR Line 155  DWORD SelectOpenPGPApplication(__in PCAR
155                                          0x00                                          0x00
156                                          };                                          };
157                    
158          return SCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));          return OCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));
159  }  }
160    
161    
162  DWORD SCardGetData(__in PCARD_DATA  pCardData,  DWORD OCardGetData(__in PCARD_DATA  pCardData,
163                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,
164                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
165  {  {
# Line 129  DWORD SCardGetData(__in PCARD_DATA  pCar Line 192  DWORD SCardGetData(__in PCARD_DATA  pCar
192                  {                  {
193                          if ( dwReturn != SCARD_S_SUCCESS )                          if ( dwReturn != SCARD_S_SUCCESS )
194                          {                          {
195                                    if (dwReturn == SCARD_W_RESET_CARD)
196                                    {
197                                            dwReturn = OCardReconnect(pCardData);
198                                            if (dwReturn)
199                                            {
200                                                    __leave;
201                                            }
202                                            dwReturn = OCardGetData(pCardData,pbCmd, dwCmdSize,pbResponse, pdwResponseSize);
203                                            __leave;
204                                    }
205                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
206                                  __leave;                                  __leave;
207                          }                          }
208                          SW1 = recvbuf[recvlen-2];                          SW1 = recvbuf[recvlen-2];
209                          SW2 = recvbuf[recvlen-1];                          SW2 = recvbuf[recvlen-1];
210                            if ( (SW1 == 0x6A) && (SW2 == 0x88) )
211                            {
212                                    Trace(WINEVENT_LEVEL_ERROR, L"card reset");
213                                    recvlen = sizeof(recvbuf);
214                                    dwReturn = SelectOpenPGPApplication(pCardData);
215                                    if (dwReturn)
216                                    {
217                                            __leave;
218                                    }
219                                    dwReturn = SCardTransmit(pCardData->hScard,
220                                                                            SCARD_PCI_T1,
221                                                                            pbCmd,
222                                                                            dwCmdSize,
223                                                                            NULL,
224                                                                            recvbuf,
225                                                                            &recvlen);
226                                    SW1 = recvbuf[recvlen-2];
227                                    SW2 = recvbuf[recvlen-1];
228                            }
229                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )
230                          {                          {
231                                  dwDataSize = recvlen-2;                                  dwDataSize = recvlen-2;
# Line 178  DWORD SCardGetData(__in PCARD_DATA  pCar Line 270  DWORD SCardGetData(__in PCARD_DATA  pCar
270                                  dwReturn = SCARD_W_CHV_BLOCKED;                                  dwReturn = SCARD_W_CHV_BLOCKED;
271                                  __leave;                                  __leave;
272                          }                          }
273                          else if ( (SW1 == 0x6A) && (SW2 == 0x88) )                          else if ( (SW1 == 0x69) && (SW2 == 0x85) )
274                          {                          {
275                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND");                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");
276                                  dwReturn = SCARD_E_FILE_NOT_FOUND;                                  dwReturn = SCARD_W_SECURITY_VIOLATION;
277                                  __leave;                                  __leave;
278                          }                          }
279                          else                          else

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26