--- trunk/OpenPGPminidriver/PublicDataOperations.c 2010/03/15 18:23:17 10 +++ trunk/OpenPGPminidriver/PublicDataOperations.c 2010/03/18 16:03:39 11 @@ -54,6 +54,7 @@ { {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x6E, 0xC5, EveryoneReadAdminWriteAc}, {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc}, + {szOpenPGPDir, szOpenPGPStatusPW1, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_WRITE_ONLY}, {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x4F, 0, UnknownAc}, {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x5E, 0, EveryoneReadAdminWriteAc}, {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x65, 0x5B, EveryoneReadAdminWriteAc}, @@ -61,7 +62,7 @@ {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc}, {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc}, {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc}, - {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING}, + {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc}, {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc}, {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc}, {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc}, @@ -71,8 +72,8 @@ {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc}, {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc}, {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc}, - {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING | OPENPGP_FILE_CONF_IS_AUTH}, - {szBASE_CSP_DIR, "ksc2", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING}, + {szBASE_CSP_DIR, "kxc01", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING | OPENPGP_FILE_CONF_IS_AUTH}, + {szBASE_CSP_DIR, "ksc02", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING}, }; @@ -102,7 +103,7 @@ DWORD dwReturn = 0; BOOL fDirectoryFound = FALSE; BOOL fFileFound = FALSE; - BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00}; + BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00, 0x00,0x00}; DWORD dwCmdSize = ARRAYSIZE(pbCmd); POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific; PBYTE pbData = NULL; @@ -164,6 +165,7 @@ { Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY"); dwReturn = SCARD_E_NO_MEMORY; + __leave; } memcpy(*ppbResponse, pbPointer, *pdwResponseSize); } @@ -171,6 +173,7 @@ { dwReturn = SCARD_E_FILE_NOT_FOUND; Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile); + __leave; } } else @@ -179,6 +182,31 @@ // do not free the data ! pbData = NULL; } + if (Files[dwI].dwFlag & OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING) + { + if (*pdwResponseSize == 0) + { + pCardData->pfnCspFree(*ppbResponse); + *pdwResponseSize = 0; + *ppbResponse = NULL; + dwReturn = SCARD_E_FILE_NOT_FOUND; + Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING",szFile); + __leave; + } + } + if (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH) + { + DWORD dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData); + if (dwTempReturn) + { + pCardData->pfnCspFree(*ppbResponse); + *pdwResponseSize = 0; + *ppbResponse = NULL; + dwReturn = SCARD_E_FILE_NOT_FOUND; + Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_CONF_IS_AUTH",szFile); + __leave; + } + } } else { @@ -311,7 +339,7 @@ if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH)) { dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData); - if (dwReturn) + if (dwTempReturn) { fAddToOuput = FALSE; } @@ -387,25 +415,98 @@ return dwReturn; } -DWORD OCardWriteFile(__in PCARD_DATA pCardData, - __in_opt PSTR szDirectory, __in PSTR szFile, +DWORD OCardWriteFileOnSmartCard(__in PCARD_DATA pCardData, + __in OPENPGP_FILE File, __in PBYTE pbData, __in DWORD dwSize) { - DWORD dwI; DWORD dwReturn = 0; - BOOL fDirectoryFound = FALSE; - BOOL fFileFound = FALSE; BYTE pbCmd[5 + 256] = {0x00, 0xDA, 0x00, 0x00, 0x00}; DWORD dwCmdSize = 0; + PBYTE pbCmdExtended = NULL; __try { - if (dwSize > 255) + if (dwSize > 0xFFFF) { dwReturn = SCARD_E_INVALID_PARAMETER; Trace(WINEVENT_LEVEL_ERROR, L"dwSize %d",dwSize); __leave; } + if (dwSize < 256) + { + if (File.dwTlv > 0) + { + pbCmd[2] = (BYTE) (File.dwTlv / 0x100); + pbCmd[3] = (BYTE) (File.dwTlv % 0x100); + } + else + { + pbCmd[2] = (BYTE) (File.dwTag / 0x100); + pbCmd[3] = (BYTE) (File.dwTag % 0x100); + } + pbCmd[4] = (BYTE) dwSize; + if (dwSize) + { + memcpy(pbCmd + 5, pbData, dwSize); + } + dwCmdSize = dwSize + 5; + dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize); + if (dwReturn) + { + __leave; + } + } + else + { + dwCmdSize = dwSize + 7; + pbCmdExtended = pCardData->pfnCspAlloc(dwCmdSize); + if (!pbCmdExtended) + { + Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY"); + dwReturn = SCARD_E_NO_MEMORY; + __leave; + } + pbCmdExtended[0] = 0; + pbCmdExtended[1] = 0xDA; + if (File.dwTlv > 0) + { + pbCmdExtended[2] = (BYTE) (File.dwTlv / 0x100); + pbCmdExtended[3] = (BYTE) (File.dwTlv % 0x100); + } + else + { + pbCmdExtended[2] = (BYTE) (File.dwTag / 0x100); + pbCmdExtended[3] = (BYTE) (File.dwTag % 0x100); + } + pbCmdExtended[4] = 0; + pbCmdExtended[5] = (BYTE)(dwSize / 0x100); + pbCmdExtended[6] = (BYTE)(dwSize % 0x100); + memcpy(pbCmdExtended + 7, pbData, dwSize); + dwReturn = OCardSendCommand(pCardData, pbCmdExtended, dwCmdSize); + if (dwReturn) + { + __leave; + } + } + } + __finally + { + if(pbCmdExtended) + pCardData->pfnCspFree(pbCmdExtended); + } + Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); + return dwReturn; +} +DWORD OCardWriteFile(__in PCARD_DATA pCardData, + __in_opt PSTR szDirectory, __in PSTR szFile, + __in PBYTE pbData, __in DWORD dwSize) +{ + DWORD dwI; + DWORD dwReturn = 0; + BOOL fDirectoryFound = FALSE; + BOOL fFileFound = FALSE; + __try + { for(dwI = 0; dwI < dwFileCount; dwI++) { @@ -444,27 +545,7 @@ } if (Files[dwI].dwFileType == StoredOnSmartCard) { - if (Files[dwI].dwTlv > 0) - { - pbCmd[2] = (BYTE) (Files[dwI].dwTlv / 0x100); - pbCmd[3] = (BYTE) (Files[dwI].dwTlv % 0x100); - } - else - { - pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100); - pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100); - } - pbCmd[4] = (BYTE) dwSize; - if (dwSize) - { - memcpy(pbCmd + 5, pbData, dwSize); - } - dwCmdSize = dwSize + 5; - dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize); - if (dwReturn) - { - __leave; - } + dwReturn = OCardWriteFileOnSmartCard(pCardData, Files[dwI], pbData, dwSize); } else { @@ -472,8 +553,6 @@ Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION %S",szFile); __leave; } - - } __finally {