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

Diff of /trunk/OpenPGPminidriver/CryptoOperations.c

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

revision 4 by vletoux, Sun Feb 28 09:39:34 2010 UTC revision 5 by vletoux, Tue Mar 2 18:54:34 2010 UTC
# Line 188  DWORD GetKeyAlgorithmAttributes(__in PCA Line 188  DWORD GetKeyAlgorithmAttributes(__in PCA
188                  if (pbData)                  if (pbData)
189                          pCardData->pfnCspFree(pbData);                          pCardData->pfnCspFree(pbData);
190          }          }
191            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
192          return dwReturn;          return dwReturn;
193  }  }
194    
# Line 234  DWORD SetKeyAlgorithmAttributes(__in PCA Line 235  DWORD SetKeyAlgorithmAttributes(__in PCA
235          __finally          __finally
236          {          {
237          }          }
238            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
239          return dwReturn;          return dwReturn;
240  }  }
241    
# Line 372  DWORD BuildPrivateKeyTlv(__in PCARD_DATA Line 374  DWORD BuildPrivateKeyTlv(__in PCARD_DATA
374                  {                  {
375                          (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(3*bitlen)/16 - 1 - dwI];                          (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(3*bitlen)/16 - 1 - dwI];
376                  }                  }
                 TraceDump(WINEVENT_LEVEL_VERBOSE, *ppbTlv + dwOffset, bitlen / 16);  
377                  dwOffset += bitlen / 16;                  dwOffset += bitlen / 16;
378                                    
379                  // prime2                  // prime2
# Line 381  DWORD BuildPrivateKeyTlv(__in PCARD_DATA Line 382  DWORD BuildPrivateKeyTlv(__in PCARD_DATA
382                          (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(4*bitlen)/16 - 1 - dwI];                          (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(4*bitlen)/16 - 1 - dwI];
383                  }                  }
384                  //memcpy(*ppbTlv + dwOffset, pbPublicKeyData + (3*bitlen)/16, bitlen / 16);                  //memcpy(*ppbTlv + dwOffset, pbPublicKeyData + (3*bitlen)/16, bitlen / 16);
                 TraceDump(WINEVENT_LEVEL_VERBOSE, *ppbTlv + dwOffset, bitlen / 16);  
385                  dwOffset += bitlen / 16;                  dwOffset += bitlen / 16;
386                  if (bFormat & 2)                  if (bFormat & 2)
387                  {                  {
# Line 416  DWORD BuildPrivateKeyTlv(__in PCARD_DATA Line 416  DWORD BuildPrivateKeyTlv(__in PCARD_DATA
416                                  (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[bitlen / 8 - 1 - dwI];                                  (*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[bitlen / 8 - 1 - dwI];
417                          }                          }
418                  }                  }
                 TraceDump(WINEVENT_LEVEL_VERBOSE, pbPublicKeyData, bitlen / 8);  
419          }          }
420          __finally          __finally
421          {          {
422          }          }
423            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
424          return dwReturn;          return dwReturn;
425  }  }
426    
# Line 461  DWORD UpdateGenerationDateTime(__in PCAR Line 461  DWORD UpdateGenerationDateTime(__in PCAR
461          __finally          __finally
462          {          {
463          }          }
464            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
465          return dwReturn;          return dwReturn;
466  }  }
467    
# Line 567  DWORD UpdateFingerPrint(__in PCARD_DATA Line 568  DWORD UpdateFingerPrint(__in PCARD_DATA
568                          CryptReleaseContext(hProv,0);                          CryptReleaseContext(hProv,0);
569    
570          }          }
571            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
572          return dwReturn;          return dwReturn;
573    
574  }  }
# Line 621  DWORD SCardReadPublicKey(PCARD_DATA pCar Line 623  DWORD SCardReadPublicKey(PCARD_DATA pCar
623                  {                  {
624                          __leave;                          __leave;
625                  }                  }
                 //TraceDump(WINEVENT_LEVEL_INFO, pbData,dwSize);  
