Linux/MacOSX: Use also PIM when comparing Outer and Hidden volumes credentials

This commit is contained in:
Mounir IDRASSI 2020-06-22 10:22:36 +02:00
parent b4465b80e6
commit 05b3cd5cc1
No known key found for this signature in database
GPG Key ID: 02C30AE90FAE4A6F
2 changed files with 64 additions and 28 deletions

View File

@ -92,6 +92,8 @@ namespace VeraCrypt
VolumeCreationWizard::~VolumeCreationWizard () VolumeCreationWizard::~VolumeCreationWizard ()
{ {
burn (&Pim, sizeof (Pim));
burn (&OuterPim, sizeof (OuterPim));
} }
WizardPage *VolumeCreationWizard::GetPage (WizardStep step) WizardPage *VolumeCreationWizard::GetPage (WizardStep step)
@ -774,29 +776,6 @@ namespace VeraCrypt
Kdf = page->GetPkcs5Kdf(); Kdf = page->GetPkcs5Kdf();
Keyfiles = page->GetKeyfiles(); Keyfiles = page->GetKeyfiles();
if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden)
{
shared_ptr <VolumePassword> 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 (forward && Password && !Password->IsEmpty())
{ {
if (Password->Size() < VolumePassword::WarningSizeThreshold) if (Password->Size() < VolumePassword::WarningSizeThreshold)
@ -815,6 +794,33 @@ namespace VeraCrypt
// Clear PIM // Clear PIM
Pim = 0; Pim = 0;
if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden)
{
shared_ptr <VolumePassword> 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 // Skip PIM
if (forward && OuterVolume) if (forward && OuterVolume)
{ {
@ -841,15 +847,42 @@ namespace VeraCrypt
VolumePimWizardPage *page = dynamic_cast <VolumePimWizardPage *> (GetCurrentPage()); VolumePimWizardPage *page = dynamic_cast <VolumePimWizardPage *> (GetCurrentPage());
Pim = page->GetVolumePim(); Pim = page->GetVolumePim();
if (forward && Password && !Password->IsEmpty()) if (-1 == Pim)
{ {
if (-1 == Pim) // PIM invalid: don't go anywhere
Gui->ShowError ("PIM_TOO_BIG");
return GetCurrentStep();
}
if (forward && !OuterVolume && SelectedVolumeType == VolumeType::Hidden)
{
shared_ptr <VolumePassword> hiddenPassword;
try
{ {
// PIM invalid: don't go anywhere hiddenPassword = Keyfile::ApplyListToPassword (Keyfiles, Password);
Gui->ShowError ("PIM_TOO_BIG"); }
return GetCurrentStep(); 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 (Password->Size() < VolumePassword::WarningSizeThreshold)
{ {
if (Pim > 0 && Pim < 485) if (Pim > 0 && Pim < 485)
@ -1112,6 +1145,8 @@ namespace VeraCrypt
{ {
OuterPassword = Password; OuterPassword = Password;
} }
OuterPim = Pim;
} }
catch (exception &e) catch (exception &e)
{ {

View File

@ -84,6 +84,7 @@ namespace VeraCrypt
shared_ptr <VolumePassword> Password; shared_ptr <VolumePassword> Password;
shared_ptr <VolumePassword> OuterPassword; shared_ptr <VolumePassword> OuterPassword;
int Pim; int Pim;
int OuterPim;
shared_ptr <Pkcs5Kdf> Kdf; shared_ptr <Pkcs5Kdf> Kdf;
uint32 SectorSize; uint32 SectorSize;
shared_ptr <Hash> SelectedHash; shared_ptr <Hash> SelectedHash;