/[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 1 by vletoux, Tue Feb 23 19:18:59 2010 UTC revision 9 by vletoux, Mon Mar 15 09:47:30 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 92  DWORD SelectOpenPGPApplication(__in PCAR Line 149  DWORD SelectOpenPGPApplication(__in PCAR
149                                          0x00                                          0x00
150                                          };                                          };
151                    
152          return SCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));          return OCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));
153  }  }
154    
155    
156  DWORD SCardGetData(__in PCARD_DATA  pCardData,  DWORD OCardGetData(__in PCARD_DATA  pCardData,
157                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,
158                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
159  {  {
# Line 129  DWORD SCardGetData(__in PCARD_DATA  pCar Line 186  DWORD SCardGetData(__in PCARD_DATA  pCar
186                  {                  {
187                          if ( dwReturn != SCARD_S_SUCCESS )                          if ( dwReturn != SCARD_S_SUCCESS )
188                          {                          {
189                                    if (dwReturn == SCARD_W_RESET_CARD)
190                                    {
191                                            dwReturn = OCardReconnect(pCardData);
192                                            if (dwReturn)
193                                            {
194                                                    __leave;
195                                            }
196                                            dwReturn = OCardGetData(pCardData,pbCmd, dwCmdSize,pbResponse, pdwResponseSize);
197                                            __leave;
198                                    }
199                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
200                                  __leave;                                  __leave;
201                          }                          }
202                          SW1 = recvbuf[recvlen-2];                          SW1 = recvbuf[recvlen-2];
203                          SW2 = recvbuf[recvlen-1];                          SW2 = recvbuf[recvlen-1];
204                            if ( (SW1 == 0x6A) && (SW2 == 0x88) )
205                            {
206                                    Trace(WINEVENT_LEVEL_ERROR, L"card reset");
207                                    recvlen = sizeof(recvbuf);
208                                    dwReturn = SelectOpenPGPApplication(pCardData);
209                                    if (dwReturn)
210                                    {
211                                            __leave;
212                                    }
213                                    dwReturn = SCardTransmit(pCardData->hScard,
214                                                                            SCARD_PCI_T1,
215                                                                            pbCmd,
216                                                                            dwCmdSize,
217                                                                            NULL,
218                                                                            recvbuf,
219                                                                            &recvlen);
220                                    SW1 = recvbuf[recvlen-2];
221                                    SW2 = recvbuf[recvlen-1];
222                            }
223                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )                          if ( ( SW1 == 0x90 ) && ( SW2 == 0x00 ) )
224                          {                          {
225                                  dwDataSize = recvlen-2;                                  dwDataSize = recvlen-2;
226                                  *pbResponse = pCardData->pfnCspAlloc(dwDataSize);                                  *pbResponse = pCardData->pfnCspAlloc(dwDataSize);
227                                    if (! *pbResponse)
228                                    {
229                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
230                                            dwReturn = SCARD_E_NO_MEMORY;
231                                            __leave;
232                                    }
233                                  memcpy(*pbResponse, recvbuf, dwDataSize);                                  memcpy(*pbResponse, recvbuf, dwDataSize);
234                          }                          }
235                          else if (SW1 == 0x61)                          else if (SW1 == 0x61)
# Line 172  DWORD SCardGetData(__in PCARD_DATA  pCar Line 264  DWORD SCardGetData(__in PCARD_DATA  pCar
264                                  dwReturn = SCARD_W_CHV_BLOCKED;                                  dwReturn = SCARD_W_CHV_BLOCKED;
265                                  __leave;                                  __leave;
266                          }                          }
                         else if ( (SW1 == 0x6A) && (SW2 == 0x88) )  
                         {  
                                 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND");  
                                 dwReturn = SCARD_E_FILE_NOT_FOUND;  
                                 __leave;  
                         }  
                         else if ( (SW1 == 0x69) && (SW2 == 0x85) )  
                         {  
                                 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");  
                                 dwReturn = SCARD_W_SECURITY_VIOLATION;  
                                 __leave;  
                         }  
267                          else                          else
268                          {                          {
269                                  TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);                                  TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);

Legend:
Removed from v.1  
changed lines
  Added in v.9

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26