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