From c8c8cc517dae089c1241890133837339a716f225 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Wed, 10 Dec 2014 19:24:39 +0100 Subject: Linux/MacOSX: Implement generating more than one keyfile, specifying the size of the generated keyfiles and letting VeraCrypt choose random size values. --- src/Main/Forms/KeyfileGeneratorDialog.cpp | 105 +++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 10 deletions(-) (limited to 'src/Main/Forms/KeyfileGeneratorDialog.cpp') diff --git a/src/Main/Forms/KeyfileGeneratorDialog.cpp b/src/Main/Forms/KeyfileGeneratorDialog.cpp index ce88ab09..5a24a255 100644 --- a/src/Main/Forms/KeyfileGeneratorDialog.cpp +++ b/src/Main/Forms/KeyfileGeneratorDialog.cpp @@ -48,20 +48,97 @@ namespace VeraCrypt { try { - FilePathList files = Gui->SelectFiles (Gui->GetActiveWindow(), wxEmptyString, true); - - if (files.empty()) + int keyfilesCount = NumberOfKeyfiles->GetValue(); + int keyfilesSize = KeyfilesSize->GetValue(); + bool useRandomSize = RandomSizeCheckBox->IsChecked(); + wxString keyfileBaseName = KeyfilesBaseName->GetValue(); + keyfileBaseName.Trim(true); + keyfileBaseName.Trim(false); + + if (keyfileBaseName.IsEmpty()) + { + Gui->ShowWarning("KEYFILE_EMPTY_BASE_NAME"); return; - - SecureBuffer keyfileBuffer (VolumePassword::MaxSize); - RandomNumberGenerator::GetData (keyfileBuffer); - + } + + wxFileName baseFileName = wxFileName::FileName (keyfileBaseName); + if (!baseFileName.IsOk()) + { + Gui->ShowWarning("KEYFILE_INVALID_BASE_NAME"); + return; + } + + DirectoryPath keyfilesDir = Gui->SelectDirectory (Gui->GetActiveWindow(), LangString["SELECT_KEYFILE_GENERATION_DIRECTORY"], false); + if (keyfilesDir.IsEmpty()) + return; + + wxFileName dirFileName = wxFileName::DirName( wstring(keyfilesDir).c_str() ); + if (!dirFileName.IsDirWritable ()) { - File keyfile; - keyfile.Open (*files.front(), File::CreateWrite); - keyfile.Write (keyfileBuffer); + Gui->ShowWarning(L"You don't have write permission on the selected directory"); + return; } + + wxBusyCursor busy; + for (int i = 0; i < keyfilesCount; i++) + { + int bufferLen; + if (useRandomSize) + { + SecureBuffer sizeBuffer (sizeof(int)); + RandomNumberGenerator::GetData (sizeBuffer, true); + + memcpy(&bufferLen, sizeBuffer.Ptr(), sizeof(int)); + + /* since keyfilesSize < 1024 * 1024, we mask with 0x000FFFFF */ + bufferLen = (long) (((unsigned long) bufferLen) & 0x000FFFFF); + + bufferLen %= ((1024*1024 - 64) + 1); + bufferLen += 64; + } + else + bufferLen = keyfilesSize; + + SecureBuffer keyfileBuffer (bufferLen); + RandomNumberGenerator::GetData (keyfileBuffer, true); + + wstringstream convertStream; + convertStream << i; + wxString suffix = L"_"; + suffix += convertStream.str().c_str(); + + wxFileName keyfileName; + if (i == 0) + { + keyfileName.Assign(dirFileName.GetPath(), keyfileBaseName); + } + else + { + if (baseFileName.HasExt()) + { + keyfileName.Assign(dirFileName.GetPath(), baseFileName.GetName() + suffix + L"." + baseFileName.GetExt()); + } + else + { + keyfileName.Assign(dirFileName.GetPath(), keyfileBaseName + suffix); + } + } + + if (keyfileName.Exists()) + { + wxString msg = wxString::Format(LangString["KEYFILE_ALREADY_EXISTS"], keyfileName.GetFullPath()); + if (!Gui->AskYesNo (msg, false, true)) + return; + } + + { + FilePath keyfilePath((const wchar_t*) keyfileName.GetFullPath()); + File keyfile; + keyfile.Open (keyfilePath, File::CreateWrite); + keyfile.Write (keyfileBuffer); + } + } Gui->ShowInfo ("KEYFILE_CREATED"); } catch (exception &e) @@ -96,6 +173,14 @@ namespace VeraCrypt RandomPoolStaticText->SetLabel (L""); } + void KeyfileGeneratorDialog::OnRandomSizeCheckBoxClicked (wxCommandEvent& event) + { + if (!event.IsChecked()) + KeyfilesSize->Enable(); + else + KeyfilesSize->Disable(); + } + void KeyfileGeneratorDialog::ShowBytes (wxStaticText *textCtrl, const ConstBufferPtr &buffer, bool appendDots) { wxString str; -- cgit v1.2.3