diff options
Diffstat (limited to 'src/Format/Tcformat.c')
-rw-r--r-- | src/Format/Tcformat.c | 191 |
1 files changed, 143 insertions, 48 deletions
diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c index 40c17d66..31140fd7 100644 --- a/src/Format/Tcformat.c +++ b/src/Format/Tcformat.c @@ -51,6 +51,7 @@ #include "Volumes.h" #include "Wipe.h" #include "Xml.h" +#include "SecurityToken.h" #include <Strsafe.h> @@ -254,6 +255,8 @@ BOOL bOperationSuccess = FALSE; BOOL bGuiMode = TRUE; +BOOL bSystemIsGPT = FALSE; + int nPbar = 0; /* Control ID of progress bar:- for format code */ wchar_t HeaderKeyGUIView [KEY_GUI_VIEW_SIZE]; @@ -930,11 +933,13 @@ static BOOL SysDriveOrPartitionFullyEncrypted (BOOL bSilent) BOOL SwitchWizardToSysEncMode (void) { WaitCursor (); + SystemDriveConfiguration config; try { BootEncStatus = BootEncObj->GetStatus(); bWholeSysDrive = BootEncObj->SystemPartitionCoversWholeDrive(); + config = BootEncObj->GetSystemDriveConfiguration (); } catch (Exception &e) { @@ -1412,6 +1417,24 @@ void ComboSelChangeEA (HWND hwndDlg) SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("TWOFISH_HELP")); } + else if (wcsncmp (name, L"GOST89", 6) == 0) + { + StringCbPrintfW (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), L"GOST89"); + + SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("GOST89_HELP")); + } + else if (wcscmp (name, L"Kuznyechik") == 0) + { + StringCbPrintfW (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), name); + + SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("KUZNYECHIK_HELP")); + } + else if (wcscmp (name, L"Camellia") == 0) + { + StringCbPrintfW (hyperLink, sizeof(hyperLink) / 2, GetString ("MORE_INFO_ABOUT"), name); + + SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("CAMELLIA_HELP")); + } else if (EAGetCipherCount (nIndex) > 1) { // Cascade @@ -1582,6 +1605,10 @@ static void RefreshMultiBootControls (HWND hwndDlg) nMultiBoot = 1; #endif + // For now, we force single configuration in wizard + if (bSystemIsGPT && nMultiBoot == 0) + nMultiBoot = 1; + SendMessage (GetDlgItem (hwndDlg, IDC_SINGLE_BOOT), BM_SETCHECK, nMultiBoot == 1 ? BST_CHECKED : BST_UNCHECKED, @@ -3605,6 +3632,13 @@ static BOOL FileSize4GBLimitQuestionNeeded (void) } +void DisableIfGpt(HWND control) +{ + if (bSystemIsGPT) { + EnableWindow(control, FALSE); + } +} + /* Except in response to the WM_INITDIALOG message, the dialog box procedure should return nonzero if it processes the message, and zero if it does not. - see DialogProc */ @@ -3662,6 +3696,8 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SendMessage (GetDlgItem (hwndDlg, IDC_SYSENC_HIDDEN), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE); SendMessage (GetDlgItem (hwndDlg, IDC_SYSENC_NORMAL), WM_SETFONT, (WPARAM) hUserBoldFont, (LPARAM) TRUE); + DisableIfGpt(GetDlgItem(hwndDlg, IDC_SYSENC_HIDDEN)); + CheckButton (GetDlgItem (hwndDlg, bHiddenOS ? IDC_SYSENC_HIDDEN : IDC_SYSENC_NORMAL)); SetWindowTextW (GetDlgItem (hwndDlg, IDC_BOX_HELP), GetString ("SYSENC_HIDDEN_TYPE_HELP")); @@ -3701,6 +3737,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SetWindowTextW (GetDlgItem (hwndDlg, IDT_WHOLE_SYS_DRIVE), GetString ("SYS_ENCRYPTION_SPAN_WHOLE_SYS_DRIVE_HELP")); CheckButton (GetDlgItem (hwndDlg, bWholeSysDrive ? IDC_WHOLE_SYS_DRIVE : IDC_SYS_PARTITION)); + DisableIfGpt(GetDlgItem(hwndDlg, IDC_WHOLE_SYS_DRIVE)); SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT")); SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV")); @@ -3778,7 +3815,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDCANCEL), GetString ("CANCEL")); RefreshMultiBootControls (hwndDlg); - + DisableIfGpt(GetDlgItem(hwndDlg, IDC_MULTI_BOOT)); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), nMultiBoot > 0); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), TRUE); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDCANCEL), TRUE); @@ -4040,7 +4077,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa for (ea = EAGetFirst (); ea != 0; ea = EAGetNext (ea)) { - if (EAIsFormatEnabled (ea)) + if (EAIsFormatEnabled (ea) && (!SysEncInEffect () || bSystemIsGPT || EAIsMbrSysEncEnabled (ea))) AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX), EAGetName (buf, ea, 1), ea); } @@ -4054,13 +4091,13 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa if (SysEncInEffect ()) { - hash_algo = DEFAULT_HASH_ALGORITHM_BOOT; + hash_algo = bSystemIsGPT? SHA512 : DEFAULT_HASH_ALGORITHM_BOOT; RandSetHashFunction (hash_algo); for (hid = FIRST_PRF_ID; hid <= LAST_PRF_ID; hid++) { // For now, we keep RIPEMD160 for system encryption - if (((hid == RIPEMD160) || !HashIsDeprecated (hid)) && HashForSystemEncryption (hid)) + if (((hid == RIPEMD160) || !HashIsDeprecated (hid)) && (bSystemIsGPT || HashForSystemEncryption (hid))) AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), HashGetName(hid), hid); } } @@ -4450,11 +4487,10 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_BOX_TITLE), GetString ("RESCUE_DISK")); SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT")); SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV")); - SetWindowTextW (GetDlgItem (hwndDlg, IDT_RESCUE_DISK_INFO), GetString ("RESCUE_DISK_INFO")); + SetWindowTextW (GetDlgItem (hwndDlg, IDT_RESCUE_DISK_INFO), bSystemIsGPT? GetString ("RESCUE_DISK_EFI_INFO"): GetString ("RESCUE_DISK_INFO")); SetDlgItemText (hwndDlg, IDC_RESCUE_DISK_ISO_PATH, szRescueDiskISO); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), (GetWindowTextLength (GetDlgItem (hwndDlg, IDC_RESCUE_DISK_ISO_PATH)) > 1)); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), TRUE); - SetCheckBox (hCurPage, IDC_SKIP_RESCUE_VERIFICATION, bDontVerifyRescueDisk); break; @@ -4466,10 +4502,19 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), GetString ("NEXT")); SetWindowTextW (GetDlgItem (GetParent (hwndDlg), IDC_PREV), GetString ("PREV")); - StringCbPrintfW (szTmp, sizeof szTmp, - GetString (bDontVerifyRescueDisk ? "RESCUE_DISK_BURN_INFO_NO_CHECK" : "RESCUE_DISK_BURN_INFO"), - szRescueDiskISO, IsWindowsIsoBurnerAvailable() ? L"" : GetString ("RESCUE_DISK_BURN_INFO_NONWIN_ISO_BURNER")); + if (bSystemIsGPT) + { + StringCbPrintfW (szTmp, sizeof szTmp, + GetString (bDontVerifyRescueDisk ? "RESCUE_DISK_EFI_EXTRACT_INFO_NO_CHECK" : "RESCUE_DISK_EFI_EXTRACT_INFO"), + szRescueDiskISO, GetString ("RESCUE_DISK_EFI_EXTRACT_INFO_NOTE")); + } + else + { + StringCbPrintfW (szTmp, sizeof szTmp, + GetString (bDontVerifyRescueDisk ? "RESCUE_DISK_BURN_INFO_NO_CHECK" : "RESCUE_DISK_BURN_INFO"), + szRescueDiskISO, IsWindowsIsoBurnerAvailable() ? L"" : GetString ("RESCUE_DISK_BURN_INFO_NONWIN_ISO_BURNER")); + } SetWindowTextW (GetDlgItem (hwndDlg, IDT_RESCUE_DISK_BURN_INFO), szTmp); EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_NEXT), TRUE); @@ -4478,14 +4523,21 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa would be confusion and bug reports). */ EnableWindow (GetDlgItem (GetParent (hwndDlg), IDC_PREV), FALSE); - if (IsWindowsIsoBurnerAvailable()) - SetWindowTextW (GetDlgItem (hwndDlg, IDC_DOWNLOAD_CD_BURN_SOFTWARE), GetString ("LAUNCH_WIN_ISOBURN")); + if (bSystemIsGPT) + { + ShowWindow (GetDlgItem (hwndDlg, IDC_DOWNLOAD_CD_BURN_SOFTWARE), SW_HIDE); + } + else + { + if (IsWindowsIsoBurnerAvailable()) + SetWindowTextW (GetDlgItem (hwndDlg, IDC_DOWNLOAD_CD_BURN_SOFTWARE), GetString ("LAUNCH_WIN_ISOBURN")); - ToHyperlink (hwndDlg, IDC_DOWNLOAD_CD_BURN_SOFTWARE); + ToHyperlink (hwndDlg, IDC_DOWNLOAD_CD_BURN_SOFTWARE); - if (IsWindowsIsoBurnerAvailable() && !bDontVerifyRescueDisk) - LaunchWindowsIsoBurner (hwndDlg, szRescueDiskISO); - } + if (IsWindowsIsoBurnerAvailable() && !bDontVerifyRescueDisk) + LaunchWindowsIsoBurner (hwndDlg, szRescueDiskISO); + } + } break; case SYSENC_RESCUE_DISK_VERIFIED_PAGE: @@ -5442,7 +5494,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa DialogBoxParamW (hInst, MAKEINTRESOURCEW (IDD_BENCHMARK_DLG), hwndDlg, - (DLGPROC) BenchmarkDlgProc, (LPARAM) NULL); + (DLGPROC) BenchmarkDlgProc, (LPARAM) bSystemIsGPT); bFastPollEnabled = TRUE; bRandmixEnabled = TRUE; @@ -5464,6 +5516,12 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa Applink ("serpent", FALSE, ""); else if (wcscmp (name, L"Twofish") == 0) Applink ("twofish", FALSE, ""); + else if (wcscmp (name, L"GOST89") == 0) + Applink ("gost89", FALSE, ""); + else if (wcscmp (name, L"Kuznyechik") == 0) + Applink ("kuznyechik", FALSE, ""); + else if (wcscmp (name, L"Camellia") == 0) + Applink ("camellia", FALSE, ""); else if (EAGetCipherCount (nIndex) > 1) Applink ("cascades", TRUE, ""); @@ -5784,7 +5842,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { HWND hHashAlgoItem = GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO); int selectedAlgo = (int) SendMessage (hHashAlgoItem, CB_GETITEMDATA, SendMessage (hHashAlgoItem, CB_GETCURSEL, 0, 0), 0); - if (!HashForSystemEncryption(selectedAlgo)) + if (!bSystemIsGPT && !HashForSystemEncryption(selectedAlgo)) { hash_algo = DEFAULT_HASH_ALGORITHM_BOOT; RandSetHashFunction (DEFAULT_HASH_ALGORITHM_BOOT); @@ -5972,6 +6030,14 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa return 0; } + try + { + bSystemIsGPT = BootEncObj->GetSystemDriveConfiguration().SystemPartition.IsGPT; + } + catch (...) + { + } + SendMessageW (GetDlgItem (hwndDlg, IDC_BOX_TITLE), WM_SETFONT, (WPARAM) hTitleFont, (LPARAM) TRUE); SetWindowTextW (hwndDlg, lpszTitle); @@ -6153,7 +6219,10 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa } SHGetFolderPath (NULL, CSIDL_MYDOCUMENTS, NULL, 0, szRescueDiskISO); - StringCbCatW (szRescueDiskISO, sizeof(szRescueDiskISO), L"\\VeraCrypt Rescue Disk.iso"); + if (bSystemIsGPT) + StringCbCatW (szRescueDiskISO, sizeof(szRescueDiskISO), L"\\VeraCrypt Rescue Disk.zip"); + else + StringCbCatW (szRescueDiskISO, sizeof(szRescueDiskISO), L"\\VeraCrypt Rescue Disk.iso"); if (IsOSAtLeast (WIN_VISTA)) { @@ -7326,7 +7395,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa nIndex = SendMessage (GetDlgItem (hCurPage, IDC_COMBO_BOX), CB_GETCURSEL, 0, 0); nVolumeEA = (int) SendMessage (GetDlgItem (hCurPage, IDC_COMBO_BOX), CB_GETITEMDATA, nIndex, 0); - if (SysEncInEffect () + if (!bSystemIsGPT && SysEncInEffect () && EAGetCipherCount (nVolumeEA) > 1) // Cascade? { if (AskWarnNoYes ("CONFIRM_CASCADE_FOR_SYS_ENCRYPTION", hwndDlg) == IDNO) @@ -7910,40 +7979,43 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa return 1; } -retryCDDriveCheck: - if (!bDontVerifyRescueDisk && !BootEncObj->IsCDRecorderPresent()) + if (!bSystemIsGPT) { - char *multiChoiceStr[] = { 0, "CD_BURNER_NOT_PRESENT", - "CD_BURNER_NOT_PRESENT_WILL_STORE_ISO", - "CD_BURNER_NOT_PRESENT_WILL_CONNECT_LATER", - "CD_BURNER_NOT_PRESENT_CONNECTED_NOW", - 0 }; - - switch (AskMultiChoice ((void **) multiChoiceStr, FALSE, hwndDlg)) +retryCDDriveCheck: + if (!bDontVerifyRescueDisk && !BootEncObj->IsCDRecorderPresent()) { - case 1: - wchar_t msg[8192]; - StringCchPrintfW (msg, array_capacity (msg), GetString ("CD_BURNER_NOT_PRESENT_WILL_STORE_ISO_INFO"), szRescueDiskISO); - WarningDirect (msg, hwndDlg); + char *multiChoiceStr[] = { 0, "CD_BURNER_NOT_PRESENT", + "CD_BURNER_NOT_PRESENT_WILL_STORE_ISO", + "CD_BURNER_NOT_PRESENT_WILL_CONNECT_LATER", + "CD_BURNER_NOT_PRESENT_CONNECTED_NOW", + 0 }; - Warning ("RESCUE_DISK_BURN_NO_CHECK_WARN", hwndDlg); - bDontVerifyRescueDisk = TRUE; - nNewPageNo = SYSENC_RESCUE_DISK_VERIFIED_PAGE; - break; + switch (AskMultiChoice ((void **) multiChoiceStr, FALSE, hwndDlg)) + { + case 1: + wchar_t msg[8192]; + StringCchPrintfW (msg, array_capacity (msg), GetString ("CD_BURNER_NOT_PRESENT_WILL_STORE_ISO_INFO"), szRescueDiskISO); + WarningDirect (msg, hwndDlg); - case 2: - AbortProcessSilent(); + Warning ("RESCUE_DISK_BURN_NO_CHECK_WARN", hwndDlg); + bDontVerifyRescueDisk = TRUE; + nNewPageNo = SYSENC_RESCUE_DISK_VERIFIED_PAGE; + break; - case 3: - break; + case 2: + AbortProcessSilent(); - default: - goto retryCDDriveCheck; + case 3: + break; + + default: + goto retryCDDriveCheck; + } } - } - if (IsWindowsIsoBurnerAvailable() && !bDontVerifyRescueDisk) - Info ("RESCUE_DISK_WIN_ISOBURN_PRELAUNCH_NOTE", hwndDlg); + if (IsWindowsIsoBurnerAvailable() && !bDontVerifyRescueDisk) + Info ("RESCUE_DISK_WIN_ISOBURN_PRELAUNCH_NOTE", hwndDlg); + } NormalCursor (); } @@ -7961,8 +8033,15 @@ retryCDDriveCheck: { wchar_t szTmp[8000]; - StringCbPrintfW (szTmp, sizeof(szTmp), GetString ("RESCUE_DISK_CHECK_FAILED"), - IsWindowsIsoBurnerAvailable () ? L"" : GetString ("RESCUE_DISK_CHECK_FAILED_SENTENCE_APPENDIX")); + if (bSystemIsGPT) + { + StringCbCopyW (szTmp, sizeof(szTmp), GetString ("RESCUE_DISK_EFI_CHECK_FAILED")); + } + else + { + StringCbPrintfW (szTmp, sizeof(szTmp), GetString ("RESCUE_DISK_CHECK_FAILED"), + IsWindowsIsoBurnerAvailable () ? L"" : GetString ("RESCUE_DISK_CHECK_FAILED_SENTENCE_APPENDIX")); + } ErrorDirect (szTmp, hwndDlg); @@ -8024,7 +8103,7 @@ retryCDDriveCheck: } #endif - BootEncObj->Install (bHiddenOS ? true : false); + BootEncObj->Install (bHiddenOS ? true : false, hash_algo); } catch (Exception &e) { @@ -8777,6 +8856,7 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) OptionNoIsoCheck, OptionQuit, OptionTokenLib, + OptionTokenPin, CommandResumeSysEncLogOn, CommandResumeSysEnc, CommandDecryptSysEnc, @@ -8806,6 +8886,7 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) { OptionHistory, L"/history", L"/h", FALSE }, { OptionNoIsoCheck, L"/noisocheck", L"/n", FALSE }, { OptionTokenLib, L"/tokenlib", NULL, FALSE }, + { OptionTokenPin, L"/tokenpin", NULL, FALSE }, { OptionQuit, L"/quit", L"/q", FALSE }, { OptionEncryption, L"/encryption", NULL , FALSE }, { OptionFilesystem, L"/filesystem", NULL , FALSE }, @@ -9190,6 +9271,20 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) break; + case OptionTokenPin: + { + wchar_t szTmp[SecurityToken::MaxPasswordLength + 1] = {0}; + if (GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, szTmp, ARRAYSIZE (szTmp)) == HAS_ARGUMENT) + { + if (0 == WideCharToMultiByte (CP_UTF8, 0, szTmp, -1, CmdTokenPin, TC_MAX_PATH, nullptr, nullptr)) + AbortProcess ("COMMAND_LINE_ERROR"); + } + else + AbortProcess ("COMMAND_LINE_ERROR"); + } + + break; + case OptionQuit: { // Used to indicate non-install elevation |