/[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 3 by vletoux, Thu Feb 25 22:09:17 2010 UTC revision 4 by vletoux, Sun Feb 28 09:39:34 2010 UTC
# Line 1050  DWORD SCardDecrypt(PCARD_DATA pCardData, Line 1050  DWORD SCardDecrypt(PCARD_DATA pCardData,
1050                          pbCmd[dwCmdSize++] = (BYTE)((pInfo->cbData +1) % 0x100);                          pbCmd[dwCmdSize++] = (BYTE)((pInfo->cbData +1) % 0x100);
1051                  }                  }
1052                  pbCmd[dwCmdSize++] = 0;                  pbCmd[dwCmdSize++] = 0;
1053                  //memcpy(pbCmd + dwCmdSize, pInfo->pbData, pInfo->cbData);                  //little endian => big endian
1054                  for(dwI = 0; dwI < pInfo->cbData; dwI++)                  for(dwI = 0; dwI < pInfo->cbData; dwI++)
1055                  {                  {
1056                          pbCmd[dwCmdSize + dwI] = pInfo->pbData[pInfo->cbData -1 -dwI];                          pbCmd[dwCmdSize + dwI] = pInfo->pbData[pInfo->cbData -1 -dwI];
# Line 1070  DWORD SCardDecrypt(PCARD_DATA pCardData, Line 1070  DWORD SCardDecrypt(PCARD_DATA pCardData,
1070                  {                  {
1071                          __leave;                          __leave;
1072                  }                  }
1073                  if ( pInfo->cbData < dwResponseSize)                  
1074                    // CryptDecrypt expects the data decrypted using rsa (only the mathematical computation)
1075                    // this means the data with the padding (removed by the card)
1076                    // and in little endian (while the card return the data in big endian)
1077                    // so we rebuilt the padding in reverse order
1078                    
1079                    if ( pInfo->cbData < dwResponseSize + 3 + 11)
1080                  {                  {
1081                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;                          dwReturn = SCARD_E_INSUFFICIENT_BUFFER;
1082                          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);
1083                          __leave;                          __leave;
1084                  }                  }
1085                  pInfo->cbData = dwResponseSize;                  
1086                  memcpy( pInfo->pbData, pbData, dwResponseSize);                  pInfo->pbData[pInfo->cbData - 1] = 0; // start byte
1087                    pInfo->pbData[pInfo->cbData - 2] = 02; // block type
1088                    // padding
1089                    memset(pInfo->pbData + dwResponseSize + 1,1,pInfo->cbData - 3 - dwResponseSize);
1090                    pInfo->pbData[dwResponseSize] = 0; // separator
1091                    // data field in reverse order
1092                    for(dwI = 0; dwI < dwResponseSize; dwI++)
1093                    {
1094                            pInfo->pbData[dwI] = pbData[dwResponseSize - 1 - dwI];
1095                    }
1096          }          }
1097          __finally          __finally
1098          {          {

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26