md: implement CardGetChallenge
This commit is contained in:
parent
5564b9973b
commit
1dc5a26a8d
|
@ -2395,15 +2395,65 @@ DWORD WINAPI CardAuthenticatePin(__in PCARD_DATA pCardData,
|
|||
return SCARD_S_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI CardGetChallenge(__in PCARD_DATA pCardData,
|
||||
__deref_out_bcount(*pcbChallengeData) PBYTE *ppbChallengeData,
|
||||
__out PDWORD pcbChallengeData)
|
||||
{
|
||||
VENDOR_SPECIFIC *vs;
|
||||
unsigned char *random = NULL;
|
||||
size_t random_len;
|
||||
int rv;
|
||||
|
||||
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
|
||||
logprintf(pCardData, 1, "CardGetChallenge - unsupported\n");
|
||||
return SCARD_E_UNSUPPORTED_FEATURE;
|
||||
logprintf(pCardData, 1, "CardGetChallenge\n");
|
||||
|
||||
if(!pCardData)
|
||||
return SCARD_E_INVALID_PARAMETER;
|
||||
if (!ppbChallengeData || !pcbChallengeData)
|
||||
return SCARD_E_INVALID_PARAMETER;
|
||||
|
||||
logprintf(pCardData, 1, "Asked challenge length %i, buffer %p\n", *pcbChallengeData, *ppbChallengeData);
|
||||
if (pcbChallengeData == 0) {
|
||||
*ppbChallengeData = NULL;
|
||||
|
||||
logprintf(pCardData, 7, "returns zero bytes\n");
|
||||
return SCARD_S_SUCCESS;
|
||||
}
|
||||
|
||||
vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific);
|
||||
|
||||
check_reader_status(pCardData);
|
||||
|
||||
random_len = (size_t)(*pcbChallengeData);
|
||||
if(random_len < 8)
|
||||
random_len = 8;
|
||||
*pcbChallengeData = 0;
|
||||
|
||||
random = malloc(random_len);
|
||||
if (!random)
|
||||
return SCARD_E_NO_MEMORY;
|
||||
|
||||
rv = sc_get_challenge(vs->p15card->card, random, random_len);
|
||||
if (rv) {
|
||||
logprintf(pCardData, 1, "Get challenge failed: %s\n", sc_strerror(rv));
|
||||
return SCARD_E_UNEXPECTED;
|
||||
}
|
||||
|
||||
*ppbChallengeData = pCardData->pfnCspAlloc(random_len);
|
||||
if(!*ppbChallengeData)
|
||||
return SCARD_E_NO_MEMORY;
|
||||
|
||||
memcpy(*ppbChallengeData, random, random_len);
|
||||
*pcbChallengeData = random_len;
|
||||
free(random);
|
||||
|
||||
logprintf(pCardData, 7, "returns %i bytes:\n", *pcbChallengeData);
|
||||
loghex(pCardData, 7, *ppbChallengeData, *pcbChallengeData);
|
||||
return SCARD_S_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI CardAuthenticateChallenge(__in PCARD_DATA pCardData,
|
||||
__in_bcount(cbResponseData) PBYTE pbResponseData,
|
||||
__in DWORD cbResponseData,
|
||||
|
@ -2414,6 +2464,7 @@ DWORD WINAPI CardAuthenticateChallenge(__in PCARD_DATA pCardData,
|
|||
return SCARD_E_UNSUPPORTED_FEATURE;
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI CardUnblockPin(__in PCARD_DATA pCardData,
|
||||
__in LPWSTR pwszUserId,
|
||||
__in_bcount(cbAuthenticationData) PBYTE pbAuthenticationData,
|
||||
|
@ -3691,6 +3742,8 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags)
|
|||
pCardData->pfnCspGetDHAgreement = CspGetDHAgreement;
|
||||
|
||||
if (suppliedVersion > 5 ) {
|
||||
logprintf(pCardData, 1, "Supplied version %i.\n", suppliedVersion);
|
||||
|
||||
pCardData->pfnCardGetChallengeEx = CardGetChallengeEx;
|
||||
pCardData->pfnCardAuthenticateEx = CardAuthenticateEx;
|
||||
pCardData->pfnCardChangeAuthenticatorEx = CardChangeAuthenticatorEx;
|
||||
|
|
Loading…
Reference in New Issue