1
0
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:
Mounir IDRASSI
2014-12-10 19:24:39 +01:00
parent e673006969
commit c8c8cc517d
8 changed files with 991 additions and 36 deletions

View File

@@ -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;