626                  if (!find_tlv(pbData,0x81,&pbModulus,&dwModulusSize))                  if (!find_tlv(pbData,0x81,&pbModulus,&dwModulusSize))
627                  {                  {
628                          dwReturn = SCARD_E_UNEXPECTED;                          dwReturn = SCARD_E_UNEXPECTED;
# Line 659  DWORD SCardReadPublicKey(PCARD_DATA pCar Line 660  DWORD SCardReadPublicKey(PCARD_DATA pCar
660                          pbBlob->modulus[dwI] = pbModulus[dwModulusSize - 1 - dwI];                          pbBlob->modulus[dwI] = pbModulus[dwModulusSize - 1 - dwI];
661                  }                  }
662                                    
                 //TraceDump(WINEVENT_LEVEL_VERBOSE, pbModulus, dwModulusSize);  
663                  dwReturn = 0;                  dwReturn = 0;
664          }          }
665          __finally          __finally
666          {          {
667          }          }
668            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
669          return dwReturn;          return dwReturn;
670  }  }
671    
# Line 766  DWORD SCardCreateKey(PCARD_DATA pCardDat Line 767  DWORD SCardCreateKey(PCARD_DATA pCardDat
767                  if (pbData)                  if (pbData)
768                          pCardData->pfnCspFree(pbData);                          pCardData->pfnCspFree(pbData);
769          }          }
770            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
771          return dwReturn;          return dwReturn;
772  }  }
773    
# Line 830  DWORD SCardImportKey(PCARD_DATA pCardDat Line 832  DWORD SCardImportKey(PCARD_DATA pCardDat
832                  {                  {
833                          __leave;                          __leave;
834                  }                  }
                 //TraceDump(WINEVENT_LEVEL_VERBOSE, pbTlv, dwTlvSize);  
