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