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]; |
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 |
{ |
{ |