mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 19:08:26 -06:00
Linux/MacOSX: Implement generating more than one keyfile, specifying the size of the generated keyfiles and letting VeraCrypt choose random size values.
This commit is contained in:
@@ -48,20 +48,97 @@ namespace VeraCrypt
|
||||
{
|
||||
try
|
||||
{
|
||||
FilePathList files = Gui->SelectFiles (Gui->GetActiveWindow(), wxEmptyString, true);
|
||||
|
||||
if (files.empty())
|
||||
return;
|
||||
|
||||
SecureBuffer keyfileBuffer (VolumePassword::MaxSize);
|
||||
RandomNumberGenerator::GetData (keyfileBuffer);
|
||||
|
||||
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())
|
||||
{
|
||||
File keyfile;
|
||||
keyfile.Open (*files.front(), File::CreateWrite);
|
||||
keyfile.Write (keyfileBuffer);
|
||||
Gui->ShowWarning("KEYFILE_EMPTY_BASE_NAME");
|
||||
return;
|
||||
}
|
||||
|
||||
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 ())
|
||||
{
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user