minidriver: pinpad authentication is now working for smart card logon !!! (still needs 5 pinpad entries)
minidriver: minor fixes
This commit is contained in:
parent
6127fe6b77
commit
33cf161941
|
@ -108,6 +108,8 @@ HINSTANCE g_inst;
|
||||||
#define IDC_PINPAD_TEXT 1001
|
#define IDC_PINPAD_TEXT 1001
|
||||||
#define IDC_PINPAD_ICON 1000
|
#define IDC_PINPAD_ICON 1000
|
||||||
|
|
||||||
|
/* magic to determine previous pinpad authentication */
|
||||||
|
#define MAGIC_SESSION_PIN "opensc-minidriver"
|
||||||
|
|
||||||
struct md_directory {
|
struct md_directory {
|
||||||
unsigned char parent[9];
|
unsigned char parent[9];
|
||||||
|
@ -2375,6 +2377,8 @@ DWORD md_translate_OpenSC_to_Windows_error(int OpenSCerror, DWORD dwDefaulCode)
|
||||||
return SCARD_W_WRONG_CHV;
|
return SCARD_W_WRONG_CHV;
|
||||||
|
|
||||||
/* Returned by OpenSC library when called with invalid arguments */
|
/* Returned by OpenSC library when called with invalid arguments */
|
||||||
|
case SC_ERROR_INVALID_ARGUMENTS:
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
case SC_ERROR_BUFFER_TOO_SMALL:
|
case SC_ERROR_BUFFER_TOO_SMALL:
|
||||||
return NTE_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",
|
logprintf(pCardData, 7, "PIN pad=%s, pbPinData=%p, hwndParent=%p\n",
|
||||||
vs->reader->capabilities & SC_READER_CAP_PIN_PAD ? "yes" : "no", pbPinData, vs->hwndParent);
|
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);
|
r = md_dialog_perform_pin_operation(pCardData, SC_PIN_CMD_VERIFY, vs->p15card, pin_obj, (const u8 *) pbPinData, cbPinData, NULL, 0, DisplayPinpadUI);
|
||||||
|
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -3707,6 +3717,19 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
|
||||||
|
|
||||||
logprintf(pCardData, 2, "Pin code correct.\n");
|
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);
|
dwret = md_get_cardcf(pCardData, &cardcf);
|
||||||
if (dwret != SCARD_S_SUCCESS)
|
if (dwret != SCARD_S_SUCCESS)
|
||||||
return dwret;
|
return dwret;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <winresrc.h>
|
#include <winresrc.h>
|
||||||
|
|
||||||
|
#define IDC_STATIC -1
|
||||||
/* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */
|
/* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */
|
||||||
#define IDD_PINPAD 101
|
#define IDD_PINPAD 101
|
||||||
#define IDC_PINPAD_TEXT 1001
|
#define IDC_PINPAD_TEXT 1001
|
||||||
|
|
Loading…
Reference in New Issue