/[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 8 by vletoux, Thu Mar 11 20:32:26 2010 UTC revision 9 by vletoux, Mon Mar 15 09:47:30 2010 UTC
# Line 31  typedef enum _OPENPGP_FILE_TYPE Line 31  typedef enum _OPENPGP_FILE_TYPE
31          Virtual,          Virtual,
32  } OPENPGP_FILE_TYPE;  } OPENPGP_FILE_TYPE;
33    
34    #define OPENPGP_FILE_OPTIONAL 1
35    #define OPENPGP_FILE_WRITE_ONLY 2
36    #define OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING 4
37    
38  typedef struct _OPENPGP_FILE  typedef struct _OPENPGP_FILE
39  {  {
40          PCHAR szDirectory;          PCHAR szDirectory;
# Line 39  typedef struct _OPENPGP_FILE Line 43  typedef struct _OPENPGP_FILE
43          DWORD dwTag;          DWORD dwTag;
44          DWORD dwTlv;          DWORD dwTlv;
45          CARD_FILE_ACCESS_CONDITION dwAccess;          CARD_FILE_ACCESS_CONDITION dwAccess;
46            DWORD dwFlag;
47  } OPENPGP_FILE, *POPENPGP_FILE;  } OPENPGP_FILE, *POPENPGP_FILE;
48    
49    
# Line 55  OPENPGP_FILE Files[] = Line 60  OPENPGP_FILE Files[] =
60          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},
61          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},
62          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},
63          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},
64          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},
65          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},
66          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},
67          {szOpenPGPDir, szOpenPGPAlgoAttributesAuthentication, StoredOnSmartCard, 0x6E, 0xC3, UnknownAc },          {szOpenPGPDir, szOpenPGPAlgoAttributesAuthentication, StoredOnSmartCard, 0x6E, 0xC3, UnknownAc },
68          {szOpenPGPDir, szOpenPGPPUK, StoredOnSmartCard, 0xD3, 0, UnknownAc },          {szOpenPGPDir, szOpenPGPPUK, StoredOnSmartCard, 0xD3, 0, UnknownAc, OPENPGP_FILE_WRITE_ONLY },
69          {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x4F, 0, EveryoneReadAdminWriteAc},          {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x4F, 0, EveryoneReadAdminWriteAc},
70          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},
71          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
72          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
73          {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},          {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},
74    
75  };  };
76    
# Line 232  DWORD OCardEnumFile(__in PCARD_DATA  pCa Line 237  DWORD OCardEnumFile(__in PCARD_DATA  pCa
237                                          __in_opt PSTR szDirectory,                                          __in_opt PSTR szDirectory,
238                                          __in PBYTE* pbResponse, __in PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in PDWORD pdwResponseSize)
239  {  {
240          DWORD dwReturn = 0, dwNotExists;          DWORD dwReturn = 0, dwReadFileReturn;
241          DWORD dwI, dwSize;          DWORD dwI, dwSize;
242          BOOL fDirectoryFound = FALSE;          BOOL fDirectoryFound = FALSE;
243            BOOL fAddToOuput;
244          __try          __try
245          {          {
246                  *pbResponse = NULL;                  *pbResponse = NULL;
247                  *pdwResponseSize = 0;                  *pdwResponseSize = 0;
248                    
249                    // compute the max size of the buffer
250                    dwSize = 0;
251                    for(dwI = 0; dwI < dwFileCount; dwI++)
252                    {
253                            BOOL fMatch = FALSE;
254                            if (szDirectory == NULL)
255                            {
256                                    if (!Files[dwI].szDirectory) fMatch = TRUE;
257                            }
258                            else
259                            {
260                                    if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
261                            }
262                            if (fMatch && !(Files[dwI].dwFileType & OPENPGP_FILE_WRITE_ONLY))
263                            {
264                                    dwSize += (DWORD) strlen( Files[dwI].szFile) + 1;
265                            }
266                    }
267                    dwSize += 1;
268                    *pbResponse = pCardData->pfnCspAlloc(dwSize);
269                    if (!*pbResponse)
270                    {
271                            dwReturn = SCARD_E_NO_MEMORY;
272                            __leave;
273                    }
274                  for(dwI = 0; dwI < dwFileCount; dwI++)                  for(dwI = 0; dwI < dwFileCount; dwI++)
275                  {                  {
276                          BOOL fMatch = FALSE;                          BOOL fMatch = FALSE;
# Line 254  DWORD OCardEnumFile(__in PCARD_DATA  pCa Line 285  DWORD OCardEnumFile(__in PCARD_DATA  pCa
285                          if (fMatch)                          if (fMatch)
286                          {                          {
287                                  fDirectoryFound = TRUE;                                  fDirectoryFound = TRUE;
288                                  dwNotExists = 0;                                  fAddToOuput = TRUE;
289                                  if (StoredOnSmartCard == Files[dwI].dwFileType)                                  if (Files[dwI].dwFlag & OPENPGP_FILE_WRITE_ONLY)
290                                    {
291                                            fAddToOuput = FALSE;
292                                    }
293                                    if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING))
294                                  {                                  {
295                                          PBYTE pbData = NULL;                                          PBYTE pbData = NULL;
296                                          DWORD dwSize;                                          DWORD dwSize;
297                                            fAddToOuput = FALSE;
298                                          // check if the file exists and be read                                          // check if the file exists and be read
299                                          dwNotExists = OCardReadFile(pCardData, szDirectory, Files[dwI].szFile, &pbData, &dwSize);                                          dwReadFileReturn = OCardReadFile(pCardData, szDirectory, Files[dwI].szFile, &pbData, &dwSize);
300                                          if (!dwNotExists)                                          if (!dwReadFileReturn)
301                                          {                                          {
302                                                  pCardData->pfnCspFree(pbData);                                                  pCardData->pfnCspFree(pbData);
303                                                    if (dwSize > 0)
304                                                    {
305                                                            fAddToOuput = TRUE;
306                                                    }
307                                          }                                          }
308                                  }                                  }
309                                  if (!dwNotExists)                                  if (fAddToOuput)
310                                  {                                  {
311                                          dwSize = (DWORD) strlen( Files[dwI].szFile) + 1;                                          dwSize = (DWORD) strlen( Files[dwI].szFile) + 1;
                                         // + 1 to add the final \0  
                                         if (*pbResponse)  
                                         {  
                                                 *pbResponse = pCardData->pfnCspReAlloc(*pbResponse, *pdwResponseSize + dwSize + 1);  
                                         }  
                                         else  
                                         {  
                                                 *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize + dwSize + 1);  
                                         }  
                                         if (!*pbResponse)  
                                         {  
                                                 dwReturn = SCARD_E_NO_MEMORY;  
                                                 __leave;  
                                         }  
312                                          memcpy(*pbResponse + *pdwResponseSize,  Files[dwI].szFile, dwSize);                                          memcpy(*pbResponse + *pdwResponseSize,  Files[dwI].szFile, dwSize);
313                                          *pdwResponseSize += dwSize;                                          *pdwResponseSize += dwSize;
314                                  }                                  }

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26