From c57c9c36bf40c9dd6fee645e83fdc044f54051a4 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Thu, 9 Feb 2017 13:44:07 +0100 Subject: [PATCH] md: added themable PIN-pad dialog - themable in the sense of using OS native design - user messages on PIN pad dialog are identical to Base CSP, which still displays the dialog for PIN entry if no PIN pad is available - adds progress bar to dialog - Uses Smartcard icon extracted from DDORes.dll - requires windows vista/windows server 2008 or above --- src/minidriver/Makefile.mak | 2 +- src/minidriver/minidriver.c | 253 ++++++++---------- src/minidriver/opensc-minidriver.dll.manifest | 15 ++ src/minidriver/versioninfo-minidriver.rc.in | 24 +- win32/DDORes.dll_14_2302.ico | Bin 0 -> 55077 bytes win32/Make.rules.mak | 8 +- 6 files changed, 135 insertions(+), 167 deletions(-) create mode 100644 src/minidriver/opensc-minidriver.dll.manifest create mode 100644 win32/DDORes.dll_14_2302.ico diff --git a/src/minidriver/Makefile.mak b/src/minidriver/Makefile.mak index 5ce80ef5..da4c66f1 100644 --- a/src/minidriver/Makefile.mak +++ b/src/minidriver/Makefile.mak @@ -14,5 +14,5 @@ $(TARGET): $(OBJECTS) $(LIBS) echo LIBRARY $* > $*.def echo EXPORTS >> $*.def type minidriver.exports >> $*.def - link /dll $(LINKFLAGS) /def:$*.def /out:$(TARGET) $(OBJECTS) $(LIBS) $(ZLIB_LIB) $(OPENPACE_LIB) $(OPENSSL_LIB) ws2_32.lib gdi32.lib advapi32.lib Crypt32.lib User32.lib bcrypt.lib DelayImp.lib Rpcrt4.lib /DELAYLOAD:bcrypt.dll + link /dll $(LINKFLAGS) /def:$*.def /out:$(TARGET) $(OBJECTS) $(LIBS) $(ZLIB_LIB) $(OPENPACE_LIB) $(OPENSSL_LIB) ws2_32.lib gdi32.lib Comctl32.lib advapi32.lib Crypt32.lib User32.lib bcrypt.lib DelayImp.lib Rpcrt4.lib /DELAYLOAD:bcrypt.dll if EXIST $(TARGET).manifest mt -manifest $(TARGET).manifest -outputresource:$(TARGET);2 diff --git a/src/minidriver/minidriver.c b/src/minidriver/minidriver.c index b1508ead..fad646bf 100644 --- a/src/minidriver/minidriver.c +++ b/src/minidriver/minidriver.c @@ -30,11 +30,14 @@ #pragma managed(push, off) #endif + #include #include #include #include +#include +#include "cardmod.h" #include "common/compat_strlcpy.h" #include "libopensc/asn1.h" @@ -111,12 +114,7 @@ HINSTANCE g_inst; #endif /* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */ -#define IDD_PINPAD 101 -#define IDI_LOGO 102 -#define IDC_EXPLANATION_TEXT 1003 -#define IDC_PURPOSE_TEXT 1002 -#define IDC_PINPAD_TEXT 1001 -#define IDC_PINPAD_ICON 1000 +#define IDI_SMARTCARD 102 /* magic to determine previous pinpad authentication */ #define MAGIC_SESSION_PIN "opensc-minidriver" @@ -2304,39 +2302,6 @@ md_query_key_sizes(PCARD_DATA pCardData, DWORD dwKeySpec, CARD_KEY_SIZES *pKeySi return SCARD_S_SUCCESS; } -static VOID CenterWindow(HWND hwndWindow, HWND hwndParent) -{ - RECT rectWindow, rectParent; - int nWidth,nHeight, nScreenWidth, nScreenHeight; - int nX, nY; - GetWindowRect(hwndWindow, &rectWindow); - - nWidth = rectWindow.right - rectWindow.left; - nHeight = rectWindow.bottom - rectWindow.top; - - nScreenWidth = GetSystemMetrics(SM_CXSCREEN); - nScreenHeight = GetSystemMetrics(SM_CYSCREEN); - - // make the window relative to its parent - if (hwndParent != NULL) { - GetWindowRect(hwndParent, &rectParent); - nX = ((rectParent.right - rectParent.left) - nWidth) / 2 + rectParent.left; - nY = ((rectParent.bottom - rectParent.top) - nHeight) / 2 + rectParent.top; - } - else { - nX = (nScreenWidth - nWidth) /2; - nY = (nScreenHeight - nHeight) /2; - } - // make sure that the dialog box never moves outside of the screen - if (nX < 0) nX = 0; - if (nY < 0) nY = 0; - if (nX + nWidth > nScreenWidth) nX = nScreenWidth - nWidth; - if (nY + nHeight > nScreenHeight) nY = nScreenHeight - nHeight; - - MoveWindow(hwndWindow, nX, nY, nWidth, nHeight, TRUE); -} - - static DWORD WINAPI md_dialog_perform_pin_operation_thread(PVOID lpParameter) { @@ -2374,114 +2339,57 @@ md_dialog_perform_pin_operation_thread(PVOID lpParameter) return (DWORD) rv; } -static INT_PTR CALLBACK md_dialog_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK md_dialog_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData) { - UNREFERENCED_PARAMETER(wParam); - switch (message) - { - case WM_INITDIALOG: - { - LANGID lang = GetUserDefaultUILanguage(); - struct sc_pkcs15_card *p15card = (struct sc_pkcs15_card *) (((LONG_PTR*)lParam)[1]); - DWORD role = (DWORD) (((LONG_PTR*)lParam)[8]); - HICON hIcon = NULL; - PCARD_DATA pCardData = (PCARD_DATA) (((LONG_PTR*)lParam)[7]); - VENDOR_SPECIFIC* vs = (VENDOR_SPECIFIC*) pCardData->pvVendorSpecific; - /* store parameter like pCardData for further use if needed */ - SetWindowLongPtr(hWnd, GWLP_USERDATA, lParam); - /* change the text shown on the screen */ - if (p15card->tokeninfo->preferred_language) { - /* choose the token's preferred language over the system's language */ - if (strncmp(p15card->tokeninfo->preferred_language, "de", 2)) - lang = LANG_GERMAN|SUBLANG_GERMAN; - } - - if (vs->wszPinContext ) { - SetWindowTextW(GetDlgItem(hWnd, IDC_PURPOSE_TEXT), vs->wszPinContext); - } - if (lang & LANG_GERMAN) { - SetWindowText(hWnd, - "PIN-Eingabe notwendig"); - SetWindowText(GetDlgItem(hWnd, IDC_EXPLANATION_TEXT), - "Dieses Fenster wird automatisch geschlossen, wenn die PIN am PINPAD eingegeben wurde oder nach dem PINPAD-Timeout (typischerweise nach 30 Sekunden)."); - SetWindowText(GetDlgItem(hWnd, IDC_EXPLANATION_TEXT), - "Dieses Fenster wird automatisch geschlossen, wenn die PIN am PINPAD eingegeben wurde oder nach dem PINPAD-Timeout (typischerweise nach 30 Sekunden)."); - SetWindowText(GetDlgItem(hWnd, IDCANCEL), - "Abbrechen"); - } - - switch (role) { - case ROLE_ADMIN: - if (lang & LANG_GERMAN) { - SetWindowText(GetDlgItem(hWnd, IDC_PINPAD_TEXT), - "Bitte geben Sie Ihre PIN zum Entsperren der Nutzer-PIN auf dem PINPAD ein."); - } else { - SetWindowText(GetDlgItem(hWnd, IDC_PINPAD_TEXT), - "Please enter your PIN to unblock the user PIN on the PINPAD."); - } - break; - case ROLE_USER: - if (lang & LANG_GERMAN) { - SetWindowText(GetDlgItem(hWnd, IDC_PINPAD_TEXT), - "Bitte geben Sie Ihre Signatur-PIN auf dem PINPAD ein."); - } else { - SetWindowText(GetDlgItem(hWnd, IDC_PINPAD_TEXT), - "Please enter your digital signature PIN on the PINPAD."); - } - break; - default: - break; - - } - CenterWindow(hWnd, vs->hwndParent); - /* load the information icon */ - hIcon = (HICON) LoadImage(0, IDI_INFORMATION, IMAGE_ICON, 0, 0, LR_SHARED); - SendMessage(GetDlgItem(hWnd, IDC_PINPAD_ICON),STM_SETIMAGE,IMAGE_ICON, (LPARAM) hIcon); - /* change the icon */ - hIcon = LoadIcon(g_inst, MAKEINTRESOURCE(IDI_LOGO)); - if (hIcon) + UNREFERENCED_PARAMETER(lParam); + switch (message) { + case TDN_CREATED: { - SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM) hIcon); - SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM) hIcon); + /* remove the icon from the window title */ + SendMessage(hWnd, WM_SETICON, (LPARAM) ICON_BIG, (LONG_PTR) NULL); + SendMessage(hWnd, WM_SETICON, (LPARAM) ICON_SMALL, (LONG_PTR) NULL); + /* store parameter like pCardData for further use if needed */ + SetWindowLongPtr(hWnd, GWLP_USERDATA, dwRefData); + /* launch the function in another thread context store the thread handle */ + ((LONG_PTR*)dwRefData)[10] = (LONG_PTR) hWnd; + ((LONG_PTR*)dwRefData)[9] = (LONG_PTR) CreateThread(NULL, 0, md_dialog_perform_pin_operation_thread, (LPVOID) dwRefData, 0, NULL); } - /* launch the function in another thread context store the thread handle */ - ((LONG_PTR*)lParam)[10] = (LONG_PTR) hWnd; - ((LONG_PTR*)lParam)[9] = (LONG_PTR) CreateThread(NULL, 0, md_dialog_perform_pin_operation_thread, (PVOID) lParam, 0, NULL); - } - return TRUE; - case WM_COMMAND: - { - /* This *must* be IDCANCEL, because we don't have any other command */ - if (LOWORD(wParam) != IDCANCEL) - return FALSE; + case TDN_TIMER: + // progress bar 30 seconds. + SendMessage(hWnd, TDM_SET_PROGRESS_BAR_POS, wParam / 300 , 0L); + /* continue the tickcount */ + return S_OK; + case TDN_BUTTON_CLICKED: + { + /* We ignore anything else than the Cancel button */ + if (LOWORD(wParam) != IDCANCEL) + return S_FALSE; - /* cancel request */ - LPARAM param = GetWindowLongPtr(hWnd, GWLP_USERDATA); - if (param) { - PCARD_DATA pCardData = (PCARD_DATA)((LONG_PTR*)param)[7]; - VENDOR_SPECIFIC* vs = (VENDOR_SPECIFIC*) pCardData->pvVendorSpecific; - sc_cancel(vs->ctx); - /* Some readers don't support SCardCancel, though they're - * reporting SCARD_S_SUCCESS. We force closing of the dialog so - * that at least the application can continue. */ - if (((LONG_PTR*)param)[10] != 0) { - EndDialog((HWND) ((LONG_PTR*)param)[10], SC_ERROR_KEYPAD_CANCELLED); + LONG_PTR param = GetWindowLongPtr(hWnd, GWLP_USERDATA); + if (param) { + PCARD_DATA pCardData = (PCARD_DATA)((LONG_PTR*)param)[7]; + VENDOR_SPECIFIC* vs = (VENDOR_SPECIFIC*) pCardData->pvVendorSpecific; + sc_cancel(vs->ctx); } } - } - return TRUE; - case WM_DESTROY: - { - /* clean resources used */ - LPARAM param = GetWindowLongPtr(hWnd, GWLP_USERDATA); - if (param) { - HANDLE hThread = (HANDLE)((LONG_PTR*)param)[9]; - CloseHandle(hThread); + /* Some readers don't support SCardCancel, though they're + * reporting SCARD_S_SUCCESS. We force closing of the dialog so + * that at least the application can continue. */ + return S_OK; + case TDN_DESTROYED: + { + /* clean resources used */ + LONG_PTR param = GetWindowLongPtr(hWnd, GWLP_USERDATA); + if (param) { + HANDLE hThread = (HANDLE)((LONG_PTR*)param)[9]; + CloseHandle(hThread); + } } - } - break; + break; } - return FALSE; + + /* don't close the Task Dialog */ + return S_FALSE; } @@ -2494,8 +2402,12 @@ md_dialog_perform_pin_operation(PCARD_DATA pCardData, int operation, struct sc_p { LONG_PTR parameter[11]; INT_PTR result = 0; + HWND hWndDlg = 0; + TASKDIALOGCONFIG tc = {0}; int rv = 0; VENDOR_SPECIFIC* pv = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); + LANGID lang = GetUserDefaultUILanguage(); + /* stack the parameters */ parameter[0] = (LONG_PTR)operation; parameter[1] = (LONG_PTR)p15card; @@ -2508,16 +2420,77 @@ md_dialog_perform_pin_operation(PCARD_DATA pCardData, int operation, struct sc_p parameter[8] = (LONG_PTR)role; parameter[9] = 0; /* place holder for thread handle */ parameter[10] = 0; /* place holder for window handle */ + /* launch the function to perform in the same thread context */ if (!displayUI) { rv = md_dialog_perform_pin_operation_thread(parameter); SecureZeroMemory(parameter, sizeof(parameter)); return rv; } + /* launch the UI in the same thread context than the parent and the function to perform in another thread context this is the only way to display a modal dialog attached to a parent (hwndParent != 0) */ - result = DialogBoxParam(g_inst, MAKEINTRESOURCE(IDD_PINPAD), pv->hwndParent, md_dialog_proc, (LPARAM) parameter); + tc.hwndParent = pv->hwndParent; + tc.hInstance = g_inst; + tc.dwFlags = TDF_ALLOW_DIALOG_CANCELLATION | TDF_SHOW_PROGRESS_BAR | TDF_CALLBACK_TIMER | TDF_EXPAND_FOOTER_AREA | TDF_POSITION_RELATIVE_TO_WINDOW | TDF_USE_HICON_FOOTER; + tc.dwCommonButtons = TDCBF_CANCEL_BUTTON; + + if (p15card->tokeninfo->preferred_language) { + /* choose the token's preferred language over the system's language */ + if (strncmp(p15card->tokeninfo->preferred_language, "de", 2)) + lang = LANG_GERMAN|SUBLANG_GERMAN; + } + + if (lang & LANG_GERMAN) { + tc.pszWindowTitle = L"Windows-Sicherheit"; + tc.pszMainInstruction = L"OpenSC Smartcard-Anbieter"; + switch (role) { + case ROLE_ADMIN: + tc.pszContent = L"Bitte geben Sie Ihre PIN zum Entsperren der Nutzer-PIN auf dem PINPAD ein."; + break; + case ROLE_USER: + /* fall through */ + default: + tc.pszContent = L"Bitte geben Sie Ihre PIN für die digitale Signatur auf dem PINPAD ein."; + break; + } + tc.pszExpandedInformation = L"Dieses Fenster wird automatisch geschlossen, wenn die PIN am PINPAD eingegeben wurde (Timeout typischerweise nach 30 Sekunden)."; + tc.pszExpandedControlText = L"Weitere Informationen"; + tc.pszCollapsedControlText = L"Weitere Informationen"; + } else { + tc.pszWindowTitle = L"Windows Security"; + tc.pszMainInstruction = L"OpenSC Smart Card Provider"; + switch (role) { + case ROLE_ADMIN: + tc.pszContent = L"Please enter your PIN to unblock the user PIN on the PINPAD."; + break; + case ROLE_USER: + /* fall through */ + default: + tc.pszContent = L"Please enter your digital signature PIN on the PINPAD."; + break; + } + tc.pszExpandedInformation = L"This window will be closed automatically after the PIN has been submitted on the PINPAD (timeout typically after 30 seconds)."; + tc.pszExpandedControlText = L"Click here for more information"; + tc.pszCollapsedControlText = L"Click here for more information"; + } + if (pv->wszPinContext ) { + tc.pszMainInstruction = pv->wszPinContext; + } + + tc.pszMainIcon = MAKEINTRESOURCE(IDI_SMARTCARD); + tc.cButtons = 0; + tc.pButtons = NULL; + tc.cRadioButtons = 0; + tc.pRadioButtons = NULL; + tc.pfCallback = md_dialog_proc; + tc.lpCallbackData = (LONG_PTR)parameter; + tc.cbSize = sizeof(tc); + + result = TaskDialogIndirect(&tc, NULL, NULL, NULL); + SecureZeroMemory(parameter, sizeof(parameter)); + return (int) result; } diff --git a/src/minidriver/opensc-minidriver.dll.manifest b/src/minidriver/opensc-minidriver.dll.manifest new file mode 100644 index 00000000..029b3537 --- /dev/null +++ b/src/minidriver/opensc-minidriver.dll.manifest @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/minidriver/versioninfo-minidriver.rc.in b/src/minidriver/versioninfo-minidriver.rc.in index bcb5c789..f99d2b92 100644 --- a/src/minidriver/versioninfo-minidriver.rc.in +++ b/src/minidriver/versioninfo-minidriver.rc.in @@ -2,11 +2,7 @@ #define IDC_STATIC -1 /* defined twice: in versioninfo-minidriver.rc.in and in minidriver.c */ -#define IDD_PINPAD 101 -#define IDI_LOGO 102 -#define IDC_PURPOSE_TEXT 1002 -#define IDC_PINPAD_TEXT 1001 -#define IDC_PINPAD_ICON 1000 +#define IDI_SMARTCARD 102 VS_VERSION_INFO VERSIONINFO FILEVERSION @OPENSC_VERSION_MAJOR@,@OPENSC_VERSION_MINOR@,@OPENSC_VERSION_FIX@,@OPENSC_VERSION_REVISION@ @@ -44,20 +40,4 @@ BEGIN END END -IDD_PINPAD DIALOGEX 0, 0, 309, 89 -STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION -CAPTION "PIN Entry Required" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - LTEXT "OpenSC Smart Card Provider",IDC_PURPOSE_TEXT,46,9,256,10 - LTEXT "Please enter your PIN on the PINPAD",IDC_PINPAD_TEXT,46,19,256,19 - ICON "",IDC_PINPAD_ICON,6,11,20,20 - LTEXT "This window will be closed automatically after the PIN has been submitted on the PINPAD or if the PINPAD timeout occurs (in general 30 seconds).",IDC_STATIC,7,46,298,19 - PUSHBUTTON "Cancel",IDCANCEL,250,67,50,14 -END - -#ifndef __MINGW32__ -IDI_LOGO ICON "..\\..\\win32\\OpenSC.ico" -#else -IDI_LOGO ICON "../../win32/OpenSC.ico" -#endif +IDI_SMARTCARD ICON "..\\..\\win32\\DDORes.dll_14_2302.ico" diff --git a/win32/DDORes.dll_14_2302.ico b/win32/DDORes.dll_14_2302.ico new file mode 100644 index 0000000000000000000000000000000000000000..4b4af23071213359c25e0bfe4f67039eb79fb39d GIT binary patch literal 55077 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 literal 0 HcmV?d00001 diff --git a/win32/Make.rules.mak b/win32/Make.rules.mak index b8e0adf6..8780dadb 100644 --- a/win32/Make.rules.mak +++ b/win32/Make.rules.mak @@ -125,14 +125,14 @@ ALL_INCLUDES = /I$(TOPDIR)\win32 /I$(TOPDIR)\src $(OPENPACE_INCL_DIR) $(OPENSSL_ !IF "$(DEBUG_DEF)" == "/DDEBUG" LINKDEBUGFLAGS = /NODEFAULTLIB:LIBCMT /DEBUG CODE_OPTIMIZATION = -COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MTd /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0502 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" /DDEBUG /Zi /Od +COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MTd /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" /DDEBUG /Zi /Od !ELSE LINKDEBUGFLAGS = /NODEFAULTLIB:LIBCMTD -COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MT /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0502 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" +COPTS = /GS /W3 /D_CRT_SECURE_NO_DEPRECATE /MT /nologo /DHAVE_CONFIG_H $(ALL_INCLUDES) /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN $(OPENPACE_DEF) $(OPENSSL_DEF) $(ZLIB_DEF) $(MINIDRIVER_DEF) $(SM_DEF) /DOPENSC_FEATURES="\"$(OPENSC_FEATURES)\"" !ENDIF -LINKFLAGS = /NOLOGO /INCREMENTAL:NO /MACHINE:$(PLATFORM) /MANIFEST:NO /NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:MSVCRT /NXCOMPAT /DYNAMICBASE $(LINKDEBUGFLAGS) +LINKFLAGS = /NOLOGO /INCREMENTAL:NO /MACHINE:$(PLATFORM) /NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:MSVCRT /NXCOMPAT /DYNAMICBASE $(LINKDEBUGFLAGS) LIBFLAGS = /nologo /machine:$(PLATFORM) !IF "$(PLATFORM)" == "x86" CANDLEFLAGS = -dPlatform=x86 $(CANDLEFLAGS) @@ -150,4 +150,4 @@ CANDLEFLAGS = -dPlatform=x64 $(CANDLEFLAGS) rc /l 0x0409 $< clean:: - del /Q *.obj *.dll *.exe *.pdb *.lib *.def *.manifest *.res + del /Q *.obj *.dll *.exe *.pdb *.lib *.def *.res