835                  if (dwTlvSize > 0xFF)                  if (dwTlvSize > 0xFF)
836                  {                  {
837                          dwCommandSize = 7 + dwTlvSize;                          dwCommandSize = 7 + dwTlvSize;
# Line 890  DWORD SCardImportKey(PCARD_DATA pCardDat Line 891  DWORD SCardImportKey(PCARD_DATA pCardDat
891                          pCardData->pfnCspFree(pbTlv);                          pCardData->pfnCspFree(pbTlv);
892                  }                  }
893          }          }
894            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
895          return dwReturn;          return dwReturn;
896  }  }
897    
# Line 910  DWORD SCardSign(PCARD_DATA pCardData, Line 912  DWORD SCardSign(PCARD_DATA pCardData,
912          __try          __try
913          {          {
914                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);
915                  if (pInfo->bContainerIndex >= MaxContainer)                  if (pInfo->bContainerIndex != Signature)
916                  {                  {
917                          dwReturn = SCARD_E_NO_KEY_CONTAINER;                          dwReturn = SCARD_E_NO_KEY_CONTAINER;
918                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);
919                          __leave;                          __leave;
920                  }                  }
921                  if (pInfo->bContainerIndex != Signature)                  if (CARD_PADDING_PKCS1 & pInfo->dwPaddingType)
922                    {
923                            dwReturn = SCARD_E_UNSUPPORTED_FEATURE;
924                            Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PKCS1");
925                            __leave;
926                    }
927                    else if (CARD_PADDING_PSS & pInfo->dwPaddingType)
928                    {
929                            dwReturn = SCARD_E_UNSUPPORTED_FEATURE;
930                            Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PSS");
931                            __leave;
932                    }
933                    for(dwI = 0 ; dwI < dwSignatureAlgorithmCount ; dwI++)
934                    {
935                            if (SignatureAlgorithm[dwI].aiHashAlg == pInfo->aiHashAlg)
936                            {
937                                    // found
938                                    break;
939                            }
940                    }
941                    if (dwI >= dwSignatureAlgorithmCount)
942                    {
943                            Trace(WINEVENT_LEVEL_ERROR, L"alg not found %d", pInfo->aiHashAlg);
944                            __leave;
945                    }
946                    if (SignatureAlgorithm[dwI].dwHashSize != pInfo->cbData)
947                    {
948                            Trace(WINEVENT_LEVEL_ERROR, L"wrong hash size %d", pInfo->cbData);
949                            __leave;
950                    }
951                    pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
952    
953                    dwCmdSize = 5;
954                    if (pContext->fExtentedLeLcFields)
955                    {
956                            dwCmdSize++;
957                    }
958                    pbCmd[dwCmdSize++] = (BYTE) (SignatureAlgorithm[dwI].dwEncodedOidSize + pInfo->cbData);
959                    memcpy(pbCmd + dwCmdSize , SignatureAlgorithm[dwI].pbEncodedOid,SignatureAlgorithm[dwI].dwEncodedOidSize);
960                    dwCmdSize += SignatureAlgorithm[dwI].dwEncodedOidSize;
961                    /*for(dwI = 0 ; dwI < pInfo->cbData ; dwI++)
962                    {
963                            pbCmd[dwCmdSize + dwI] = pInfo->pbData[pInfo->cbData - dwI -1];
964                    }*/
965                    memcpy(pbCmd + dwCmdSize, pInfo->pbData,pInfo->cbData);
966                    dwCmdSize += pInfo->cbData;
967    
968                    
969                    if (pContext->fExtentedLeLcFields)
970                    {
971                            pbCmd[dwCmdSize++] = (BYTE)(pContext->dwMaxLength / 0x100);
972                            pbCmd[dwCmdSize++] = (BYTE)(pContext->dwMaxLength % 0x100);
973                    }
974                    else
975                    {
976                            pbCmd[dwCmdSize++] = 0;
977                    }
978                    dwReturn = SCardGetData(pCardData, pbCmd, dwCmdSize, &(pInfo->pbSignedData), &(pInfo->cbSignedData));
979                    if (dwReturn == SCARD_W_WRONG_CHV)
980                    {
981                            dwReturn = SCARD_W_SECURITY_VIOLATION;
982                            __leave;
983                    }
984                    if (dwReturn)
985                    {
986                            __leave;
987                    }
988                    // revert the BYTES
989                    for(dwI = 0 ; dwI < pInfo->cbSignedData / 2 ; dwI++)
990                    {
991                            BYTE bTemp = pInfo->pbSignedData[dwI];
992                            pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI];
993                            pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp;
994                    }
995            }
996            __finally
997            {
998                    if (dwReturn)
999                    {
1000                            if (pInfo->pbSignedData)
1001                                    pCardData->pfnCspFree(pInfo->pbSignedData);
1002                    }
1003            }
1004            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
1005            return dwReturn;
1006    }
1007    
1008    DWORD SCardAuthenticate(PCARD_DATA pCardData,
1009                                    PCARD_SIGNING_INFO  pInfo)
1010    {
1011            DWORD dwReturn;
1012            PBYTE pbData = NULL;
1013            DWORD dwCmdSize = 0, dwI;
1014            POPENPGP_CONTEXT pContext;
1015            BYTE pbCmd[6 + 256 + 256] = {0x00,
1016                                        0x88,
1017                                            0x00,
1018                                            0x00,
1019                                            0x00,
1020                                            0x00,
1021                                            };
1022            __try
1023            {
1024                    Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);
1025                    if (pInfo->bContainerIndex != Authentication)
1026                  {                  {
1027                          dwReturn = SCARD_E_NO_KEY_CONTAINER;                          dwReturn = SCARD_E_NO_KEY_CONTAINER;
1028                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);
# Line 996  DWORD SCardSign(PCARD_DATA pCardData, Line 1102  DWORD SCardSign(PCARD_DATA pCardData,
1102                          pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI];                          pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI];
1103                          pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp;                          pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp;
1104                  }                  }
                 //TraceDump(WINEVENT_LEVEL_ERROR,pInfo->pbSignedData,pInfo->cbSignedData);  
