/[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 10 by vletoux, Mon Mar 15 18:23:17 2010 UTC revision 11 by vletoux, Thu Mar 18 16:03:39 2010 UTC
# Line 54  OPENPGP_FILE Files[] = Line 54  OPENPGP_FILE Files[] =
54  {  {
55          {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x6E, 0xC5, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x6E, 0xC5, EveryoneReadAdminWriteAc},
56          {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc},
57            {szOpenPGPDir, szOpenPGPStatusPW1, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_WRITE_ONLY},
58          {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x4F, 0, UnknownAc},          {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x4F, 0, UnknownAc},
59          {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x5E, 0, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x5E, 0, EveryoneReadAdminWriteAc},
60          {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x65, 0x5B, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x65, 0x5B, EveryoneReadAdminWriteAc},
# Line 61  OPENPGP_FILE Files[] = Line 62  OPENPGP_FILE Files[] =
62          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},
63          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},          {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},
64          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},          {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},
65          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},          {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},
66          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},          {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},
67          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},
68          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},          {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},
# Line 71  OPENPGP_FILE Files[] = Line 72  OPENPGP_FILE Files[] =
72          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},          {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},
73          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
74          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},          {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
75          {szBASE_CSP_DIR, "ksc1", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING | OPENPGP_FILE_CONF_IS_AUTH},          {szBASE_CSP_DIR, "kxc01", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING | OPENPGP_FILE_CONF_IS_AUTH},
76          {szBASE_CSP_DIR, "ksc2", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},          {szBASE_CSP_DIR, "ksc02", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},
77    
78  };  };
79    
# Line 102  DWORD OCardReadFile(__in PCARD_DATA  pCa Line 103  DWORD OCardReadFile(__in PCARD_DATA  pCa
103          DWORD dwReturn = 0;          DWORD dwReturn = 0;
104          BOOL fDirectoryFound = FALSE;          BOOL fDirectoryFound = FALSE;
105          BOOL fFileFound = FALSE;          BOOL fFileFound = FALSE;
106          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00};          BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00, 0x00,0x00};
107          DWORD dwCmdSize = ARRAYSIZE(pbCmd);          DWORD dwCmdSize = ARRAYSIZE(pbCmd);
108          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
109          PBYTE pbData = NULL;          PBYTE pbData = NULL;
# Line 164  DWORD OCardReadFile(__in PCARD_DATA  pCa Line 165  DWORD OCardReadFile(__in PCARD_DATA  pCa
165                                          {                                          {
166                                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");                                                  Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
167                                                  dwReturn = SCARD_E_NO_MEMORY;                                                  dwReturn = SCARD_E_NO_MEMORY;
168                                                    __leave;
169                                          }                                          }
170                                          memcpy(*ppbResponse, pbPointer, *pdwResponseSize);                                          memcpy(*ppbResponse, pbPointer, *pdwResponseSize);
171                                  }                                  }
# Line 171  DWORD OCardReadFile(__in PCARD_DATA  pCa Line 173  DWORD OCardReadFile(__in PCARD_DATA  pCa
173                                  {                                  {
174                                          dwReturn = SCARD_E_FILE_NOT_FOUND;                                          dwReturn = SCARD_E_FILE_NOT_FOUND;
175                                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);                                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
176                                            __leave;
177                                  }                                  }
178                          }                          }
179                          else                          else
# Line 179  DWORD OCardReadFile(__in PCARD_DATA  pCa Line 182  DWORD OCardReadFile(__in PCARD_DATA  pCa
182                                  // do not free the data !                                  // do not free the data !
183                                  pbData = NULL;                                  pbData = NULL;
184                          }                          }
185                            if (Files[dwI].dwFlag & OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING)
186                            {
187                                    if (*pdwResponseSize == 0)
188                                    {
189                                            pCardData->pfnCspFree(*ppbResponse);
190                                            *pdwResponseSize = 0;
191                                            *ppbResponse = NULL;
192                                            dwReturn = SCARD_E_FILE_NOT_FOUND;
193                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING",szFile);
194                                            __leave;
195                                    }
196                            }
197                            if (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH)
198                            {
199                                    DWORD dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData);
200                                    if (dwTempReturn)
201                                    {
202                                            pCardData->pfnCspFree(*ppbResponse);
203                                            *pdwResponseSize = 0;
204                                            *ppbResponse = NULL;
205                                            dwReturn = SCARD_E_FILE_NOT_FOUND;
206                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_CONF_IS_AUTH",szFile);
207                                            __leave;
208                                    }
209                            }
210                  }                  }
211                  else                  else
212                  {                  {
# Line 311  DWORD OCardEnumFile(__in PCARD_DATA  pCa Line 339  DWORD OCardEnumFile(__in PCARD_DATA  pCa
339                                  if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH))                                  if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH))
340                                  {                                  {
341                                          dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData);                                          dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData);
342                                          if (dwReturn)                                          if (dwTempReturn)
343                                          {                                          {
344                                                  fAddToOuput = FALSE;                                                  fAddToOuput = FALSE;
345                                          }                                          }
# Line 387  DWORD OCardGetFileInfo(__in PCARD_DATA Line 415  DWORD OCardGetFileInfo(__in PCARD_DATA
415          return dwReturn;                  return dwReturn;        
416  }  }
417    
418  DWORD OCardWriteFile(__in PCARD_DATA  pCardData,  DWORD OCardWriteFileOnSmartCard(__in PCARD_DATA  pCardData,
419                                          __in_opt PSTR szDirectory, __in PSTR szFile,                                          __in OPENPGP_FILE File,
420                                          __in PBYTE pbData, __in DWORD dwSize)                                          __in PBYTE pbData, __in DWORD dwSize)
421  {  {
         DWORD dwI;  
422          DWORD dwReturn = 0;          DWORD dwReturn = 0;
         BOOL fDirectoryFound = FALSE;  
         BOOL fFileFound = FALSE;  
423          BYTE pbCmd[5 + 256] = {0x00, 0xDA, 0x00, 0x00, 0x00};          BYTE pbCmd[5 + 256] = {0x00, 0xDA, 0x00, 0x00, 0x00};
424          DWORD dwCmdSize = 0;          DWORD dwCmdSize = 0;
425            PBYTE pbCmdExtended = NULL;
426          __try          __try
427          {          {
428                  if (dwSize > 255)                  if (dwSize > 0xFFFF)
429                  {                  {
430                          dwReturn = SCARD_E_INVALID_PARAMETER;                          dwReturn = SCARD_E_INVALID_PARAMETER;
431                          Trace(WINEVENT_LEVEL_ERROR, L"dwSize %d",dwSize);                          Trace(WINEVENT_LEVEL_ERROR, L"dwSize %d",dwSize);
432                          __leave;                          __leave;
433                  }                  }
434                    if (dwSize < 256)
435                    {
436                            if (File.dwTlv > 0)
437                            {
438                                    pbCmd[2] = (BYTE) (File.dwTlv / 0x100);
439                                    pbCmd[3] = (BYTE) (File.dwTlv % 0x100);
440                            }
441                            else
442                            {
443                                    pbCmd[2] = (BYTE) (File.dwTag / 0x100);
444                                    pbCmd[3] = (BYTE) (File.dwTag % 0x100);
445                            }
446                            pbCmd[4] = (BYTE) dwSize;
447                            if (dwSize)
448                            {
449                                    memcpy(pbCmd + 5, pbData, dwSize);
450                            }
451                            dwCmdSize = dwSize + 5;
452                            dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize);
453                            if (dwReturn)
454                            {
455                                    __leave;
456                            }
457                    }
458                    else
459                    {
460                            dwCmdSize = dwSize + 7;
461                            pbCmdExtended = pCardData->pfnCspAlloc(dwCmdSize);
462                            if (!pbCmdExtended)
463                            {
464                                    Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
465                                    dwReturn = SCARD_E_NO_MEMORY;
466                                    __leave;
467                            }
468                            pbCmdExtended[0] = 0;
469                            pbCmdExtended[1] = 0xDA;
470                            if (File.dwTlv > 0)
471                            {
472                                    pbCmdExtended[2] = (BYTE) (File.dwTlv / 0x100);
473                                    pbCmdExtended[3] = (BYTE) (File.dwTlv % 0x100);
474                            }
475                            else
476                            {
477                                    pbCmdExtended[2] = (BYTE) (File.dwTag / 0x100);
478                                    pbCmdExtended[3] = (BYTE) (File.dwTag % 0x100);
479                            }
480                            pbCmdExtended[4] = 0;
481                            pbCmdExtended[5] = (BYTE)(dwSize / 0x100);
482                            pbCmdExtended[6] = (BYTE)(dwSize % 0x100);
483                            memcpy(pbCmdExtended + 7, pbData, dwSize);
484                            dwReturn = OCardSendCommand(pCardData, pbCmdExtended, dwCmdSize);
485                            if (dwReturn)
486                            {
487                                    __leave;
488                            }
489                    }
490            }
491            __finally
492            {
493                    if(pbCmdExtended)
494                            pCardData->pfnCspFree(pbCmdExtended);
495            }
496            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
497            return dwReturn;
498    }
499    
500    DWORD OCardWriteFile(__in PCARD_DATA  pCardData,
501                                            __in_opt PSTR szDirectory, __in PSTR szFile,
502                                            __in PBYTE pbData, __in DWORD dwSize)
503    {
504            DWORD dwI;
505            DWORD dwReturn = 0;
506            BOOL fDirectoryFound = FALSE;
507            BOOL fFileFound = FALSE;
508            __try
509            {
510    
511                  for(dwI = 0; dwI < dwFileCount; dwI++)                  for(dwI = 0; dwI < dwFileCount; dwI++)
512                  {                  {
# Line 444  DWORD OCardWriteFile(__in PCARD_DATA  pC Line 545  DWORD OCardWriteFile(__in PCARD_DATA  pC
545                  }                  }
546                  if (Files[dwI].dwFileType == StoredOnSmartCard)                  if (Files[dwI].dwFileType == StoredOnSmartCard)
547                  {                  {
548                          if (Files[dwI].dwTlv > 0)                          dwReturn = OCardWriteFileOnSmartCard(pCardData, Files[dwI], pbData, dwSize);
                         {  
                                 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;  
                         }  
549                  }                  }
550                  else                  else
551                  {                  {
# Line 472  DWORD OCardWriteFile(__in PCARD_DATA  pC Line 553  DWORD OCardWriteFile(__in PCARD_DATA  pC
553                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION %S",szFile);                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION %S",szFile);
554                          __leave;                          __leave;
555                  }                  }
   
                   
556          }          }
557          __finally          __finally
558          {          {

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26