/[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 11 by vletoux, Thu Mar 18 16:03:39 2010 UTC revision 12 by vletoux, Wed Mar 31 08:58:46 2010 UTC
# Line 1444  DWORD OCardDecrypt(PCARD_DATA pCardData, Line 1444  DWORD OCardDecrypt(PCARD_DATA pCardData,
1444                                          0x00,                                          0x00,
1445                                          };                                          };
1446          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;          POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
1447          DWORD dwI;          DWORD dwI, dwModulusSizeInBytes;
         OPENPGP_ALGORITHM_ATTRIBUTE Attributes;  
1448          __try          __try
1449          {          {
1450                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);                  Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex);
# Line 1462  DWORD OCardDecrypt(PCARD_DATA pCardData, Line 1461  DWORD OCardDecrypt(PCARD_DATA pCardData,
1461                          __leave;                          __leave;
1462                  }                  }
1463                  // check the buffer size                  // check the buffer size
1464                  dwReturn = OCardGetKeyAlgorithmAttributes(pCardData, KeyConfidentiality, &Attributes);                  dwModulusSizeInBytes = pContext->dwModulusSizeInBytes[pInfo->bContainerIndex];
1465                  if (dwReturn)                  if (pInfo->cbData < dwModulusSizeInBytes)
                 {  
                         __leave;  
                 }  
                 if (pInfo->cbData < (DWORD)(Attributes.wModulusLengthInBit/8))  
1466                  {                  {
1467                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;
1468                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_INSUFFICIENT_BUFFER %d", pInfo->cbData);                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_INSUFFICIENT_BUFFER %d", pInfo->cbData);
# Line 1505  DWORD OCardDecrypt(PCARD_DATA pCardData, Line 1500  DWORD OCardDecrypt(PCARD_DATA pCardData,
1500                          __leave;                          __leave;
1501                  }                  }
1502                                    
                 // CryptDecrypt expects the data decrypted using rsa (only the mathematical computation)  
                 // this means the data with the padding (removed by the card)  
                 // and in little endian (while the card return the data in big endian)  
                 // so we rebuilt the padding in reverse order  
                   
1503                  if ( pInfo->cbData < dwResponseSize + 3 + 11)                  if ( pInfo->cbData < dwResponseSize + 3 + 11)
1504                  {                  {
1505                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;
1506                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_INSUFFICIENT_BUFFER %d expected = %d", pInfo->cbData, dwResponseSize);                          Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_INSUFFICIENT_BUFFER %d expected = %d", pInfo->cbData, dwResponseSize);
1507                          __leave;                          __leave;
1508                  }                  }
1509                                    if (pInfo->dwVersion >= CARD_RSA_KEY_DECRYPT_INFO_VERSION_TWO)
                 pInfo->pbData[pInfo->cbData - 1] = 0; // start byte  
                 pInfo->pbData[pInfo->cbData - 2] = 02; // block type  
                 // padding  
                 memset(pInfo->pbData + dwResponseSize + 1,1,pInfo->cbData - 3 - dwResponseSize);  
                 pInfo->pbData[dwResponseSize] = 0; // separator  
                 // data field in reverse order  
                 for(dwI = 0; dwI < dwResponseSize; dwI++)  
1510                  {                  {
1511                          pInfo->pbData[dwI] = pbData[dwResponseSize - 1 - dwI];                          // data field in reverse order (big endian => little endian)
1512                            for(dwI = 0; dwI < dwResponseSize; dwI++)
1513                            {
1514                                    pInfo->pbData[dwI] = pbData[dwResponseSize - 1 - dwI];
1515                            }
1516                            pInfo->cbData = dwResponseSize;
1517                  }                  }
1518                    else
1519                    {
1520                            // CryptDecrypt expects the data decrypted using rsa (only the mathematical computation)
1521                            // this means the data with the padding (removed by the card)
1522                            // and in little endian (while the card return the data in big endian)
1523                            // so we rebuilt the padding in reverse order
1524                            
1525                            pInfo->pbData[pInfo->cbData - 1] = 0; // start byte
1526                            pInfo->pbData[pInfo->cbData - 2] = 02; // block type
1527                            // padding
1528                            memset(pInfo->pbData + dwResponseSize + 1,1,pInfo->cbData - 3 - dwResponseSize);
1529                            pInfo->pbData[dwResponseSize] = 0; // separator
1530                            // data field in reverse order
1531                            for(dwI = 0; dwI < dwResponseSize; dwI++)
1532                            {
1533                                    pInfo->pbData[dwI] = pbData[dwResponseSize - 1 - dwI];
1534                            }
1535                    }
1536                    
1537          }          }
1538          __finally          __finally
1539          {          {

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26