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; |
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 |
|
|
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 |
|
|
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; |
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 |
} |
} |