From 33cf1619413c88f491d6ff5db2359b81faa2914b Mon Sep 17 00:00:00 2001 From: vletoux Date: Mon, 20 Apr 2015 23:25:57 +0200 Subject: [PATCH] minidriver: pinpad authentication is now working for smart card logon !!! (still needs 5 pinpad entries) minidriver: minor fixes --- src/minidriver/minidriver.c | 23 +++++++++++++++++++++ src/minidriver/versioninfo-minidriver.rc.in | 1 + 2 files changed, 24 insertions(+) diff --git a/src/minidriver/minidriver.c b/src/minidriver/minidriver.c index e0877fbd..637e38ab 100644 --- a/src/minidriver/minidriver.c +++ b/src/minidriver/minidriver.c @@ -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; diff --git a/src/minidriver/versioninfo-minidriver.rc.in b/src/minidriver/versioninfo-minidriver.rc.in index cff733b9..a86e2b53 100644 --- a/src/minidriver/versioninfo-minidriver.rc.in +++ b/src/minidriver/versioninfo-minidriver.rc.in @@ -1,5 +1,6 @@ #include +#define IDC_STATIC -1 /* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */ #define IDD_PINPAD 101 #define IDC_PINPAD_TEXT 1001