/[openpgpmdrv]/trunk/OpenPGPminidriver/PinOperations.c
ViewVC logotype

Diff of /trunk/OpenPGPminidriver/PinOperations.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3 by vletoux, Thu Feb 25 22:09:17 2010 UTC revision 9 by vletoux, Mon Mar 15 09:47:30 2010 UTC
# Line 28  DWORD CheckPinLength(__in PCARD_DATA  pC Line 28  DWORD CheckPinLength(__in PCARD_DATA  pC
28  {  {
29          DWORD dwReturn;          DWORD dwReturn;
30          PBYTE pbResponse = NULL;          PBYTE pbResponse = NULL;
31          DWORD dwMinPinSize = 0, dwMaxPinSize;          DWORD dwMinPinSize = 0, dwMaxPinSize, dwSize;
32          __try          __try
33          {          {
34                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);
# Line 41  DWORD CheckPinLength(__in PCARD_DATA  pC Line 41  DWORD CheckPinLength(__in PCARD_DATA  pC
41                  case ROLE_CONFIDENTIALITY:                  case ROLE_CONFIDENTIALITY:
42                          dwMinPinSize = 6;                          dwMinPinSize = 6;
43                  case ROLE_PUK:                  case ROLE_PUK:
44                            dwMinPinSize = 1;
45                          break;                          break;
46                  case ROLE_ADMIN:                  case ROLE_ADMIN:
47                          dwMinPinSize = 8;                          dwMinPinSize = 8;
# Line 56  DWORD CheckPinLength(__in PCARD_DATA  pC Line 57  DWORD CheckPinLength(__in PCARD_DATA  pC
57                          __leave;                          __leave;
58                  }                  }
59                  // check in status DO                  // check in status DO
60                  dwReturn = SCardReadFile(pCardData, szOpenPGPDir, szOpenPGPStatus, &pbResponse, NULL);                  dwReturn = OCardReadFile(pCardData, szOpenPGPDir, szOpenPGPStatus, &pbResponse, &dwSize);
61                    if (dwReturn)
62                    {
63                            __leave;
64                    }
65                  switch(PinId)                  switch(PinId)
66                  {                  {
67                  case ROLE_SIGNATURE:                  case ROLE_SIGNATURE:
# Line 92  DWORD CheckPinLength(__in PCARD_DATA  pC Line 97  DWORD CheckPinLength(__in PCARD_DATA  pC
97    
98  DWORD GetRemainingPin(__in PCARD_DATA  pCardData, __in PIN_ID  PinId, __out PDWORD pdwCounter)  DWORD GetRemainingPin(__in PCARD_DATA  pCardData, __in PIN_ID  PinId, __out PDWORD pdwCounter)
99  {  {
100          DWORD dwReturn;          DWORD dwReturn, dwSize;
101          PBYTE pbResponse = NULL;          PBYTE pbResponse = NULL;
102          __try          __try
103          {          {
104                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);
105                  dwReturn = SCardReadFile(pCardData, szOpenPGPDir, szOpenPGPStatus, &pbResponse, NULL);                  dwReturn = OCardReadFile(pCardData, szOpenPGPDir, szOpenPGPStatus, &pbResponse, &dwSize);
106                  switch(PinId)                  switch(PinId)
107                  {                  {
108                  case ROLE_SIGNATURE:                  case ROLE_SIGNATURE:
# Line 159  DWORD VerifyPIN(__in PCARD_DATA  pCardDa Line 164  DWORD VerifyPIN(__in PCARD_DATA  pCardDa
164                  }                  }
165                  pbCmd[4] = (BYTE) cbPin;                  pbCmd[4] = (BYTE) cbPin;
166                  memcpy(pbCmd + 5, pbPin, cbPin);                  memcpy(pbCmd + 5, pbPin, cbPin);
167                  dwReturn = SCardSendCommand(pCardData, pbCmd, 5 + cbPin);                  dwReturn = OCardSendCommand(pCardData, pbCmd, 5 + cbPin);
168                  if (dwReturn)                  if (dwReturn)
169                  {                  {
170                            Trace(WINEVENT_LEVEL_VERBOSE, L"Authentication failed");
171                          __leave;                          __leave;
172                  }                  }
173                  /*switch(PinId)                  Trace(WINEVENT_LEVEL_VERBOSE, L"Authentication successfull");
                 {  
                         case ROLE_AUTHENTICATION:  
                         case ROLE_CONFIDENTIALITY:  
                                 dwReturn = VerifyPIN(pCardData, ROLE_SIGNATURE, pbPin, cbPin);  
                                 break;  
                 }*/  
174                                                    
175          }          }
176          __finally          __finally
# Line 197  DWORD ChangePIN(__in PCARD_DATA  pCardDa Line 197  DWORD ChangePIN(__in PCARD_DATA  pCardDa
197          __try          __try
198          {          {
199                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);
200                    dwReturn = CheckPinLength(pCardData, PinId, cbNewPin);
201                    if (dwReturn)
202                    {
203                            Trace(WINEVENT_LEVEL_ERROR, L"Invalid len %d",cbNewPin);
204                            dwReturn = SCARD_E_INVALID_PARAMETER;
205                            __leave;
206                    }
207                  dwReturn = CheckPinLength(pCardData, PinId, cbOldPin);                  dwReturn = CheckPinLength(pCardData, PinId, cbOldPin);
208                  if (dwReturn)                  if (dwReturn)
209                  {                  {
# Line 222  DWORD ChangePIN(__in PCARD_DATA  pCardDa Line 229  DWORD ChangePIN(__in PCARD_DATA  pCardDa
229                  pbCmd[4] = (BYTE) (cbOldPin + cbNewPin);                  pbCmd[4] = (BYTE) (cbOldPin + cbNewPin);
230                  memcpy(pbCmd + 5, pbOldPin, cbOldPin);                  memcpy(pbCmd + 5, pbOldPin, cbOldPin);
231                  memcpy(pbCmd + 5 + cbOldPin, pbNewPin, cbNewPin);                  memcpy(pbCmd + 5 + cbOldPin, pbNewPin, cbNewPin);
232                  dwReturn = SCardSendCommand(pCardData, pbCmd, 5 + cbOldPin + cbNewPin);                  dwReturn = OCardSendCommand(pCardData, pbCmd, 5 + cbOldPin + cbNewPin);
233          }          }
234          __finally          __finally
235          {          {
# Line 249  DWORD ResetUserPIN(__in PCARD_DATA  pCar Line 256  DWORD ResetUserPIN(__in PCARD_DATA  pCar
256          __try          __try
257          {          {
258                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter PinId=%d",PinId);
259                    dwReturn = CheckPinLength(pCardData, ROLE_USER, cbNewPin);
260                    if (dwReturn)
261                    {
262                            Trace(WINEVENT_LEVEL_ERROR, L"Invalid len %d",cbNewPin);
263                            dwReturn = SCARD_E_INVALID_PARAMETER;
264                            __leave;
265                    }
266                  switch(PinId)                  switch(PinId)
267                  {                  {
268                  case ROLE_ADMIN:                  case ROLE_ADMIN:
269                          // authenticate the admin                          // authenticate the admin
270                          dwReturn = VerifyPIN(pCardData, PinId, pbAuthenticator, cbAuthenticator);                          dwReturn = VerifyPIN(pCardData, PinId, pbAuthenticator, cbAuthenticator);
271                          if (!dwReturn)                          if (dwReturn)
272                          {                          {
273                                  return dwReturn;                                  __leave;
274                          }                          }
275                          pbCmd[4] = (BYTE) cbAuthenticator;                          pbCmd[4] = (BYTE) cbNewPin;
276                          memcpy(pbCmd + 5, pbNewPin, cbNewPin);                          memcpy(pbCmd + 5, pbNewPin, cbNewPin);
277                          dwCmdSize = 5 + cbNewPin;                          dwCmdSize = 5 + cbNewPin;
278                          break;                          break;
# Line 267  DWORD ResetUserPIN(__in PCARD_DATA  pCar Line 281  DWORD ResetUserPIN(__in PCARD_DATA  pCar
281                          if (dwReturn)                          if (dwReturn)
282                          {                          {
283                                  __leave;                                  __leave;
284                          }                          }      
285                          pbCmd[2] = 0x00;                          pbCmd[2] = 0x00;
286                          pbCmd[4] = (BYTE) (cbAuthenticator + cbNewPin);                          pbCmd[4] = (BYTE) (cbAuthenticator + cbNewPin);
287                          memcpy(pbCmd + 5, pbAuthenticator, cbAuthenticator);                          memcpy(pbCmd + 5, pbAuthenticator, cbAuthenticator);
# Line 278  DWORD ResetUserPIN(__in PCARD_DATA  pCar Line 292  DWORD ResetUserPIN(__in PCARD_DATA  pCar
292                          dwReturn = SCARD_E_INVALID_PARAMETER;                          dwReturn = SCARD_E_INVALID_PARAMETER;
293                          __leave;                          __leave;
294                  }                  }
295                  dwReturn = SCardSendCommand(pCardData, pbCmd, dwCmdSize);                  dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize);
296          }          }
297          __finally          __finally
298          {          {
# Line 287  DWORD ResetUserPIN(__in PCARD_DATA  pCar Line 301  DWORD ResetUserPIN(__in PCARD_DATA  pCar
301          return dwReturn;          return dwReturn;
302  }  }
303    
304    DWORD SetPUK(__in PCARD_DATA  pCardData,
305                                    __in_bcount(cbPin) PBYTE  pbAdminPin, __in DWORD  cbAdminPin,
306                                    __in_bcount(cbPin) PBYTE  pbPuk, __in DWORD  cbPuk
307                                    )
308    {
309            DWORD dwReturn;
310            Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
311            __try
312            {
313                    dwReturn = CheckPinLength(pCardData, ROLE_PUK, cbPuk);
314                    if (dwReturn)
315                    {
316                            Trace(WINEVENT_LEVEL_ERROR, L"Invalid len %d",cbPuk);
317                            dwReturn = SCARD_E_INVALID_PARAMETER;
318                            __leave;
319                    }
320                    dwReturn = VerifyPIN(pCardData, ROLE_ADMIN, pbAdminPin, cbAdminPin);
321                    if (dwReturn)
322                    {
323                            __leave;
324                    }
325                    dwReturn = OCardWriteFile(pCardData, szOpenPGPDir, szOpenPGPPUK, pbPuk, cbPuk);
326            }
327            __finally
328            {
329            }
330            return dwReturn;
331    }
332    
333  DWORD Deauthenticate(__in PCARD_DATA  pCardData)  DWORD Deauthenticate(__in PCARD_DATA  pCardData)
334  {  {
335          DWORD     dwAP;          /*DWORD     dwCode, dwSize;
336          DWORD dwReturn;          DWORD dwReturn;
337          __try          __try
338          {          {
339                  // reset the card                  // reset the card
340                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
341                  dwReturn = SCardReconnect(pCardData->hScard,                  dwCode = SCARD_COLD_RESET;
342                           SCARD_SHARE_SHARED,                  dwReturn = SCardControl(pCardData->hScard, IOCTL_SMARTCARD_POWER,&dwCode,4,NULL,0,&dwSize);  
343                           SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,                  if (dwReturn && dwReturn != SCARD_W_RESET_CARD)
                          SCARD_LEAVE_CARD,  
                          &dwAP );  
                 if (dwReturn)  
344                  {                  {
345                          Trace(WINEVENT_LEVEL_ERROR, L"SCardControl 0x%08X", dwReturn);                          Trace(WINEVENT_LEVEL_ERROR, L"SCardControl 0x%08X", dwReturn);
346                          __leave;                          __leave;
347                  }                  }
348                  // regain the ownership of a transaction                  Sleep(200);
349                  dwReturn = SCardBeginTransaction(pCardData->hScard);                  dwReturn = SelectOpenPGPApplication(pCardData);
350                  if (dwReturn)          }
351            __finally
352            {
353            }
354            return dwReturn;*/
355            return SCARD_E_UNSUPPORTED_FEATURE;
356    }
357    
358    
359    DWORD GetPinInfo(DWORD __in dwPinIndex, __inout PPIN_INFO pPinInfo)
360    {
361            DWORD dwReturn=0, dwVersion;
362            __try
363            {
364                    Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwPinIndex=%d",dwPinIndex);
365                    dwVersion = (pPinInfo->dwVersion == 0) ? PIN_INFO_CURRENT_VERSION : pPinInfo->dwVersion;
366                    if ( dwVersion != PIN_INFO_CURRENT_VERSION )
367                  {                  {
368                          Trace(WINEVENT_LEVEL_ERROR, L"SCardBeginTransaction 0x%08X", dwReturn);                          Trace(WINEVENT_LEVEL_ERROR, L"dwVersion %d", dwVersion);
369                            dwReturn  = ERROR_REVISION_MISMATCH;
370                            __leave;
371                    }
372                    pPinInfo->dwVersion = dwVersion;
373                    switch(dwPinIndex)
374                    {
375                    case ROLE_SIGNATURE:
376                            pPinInfo->PinType = AlphaNumericPinType;
377                            pPinInfo->PinPurpose = DigitalSignaturePin;
378                            pPinInfo->dwChangePermission = CREATE_PIN_SET(ROLE_SIGNATURE);
379                            SET_PIN(pPinInfo->dwChangePermission, ROLE_AUTHENTICATION);
380                            SET_PIN(pPinInfo->dwChangePermission, ROLE_CONFIDENTIALITY);
381                            pPinInfo->dwUnblockPermission = CREATE_PIN_SET(ROLE_ADMIN);
382                            SET_PIN(pPinInfo->dwUnblockPermission, ROLE_PUK);
383                            pPinInfo->PinCachePolicy.dwVersion = PIN_CACHE_POLICY_CURRENT_VERSION;
384                            pPinInfo->PinCachePolicy.PinCachePolicyType = PinCacheNormal;
385                            pPinInfo->dwFlags = 0;
386                            break;
387                    case ROLE_AUTHENTICATION:
388                            pPinInfo->PinType = AlphaNumericPinType;
389                            pPinInfo->PinPurpose = AuthenticationPin;
390                            pPinInfo->dwChangePermission = CREATE_PIN_SET(ROLE_SIGNATURE);
391                            SET_PIN(pPinInfo->dwChangePermission, ROLE_AUTHENTICATION);
392                            SET_PIN(pPinInfo->dwChangePermission, ROLE_CONFIDENTIALITY);
393                            pPinInfo->dwUnblockPermission = CREATE_PIN_SET(ROLE_ADMIN);
394                            SET_PIN(pPinInfo->dwUnblockPermission, ROLE_PUK);
395                            pPinInfo->PinCachePolicy.dwVersion = PIN_CACHE_POLICY_CURRENT_VERSION;
396                            pPinInfo->PinCachePolicy.PinCachePolicyType = PinCacheNormal;
397                            pPinInfo->dwFlags = 0;
398                            break;
399                    case ROLE_CONFIDENTIALITY:
400                            pPinInfo->PinType = AlphaNumericPinType;
401                            pPinInfo->PinPurpose = EncryptionPin;
402                            pPinInfo->dwChangePermission = CREATE_PIN_SET(ROLE_SIGNATURE);
403                            SET_PIN(pPinInfo->dwChangePermission, ROLE_AUTHENTICATION);
404                            SET_PIN(pPinInfo->dwChangePermission, ROLE_CONFIDENTIALITY);
405                            pPinInfo->dwUnblockPermission = CREATE_PIN_SET(ROLE_ADMIN);
406                            SET_PIN(pPinInfo->dwUnblockPermission, ROLE_PUK);
407                            pPinInfo->PinCachePolicy.dwVersion = PIN_CACHE_POLICY_CURRENT_VERSION;
408                            pPinInfo->PinCachePolicy.PinCachePolicyType = PinCacheNormal;
409                            pPinInfo->dwFlags = 0;
410                            break;
411                    case ROLE_ADMIN:
412                            pPinInfo->PinType = AlphaNumericPinType;
413                            pPinInfo->PinPurpose = AdministratorPin;
414                            pPinInfo->dwChangePermission = CREATE_PIN_SET(ROLE_ADMIN);
415                            pPinInfo->dwUnblockPermission = 0;
416                            pPinInfo->PinCachePolicy.dwVersion = PIN_CACHE_POLICY_CURRENT_VERSION;
417                            pPinInfo->PinCachePolicy.PinCachePolicyType = PinCacheNormal;
418                            pPinInfo->dwFlags = 0;
419                            break;
420                    case ROLE_PUK:
421                            pPinInfo->PinType = AlphaNumericPinType;
422                            pPinInfo->PinPurpose = UnblockOnlyPin;
423                            pPinInfo->dwChangePermission = CREATE_PIN_SET(ROLE_ADMIN);
424                            pPinInfo->dwUnblockPermission = 0;
425                            pPinInfo->PinCachePolicy.dwVersion = PIN_CACHE_POLICY_CURRENT_VERSION;
426                            pPinInfo->PinCachePolicy.PinCachePolicyType = PinCacheNormal;
427                            pPinInfo->dwFlags = 0;
428                            break;
429                    default:
430                            Trace(WINEVENT_LEVEL_ERROR, L"dwPinIndex == %d", dwPinIndex);
431                            dwReturn  = SCARD_E_INVALID_PARAMETER ;
432                          __leave;                          __leave;
433                  }                  }
                 dwReturn = SelectOpenPGPApplication(pCardData);  
434          }          }
435          __finally          __finally
436          {          {
437          }          }
438            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
439          return dwReturn;          return dwReturn;
440  }  }

Legend:
Removed from v.3  
changed lines
  Added in v.9

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26