VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Main
AgeCommit message (Expand)AuthorFilesLines
2017-06-05Linux/MacOSX: Replace User Guide PDF with local HTML documentation. Replace U...Mounir IDRASSI2-52/+53
2017-06-01Linux/MacOSX: Update location of User Guide pdf in MakefileMounir IDRASSI1-2/+2
2017-05-15Replace Codeplex links by ones on veracrypt.frMounir IDRASSI3-34/+46
2017-04-26Update zlib copyright noticeMounir IDRASSI1-1/+1
2017-04-23FreeBSD 11 build and use compatibilityMounir IDRASSI1-3/+3
2016-12-30Update donation link to point to page indicating all accepted donations options.Mounir IDRASSI1-1/+1
2016-12-26Linux & MacOSX: automatically check TrueCryptMode in password dialog when sel...Mounir IDRASSI4-0/+24
2016-12-26MacOSX: Make VeraCrypt default handler of .hc and .tc files on OSX and add cu...Mounir IDRASSI1-0/+1
2016-11-28Document --truecrypt optionPaul Nijjar1-0/+5
2016-10-17Linux/MacOSX: correctly display Kuznyechik help page when link clicked. Remov...Mounir IDRASSI2-7/+1
2016-10-17Crypto: Use SIMD optimized Serpent implementation from Botan. 2.5x speed gain...Mounir IDRASSI1-1/+8
2016-10-17Linux/MacOSX: fix error in Makefile caused by erroneous extra characterMounir IDRASSI1-1/+1
2016-10-17MacOSX: remove MacFUSE dependency and link against OSXFuse library. Now, only...Mounir IDRASSI2-2/+5
2016-10-17Linux/MacOSX: display error message when entered PIM is too big in the Volume...Mounir IDRASSI1-0/+1
2016-10-17Linux/MacOSX: add missing check for PIM max value on volume creation wizardMounir IDRASSI1-1/+2
2016-08-17Linux: fix various compilation issues under Linux.Mounir IDRASSI1-1/+1
2016-08-15Linux: avoid overflow when specifying TiB size in command lineMounir IDRASSI1-1/+1
2016-08-15Merge pull request #75 from oceanBT/revert-66-patch-1Mounir IDRASSI1-0/+5
2016-08-15Linux/MacOSX: Add help text for GOST89 and KuznyechikMounir IDRASSI2-6/+18
2016-06-23added TiB size unitoceanBT1-0/+5
2016-06-02Crypto: Add support for Japanese encryption standard Camellia, including for ...Mounir IDRASSI2-0/+6
2016-05-29Linux/MacOSX: Implement passing smart card PIN as command line argument (--to...Mounir IDRASSI4-0/+37
2016-05-13Linux: Fix gcc-6 compilation errors.Mounir IDRASSI3-7/+7
2016-05-10Remove trailing whitespaceDavid Foerster101-1922/+1922
2016-05-10Normalize all line terminatorsDavid Foerster3-33360/+33360
2016-05-04Windows/Linux/MacOSX: Set maximum PIM value to 2147468 in order to avoid havi...Mounir IDRASSI8-12/+25
2016-05-01Use scoped instead of raw pointerDavid Foerster1-2/+2
2016-05-01Reset bogus executable permissionsDavid Foerster5-0/+0
2016-04-01Use wx-provided wrapper around *getenv()David Foerster1-7/+2
2016-03-31Use XDG_CONFIG_HOME to determine the path of the configurationDavid Foerster1-18/+88
2016-03-31Remove some trailing whitespaceDavid Foerster1-3/+3
2016-03-20Linux/MacOSX: Fix build error when using strict wxWidgets library that doesn'...Axel Köllhofer1-3/+3
2016-02-09Linux/MacOSX: add progress bar for mouse collected entropy in GUI of volume c...Mounir IDRASSI10-21/+146
2016-02-08Linux/MacOSX: add progress bar for mouse collected entropy in GUI for keyfile...Mounir IDRASSI7-10/+306
2016-01-30MacOSX: Support creation exFAT volumes on OSX using the built-in command newf...Mounir IDRASSI4-4/+18
2016-01-27Windows/Linux: Implement exFAT support.Mounir IDRASSI4-0/+8
2016-01-26Linux/MacOSX: Update command line help text to reflect that we can now specif...Mounir IDRASSI1-3/+2
2016-01-26Linux/MacOSX: fix issue creating volumes using command line with a filesystem...Mounir IDRASSI2-0/+25
2016-01-25Linux/MacOSX: remove unecessary XML resource string replacement of %hs, not n...Mounir IDRASSI3-6/+0
2016-01-25Linux/MacOSX: fix wrong AskYesNo method parameters use caused by mistake in p...Mounir IDRASSI1-1/+1
2016-01-25MacOSX: Add PIM value validity checks to workaround wxWidget bug that makes w...Mounir IDRASSI5-5/+50
2016-01-24Linux/MacOSX: update --size entry in command line help text.Mounir IDRASSI1-2/+4
2016-01-24Linux/MacOSX: Support K/M/G/T suffixes for --size switch to indicate unit to ...Mounir IDRASSI1-1/+28
2016-01-20Copyright: update dates to include 2016.Mounir IDRASSI100-101/+101
2016-01-20Linux/MacOSX:solve issue of --stdin option not handling correctly passwords t...Mounir IDRASSI1-1/+1
2016-01-17MacOSX: Ensure that time-stamping is always activated when performing code si...Mounir IDRASSI1-2/+2
2016-01-03Linux: Restore Nautilus fix that was mistakenly removed by Whirlpool optimiza...Mounir IDRASSI1-2/+4
2015-12-31Cryptography: Optimize Whirlpool implementation by using public domain assemb...Mounir IDRASSI1-4/+6
2015-12-06MacOSX: Customize dmg file using VeraCrypt new logoMounir IDRASSI1-1/+12
2015-12-04Linux/MacOSX: use new icons contributed by Andreas Becker (https://github.com...Mounir IDRASSI2-3/+3
try { uint64 endOffset; uint64 filesystemSize = Layout->GetDataSize (HostSize); if (filesystemSize < 1) throw ParameterIncorrect (SRC_POS); DataStart = Layout->GetDataOffset (HostSize); WriteOffset = DataStart; endOffset = DataStart + Layout->GetDataSize (HostSize); VolumeFile->SeekAt (DataStart); // Create filesystem if (Options->Filesystem == VolumeCreationOptions::FilesystemType::FAT) { if (filesystemSize < TC_MIN_FAT_FS_SIZE || filesystemSize > TC_MAX_FAT_SECTOR_COUNT * Options->SectorSize) throw ParameterIncorrect (SRC_POS); struct WriteSectorCallback : public FatFormatter::WriteSectorCallback { WriteSectorCallback (VolumeCreator *creator) : Creator (creator), OutputBuffer (File::GetOptimalWriteSize()), OutputBufferWritePos (0) { } virtual bool operator() (const BufferPtr &sector) { OutputBuffer.GetRange (OutputBufferWritePos, sector.Size()).CopyFrom (sector); OutputBufferWritePos += sector.Size(); if (OutputBufferWritePos >= OutputBuffer.Size()) FlushOutputBuffer(); return !Creator->AbortRequested; } void FlushOutputBuffer () { if (OutputBufferWritePos > 0) { Creator->Options->EA->EncryptSectors (OutputBuffer.GetRange (0, OutputBufferWritePos), Creator->WriteOffset / ENCRYPTION_DATA_UNIT_SIZE, OutputBufferWritePos / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE); Creator->VolumeFile->Write (OutputBuffer.GetRange (0, OutputBufferWritePos)); Creator->WriteOffset += OutputBufferWritePos; Creator->SizeDone.Set (Creator->WriteOffset - Creator->DataStart); OutputBufferWritePos = 0; } } VolumeCreator *Creator; SecureBuffer OutputBuffer; size_t OutputBufferWritePos; }; WriteSectorCallback sectorWriter (this); FatFormatter::Format (sectorWriter, filesystemSize, Options->FilesystemClusterSize, Options->SectorSize); sectorWriter.FlushOutputBuffer(); } if (!Options->Quick) { // Empty sectors are encrypted with different key to randomize plaintext Core->RandomizeEncryptionAlgorithmKey (Options->EA); SecureBuffer outputBuffer (File::GetOptimalWriteSize()); uint64 dataFragmentLength = outputBuffer.Size(); while (!AbortRequested && WriteOffset < endOffset) { if (WriteOffset + dataFragmentLength > endOffset) dataFragmentLength = endOffset - WriteOffset; outputBuffer.Zero(); Options->EA->EncryptSectors (outputBuffer, WriteOffset / ENCRYPTION_DATA_UNIT_SIZE, dataFragmentLength / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE); VolumeFile->Write (outputBuffer, (size_t) dataFragmentLength); WriteOffset += dataFragmentLength; SizeDone.Set (WriteOffset - DataStart); } } if (!AbortRequested) { SizeDone.Set (Options->Size); // Backup header SecureBuffer backupHeader (Layout->GetHeaderSize()); SecureBuffer backupHeaderSalt (VolumeHeader::GetSaltSize()); RandomNumberGenerator::GetData (backupHeaderSalt); Options->VolumeHeaderKdf->DeriveKey (HeaderKey, *PasswordKey, backupHeaderSalt); Layout->GetHeader()->EncryptNew (backupHeader, backupHeaderSalt, HeaderKey, Options->VolumeHeaderKdf); if (Options->Quick || Options->Type == VolumeType::Hidden) VolumeFile->SeekEnd (Layout->GetBackupHeaderOffset()); VolumeFile->Write (backupHeader); if (Options->Type == VolumeType::Normal) { // Write random data to space reserved for hidden volume backup header Core->RandomizeEncryptionAlgorithmKey (Options->EA); Options->EA->Encrypt (backupHeader); VolumeFile->Write (backupHeader); } VolumeFile->Flush(); } } catch (Exception &e) { ThreadException.reset (e.CloneNew()); } catch (exception &e) { ThreadException.reset (new ExternalException (SRC_POS, StringConverter::ToExceptionString (e))); } catch (...) { ThreadException.reset (new UnknownException (SRC_POS)); } VolumeFile.reset(); mProgressInfo.CreationInProgress = false; } void VolumeCreator::CreateVolume (shared_ptr <VolumeCreationOptions> options) { EncryptionTest::TestAll(); { #ifdef TC_UNIX // Temporarily take ownership of a device if the user is not an administrator UserId origDeviceOwner ((uid_t) -1); if (!Core->HasAdminPrivileges() && options->Path.IsDevice()) { origDeviceOwner = FilesystemPath (wstring (options->Path)).GetOwner(); Core->SetFileOwner (options->Path, UserId (getuid())); } finally_do_arg2 (FilesystemPath, options->Path, UserId, origDeviceOwner, { if (finally_arg2.SystemId != (uid_t) -1) Core->SetFileOwner (finally_arg, finally_arg2); }); #endif VolumeFile.reset (new File); VolumeFile->Open (options->Path, (options->Path.IsDevice() || options->Type == VolumeType::Hidden) ? File::OpenReadWrite : File::CreateReadWrite, File::ShareNone); HostSize = VolumeFile->Length(); } try { // Sector size if (options->Path.IsDevice()) { options->SectorSize = VolumeFile->GetDeviceSectorSize(); if (options->SectorSize < TC_MIN_VOLUME_SECTOR_SIZE || options->SectorSize > TC_MAX_VOLUME_SECTOR_SIZE #if !defined (TC_LINUX) && !defined (TC_MACOSX) || options->SectorSize != TC_SECTOR_SIZE_LEGACY #endif || options->SectorSize % ENCRYPTION_DATA_UNIT_SIZE != 0) { throw UnsupportedSectorSize (SRC_POS); } } else options->SectorSize = TC_SECTOR_SIZE_FILE_HOSTED_VOLUME; // Volume layout switch (options->Type) { case VolumeType::Normal: Layout.reset (new VolumeLayoutV2Normal()); break; case VolumeType::Hidden: Layout.reset (new VolumeLayoutV2Hidden()); if (HostSize < TC_MIN_HIDDEN_VOLUME_HOST_SIZE) throw ParameterIncorrect (SRC_POS); break; default: throw ParameterIncorrect (SRC_POS); } // Volume header shared_ptr <VolumeHeader> header (Layout->GetHeader()); SecureBuffer headerBuffer (Layout->GetHeaderSize()); VolumeHeaderCreationOptions headerOptions; headerOptions.EA = options->EA; headerOptions.Kdf = options->VolumeHeaderKdf; headerOptions.Type = options->Type; headerOptions.SectorSize = options->SectorSize; if (options->Type == VolumeType::Hidden) headerOptions.VolumeDataStart = HostSize - Layout->GetHeaderSize() * 2 - options->Size; else headerOptions.VolumeDataStart = Layout->GetHeaderSize() * 2; headerOptions.VolumeDataSize = Layout->GetMaxDataSize (options->Size); if (headerOptions.VolumeDataSize < 1) throw ParameterIncorrect (SRC_POS); // Master data key MasterKey.Allocate (options->EA->GetKeySize() * 2); RandomNumberGenerator::GetData (MasterKey); headerOptions.DataKey = MasterKey; // PKCS5 salt SecureBuffer salt (VolumeHeader::GetSaltSize()); RandomNumberGenerator::GetData (salt); headerOptions.Salt = salt; // Header key HeaderKey.Allocate (VolumeHeader::GetLargestSerializedKeySize()); PasswordKey = Keyfile::ApplyListToPassword (options->Keyfiles, options->Password); options->VolumeHeaderKdf->DeriveKey (HeaderKey, *PasswordKey, salt); headerOptions.HeaderKey = HeaderKey; header->Create (headerBuffer, headerOptions); // Write new header if (Layout->GetHeaderOffset() >= 0) VolumeFile->SeekAt (Layout->GetHeaderOffset()); else VolumeFile->SeekEnd (Layout->GetHeaderOffset()); VolumeFile->Write (headerBuffer); if (options->Type == VolumeType::Normal) { // Write random data to space reserved for hidden volume header Core->RandomizeEncryptionAlgorithmKey (options->EA); options->EA->Encrypt (headerBuffer); VolumeFile->Write (headerBuffer); } // Data area keys options->EA->SetKey (MasterKey.GetRange (0, options->EA->GetKeySize())); shared_ptr <EncryptionMode> mode (new EncryptionModeXTS ()); mode->SetKey (MasterKey.GetRange (options->EA->GetKeySize(), options->EA->GetKeySize())); options->EA->SetMode (mode); Options = options; AbortRequested = false; mProgressInfo.CreationInProgress = true; struct ThreadFunctor : public Functor { ThreadFunctor (VolumeCreator *creator) : Creator (creator) { } virtual void operator() () { Creator->CreationThread (); } VolumeCreator *Creator; }; Thread thread; thread.Start (new ThreadFunctor (this)); } catch (...) { VolumeFile.reset(); throw; } } VolumeCreator::KeyInfo VolumeCreator::GetKeyInfo () const { KeyInfo info; info.HeaderKey = HeaderKey; info.MasterKey = MasterKey; return info; } VolumeCreator::ProgressInfo VolumeCreator::GetProgressInfo () { mProgressInfo.SizeDone = SizeDone.Get(); return mProgressInfo; } }