1105          }          }
1106          __finally          __finally
1107          {          {
# Line 1006  DWORD SCardSign(PCARD_DATA pCardData, Line 1111  DWORD SCardSign(PCARD_DATA pCardData,
1111                                  pCardData->pfnCspFree(pInfo->pbSignedData);                                  pCardData->pfnCspFree(pInfo->pbSignedData);
1112                  }                  }
1113          }          }
1114            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
1115          return dwReturn;          return dwReturn;
1116  }  }
1117    
# Line 1102  DWORD SCardDecrypt(PCARD_DATA pCardData, Line 1208  DWORD SCardDecrypt(PCARD_DATA pCardData,
1208                          pCardData->pfnCspFree(pbData);                          pCardData->pfnCspFree(pbData);
1209                  }                  }
1210          }          }
1211            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
1212          return dwReturn;          return dwReturn;
1213  }  }
1214    
 DWORD SCardAuthenticate(PCARD_DATA pCardData,  
                                                         PCARD_SIGNING_INFO  pInfo)  
 {  
         DWORD dwReturn;  
         PBYTE pbData = NULL;  
         DWORD dwSize = 0, dwI;  
         BYTE pbCmd[6 + 256 + 256] = {0x00,  
                                     0x88,  
                                         0x00,  
                                         0x00,  
                                         0x00,  
                                         };  
         __try  
         {  
                 Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);  
                 if (pInfo->bContainerIndex >= MaxContainer)  
                 {  
                         dwReturn = SCARD_E_NO_KEY_CONTAINER;  
                         Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);  
                         __leave;  
                 }  
                 if (pInfo->bContainerIndex != Authentication)  
                 {  
                         dwReturn = SCARD_E_NO_KEY_CONTAINER;  
                         Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);  
                         __leave;  
                 }  
                 if (CARD_PADDING_PKCS1 & pInfo->dwPaddingType)  
                 {  
                         dwReturn = SCARD_E_UNSUPPORTED_FEATURE;  
                         Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PKCS1");  
                         __leave;  
                 }  
                 else if (CARD_PADDING_PSS & pInfo->dwPaddingType)  
                 {  
                         dwReturn = SCARD_E_UNSUPPORTED_FEATURE;  
                         Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PSS");  
                         __leave;  
                 }  
                 for(dwI = 0 ; dwI < dwSignatureAlgorithmCount ; dwI++)  
                 {  
                         if (SignatureAlgorithm[dwI].aiHashAlg == pInfo->aiHashAlg)  
                         {  
                                 // found  
                                 break;  
                         }  
                 }  
                 if (dwI >= dwSignatureAlgorithmCount)  
                 {  
                         Trace(WINEVENT_LEVEL_ERROR, L"alg not found %d", pInfo->aiHashAlg);  
                         __leave;  
                 }  
                 if (SignatureAlgorithm[dwI].dwHashSize != pInfo->cbData)  
                 {  
                         Trace(WINEVENT_LEVEL_ERROR, L"wrong hash size %d", pInfo->cbData);  
                         __leave;  
                 }  
                 memcpy(pbCmd +5, SignatureAlgorithm[dwI].pbEncodedOid,SignatureAlgorithm[dwI].dwEncodedOidSize);  
                 memcpy(pbCmd +5 + SignatureAlgorithm[dwI].dwEncodedOidSize, pInfo->pbData,pInfo->cbData);  
   
                 dwReturn = SCardGetData(pCardData, pbCmd, ARRAYSIZE(pbCmd), &(pInfo->pbSignedData), &(pInfo->cbSignedData));  
                 if (dwReturn)  
                 {  
                         __leave;  
                 }  
         }  
         __finally  
         {  
         }  
         return dwReturn;  
 }  
1215    
1216  DWORD GetPinInfo(DWORD __in dwPinIndex, __inout PPIN_INFO pPinInfo)  DWORD GetPinInfo(DWORD __in dwPinIndex, __inout PPIN_INFO pPinInfo)
1217  {  {
# Line 1215  DWORD GetPinInfo(DWORD __in dwPinIndex, Line 1251  DWORD GetPinInfo(DWORD __in dwPinIndex,
1251          __finally          __finally
1252          {          {
1253          }          }
1254            Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
1255          return dwReturn;          return dwReturn;
1256  }  }

Legend:
Removed from v.4  
changed lines
  Added in v.5

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26