From 05b3cd5cc1c45df594d59e73cc1b693d9e79abc9 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Mon, 22 Jun 2020 10:22:36 +0200 Subject: Linux/MacOSX: Use also PIM when comparing Outer and Hidden volumes credentials --- src/Main/Forms/VolumeCreationWizard.cpp | 91 +++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 28 deletions(-) (limited to 'src/Main/Forms/VolumeCreationWizard.cpp') diff --git a/src/Main/Forms/VolumeCreationWizard.cpp b/src/Main/Forms/VolumeCreationWizard.cpp index 240f08dc..572523e7 100644 --- a/src/Main/Forms/VolumeCreationWizard.cpp +++ b/src/Main/Forms/VolumeCreationWizard.cpp @@ -92,6 +92,8 @@ namespace VeraCrypt VolumeCreationWizard::~VolumeCreationWizard () { + burn (&Pim, sizeof (Pim)); + burn (&OuterPim, sizeof (OuterPim)); } WizardPage *VolumeCreationWizard::GetPage (WizardStep step) @@ -774,29 +776,6 @@ namespace VeraCrypt Kdf = page->GetPkcs5Kdf(); Keyfiles = page->GetKeyfiles(); - if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden) - { - shared_ptr hiddenPassword; - try - { - hiddenPassword = Keyfile::ApplyListToPassword (Keyfiles, Password); - } - catch (...) - { - hiddenPassword = Password; - } - - // check if Outer and Hidden passwords are the same - if ( (hiddenPassword && !hiddenPassword->IsEmpty() && OuterPassword && !OuterPassword->IsEmpty() && (*(OuterPassword.get()) == *(hiddenPassword.get()))) - || - ((!hiddenPassword || hiddenPassword->IsEmpty()) && (!OuterPassword || OuterPassword->IsEmpty())) - ) - { - Gui->ShowError (_("The Hidden volume password can not be identical to the Outer volume password")); - return GetCurrentStep(); - } - } - if (forward && Password && !Password->IsEmpty()) { if (Password->Size() < VolumePassword::WarningSizeThreshold) @@ -815,6 +794,33 @@ namespace VeraCrypt // Clear PIM Pim = 0; + if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden) + { + shared_ptr hiddenPassword; + try + { + hiddenPassword = Keyfile::ApplyListToPassword (Keyfiles, Password); + } + catch (...) + { + hiddenPassword = Password; + } + + // check if Outer and Hidden passwords are the same + if ( (hiddenPassword && !hiddenPassword->IsEmpty() && OuterPassword && !OuterPassword->IsEmpty() && (*(OuterPassword.get()) == *(hiddenPassword.get()))) + || + ((!hiddenPassword || hiddenPassword->IsEmpty()) && (!OuterPassword || OuterPassword->IsEmpty())) + ) + { + //check if they have also the same PIM + if (OuterPim == Pim) + { + Gui->ShowError (_("The Hidden volume can't have the same password, PIM and keyfiles as the Outer volume")); + return GetCurrentStep(); + } + } + } + // Skip PIM if (forward && OuterVolume) { @@ -841,15 +847,42 @@ namespace VeraCrypt VolumePimWizardPage *page = dynamic_cast (GetCurrentPage()); Pim = page->GetVolumePim(); - if (forward && Password && !Password->IsEmpty()) + if (-1 == Pim) + { + // PIM invalid: don't go anywhere + Gui->ShowError ("PIM_TOO_BIG"); + return GetCurrentStep(); + } + + if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden) { - if (-1 == Pim) + shared_ptr hiddenPassword; + try { - // PIM invalid: don't go anywhere - Gui->ShowError ("PIM_TOO_BIG"); - return GetCurrentStep(); + hiddenPassword = Keyfile::ApplyListToPassword (Keyfiles, Password); + } + catch (...) + { + hiddenPassword = Password; + } + + // check if Outer and Hidden passwords are the same + if ( (hiddenPassword && !hiddenPassword->IsEmpty() && OuterPassword && !OuterPassword->IsEmpty() && (*(OuterPassword.get()) == *(hiddenPassword.get()))) + || + ((!hiddenPassword || hiddenPassword->IsEmpty()) && (!OuterPassword || OuterPassword->IsEmpty())) + ) + { + //check if they have also the same PIM + if (OuterPim == Pim) + { + Gui->ShowError (_("The Hidden volume can't have the same password, PIM and keyfiles as the Outer volume")); + return GetCurrentStep(); + } } + } + if (forward && Password && !Password->IsEmpty()) + { if (Password->Size() < VolumePassword::WarningSizeThreshold) { if (Pim > 0 && Pim < 485) @@ -1112,6 +1145,8 @@ namespace VeraCrypt { OuterPassword = Password; } + + OuterPim = Pim; } catch (exception &e) { -- cgit v1.2.3