minidriver: pinpad authentication is now working for smart card logon !!! (still needs 5 pinpad entries)

minidriver: minor fixes
This commit is contained in:
vletoux 2015-04-20 23:25:57 +02:00 committed by Viktor Tarasov
parent 6127fe6b77
commit 33cf161941
2 changed files with 24 additions and 0 deletions

View File

@ -108,6 +108,8 @@ HINSTANCE g_inst;
#define IDC_PINPAD_TEXT 1001
#define IDC_PINPAD_ICON 1000
/* magic to determine previous pinpad authentication */
#define MAGIC_SESSION_PIN "opensc-minidriver"
struct md_directory {
unsigned char parent[9];
@ -2375,6 +2377,8 @@ DWORD md_translate_OpenSC_to_Windows_error(int OpenSCerror, DWORD dwDefaulCode)
return SCARD_W_WRONG_CHV;
/* Returned by OpenSC library when called with invalid arguments */
case SC_ERROR_INVALID_ARGUMENTS:
return ERROR_INVALID_PARAMETER;
case SC_ERROR_BUFFER_TOO_SMALL:
return NTE_BUFFER_TOO_SMALL;
@ -3689,6 +3693,12 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
logprintf(pCardData, 7, "PIN pad=%s, pbPinData=%p, hwndParent=%p\n",
vs->reader->capabilities & SC_READER_CAP_PIN_PAD ? "yes" : "no", pbPinData, vs->hwndParent);
/* check if the pin is the session pin generated by a previous authentication with a pinpad */
if (pbPinData != NULL && cbPinData == sizeof(MAGIC_SESSION_PIN) && memcmp(MAGIC_SESSION_PIN, pbPinData, sizeof(MAGIC_SESSION_PIN)) == 0) {
pbPinData = NULL;
cbPinData = 0;
}
r = md_dialog_perform_pin_operation(pCardData, SC_PIN_CMD_VERIFY, vs->p15card, pin_obj, (const u8 *) pbPinData, cbPinData, NULL, 0, DisplayPinpadUI);
if (r) {
@ -3707,6 +3717,19 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
logprintf(pCardData, 2, "Pin code correct.\n");
/* set the session pin according to the minidriver specification */
if (dwFlags == CARD_AUTHENTICATE_GENERATE_SESSION_PIN && (vs->reader->capabilities & SC_READER_CAP_PIN_PAD)) {
/* we set it to a special value for pinpad authentication to force a new pinpad authentication */
if (pcbSessionPin) *pcbSessionPin = sizeof(MAGIC_SESSION_PIN);
if (ppbSessionPin) {
*ppbSessionPin = pCardData->pfnCspAlloc(sizeof(MAGIC_SESSION_PIN));
if (ppbSessionPin) memcpy(*ppbSessionPin, MAGIC_SESSION_PIN, sizeof(MAGIC_SESSION_PIN));
}
} else {
if (pcbSessionPin) *pcbSessionPin = 0;
if (ppbSessionPin) *ppbSessionPin = NULL;
}
dwret = md_get_cardcf(pCardData, &cardcf);
if (dwret != SCARD_S_SUCCESS)
return dwret;

View File

@ -1,5 +1,6 @@
#include <winresrc.h>
#define IDC_STATIC -1
/* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */
#define IDD_PINPAD 101
#define IDC_PINPAD_TEXT 1001