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

Diff of /trunk/OpenPGPminidriver/PublicDataOperations.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 8 by vletoux, Thu Mar 11 20:32:26 2010 UTC
# Line 23  Line 23 
23  #include "SmartCard.h"  #include "SmartCard.h"
24  #include "PublicDataOperations.h"  #include "PublicDataOperations.h"
25  #include "CryptoOperations.h"  #include "CryptoOperations.h"
26    #include "tlv.h"
27    
28  typedef enum _OPENPGP_FILE_TYPE  typedef enum _OPENPGP_FILE_TYPE
29  {  {
# Line 35  typedef struct _OPENPGP_FILE Line 36  typedef struct _OPENPGP_FILE
36          PCHAR szDirectory;          PCHAR szDirectory;
37          PCHAR szFile;          PCHAR szFile;
38          OPENPGP_FILE_TYPE dwFileType;          OPENPGP_FILE_TYPE dwFileType;
39          BYTE  bP1;          DWORD dwTag;
40          BYTE  bP2;          DWORD dwTlv;
41          CARD_FILE_ACCESS_CONDITION dwAccess;          CARD_FILE_ACCESS_CONDITION dwAccess;
42  } OPENPGP_FILE, *POPENPGP_FILE;  } OPENPGP_FILE, *POPENPGP_FILE;
43    
# Line 45  typedef struct _OPENPGP_FILE Line 46  typedef struct _OPENPGP_FILE
46    
47  OPENPGP_FILE Files[] =  OPENPGP_FILE Files[] =
48  {  {
49          {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x00, 0xC5, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x6E, 0xC5, EveryoneReadAdminWriteAc},
50          {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0x00, 0xC4, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc},
51          {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x00, 0x4F, UnknownAc},          {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x4F, 0, UnknownAc},
52          {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x00, 0x5E, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x5E, 0, EveryoneReadAdminWriteAc},
53          {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x00, 0x5B, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x65, 0x5B, EveryoneReadAdminWriteAc},
54          {szOpenPGPDir, szOpenPGPLanguage, StoredOnSmartCard, 0x5F, 0x2D, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPLanguage, StoredOnSmartCard, 0x65, 0x5F2D, EveryoneReadAdminWriteAc},
55          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x5F, 0x35, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},
56          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F, 0x50, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},
57          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F, 0x52, UnknownAc},          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},
58          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F, 0x21, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},
59          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x00, 0xC0, UnknownAc},          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},
60          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x00, 0xC1, UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},
61          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x00, 0xC2, UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},
62          {szOpenPGPDir, szOpenPGPAlgoAttributesAuthentication, StoredOnSmartCard, 0x00, 0xC3, UnknownAc },          {szOpenPGPDir, szOpenPGPAlgoAttributesAuthentication, StoredOnSmartCard, 0x6E, 0xC3, UnknownAc },
63          {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x00, 0x4F, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPPUK, StoredOnSmartCard, 0xD3, 0, UnknownAc },
64            {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x4F, 0, EveryoneReadAdminWriteAc},
65          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},
66          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
67          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
68            {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},
69    
70  };  };
71    
72  DWORD dwFileCount = ARRAYSIZE(Files);  DWORD dwFileCount = ARRAYSIZE(Files);
73    
74  DWORD SCardDirectoryList(__in PCARD_DATA  pCardData,  DWORD OCardDirectoryList(__in PCARD_DATA  pCardData,
75                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
76  {  {
77          // hardcoded          // hardcoded
# Line 82  DWORD SCardDirectoryList(__in PCARD_DATA Line 85  DWORD SCardDirectoryList(__in PCARD_DATA
85          return 0;          return 0;
86  }  }
87    
88    
89  // read file  // read file
90  DWORD SCardReadFile(__in PCARD_DATA  pCardData,  DWORD OCardReadFile(__in PCARD_DATA  pCardData,
91                                          __in_opt PSTR szDirectory, __in PSTR szFile,                                          __in_opt PSTR szDirectory, __in PSTR szFile,
92                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* ppbResponse, __in PDWORD pdwResponseSize)
93  {  {
94          DWORD dwI;          DWORD dwI;
95          DWORD dwReturn = 0;          DWORD dwReturn = 0;
# Line 94  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 98  DWORD SCardReadFile(__in PCARD_DATA  pCa
98          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00};          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00};
99          DWORD dwCmdSize = ARRAYSIZE(pbCmd);          DWORD dwCmdSize = ARRAYSIZE(pbCmd);
100          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
101            PBYTE pbData = NULL;
102          __try          __try
103          {          {
104                    *pdwResponseSize = 0;
105                  for(dwI = 0; dwI < dwFileCount; dwI++)                  for(dwI = 0; dwI < dwFileCount; dwI++)
106                  {                  {
107                          BOOL fMatch = FALSE;                          BOOL fMatch = FALSE;
# Line 105  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 111  DWORD SCardReadFile(__in PCARD_DATA  pCa
111                          }                          }
112                          else                          else
113                          {                          {
114                                  if (Files[dwI].szDirectory && strcmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;                                  if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
115                          }                          }
116                          if (fMatch)                          if (fMatch)
117                          {                          {
118                                  fDirectoryFound = TRUE;                                  fDirectoryFound = TRUE;
119                                  if (strcmp(szFile, Files[dwI].szFile) == 0)                                  if (_stricmp(szFile, Files[dwI].szFile) == 0)
120                                  {                                  {
121                                          fFileFound = TRUE;                                          fFileFound = TRUE;
122                                          break;                                          break;
# Line 133  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 139  DWORD SCardReadFile(__in PCARD_DATA  pCa
139                  }                  }
140                  if (Files[dwI].dwFileType == StoredOnSmartCard)                  if (Files[dwI].dwFileType == StoredOnSmartCard)
141                  {                  {
142                          pbCmd[2] = Files[dwI].bP1;                          pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100);
143                          pbCmd[3] = Files[dwI].bP2;                          pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100);
144                          dwReturn = SCardGetData(pCardData, pbCmd, dwCmdSize, pbResponse, pdwResponseSize);                          dwReturn = OCardGetData(pCardData, pbCmd, dwCmdSize, &pbData, pdwResponseSize);
145                            if (dwReturn)
146                            {
147                                    __leave;
148                            }
149                            if (Files[dwI].dwTlv)
150                            {
151                                    PBYTE pbPointer;
152                                    //TraceDump(0,pbData,*pdwResponseSize);
153                                    if (find_tlv(pbData, Files[dwI].dwTlv, *pdwResponseSize, &pbPointer, pdwResponseSize))
154                                    {
155                                            *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
156                                            if (!*ppbResponse )
157                                            {
158                                                    Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
159                                                    dwReturn = SCARD_E_NO_MEMORY;
160                                            }
161                                            memcpy(*ppbResponse, pbPointer, *pdwResponseSize);
162                                    }
163                                    else
164                                    {
165                                            dwReturn = SCARD_E_FILE_NOT_FOUND;
166                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
167                                    }
168                            }
169                            else
170                            {
171                                    *ppbResponse = pbData;
172                                    // do not free the data !
173                                    pbData = NULL;
174                            }
175                  }                  }
176                  else                  else
177                  {                  {
178                          if (szDirectory == NULL)                          if (szDirectory == NULL)
179                          {                          {
180                                  if (strcmp(szFile, szCARD_APPLICATION_FILE) == 0)                                  if (_stricmp(szFile, szCARD_APPLICATION_FILE) == 0)
181                                  {                                  {
182                                          dwReturn = SCardDirectoryList(pCardData, pbResponse, pdwResponseSize);                                          dwReturn = OCardDirectoryList(pCardData, ppbResponse, pdwResponseSize);
183                                  }                                  }
184                                  else if (strcmp(szFile, szCACHE_FILE) == 0)                                  else if (_stricmp(szFile, szCACHE_FILE) == 0)
185                                  {                                  {
186                                          *pdwResponseSize = sizeof(CARD_CACHE_FILE_FORMAT);                                          *pdwResponseSize = sizeof(CARD_CACHE_FILE_FORMAT);
187                                          *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);                                          *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
188                                          memset(*pbResponse,0,*pdwResponseSize);                                          memset(*ppbResponse,0,*pdwResponseSize);
189                                  }                                  }
190                                  else                                  else
191                                  {                                  {
# Line 157  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 193  DWORD SCardReadFile(__in PCARD_DATA  pCa
193                                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);                                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
194                                  }                                  }
195                          }                          }
196                          else if (strcmp(szDirectory,szBASE_CSP_DIR) == 0)                          else if (_stricmp(szDirectory,szBASE_CSP_DIR) == 0)
197                          {                          {
198                                  if (strcmp(szFile, szCONTAINER_MAP_FILE) == 0)                                  if (_stricmp(szFile, szCONTAINER_MAP_FILE) == 0)
199                                  {                                  {
200                                          PCONTAINER_MAP_RECORD pContainer = NULL;                                          dwReturn = OCardReadContainerMapFile(pCardData, ppbResponse, pdwResponseSize);
                                         *pdwResponseSize = sizeof(CONTAINER_MAP_RECORD) * MaxContainer;  
                                         *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);  
                                         if (! *pbResponse )  
                                         {  
                                                 dwReturn = SCARD_E_NO_MEMORY;  
                                                 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");  
                                                 __leave;  
                                         }  
                                         pContainer = (PCONTAINER_MAP_RECORD) *pbResponse;  
                                         memset(pContainer,0,sizeof(CONTAINER_MAP_RECORD) * 3);  
                                         swprintf_s(pContainer[Signature].wszGuid,MAX_CONTAINER_NAME_LEN + 1,  
                                                 L"OPENPGP_%02X%02X_%02X%02X_%02X%02X%02X%02X_Signature",  
                                                 pContext->Aid.AidVersion[0],pContext->Aid.AidVersion[1],  
                                                 pContext->Aid.AidManufacturer[0],pContext->Aid.AidManufacturer[1],  
                                                 pContext->Aid.AidSerialNumber[0],pContext->Aid.AidSerialNumber[1],  
                                                 pContext->Aid.AidSerialNumber[2],pContext->Aid.AidSerialNumber[3]);  
                                         pContainer[Signature].bFlags = CONTAINER_MAP_VALID_CONTAINER;  
                                         pContainer[Signature].wSigKeySizeBits = 1024;  
                                         swprintf_s(pContainer[Authentication].wszGuid,MAX_CONTAINER_NAME_LEN + 1,  
                                                 L"OPENPGP_%02X%02X_%02X%02X_%02X%02X%02X%02X_Authenticate",  
                                                 pContext->Aid.AidVersion[0],pContext->Aid.AidVersion[1],  
                                                 pContext->Aid.AidManufacturer[0],pContext->Aid.AidManufacturer[1],  
                                                 pContext->Aid.AidSerialNumber[0],pContext->Aid.AidSerialNumber[1],  
                                                 pContext->Aid.AidSerialNumber[2],pContext->Aid.AidSerialNumber[3]);  
                                         pContainer[Authentication].bFlags = CONTAINER_MAP_VALID_CONTAINER | CONTAINER_MAP_DEFAULT_CONTAINER;  
                                         pContainer[Authentication].wSigKeySizeBits = 1024;  
                                         swprintf_s(pContainer[Confidentiality].wszGuid,MAX_CONTAINER_NAME_LEN + 1,  
                                                 L"OPENPGP_%02X%02X_%02X%02X_%02X%02X%02X%02X_Confidential",  
                                                 pContext->Aid.AidVersion[0],pContext->Aid.AidVersion[1],  
                                                 pContext->Aid.AidManufacturer[0],pContext->Aid.AidManufacturer[1],  
                                                 pContext->Aid.AidSerialNumber[0],pContext->Aid.AidSerialNumber[1],  
                                                 pContext->Aid.AidSerialNumber[2],pContext->Aid.AidSerialNumber[3]);  
                                         pContainer[Confidentiality].bFlags = CONTAINER_MAP_VALID_CONTAINER;  
                                         pContainer[Confidentiality].wKeyExchangeKeySizeBits = 1024;  
201                                  }                                  }
202                                  else                                  else
203                                  {                                  {
# Line 219  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 221  DWORD SCardReadFile(__in PCARD_DATA  pCa
221          }          }
222          __finally          __finally
223          {          {
224                    if( pbData)
225                            pCardData->pfnCspFree(pbData);
226          }          }
227          Trace(WINEVENT_LEVEL_VERBOSE, L"%S\\%S dwReturn = 0x%08X",szDirectory, szFile, dwReturn);          Trace(WINEVENT_LEVEL_VERBOSE, L"%S\\%S dwReturn = 0x%08X size = %d",szDirectory, szFile, dwReturn, *pdwResponseSize);
228          return dwReturn;          return dwReturn;
229  }  }
230    
231  DWORD SCardEnumFile(__in PCARD_DATA  pCardData,  DWORD OCardEnumFile(__in PCARD_DATA  pCardData,
232                                          __in_opt PSTR szDirectory,                                          __in_opt PSTR szDirectory,
233                                          __in PBYTE* pbResponse, __in PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in PDWORD pdwResponseSize)
234  {  {
# Line 245  DWORD SCardEnumFile(__in PCARD_DATA  pCa Line 249  DWORD SCardEnumFile(__in PCARD_DATA  pCa
249                          }                          }
250                          else                          else
251                          {                          {
252                                  if (Files[dwI].szDirectory && strcmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;                                  if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
253                          }                          }
254                          if (fMatch)                          if (fMatch)
255                          {                          {
# Line 256  DWORD SCardEnumFile(__in PCARD_DATA  pCa Line 260  DWORD SCardEnumFile(__in PCARD_DATA  pCa
260                                          PBYTE pbData = NULL;                                          PBYTE pbData = NULL;
261                                          DWORD dwSize;                                          DWORD dwSize;
262                                          // check if the file exists and be read                                          // check if the file exists and be read
263                                          dwNotExists = SCardReadFile(pCardData, szDirectory, Files[dwI].szFile, &pbData, &dwSize);                                          dwNotExists = OCardReadFile(pCardData, szDirectory, Files[dwI].szFile, &pbData, &dwSize);
264                                          if (!dwNotExists)                                          if (!dwNotExists)
265                                          {                                          {
266                                                  pCardData->pfnCspFree(pbData);                                                  pCardData->pfnCspFree(pbData);
# Line 301  DWORD SCardEnumFile(__in PCARD_DATA  pCa Line 305  DWORD SCardEnumFile(__in PCARD_DATA  pCa
305  }  }
306    
307  // read file  // read file
308  DWORD SCardGetFileInfo(__in PCARD_DATA  pCardData,  DWORD OCardGetFileInfo(__in PCARD_DATA  pCardData,
309                                          __in_opt PSTR szDirectory, __in PSTR szFile,                                          __in_opt PSTR szDirectory, __in PSTR szFile,
310                                           __inout PCARD_FILE_INFO  pCardFileInfo)                                           __inout PCARD_FILE_INFO  pCardFileInfo)
311  {  {
# Line 310  DWORD SCardGetFileInfo(__in PCARD_DATA Line 314  DWORD SCardGetFileInfo(__in PCARD_DATA
314          DWORD dwSize, dwI;          DWORD dwSize, dwI;
315          __try          __try
316          {          {
317                  dwReturn = SCardReadFile(pCardData, szDirectory, szFile, &pbData, &dwSize);                  dwReturn = OCardReadFile(pCardData, szDirectory, szFile, &pbData, &dwSize);
318                  if (dwReturn)                  if (dwReturn)
319                  {                  {
320                          __leave;                          __leave;
# Line 320  DWORD SCardGetFileInfo(__in PCARD_DATA Line 324  DWORD SCardGetFileInfo(__in PCARD_DATA
324                  pCardFileInfo->AccessCondition = InvalidAc;                  pCardFileInfo->AccessCondition = InvalidAc;
325                  for(dwI = 0; dwI < dwFileCount; dwI++)                  for(dwI = 0; dwI < dwFileCount; dwI++)
326                  {                  {
327                          if ((strcmp(szDirectory, Files[dwI].szDirectory) == 0)                          BOOL fMatch = FALSE;
328                                  || (!szDirectory && !Files[dwI].szDirectory) )                          if (szDirectory == NULL)
329                          {                          {
330                                  if (strcmp(szFile, Files[dwI].szFile) == 0)                                  if (!Files[dwI].szDirectory) fMatch = TRUE;
331                            }
332                            else
333                            {
334                                    if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
335                            }
336                            if (fMatch)
337                            {
338                                    if (_stricmp(szFile, Files[dwI].szFile) == 0)
339                                  {                                  {
340                                          pCardFileInfo->AccessCondition = Files[dwI].dwAccess;                                          pCardFileInfo->AccessCondition = Files[dwI].dwAccess;
341                                          break;                                          break;
# Line 339  DWORD SCardGetFileInfo(__in PCARD_DATA Line 351  DWORD SCardGetFileInfo(__in PCARD_DATA
351          return dwReturn;                  return dwReturn;        
352  }  }
353    
354  DWORD SCardWriteFile(__in PCARD_DATA  pCardData,  DWORD OCardWriteFile(__in PCARD_DATA  pCardData,
355                                          __in_opt PSTR szDirectory, __in PSTR szFile,                                          __in_opt PSTR szDirectory, __in PSTR szFile,
356                                          __in PBYTE pbData, __in DWORD dwSize)                                          __in PBYTE pbData, __in DWORD dwSize)
357  {  {
# Line 368  DWORD SCardWriteFile(__in PCARD_DATA  pC Line 380  DWORD SCardWriteFile(__in PCARD_DATA  pC
380                          }                          }
381                          else                          else
382                          {                          {
383                                  if (Files[dwI].szDirectory && strcmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;                                  if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
384                          }                          }
385                          if (fMatch)                          if (fMatch)
386                          {                          {
387                                  fDirectoryFound = TRUE;                                  fDirectoryFound = TRUE;
388                                  if (strcmp(szFile, Files[dwI].szFile) == 0)                                  if (_stricmp(szFile, Files[dwI].szFile) == 0)
389                                  {                                  {
390                                          fFileFound = TRUE;                                          fFileFound = TRUE;
391                                          break;                                          break;
# Line 396  DWORD SCardWriteFile(__in PCARD_DATA  pC Line 408  DWORD SCardWriteFile(__in PCARD_DATA  pC
408                  }                  }
409                  if (Files[dwI].dwFileType == StoredOnSmartCard)                  if (Files[dwI].dwFileType == StoredOnSmartCard)
410                  {                  {
411                          // fail because the PUT DO doesn't work => too much data                          if (Files[dwI].dwTlv > 0)
                         if (Files[dwI].bP1 != 0)  
412                          {                          {
413                                  dwReturn = SCARD_E_WRITE_TOO_MANY ;                                  pbCmd[2] = (BYTE) (Files[dwI].dwTlv / 0x100);
414                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_WRITE_TOO_MANY  %S",szFile);                                  pbCmd[3] = (BYTE) (Files[dwI].dwTlv % 0x100);
415                                  __leave;                          }
416                            else
417                            {
418                                    pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100);
419                                    pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100);
420                          }                          }
                         pbCmd[3] = Files[dwI].bP2;  
421                          pbCmd[4] = (BYTE) dwSize;                          pbCmd[4] = (BYTE) dwSize;
422                          if (dwSize)                          if (dwSize)
423                          {                          {
424                                  memcpy(pbCmd + 5, pbData, dwSize);                                  memcpy(pbCmd + 5, pbData, dwSize);
425                          }                          }
426                          dwCmdSize = dwSize + 5;                          dwCmdSize = dwSize + 5;
427                          dwReturn = SCardSendCommand(pCardData, pbCmd, dwCmdSize);                          dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize);
428                          if (dwReturn)                          if (dwReturn)
429                          {                          {
430                                  __leave;                                  __leave;
# Line 432  DWORD SCardWriteFile(__in PCARD_DATA  pC Line 446  DWORD SCardWriteFile(__in PCARD_DATA  pC
446          return dwReturn;          return dwReturn;
447  }  }
448    
449  DWORD SCardDeleteFile(__in PCARD_DATA  pCardData,  DWORD OCardDeleteFile(__in PCARD_DATA  pCardData,
450                                          __in_opt PSTR szDirectory, __in PSTR szFile)                                          __in_opt PSTR szDirectory, __in PSTR szFile)
451  {  {
452          return SCardWriteFile(pCardData, szDirectory, szFile, NULL, 0);          return OCardWriteFile(pCardData, szDirectory, szFile, NULL, 0);
453  }  }
454    
455  // just change the flag in Files  // just change the flag in Files
456  DWORD SCardCreateFile(__in PCARD_DATA  pCardData,  DWORD OCardCreateFile(__in PCARD_DATA  pCardData,
457                                          __in_opt PSTR szDirectory, __in PSTR szFile)                                          __in_opt PSTR szDirectory, __in PSTR szFile)
458  {  {
459          DWORD dwI;          DWORD dwI;
# Line 457  DWORD SCardCreateFile(__in PCARD_DATA  p Line 471  DWORD SCardCreateFile(__in PCARD_DATA  p
471                          }                          }
472                          else                          else
473                          {                          {
474                                  if (Files[dwI].szDirectory && strcmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;                                  if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
475                          }                          }
476                          if (fMatch)                          if (fMatch)
477                          {                          {
478                                  fDirectoryFound = TRUE;                                  fDirectoryFound = TRUE;
479                                  if (strcmp(szFile, Files[dwI].szFile) == 0)                                  if (_stricmp(szFile, Files[dwI].szFile) == 0)
480                                  {                                  {
481                                          fFileFound = TRUE;                                          fFileFound = TRUE;
482                                          break;                                          break;

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26