188 |
if (pbData) |
if (pbData) |
189 |
pCardData->pfnCspFree(pbData); |
pCardData->pfnCspFree(pbData); |
190 |
} |
} |
191 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
192 |
return dwReturn; |
return dwReturn; |
193 |
} |
} |
194 |
|
|
235 |
__finally |
__finally |
236 |
{ |
{ |
237 |
} |
} |
238 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
239 |
return dwReturn; |
return dwReturn; |
240 |
} |
} |
241 |
|
|
374 |
{ |
{ |
375 |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(3*bitlen)/16 - 1 - dwI]; |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(3*bitlen)/16 - 1 - dwI]; |
376 |
} |
} |
|
TraceDump(WINEVENT_LEVEL_VERBOSE, *ppbTlv + dwOffset, bitlen / 16); |
|
377 |
dwOffset += bitlen / 16; |
dwOffset += bitlen / 16; |
378 |
|
|
379 |
// prime2 |
// prime2 |
382 |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(4*bitlen)/16 - 1 - dwI]; |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[(4*bitlen)/16 - 1 - dwI]; |
383 |
} |
} |
384 |
//memcpy(*ppbTlv + dwOffset, pbPublicKeyData + (3*bitlen)/16, bitlen / 16); |
//memcpy(*ppbTlv + dwOffset, pbPublicKeyData + (3*bitlen)/16, bitlen / 16); |
|
TraceDump(WINEVENT_LEVEL_VERBOSE, *ppbTlv + dwOffset, bitlen / 16); |
|
385 |
dwOffset += bitlen / 16; |
dwOffset += bitlen / 16; |
386 |
if (bFormat & 2) |
if (bFormat & 2) |
387 |
{ |
{ |
416 |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[bitlen / 8 - 1 - dwI]; |
(*ppbTlv)[dwOffset+dwI] = pbPublicKeyData[bitlen / 8 - 1 - dwI]; |
417 |
} |
} |
418 |
} |
} |
|
TraceDump(WINEVENT_LEVEL_VERBOSE, pbPublicKeyData, bitlen / 8); |
|
419 |
} |
} |
420 |
__finally |
__finally |
421 |
{ |
{ |
422 |
} |
} |
423 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
424 |
return dwReturn; |
return dwReturn; |
425 |
} |
} |
426 |
|
|
461 |
__finally |
__finally |
462 |
{ |
{ |
463 |
} |
} |
464 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
465 |
return dwReturn; |
return dwReturn; |
466 |
} |
} |
467 |
|
|
568 |
CryptReleaseContext(hProv,0); |
CryptReleaseContext(hProv,0); |
569 |
|
|
570 |
} |
} |
571 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
572 |
return dwReturn; |
return dwReturn; |
573 |
|
|
574 |
} |
} |
623 |
{ |
{ |
624 |
__leave; |
__leave; |
625 |
} |
} |
|
//TraceDump(WINEVENT_LEVEL_INFO, pbData,dwSize); |
|
626 |
if (!find_tlv(pbData,0x81,&pbModulus,&dwModulusSize)) |
if (!find_tlv(pbData,0x81,&pbModulus,&dwModulusSize)) |
627 |
{ |
{ |
628 |
dwReturn = SCARD_E_UNEXPECTED; |
dwReturn = SCARD_E_UNEXPECTED; |
660 |
pbBlob->modulus[dwI] = pbModulus[dwModulusSize - 1 - dwI]; |
pbBlob->modulus[dwI] = pbModulus[dwModulusSize - 1 - dwI]; |
661 |
} |
} |
662 |
|
|
|
//TraceDump(WINEVENT_LEVEL_VERBOSE, pbModulus, dwModulusSize); |
|
663 |
dwReturn = 0; |
dwReturn = 0; |
664 |
} |
} |
665 |
__finally |
__finally |
666 |
{ |
{ |
667 |
} |
} |
668 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
669 |
return dwReturn; |
return dwReturn; |
670 |
} |
} |
671 |
|
|
767 |
if (pbData) |
if (pbData) |
768 |
pCardData->pfnCspFree(pbData); |
pCardData->pfnCspFree(pbData); |
769 |
} |
} |
770 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
771 |
return dwReturn; |
return dwReturn; |
772 |
} |
} |
773 |
|
|
832 |
{ |
{ |
833 |
__leave; |
__leave; |
834 |
} |
} |
|
//TraceDump(WINEVENT_LEVEL_VERBOSE, pbTlv, dwTlvSize); |
|
835 |
if (dwTlvSize > 0xFF) |
if (dwTlvSize > 0xFF) |
836 |
{ |
{ |
837 |
dwCommandSize = 7 + dwTlvSize; |
dwCommandSize = 7 + dwTlvSize; |
891 |
pCardData->pfnCspFree(pbTlv); |
pCardData->pfnCspFree(pbTlv); |
892 |
} |
} |
893 |
} |
} |
894 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
895 |
return dwReturn; |
return dwReturn; |
896 |
} |
} |
897 |
|
|
912 |
__try |
__try |
913 |
{ |
{ |
914 |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex); |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex); |
915 |
if (pInfo->bContainerIndex >= MaxContainer) |
if (pInfo->bContainerIndex != Signature) |
916 |
{ |
{ |
917 |
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
918 |
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
919 |
__leave; |
__leave; |
920 |
} |
} |
921 |
if (pInfo->bContainerIndex != Signature) |
if (CARD_PADDING_PKCS1 & pInfo->dwPaddingType) |
922 |
|
{ |
923 |
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
924 |
|
Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PKCS1"); |
925 |
|
__leave; |
926 |
|
} |
927 |
|
else if (CARD_PADDING_PSS & pInfo->dwPaddingType) |
928 |
|
{ |
929 |
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
930 |
|
Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PSS"); |
931 |
|
__leave; |
932 |
|
} |
933 |
|
for(dwI = 0 ; dwI < dwSignatureAlgorithmCount ; dwI++) |
934 |
|
{ |
935 |
|
if (SignatureAlgorithm[dwI].aiHashAlg == pInfo->aiHashAlg) |
936 |
|
{ |
937 |
|
// found |
938 |
|
break; |
939 |
|
} |
940 |
|
} |
941 |
|
if (dwI >= dwSignatureAlgorithmCount) |
942 |
|
{ |
943 |
|
Trace(WINEVENT_LEVEL_ERROR, L"alg not found %d", pInfo->aiHashAlg); |
944 |
|
__leave; |
945 |
|
} |
946 |
|
if (SignatureAlgorithm[dwI].dwHashSize != pInfo->cbData) |
947 |
|
{ |
948 |
|
Trace(WINEVENT_LEVEL_ERROR, L"wrong hash size %d", pInfo->cbData); |
949 |
|
__leave; |
950 |
|
} |
951 |
|
pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific; |
952 |
|
|
953 |
|
dwCmdSize = 5; |
954 |
|
if (pContext->fExtentedLeLcFields) |
955 |
|
{ |
956 |
|
dwCmdSize++; |
957 |
|
} |
958 |
|
pbCmd[dwCmdSize++] = (BYTE) (SignatureAlgorithm[dwI].dwEncodedOidSize + pInfo->cbData); |
959 |
|
memcpy(pbCmd + dwCmdSize , SignatureAlgorithm[dwI].pbEncodedOid,SignatureAlgorithm[dwI].dwEncodedOidSize); |
960 |
|
dwCmdSize += SignatureAlgorithm[dwI].dwEncodedOidSize; |
961 |
|
/*for(dwI = 0 ; dwI < pInfo->cbData ; dwI++) |
962 |
|
{ |
963 |
|
pbCmd[dwCmdSize + dwI] = pInfo->pbData[pInfo->cbData - dwI -1]; |
964 |
|
}*/ |
965 |
|
memcpy(pbCmd + dwCmdSize, pInfo->pbData,pInfo->cbData); |
966 |
|
dwCmdSize += pInfo->cbData; |
967 |
|
|
968 |
|
|
969 |
|
if (pContext->fExtentedLeLcFields) |
970 |
|
{ |
971 |
|
pbCmd[dwCmdSize++] = (BYTE)(pContext->dwMaxLength / 0x100); |
972 |
|
pbCmd[dwCmdSize++] = (BYTE)(pContext->dwMaxLength % 0x100); |
973 |
|
} |
974 |
|
else |
975 |
|
{ |
976 |
|
pbCmd[dwCmdSize++] = 0; |
977 |
|
} |
978 |
|
dwReturn = SCardGetData(pCardData, pbCmd, dwCmdSize, &(pInfo->pbSignedData), &(pInfo->cbSignedData)); |
979 |
|
if (dwReturn == SCARD_W_WRONG_CHV) |
980 |
|
{ |
981 |
|
dwReturn = SCARD_W_SECURITY_VIOLATION; |
982 |
|
__leave; |
983 |
|
} |
984 |
|
if (dwReturn) |
985 |
|
{ |
986 |
|
__leave; |
987 |
|
} |
988 |
|
// revert the BYTES |
989 |
|
for(dwI = 0 ; dwI < pInfo->cbSignedData / 2 ; dwI++) |
990 |
|
{ |
991 |
|
BYTE bTemp = pInfo->pbSignedData[dwI]; |
992 |
|
pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI]; |
993 |
|
pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp; |
994 |
|
} |
995 |
|
} |
996 |
|
__finally |
997 |
|
{ |
998 |
|
if (dwReturn) |
999 |
|
{ |
1000 |
|
if (pInfo->pbSignedData) |
1001 |
|
pCardData->pfnCspFree(pInfo->pbSignedData); |
1002 |
|
} |
1003 |
|
} |
1004 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
1005 |
|
return dwReturn; |
1006 |
|
} |
1007 |
|
|
1008 |
|
DWORD SCardAuthenticate(PCARD_DATA pCardData, |
1009 |
|
PCARD_SIGNING_INFO pInfo) |
1010 |
|
{ |
1011 |
|
DWORD dwReturn; |
1012 |
|
PBYTE pbData = NULL; |
1013 |
|
DWORD dwCmdSize = 0, dwI; |
1014 |
|
POPENPGP_CONTEXT pContext; |
1015 |
|
BYTE pbCmd[6 + 256 + 256] = {0x00, |
1016 |
|
0x88, |
1017 |
|
0x00, |
1018 |
|
0x00, |
1019 |
|
0x00, |
1020 |
|
0x00, |
1021 |
|
}; |
1022 |
|
__try |
1023 |
|
{ |
1024 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex); |
1025 |
|
if (pInfo->bContainerIndex != Authentication) |
1026 |
{ |
{ |
1027 |
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
1028 |
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
1102 |
pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI]; |
pInfo->pbSignedData[dwI] = pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI]; |
1103 |
pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp; |
pInfo->pbSignedData[pInfo->cbSignedData - 1 - dwI] = bTemp; |
1104 |
} |
} |
|
//TraceDump(WINEVENT_LEVEL_ERROR,pInfo->pbSignedData,pInfo->cbSignedData); |
|
1105 |
} |
} |
1106 |
__finally |
__finally |
1107 |
{ |
{ |
1111 |
pCardData->pfnCspFree(pInfo->pbSignedData); |
pCardData->pfnCspFree(pInfo->pbSignedData); |
1112 |
} |
} |
1113 |
} |
} |
1114 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
1115 |
return dwReturn; |
return dwReturn; |
1116 |
} |
} |
1117 |
|
|
1208 |
pCardData->pfnCspFree(pbData); |
pCardData->pfnCspFree(pbData); |
1209 |
} |
} |
1210 |
} |
} |
1211 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
1212 |
return dwReturn; |
return dwReturn; |
1213 |
} |
} |
1214 |
|
|
|
DWORD SCardAuthenticate(PCARD_DATA pCardData, |
|
|
PCARD_SIGNING_INFO pInfo) |
|
|
{ |
|
|
DWORD dwReturn; |
|
|
PBYTE pbData = NULL; |
|
|
DWORD dwSize = 0, dwI; |
|
|
BYTE pbCmd[6 + 256 + 256] = {0x00, |
|
|
0x88, |
|
|
0x00, |
|
|
0x00, |
|
|
0x00, |
|
|
}; |
|
|
__try |
|
|
{ |
|
|
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter dwContainer=%d",pInfo->bContainerIndex); |
|
|
if (pInfo->bContainerIndex >= MaxContainer) |
|
|
{ |
|
|
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
|
|
__leave; |
|
|
} |
|
|
if (pInfo->bContainerIndex != Authentication) |
|
|
{ |
|
|
dwReturn = SCARD_E_NO_KEY_CONTAINER; |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex); |
|
|
__leave; |
|
|
} |
|
|
if (CARD_PADDING_PKCS1 & pInfo->dwPaddingType) |
|
|
{ |
|
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PKCS1"); |
|
|
__leave; |
|
|
} |
|
|
else if (CARD_PADDING_PSS & pInfo->dwPaddingType) |
|
|
{ |
|
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"CARD_PADDING_PSS"); |
|
|
__leave; |
|
|
} |
|
|
for(dwI = 0 ; dwI < dwSignatureAlgorithmCount ; dwI++) |
|
|
{ |
|
|
if (SignatureAlgorithm[dwI].aiHashAlg == pInfo->aiHashAlg) |
|
|
{ |
|
|
// found |
|
|
break; |
|
|
} |
|
|
} |
|
|
if (dwI >= dwSignatureAlgorithmCount) |
|
|
{ |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"alg not found %d", pInfo->aiHashAlg); |
|
|
__leave; |
|
|
} |
|
|
if (SignatureAlgorithm[dwI].dwHashSize != pInfo->cbData) |
|
|
{ |
|
|
Trace(WINEVENT_LEVEL_ERROR, L"wrong hash size %d", pInfo->cbData); |
|
|
__leave; |
|
|
} |
|
|
memcpy(pbCmd +5, SignatureAlgorithm[dwI].pbEncodedOid,SignatureAlgorithm[dwI].dwEncodedOidSize); |
|
|
memcpy(pbCmd +5 + SignatureAlgorithm[dwI].dwEncodedOidSize, pInfo->pbData,pInfo->cbData); |
|
|
|
|
|
dwReturn = SCardGetData(pCardData, pbCmd, ARRAYSIZE(pbCmd), &(pInfo->pbSignedData), &(pInfo->cbSignedData)); |
|
|
if (dwReturn) |
|
|
{ |
|
|
__leave; |
|
|
} |
|
|
} |
|
|
__finally |
|
|
{ |
|
|
} |
|
|
return dwReturn; |
|
|
} |
|
1215 |
|
|
1216 |
DWORD GetPinInfo(DWORD __in dwPinIndex, __inout PPIN_INFO pPinInfo) |
DWORD GetPinInfo(DWORD __in dwPinIndex, __inout PPIN_INFO pPinInfo) |
1217 |
{ |
{ |
1251 |
__finally |
__finally |
1252 |
{ |
{ |
1253 |
} |
} |
1254 |
|
Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn); |
1255 |
return dwReturn; |
return dwReturn; |
1256 |
} |
} |