/[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 6 by vletoux, Thu Mar 4 21:17:51 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},          {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x4F, 0, EveryoneReadAdminWriteAc},
64          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},
65          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
66          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
67            {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},
68    
69  };  };
70    
# Line 85  DWORD SCardDirectoryList(__in PCARD_DATA Line 87  DWORD SCardDirectoryList(__in PCARD_DATA
87  // read file  // read file
88  DWORD SCardReadFile(__in PCARD_DATA  pCardData,  DWORD SCardReadFile(__in PCARD_DATA  pCardData,
89                                          __in_opt PSTR szDirectory, __in PSTR szFile,                                          __in_opt PSTR szDirectory, __in PSTR szFile,
90                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* ppbResponse, __in PDWORD pdwResponseSize)
91  {  {
92          DWORD dwI;          DWORD dwI;
93          DWORD dwReturn = 0;          DWORD dwReturn = 0;
# Line 94  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 96  DWORD SCardReadFile(__in PCARD_DATA  pCa
96          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00};          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00};
97          DWORD dwCmdSize = ARRAYSIZE(pbCmd);          DWORD dwCmdSize = ARRAYSIZE(pbCmd);
98          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
99            PBYTE pbData = NULL;
100          __try          __try
101          {          {
102                    *pdwResponseSize = 0;
103                  for(dwI = 0; dwI < dwFileCount; dwI++)                  for(dwI = 0; dwI < dwFileCount; dwI++)
104                  {                  {
105                          BOOL fMatch = FALSE;                          BOOL fMatch = FALSE;
# Line 133  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 137  DWORD SCardReadFile(__in PCARD_DATA  pCa
137                  }                  }
138                  if (Files[dwI].dwFileType == StoredOnSmartCard)                  if (Files[dwI].dwFileType == StoredOnSmartCard)
139                  {                  {
140                          pbCmd[2] = Files[dwI].bP1;                          pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100);
141                          pbCmd[3] = Files[dwI].bP2;                          pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100);
142                          dwReturn = SCardGetData(pCardData, pbCmd, dwCmdSize, pbResponse, pdwResponseSize);                          dwReturn = SCardGetData(pCardData, pbCmd, dwCmdSize, &pbData, pdwResponseSize);
143                            if (dwReturn)
144                            {
145                                    __leave;
146                            }
147                            if (Files[dwI].dwTlv)
148                            {
149                                    PBYTE pbPointer;
150                                    //TraceDump(0,pbData,*pdwResponseSize);
151                                    if (find_tlv(pbData, Files[dwI].dwTlv, *pdwResponseSize, &pbPointer, pdwResponseSize))
152                                    {
153                                            *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
154                                            if (!*ppbResponse )
155                                            {
156                                                    Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
157                                                    dwReturn = SCARD_E_NO_MEMORY;
158                                            }
159                                            memcpy(*ppbResponse, pbPointer, *pdwResponseSize);
160                                    }
161                                    else
162                                    {
163                                            dwReturn = SCARD_E_FILE_NOT_FOUND;
164                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
165                                    }
166                            }
167                            else
168                            {
169                                    *ppbResponse = pbData;
170                                    // do not free the data !
171                                    pbData = NULL;
172                            }
173                  }                  }
174                  else                  else
175                  {                  {
# Line 143  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 177  DWORD SCardReadFile(__in PCARD_DATA  pCa
177                          {                          {
178                                  if (strcmp(szFile, szCARD_APPLICATION_FILE) == 0)                                  if (strcmp(szFile, szCARD_APPLICATION_FILE) == 0)
179                                  {                                  {
180                                          dwReturn = SCardDirectoryList(pCardData, pbResponse, pdwResponseSize);                                          dwReturn = SCardDirectoryList(pCardData, ppbResponse, pdwResponseSize);
181                                  }                                  }
182                                  else if (strcmp(szFile, szCACHE_FILE) == 0)                                  else if (strcmp(szFile, szCACHE_FILE) == 0)
183                                  {                                  {
184                                          *pdwResponseSize = sizeof(CARD_CACHE_FILE_FORMAT);                                          *pdwResponseSize = sizeof(CARD_CACHE_FILE_FORMAT);
185                                          *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);                                          *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
186                                          memset(*pbResponse,0,*pdwResponseSize);                                          memset(*ppbResponse,0,*pdwResponseSize);
187                                  }                                  }
188                                  else                                  else
189                                  {                                  {
# Line 163  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 197  DWORD SCardReadFile(__in PCARD_DATA  pCa
197                                  {                                  {
198                                          PCONTAINER_MAP_RECORD pContainer = NULL;                                          PCONTAINER_MAP_RECORD pContainer = NULL;
199                                          *pdwResponseSize = sizeof(CONTAINER_MAP_RECORD) * MaxContainer;                                          *pdwResponseSize = sizeof(CONTAINER_MAP_RECORD) * MaxContainer;
200                                          *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);                                          *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
201                                          if (! *pbResponse )                                          if (! *ppbResponse )
202                                          {                                          {
203                                                  dwReturn = SCARD_E_NO_MEMORY;                                                  dwReturn = SCARD_E_NO_MEMORY;
204                                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");                                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
205                                                  __leave;                                                  __leave;
206                                          }                                          }
207                                          pContainer = (PCONTAINER_MAP_RECORD) *pbResponse;                                          pContainer = (PCONTAINER_MAP_RECORD) *ppbResponse;
208                                          memset(pContainer,0,sizeof(CONTAINER_MAP_RECORD) * 3);                                          memset(pContainer,0,sizeof(CONTAINER_MAP_RECORD) * 3);
209                                          swprintf_s(pContainer[Signature].wszGuid,MAX_CONTAINER_NAME_LEN + 1,                                          swprintf_s(pContainer[Signature].wszGuid,MAX_CONTAINER_NAME_LEN + 1,
210                                                  L"OPENPGP_%02X%02X_%02X%02X_%02X%02X%02X%02X_Signature",                                                  L"OPENPGP_%02X%02X_%02X%02X_%02X%02X%02X%02X_Signature",
# Line 219  DWORD SCardReadFile(__in PCARD_DATA  pCa Line 253  DWORD SCardReadFile(__in PCARD_DATA  pCa
253          }          }
254          __finally          __finally
255          {          {
256                    if( pbData)
257                            pCardData->pfnCspFree(pbData);
258          }          }
259          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);
260          return dwReturn;          return dwReturn;
261  }  }
262    
# Line 396  DWORD SCardWriteFile(__in PCARD_DATA  pC Line 432  DWORD SCardWriteFile(__in PCARD_DATA  pC
432                  }                  }
433                  if (Files[dwI].dwFileType == StoredOnSmartCard)                  if (Files[dwI].dwFileType == StoredOnSmartCard)
434                  {                  {
435                          // fail because the PUT DO doesn't work => too much data                          if (Files[dwI].dwTlv > 0)
                         if (Files[dwI].bP1 != 0)  
436                          {                          {
437                                  dwReturn = SCARD_E_WRITE_TOO_MANY ;                                  pbCmd[2] = (BYTE) (Files[dwI].dwTlv / 0x100);
438                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_WRITE_TOO_MANY  %S",szFile);                                  pbCmd[3] = (BYTE) (Files[dwI].dwTlv % 0x100);
439                                  __leave;                          }
440                            else
441                            {
442                                    pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100);
443                                    pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100);
444                          }                          }
                         pbCmd[3] = Files[dwI].bP2;  
445                          pbCmd[4] = (BYTE) dwSize;                          pbCmd[4] = (BYTE) dwSize;
446                          if (dwSize)                          if (dwSize)
447                          {                          {

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26