//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1995 - 1999 // // File: pvkdlg.cpp // // Contents: Private Key Dialog Box APIs. // // Functions: PvkDlgGetKeyPassword // // History: 12-May-96 philh created // //-------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "pvk.h" // ENTER_PASSWORD: // IDC_PASSWORD0 - Password // CREATE_PASSWORD: // IDC_PASSWORD0 - Password // IDC_PASSWORD1 - Confirm Password typedef struct _KEY_PASSWORD_PARAM { PASSWORD_TYPE PasswordType; LPWSTR pwszKey; // IDC_KEY LPSTR *ppszPassword; } KEY_PASSWORD_PARAM, *PKEY_PASSWORD_PARAM; // Where to get the dialog resources from static HINSTANCE hPvkInst; // Forward reference to local functions static int GetPassword( IN HWND hwndDlg, IN PASSWORD_TYPE PasswordType, OUT LPSTR *ppszPassword ); static INT_PTR CALLBACK KeyPasswordDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ); extern BOOL WINAPI UnicodeDllMain( HMODULE hInst, ULONG ulReason, LPVOID lpReserved); //+------------------------------------------------------------------------- // Dll initialization //-------------------------------------------------------------------------- BOOL WINAPI DllMain( HMODULE hInstDLL, DWORD fdwReason, LPVOID lpvReserved ) { switch (fdwReason) { case DLL_PROCESS_ATTACH: hPvkInst = hInstDLL; break; case DLL_PROCESS_DETACH: break; } return UnicodeDllMain( hInstDLL, fdwReason, lpvReserved); } //+------------------------------------------------------------------------- // Enter or Create Private Key Password Dialog Box //-------------------------------------------------------------------------- int PvkDlgGetKeyPassword( IN PASSWORD_TYPE PasswordType, IN HWND hwndOwner, IN LPCWSTR pwszKeyName, OUT BYTE **ppbPassword, OUT DWORD *pcbPassword ) { int nResult; LPSTR pszPassword = NULL; KEY_PASSWORD_PARAM KeyPasswordParam = { PasswordType, (LPWSTR) pwszKeyName, &pszPassword }; LPCSTR pszTemplate = PasswordType == ENTER_PASSWORD ? MAKEINTRESOURCE(IDD_ENTERKEYPASSWORD) : MAKEINTRESOURCE(IDD_CREATEKEYPASSWORD); nResult = (BOOL)DialogBoxParam( hPvkInst, pszTemplate, hwndOwner, KeyPasswordDlgProc, (LPARAM) &KeyPasswordParam ); *ppbPassword = (BYTE *) pszPassword; if (pszPassword) *pcbPassword = strlen(pszPassword); else *pcbPassword = 0; return nResult; } //+------------------------------------------------------------------------- // Allocate and get the password(s) from the dialog box // // For no password input, returns NULL // pointer for the password. Otherwise, the password is PvkAlloc'ed. //-------------------------------------------------------------------------- static int GetPassword( IN HWND hwndDlg, IN PASSWORD_TYPE PasswordType, OUT LPSTR *ppszPassword ) { LPSTR rgpszPassword[2] = {NULL, NULL}; *ppszPassword = NULL; // Get the entered password(s) assert(PasswordType < 2); int i; for (i = 0; i <= PasswordType; i++) { LONG cchPassword; cchPassword = (LONG)SendDlgItemMessage( hwndDlg, IDC_PASSWORD0 + i, EM_LINELENGTH, (WPARAM) 0, (LPARAM) 0 ); if (cchPassword > 0) { rgpszPassword[i] = (LPSTR) PvkAlloc(cchPassword + 1); assert(rgpszPassword[i]); if (rgpszPassword[i]) GetDlgItemText( hwndDlg, IDC_PASSWORD0 + i, rgpszPassword[i], cchPassword + 1 ); } } if (PasswordType == ENTER_PASSWORD) { *ppszPassword = rgpszPassword[0]; return IDOK; } int nResult = IDOK; #define MSG_BOX_TITLE_LEN 128 char szMsgBoxTitle[MSG_BOX_TITLE_LEN]; GetWindowText(hwndDlg, szMsgBoxTitle, MSG_BOX_TITLE_LEN); if (rgpszPassword[0] == NULL && rgpszPassword[1] == NULL) { // Didn't enter a password nResult = MessageBox( hwndDlg, "Without password protection ?", szMsgBoxTitle, MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2 ); if (nResult == IDYES) nResult = IDOK; else if (nResult == IDNO) nResult = IDRETRY; } else if (rgpszPassword[0] == NULL || rgpszPassword[1] == NULL || strcmp(rgpszPassword[0], rgpszPassword[1]) != 0) { // Confirmed password didn't match nResult = MessageBox( hwndDlg, "Confirm password doesn't match", szMsgBoxTitle, MB_RETRYCANCEL | MB_ICONEXCLAMATION ); if (nResult == IDRETRY) { SetDlgItemText(hwndDlg, IDC_PASSWORD0 + 0, ""); SetDlgItemText(hwndDlg, IDC_PASSWORD0 + 1, ""); } } if (nResult == IDOK) *ppszPassword = rgpszPassword[0]; else if (rgpszPassword[0]) PvkFree(rgpszPassword[0]); if (rgpszPassword[1]) PvkFree(rgpszPassword[1]); if (nResult == IDRETRY) SetFocus(GetDlgItem(hwndDlg, IDC_PASSWORD0)); return nResult; } //+------------------------------------------------------------------------- // Enter or Create Private Key Password DialogProc //-------------------------------------------------------------------------- static INT_PTR CALLBACK KeyPasswordDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { PKEY_PASSWORD_PARAM pKeyPasswordParam = (PKEY_PASSWORD_PARAM) lParam; char sz[128]; WideCharToMultiByte(CP_ACP, 0, pKeyPasswordParam->pwszKey, -1, (LPSTR) sz, 128, NULL, NULL); SetDlgItemText(hwndDlg, IDC_KEY, sz); SetWindowLongPtr(hwndDlg, DWLP_USER, (ULONG_PTR)pKeyPasswordParam); return TRUE; } case WM_COMMAND: int nResult = LOWORD(wParam); switch (nResult) { case IDOK: { PKEY_PASSWORD_PARAM pKeyPasswordParam = (PKEY_PASSWORD_PARAM) GetWindowLongPtr(hwndDlg, DWLP_USER); nResult = GetPassword( hwndDlg, pKeyPasswordParam->PasswordType, pKeyPasswordParam->ppszPassword ); if (nResult != IDRETRY) EndDialog(hwndDlg, nResult); return TRUE; } break; case IDC_NONE: nResult = IDOK; // *ppszPassword == NULL // Fall through case IDCANCEL: EndDialog(hwndDlg, nResult); return TRUE; } } return FALSE; }