VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Main/Forms/KeyfileGeneratorDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main/Forms/KeyfileGeneratorDialog.cpp')
-rw-r--r--src/Main/Forms/KeyfileGeneratorDialog.cpp105
1 files changed, 95 insertions, 10 deletions
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;