From 77deef95f053af89937becfb9b385f3a95e870ab Mon Sep 17 00:00:00 2001 From: tantra35 Date: Tue, 10 Jun 2025 13:17:12 +0300 Subject: [PATCH] add ability to save pin for smartcards --- openvpn.c | 50 ++++++++++++++++++++++++++++++++-- plap/stub.c | 19 +++++++++++++ res/openvpn-gui-res-cs.rc | 7 +++-- res/openvpn-gui-res-de.rc | 7 +++-- res/openvpn-gui-res-dk.rc | 7 +++-- res/openvpn-gui-res-en.rc | 7 +++-- res/openvpn-gui-res-es.rc | 7 +++-- res/openvpn-gui-res-fa.rc | 7 +++-- res/openvpn-gui-res-fi.rc | 7 +++-- res/openvpn-gui-res-fr.rc | 7 +++-- res/openvpn-gui-res-it.rc | 7 +++-- res/openvpn-gui-res-jp.rc | 7 +++-- res/openvpn-gui-res-kr.rc | 7 +++-- res/openvpn-gui-res-nl.rc | 7 +++-- res/openvpn-gui-res-no.rc | 7 +++-- res/openvpn-gui-res-pl.rc | 7 +++-- res/openvpn-gui-res-pt.rc | 7 +++-- res/openvpn-gui-res-ru.rc | 7 +++-- res/openvpn-gui-res-se.rc | 7 +++-- res/openvpn-gui-res-tr.rc | 7 +++-- res/openvpn-gui-res-ua.rc | 7 +++-- res/openvpn-gui-res-zh-hans.rc | 7 +++-- res/openvpn-gui-res-zh-hant.rc | 7 +++-- save_pass.c | 21 ++++++++++++++ save_pass.h | 6 ++++ 25 files changed, 178 insertions(+), 65 deletions(-) diff --git a/openvpn.c b/openvpn.c index 1eebf6a..09b1506 100644 --- a/openvpn.c +++ b/openvpn.c @@ -843,6 +843,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) case WM_INITDIALOG: param = (auth_param_t *)lParam; TRY_SETPROP(hwndDlg, cfgProp, (HANDLE)param); + BOOL lenableOKBtn = FALSE; WCHAR *wstr = Widen(param->str); if (!wstr) @@ -880,6 +881,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) SetWindowPos(hwndDlg, NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE); PrintDebug(L"Window resized to = %d %d", rect.right, rect.bottom); } + ShowWindow(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), SW_HIDE); } else if (param->flags & FLAG_PASS_TOKEN) { @@ -887,11 +889,37 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) SetDlgItemText(hwndDlg, ID_TXT_DESCRIPTION, LoadLocalizedString(IDS_NFO_TOKEN_PASSWORD_REQUEST, param->id)); + + if (RecallSmartCardPin(param->c->config_name, password)) + { + SetDlgItemTextW(hwndDlg, ID_EDT_RESPONSE, password); + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); + lenableOKBtn = TRUE; + + if (password[0] != L'\0' && param->c->failed_auth_attempts == 0) + { + /* smart card pin available: skip dialog + * if silent_connection is on, else auto submit after a few seconds. + * User can interrupt. + */ + SetFocus(GetDlgItem(hwndDlg, IDOK)); + UINT timeout = o.silent_connection ? 0 : 6; /* in seconds */ + AutoCloseSetup(hwndDlg, IDOK, timeout, ID_TXT_WARNING, IDS_NFO_AUTO_CONNECT); + } + else if (param->c->failed_auth_attempts) + { + SendMessage( + GetDlgItem(hwndDlg, ID_EDT_RESPONSE), EM_SETSEL, 0, MAKELONG(0, -1)); + } + + SecureZeroMemory(password, sizeof(password)); + } } else { WriteStatusLog(param->c, L"GUI> ", L"Unknown password request", false); SetDlgItemText(hwndDlg, ID_TXT_DESCRIPTION, wstr); + ShowWindow(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), SW_HIDE); } free(wstr); @@ -916,7 +944,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) else { /* disable OK button until response is filled-in */ - EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDOK), lenableOKBtn); ResetPasswordReveal(GetDlgItem(hwndDlg, ID_EDT_RESPONSE), GetDlgItem(hwndDlg, ID_PASSWORD_REVEAL), 0); @@ -931,7 +959,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { case ID_EDT_RESPONSE: - if (!(param->flags & FLAG_CR_ECHO)) + if (!(param->flags & FLAG_CR_ECHO) && HIWORD(wParam) != EN_KILLFOCUS) { ResetPasswordReveal(GetDlgItem(hwndDlg, ID_EDT_RESPONSE), GetDlgItem(hwndDlg, ID_PASSWORD_REVEAL), @@ -945,6 +973,19 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) } break; + case ID_CHK_SAVE_PASS: + param->c->flags ^= FLAG_SAVE_AUTH_PASS; + if (param->c->flags & FLAG_SAVE_AUTH_PASS) + { + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); + } + else + { + DeleteSavedSmartCardPin(param->c->config_name); + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_UNCHECKED); + } + break; + case IDOK: if (GetDlgItemTextW(hwndDlg, ID_EDT_RESPONSE, password, _countof(password)) && !validate_input(password, L"\n")) @@ -1001,6 +1042,11 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) PrintDebug(L"Send passwd to mgmt with format: '%hs'", fmt); ManagementCommandFromInput(param->c, fmt, hwndDlg, ID_EDT_RESPONSE); free(fmt); + + if (param->flags & FLAG_PASS_TOKEN && param->c->flags & FLAG_SAVE_AUTH_PASS) + { + SaveSmartCardPin(param->c->config_name, password); + } } else /* no memory? send stop signal */ { diff --git a/plap/stub.c b/plap/stub.c index 02f425d..e45123b 100644 --- a/plap/stub.c +++ b/plap/stub.c @@ -129,6 +129,13 @@ SaveAuthPass(UNUSED const WCHAR *config_name, UNUSED const WCHAR *password) { return 1; } + +int +SaveSmartCardPin(UNUSED const WCHAR *config_name, UNUSED const WCHAR *username) +{ + return 1; +} + int SaveUsername(UNUSED const WCHAR *config_name, UNUSED const WCHAR *username) { @@ -151,12 +158,24 @@ RecallUsername(UNUSED const WCHAR *config_name, UNUSED WCHAR *username) return 0; } +int +RecallSmartCardPin(UNUSED const WCHAR *config_name, UNUSED WCHAR *pin) +{ + return 0; +} + void DeleteSavedAuthPass(UNUSED const WCHAR *config_name) { return; } +void +DeleteSavedSmartCardPin(const WCHAR *config_name) +{ + return; +} + void DeleteSavedKeyPass(UNUSED const WCHAR *config_name) { diff --git a/res/openvpn-gui-res-cs.rc b/res/openvpn-gui-res-cs.rc index 88d59b2..faef7f7 100644 --- a/res/openvpn-gui-res-cs.rc +++ b/res/openvpn-gui-res-cs.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Odpověď na výzvu" @@ -89,8 +89,9 @@ BEGIN LTEXT "Odpověď:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Zrušit", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Uložit heslo", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Zrušit", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-de.rc b/res/openvpn-gui-res-de.rc index c14b04a..205bf71 100644 --- a/res/openvpn-gui-res-de.rc +++ b/res/openvpn-gui-res-de.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -89,8 +89,9 @@ BEGIN LTEXT "&Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Abbrechen", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Passwort &speichern", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Abbrechen", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-dk.rc b/res/openvpn-gui-res-dk.rc index 363b7e7..8e9f07e 100644 --- a/res/openvpn-gui-res-dk.rc +++ b/res/openvpn-gui-res-dk.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -90,8 +90,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuller", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Husk kodeord", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuller", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-en.rc b/res/openvpn-gui-res-en.rc index dd9ee1b..0da5726 100644 --- a/res/openvpn-gui-res-en.rc +++ b/res/openvpn-gui-res-en.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -89,8 +89,9 @@ BEGIN LTEXT "&Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Cancel", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Cancel", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-es.rc b/res/openvpn-gui-res-es.rc index 524da42..6303ac1 100644 --- a/res/openvpn-gui-res-es.rc +++ b/res/openvpn-gui-res-es.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Cancelar", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fa.rc b/res/openvpn-gui-res-fa.rc index 0a10684..056094b 100644 --- a/res/openvpn-gui-res-fa.rc +++ b/res/openvpn-gui-res-fa.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST | WS_EX_RTLREADING | WS_EX_LAYOUTRTL CAPTION "OpenVPN – پاسخ چالش" @@ -91,8 +91,9 @@ BEGIN LTEXT "پاسخ :", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "بسیار خوب", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "لغو", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "نگه داشتن رمز عبور", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "بسیار خوب", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "لغو", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fi.rc b/res/openvpn-gui-res-fi.rc index 196a14c..5d33946 100644 --- a/res/openvpn-gui-res-fi.rc +++ b/res/openvpn-gui-res-fi.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Haastemenetelmä" @@ -89,8 +89,9 @@ BEGIN LTEXT "Vastaus:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Peruuta", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Tallenna salasana", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Peruuta", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fr.rc b/res/openvpn-gui-res-fr.rc index d56402f..210bb79 100644 --- a/res/openvpn-gui-res-fr.rc +++ b/res/openvpn-gui-res-fr.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Réponse de défi" @@ -88,8 +88,9 @@ BEGIN LTEXT "Réponse:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuler", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Enregistrer mot de passe", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-it.rc b/res/openvpn-gui-res-it.rc index 5467459..f8fa300 100644 --- a/res/openvpn-gui-res-it.rc +++ b/res/openvpn-gui-res-it.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,9 @@ BEGIN LTEXT "&Risposta:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Annulla", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "&Ricorda password", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Annulla", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-jp.rc b/res/openvpn-gui-res-jp.rc index d3c73ac..69ff8ba 100644 --- a/res/openvpn-gui-res-jp.rc +++ b/res/openvpn-gui-res-jp.rc @@ -79,7 +79,7 @@ BEGIN LTEXT "", ID_TXT_WARNING, 6, 108, 150, 10 END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - チャレンジ/レスポンス" @@ -90,8 +90,9 @@ BEGIN LTEXT "レスポンス(&R):", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK(&O)", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "キャンセル(&C)", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "パスワードを保存(&S)", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK(&O)", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "キャンセル(&C)", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-kr.rc b/res/openvpn-gui-res-kr.rc index debe5c0..5c9c33f 100644 --- a/res/openvpn-gui-res-kr.rc +++ b/res/openvpn-gui-res-kr.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 자격증명" @@ -90,8 +90,9 @@ BEGIN LTEXT "요청값:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "확인", IDOK, 25, 58, 50, 14, BS_PUSHBUTTON | WS_TABSTOP | WS_DISABLED - PUSHBUTTON "취소", IDCANCEL, 85, 58, 52, 14 + CHECKBOX "암호 저장", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "확인", IDOK, 25, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP | WS_DISABLED + PUSHBUTTON "취소", IDCANCEL, 85, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-nl.rc b/res/openvpn-gui-res-nl.rc index 8067db8..71077a9 100644 --- a/res/openvpn-gui-res-nl.rc +++ b/res/openvpn-gui-res-nl.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuleren", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Wachtwoord opslaan", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuleren", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-no.rc b/res/openvpn-gui-res-no.rc index cc35475..338e5a5 100644 --- a/res/openvpn-gui-res-no.rc +++ b/res/openvpn-gui-res-no.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -89,8 +89,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Avbryt", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Husk passord", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-pl.rc b/res/openvpn-gui-res-pl.rc index eead00a..f806131 100644 --- a/res/openvpn-gui-res-pl.rc +++ b/res/openvpn-gui-res-pl.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Odpowiedź" @@ -90,8 +90,9 @@ BEGIN LTEXT "Odpowiedź:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Anuluj", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Zapisz hasło", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Anuluj", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-pt.rc b/res/openvpn-gui-res-pt.rc index 9889f01..3e57a57 100644 --- a/res/openvpn-gui-res-pt.rc +++ b/res/openvpn-gui-res-pt.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Resposta do Desafio" @@ -88,8 +88,9 @@ BEGIN LTEXT "Resposta:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Cancelar", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Salvar senha", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-ru.rc b/res/openvpn-gui-res-ru.rc index 1146264..b86bcc1 100644 --- a/res/openvpn-gui-res-ru.rc +++ b/res/openvpn-gui-res-ru.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -90,8 +90,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Отмена", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Запомнить", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Отмена", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-se.rc b/res/openvpn-gui-res-se.rc index e881d8a..a0e1fa6 100644 --- a/res/openvpn-gui-res-se.rc +++ b/res/openvpn-gui-res-se.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Avbryt", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-tr.rc b/res/openvpn-gui-res-tr.rc index 8042e6e..4e6a5a2 100644 --- a/res/openvpn-gui-res-tr.rc +++ b/res/openvpn-gui-res-tr.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -90,8 +90,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "Tamam", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Çıkış", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "Tamam", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Çıkış", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-ua.rc b/res/openvpn-gui-res-ua.rc index 8a47c21..308491a 100644 --- a/res/openvpn-gui-res-ua.rc +++ b/res/openvpn-gui-res-ua.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,9 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Скасувати", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Запам'ятати", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Скасувати", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-zh-hans.rc b/res/openvpn-gui-res-zh-hans.rc index 48645fb..23385b5 100644 --- a/res/openvpn-gui-res-zh-hans.rc +++ b/res/openvpn-gui-res-zh-hans.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 质询响应" @@ -91,8 +91,9 @@ BEGIN LTEXT "响应:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "确定", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "取消", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "保存密码", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "确定", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-zh-hant.rc b/res/openvpn-gui-res-zh-hant.rc index e91c210..c93f935 100644 --- a/res/openvpn-gui-res-zh-hant.rc +++ b/res/openvpn-gui-res-zh-hant.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 挑戰回應" @@ -91,8 +91,9 @@ BEGIN LTEXT "回應:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "確認", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "取消", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "儲存密碼", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "確認", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 90, 65, 52, 14 END /* Status Dialog */ diff --git a/save_pass.c b/save_pass.c index cde660c..d2468ad 100644 --- a/save_pass.c +++ b/save_pass.c @@ -35,6 +35,7 @@ #define AUTH_PASS_DATA L"auth-data" #define ENTROPY_DATA L"entropy" #define AUTH_USER_DATA L"username" +#define AUTH_SMARTCARD_DATA L"auth-smartcard-pin" #define ENTROPY_LEN 16 static DWORD @@ -162,6 +163,12 @@ SaveAuthPass(const WCHAR *config_name, const WCHAR *password) return save_encrypted(config_name, password, AUTH_PASS_DATA); } +int +SaveSmartCardPin(const WCHAR *config_name, const WCHAR *pin) +{ + return save_encrypted(config_name, pin, AUTH_SMARTCARD_DATA); +} + /* * Returns 1 on success, 0 on failure. password should have space * for up to capacity wide chars incluing nul termination @@ -230,6 +237,12 @@ RecallAuthPass(const WCHAR *config_name, WCHAR *password) return recall_encrypted(config_name, password, USER_PASS_LEN, AUTH_PASS_DATA); } +int +RecallSmartCardPin(const WCHAR *config_name, WCHAR *pin) +{ + return recall_encrypted(config_name, pin, USER_PASS_LEN, AUTH_SMARTCARD_DATA); +} + int SaveUsername(const WCHAR *config_name, const WCHAR *username) { @@ -237,6 +250,7 @@ SaveUsername(const WCHAR *config_name, const WCHAR *username) SetConfigRegistryValueBinary(config_name, AUTH_USER_DATA, (BYTE *)username, len); return 1; } + /* * The buffer username should be have space for up to USER_PASS_LEN * WCHARs including nul. @@ -268,6 +282,12 @@ DeleteSavedAuthPass(const WCHAR *config_name) DeleteConfigRegistryValue(config_name, AUTH_PASS_DATA); } +void +DeleteSavedSmartCardPin(const WCHAR *config_name) +{ + DeleteConfigRegistryValue(config_name, AUTH_SMARTCARD_DATA); +} + /* delete saved config-specific auth password and private key passphrase */ void DeleteSavedPasswords(const WCHAR *config_name) @@ -275,6 +295,7 @@ DeleteSavedPasswords(const WCHAR *config_name) DeleteConfigRegistryValue(config_name, KEY_PASS_DATA); DeleteConfigRegistryValue(config_name, AUTH_PASS_DATA); DeleteConfigRegistryValue(config_name, ENTROPY_DATA); + DeleteConfigRegistryValue(config_name, AUTH_SMARTCARD_DATA); } /* check if auth password is saved */ diff --git a/save_pass.h b/save_pass.h index 3f895d2..25f27a0 100644 --- a/save_pass.h +++ b/save_pass.h @@ -31,16 +31,22 @@ int SaveKeyPass(const WCHAR *config_name, const WCHAR *password); int SaveAuthPass(const WCHAR *config_name, const WCHAR *password); +int SaveSmartCardPin(const WCHAR *config_name, const WCHAR *pin); + int SaveUsername(const WCHAR *config_name, const WCHAR *username); int RecallKeyPass(const WCHAR *config_name, WCHAR *password); int RecallAuthPass(const WCHAR *config_name, WCHAR *password); +int RecallSmartCardPin(const WCHAR *config_name, WCHAR *pin); + int RecallUsername(const WCHAR *config_name, WCHAR *username); void DeleteSavedAuthPass(const WCHAR *config_name); +void DeleteSavedSmartCardPin(const WCHAR *config_name); + void DeleteSavedKeyPass(const WCHAR *config_name); void DeleteSavedPasswords(const WCHAR *config_name);