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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26