--- trunk/OpenPGPminidriver/CryptoOperations.c 2010/02/25 22:09:17 3 +++ trunk/OpenPGPminidriver/CryptoOperations.c 2010/02/28 09:39:34 4 @@ -1050,7 +1050,7 @@ pbCmd[dwCmdSize++] = (BYTE)((pInfo->cbData +1) % 0x100); } pbCmd[dwCmdSize++] = 0; - //memcpy(pbCmd + dwCmdSize, pInfo->pbData, pInfo->cbData); + //little endian => big endian for(dwI = 0; dwI < pInfo->cbData; dwI++) { pbCmd[dwCmdSize + dwI] = pInfo->pbData[pInfo->cbData -1 -dwI]; @@ -1070,14 +1070,29 @@ { __leave; } - if ( pInfo->cbData < dwResponseSize) + + // 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 + + if ( pInfo->cbData < dwResponseSize + 3 + 11) { dwReturn = SCARD_E_INSUFFICIENT_BUFFER; Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_INSUFFICIENT_BUFFER %d expected = %d", pInfo->cbData, dwResponseSize); __leave; } - pInfo->cbData = dwResponseSize; - memcpy( pInfo->pbData, pbData, dwResponseSize); + + 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++) + { + pInfo->pbData[dwI] = pbData[dwResponseSize - 1 - dwI]; + } } __finally {