VeraCrypt
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2020-03-10Windows: Add /secureDesktop switch to VeraCrypt FormatMounir IDRASSI1-0/+21
2020-03-10Documentation: Add entries for switches now supported by VeraCrypt Format (/k...Mounir IDRASSI1-2/+24
2020-03-10Windows: Update libzip to 1.6.1Mounir IDRASSI112-266/+585
2020-03-10Windows: Fix compilation error caused by previous keyfile commitMounir IDRASSI1-0/+2
2020-03-10Windows: Support using token keyfile when creating file container using comma...Mounir IDRASSI1-1/+33
2020-03-10Windows: Fix keyfiles path passed as CLI argument and set as default not alwa...Mounir IDRASSI2-4/+9
2020-03-10Windows: Fix text truncation in password dialog with some languagesMounir IDRASSI1-3/+3
2020-02-11Increment version to 1.24-Update5 and update signed Windows drivers.Mounir IDRASSI61-77/+86
2020-02-10Windows: Implement support for processor groups in the driver and fix build i...Mounir IDRASSI4-62/+138
2020-02-10Windows: Fix warnings reported by Coverity static code analyzerMounir IDRASSI4-17/+37
2020-02-04Windows: Fix groupbox alignment issue in UI of Fprmat wizardMounir IDRASSI1-1/+1
2020-01-29 Adding Processor Groups support for more than 64 processors (#581)techvintage1-3/+57
2020-01-22Windows: restore Visual Studio solution and project files to default configur...VeraCrypt_1.24-Update4Mounir IDRASSI2-1/+3
2020-01-22Update Release Notes.Mounir IDRASSI2-0/+1
2020-01-22Windows: use fix for CVE-2019-19501 only when process elevated otherwise it w...Mounir IDRASSI1-1/+22
2020-01-22Increment version to 1.24-Update4 and update Release NotesMounir IDRASSI57-76/+98
2020-01-22Linux: correct OpenSUSE build script to indicate that we link against GTK2 an...Mounir IDRASSI1-2/+2
2020-01-22Windows: Fix regression in Expander and Format when RAM encryption is enable ...Mounir IDRASSI5-2/+217
2020-01-22Documentation: Add entries for newly added /protectMemory and /signalExit CLI...Mounir IDRASSI2-0/+14
2020-01-21Fix warning when using Korean translation caused by missing '\' escape sequenceMounir IDRASSI1-2/+2
2020-01-21Windows: Support notifying WAITFOR.EXE Windows command when VeraCrypt.exe exi...Mounir IDRASSI1-0/+54
2020-01-21Windows: Fix failure of Screen Readers (Accessibility support) to reader UI b...Mounir IDRASSI5-3/+97
2020-01-21Windows: don't display mount/dismount examples in help dialog for command lin...Mounir IDRASSI1-2/+2
2020-01-20Linux/MacOSX: Fix regression that limited the size available for hidden volumesMounir IDRASSI1-1/+1
2019-12-22Increment version to 1.24-Update3 for Linux and update Release NotesVeraCrypt_1.24-Update3Mounir IDRASSI4-4/+13
2019-12-22Linux: Modify .deb build scripts to link against statically built wxWidgets o...Mounir IDRASSI2-7/+29
2019-12-21Linux: Fix building and packaging console-only version to remove dependency o...Mounir IDRASSI2-23/+41
2019-12-20Fix the compilation against WxWidgets when NOGUI=1 (#570)Gokturk Yuksek3-1/+8
2019-12-17MacOSX: revert to using wxWidgets 3.1.2 following unexplained crash when usin...VeraCrypt_1.24-Update2Mounir IDRASSI1-2/+2
2019-12-16Linux: Fix build error when linking with old wxWidgets versionMounir IDRASSI1-1/+3
2019-12-16Documentation: Adding information of availability of RAM encryption and that ...Mounir IDRASSI3-1/+6
2019-12-16Update version information in preparation for 1.24-Update2 releaseMounir IDRASSI13-17/+17
2019-12-16Update Format wizard bitmap using submission by Andreas Becker (https://githu...Mounir IDRASSI1-0/+0
2019-12-16Documentation: Add entries for /quick and /fastCreateFile CLI switches of Ver...Mounir IDRASSI2-1/+9
2019-12-16Windows: make /fastCreateFile switch apply to both UI and command line creati...Mounir IDRASSI1-1/+2
2019-12-16MacOSX: Ensure that the heading bar is always visible when window is moved so...Mounir IDRASSI2-5/+27
2019-12-16MacOSX: Ensure that main window is visible on screen when About is display as...Mounir IDRASSI2-0/+22
2019-12-16MacOSX: fix compilation error caused by missing StringConverter::ToWide metho...Mounir IDRASSI1-1/+1
2019-12-15remove extra carriage return from Release NotesMounir IDRASSI2-1/+1
2019-12-13Update Release Notes for 1.24-Update2-RCMounir IDRASSI2-0/+66
2019-12-13Windows: check "TrueCrypt Mode" in password dialog when mounting a file conta...Mounir IDRASSI3-1/+11
2019-12-12Windows: Fix the checkbox for skipping verification of Rescue Disk not reflec...Mounir IDRASSI1-0/+1
2019-12-11Documentation: better wording for Rescue Disk pageMounir IDRASSI2-8/+8
2019-12-11Linux: fix compilation error when building console-only version of VeraCrypt ...Mounir IDRASSI2-9/+0
2019-12-10MacOSX: link against latest wxWidgets version 3.1.3Mounir IDRASSI1-3/+3
2019-12-10Increment version to 1.24-Update2Mounir IDRASSI59-77/+77
2019-12-10Windows: Align volume size field in Format wizard with other controlsMounir IDRASSI1-1/+1
2019-12-10Windows: Add switch /FastCreateFile for VeraCrypt Format.exe to speedup creat...Mounir IDRASSI3-2/+34
2019-12-09Windows Driver: Reduce memory usage of IOCTL_DISK_VERIFY handler. Now we read...Mounir IDRASSI1-6/+22
2019-12-09Fix wrong check on the define CRYPTOPP_BOOL_X64Mounir IDRASSI1-1/+1
. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2013-2016 IDRIX and are governed by the Apache License 2.0 the full text of which is contained in the file License.txt included in VeraCrypt binary and source code distribution packages. */ #ifndef TC_WINDOWS #include <errno.h> #endif #include "EncryptionModeXTS.h" #include "Volume.h" #include "VolumeHeader.h" #include "VolumeLayout.h" #include "Common/Crypto.h" namespace VeraCrypt { Volume::Volume () : HiddenVolumeProtectionTriggered (false), SystemEncryption (false), VolumeDataSize (0), TopWriteOffset (0), TotalDataRead (0), TotalDataWritten (0), TrueCryptMode (false), Pim (0) { } Volume::~Volume () { } void Volume::CheckProtectedRange (uint64 writeHostOffset, uint64 writeLength) { uint64 writeHostEndOffset = writeHostOffset + writeLength - 1; if ((writeHostOffset < ProtectedRangeStart) ? (writeHostEndOffset >= ProtectedRangeStart) : (writeHostOffset <= ProtectedRangeEnd - 1)) { HiddenVolumeProtectionTriggered = true; throw VolumeProtected (SRC_POS); } } void Volume::Close () { if (VolumeFile.get() == nullptr) throw NotInitialized (SRC_POS); VolumeFile.reset(); } shared_ptr <EncryptionAlgorithm> Volume::GetEncryptionAlgorithm () const { if_debug (ValidateState ()); return EA; } shared_ptr <EncryptionMode> Volume::GetEncryptionMode () const { if_debug (ValidateState ()); return EA->GetMode(); } void Volume::Open (const VolumePath &volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, int pim, shared_ptr <Pkcs5Kdf> kdf, bool truecryptMode, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection, shared_ptr <VolumePassword> protectionPassword, int protectionPim, shared_ptr <Pkcs5Kdf> protectionKdf, shared_ptr <KeyfileList> protectionKeyfiles, bool sharedAccessAllowed, VolumeType::Enum volumeType, bool useBackupHeaders, bool partitionInSystemEncryptionScope) { make_shared_auto (File, file); File::FileOpenFlags flags = (preserveTimestamps ? File::PreserveTimestamps : File::FlagsNone); try { if (protection == VolumeProtection::ReadOnly) file->Open (volumePath, File::OpenRead, File::ShareRead, flags); else file->Open (volumePath, File::OpenReadWrite, File::ShareNone, flags); } catch (SystemException &e) { if (e.GetErrorCode() == #ifdef TC_WINDOWS ERROR_SHARING_VIOLATION) #else EAGAIN) #endif { if (!sharedAccessAllowed) throw VolumeHostInUse (SRC_POS); file->Open (volumePath, protection == VolumeProtection::ReadOnly ? File::OpenRead : File::OpenReadWrite, File::ShareReadWriteIgnoreLock, flags); } else throw; } return Open (file, password, pim, kdf, truecryptMode, keyfiles, protection, protectionPassword, protectionPim, protectionKdf,protectionKeyfiles, volumeType, useBackupHeaders, partitionInSystemEncryptionScope); } void Volume::Open (shared_ptr <File> volumeFile, shared_ptr <VolumePassword> password, int pim, shared_ptr <Pkcs5Kdf> kdf, bool truecryptMode, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection, shared_ptr <VolumePassword> protectionPassword, int protectionPim, shared_ptr <Pkcs5Kdf> protectionKdf,shared_ptr <KeyfileList> protectionKeyfiles, VolumeType::Enum volumeType, bool useBackupHeaders, bool partitionInSystemEncryptionScope) { if (!volumeFile) throw ParameterIncorrect (SRC_POS); // TrueCrypt doesn't support SHA-256 if (kdf && truecryptMode && (kdf->GetName() == L"HMAC-SHA-256")) throw UnsupportedAlgoInTrueCryptMode (SRC_POS); Protection = protection; VolumeFile = volumeFile; SystemEncryption = partitionInSystemEncryptionScope; try { VolumeHostSize = VolumeFile->Length(); shared_ptr <VolumePassword> passwordKey = Keyfile::ApplyListToPassword (keyfiles, password); bool skipLayoutV1Normal = false; // Test volume layouts foreach (shared_ptr <VolumeLayout> layout, VolumeLayout::GetAvailableLayouts (volumeType)) { if (skipLayoutV1Normal && typeid (*layout) == typeid (VolumeLayoutV1Normal)) { // Skip VolumeLayoutV1Normal as it shares header location with VolumeLayoutV2Normal continue; } if (useBackupHeaders && !layout->HasBackupHeader()) continue; SecureBuffer headerBuffer (layout->GetHeaderSize()); if (layout->HasDriveHeader()) { if (!partitionInSystemEncryptionScope) continue; if (!GetPath().IsDevice()) throw PartitionDeviceRequired (SRC_POS); File driveDevice; driveDevice.Open (DevicePath (wstring (GetPath())).ToHostDriveOfPartition()); int headerOffset = layout->GetHeaderOffset(); if (headerOffset >= 0) driveDevice.SeekAt (headerOffset); else driveDevice.SeekEnd (headerOffset); if (driveDevice.Read (headerBuffer) != layout->GetHeaderSize()) continue; } else { if (partitionInSystemEncryptionScope) continue; int headerOffset = useBackupHeaders ? layout->GetBackupHeaderOffset() : layout->GetHeaderOffset(); if (headerOffset >= 0) VolumeFile->SeekAt (headerOffset); else VolumeFile->SeekEnd (headerOffset); if (VolumeFile->Read (headerBuffer) != layout->GetHeaderSize()) continue; } EncryptionAlgorithmList layoutEncryptionAlgorithms = layout->GetSupportedEncryptionAlgorithms(); EncryptionModeList layoutEncryptionModes = layout->GetSupportedEncryptionModes(); if (typeid (*layout) == typeid (VolumeLayoutV2Normal)) { skipLayoutV1Normal = true; // Test all algorithms and modes of VolumeLayoutV1Normal as it shares header location with VolumeLayoutV2Normal layoutEncryptionAlgorithms = EncryptionAlgorithm::GetAvailableAlgorithms(); layoutEncryptionModes = EncryptionMode::GetAvailableModes(); } shared_ptr <VolumeHeader> header = layout->GetHeader(); if (header->Decrypt (headerBuffer, *passwordKey, pim, kdf, truecryptMode, layout->GetSupportedKeyDerivationFunctions(truecryptMode), layoutEncryptionAlgorithms, layoutEncryptionModes)) { // Header decrypted if (!truecryptMode && typeid (*layout) == typeid (VolumeLayoutV2Normal) && header->GetRequiredMinProgramVersion() < 0x10b) { // VolumeLayoutV1Normal has been opened as VolumeLayoutV2Normal layout.reset (new VolumeLayoutV1Normal); header->SetSize (layout->GetHeaderSize()); layout->SetHeader (header); } TrueCryptMode = truecryptMode; Pim = pim; Type = layout->GetType(); SectorSize = header->GetSectorSize(); VolumeDataOffset = layout->GetDataOffset (VolumeHostSize); VolumeDataSize = layout->GetDataSize (VolumeHostSize); Header = header; Layout = layout; EA = header->GetEncryptionAlgorithm(); EncryptionMode &mode = *EA->GetMode(); if (layout->HasDriveHeader()) { if (header->GetEncryptedAreaLength() != header->GetVolumeDataSize()) throw VolumeEncryptionNotCompleted (SRC_POS); uint64 partitionStartOffset = VolumeFile->GetPartitionDeviceStartOffset(); if (partitionStartOffset < header->GetEncryptedAreaStart() || partitionStartOffset >= header->GetEncryptedAreaStart() + header->GetEncryptedAreaLength()) throw PasswordIncorrect (SRC_POS); mode.SetSectorOffset (partitionStartOffset / ENCRYPTION_DATA_UNIT_SIZE); } // Volume protection if (Protection == VolumeProtection::HiddenVolumeReadOnly) { if (Type == VolumeType::Hidden) throw PasswordIncorrect (SRC_POS); else { try { Volume protectedVolume; protectedVolume.Open (VolumeFile, protectionPassword, protectionPim, protectionKdf, truecryptMode, protectionKeyfiles, VolumeProtection::ReadOnly, shared_ptr <VolumePassword> (), 0, shared_ptr <Pkcs5Kdf> (),shared_ptr <KeyfileList> (), VolumeType::Hidden, useBackupHeaders); if (protectedVolume.GetType() != VolumeType::Hidden) ParameterIncorrect (SRC_POS); ProtectedRangeStart = protectedVolume.VolumeDataOffset; ProtectedRangeEnd = protectedVolume.VolumeDataOffset + protectedVolume.VolumeDataSize; } catch (PasswordException&) { if (protectionKeyfiles && !protectionKeyfiles->empty()) throw ProtectionPasswordKeyfilesIncorrect (SRC_POS); throw ProtectionPasswordIncorrect (SRC_POS); } } } return; } } if (partitionInSystemEncryptionScope) throw PasswordOrKeyboardLayoutIncorrect (SRC_POS); if (!partitionInSystemEncryptionScope && GetPath().IsDevice()) { // Check if the device contains VeraCrypt Boot Loader try { File driveDevice; driveDevice.Open (DevicePath (wstring (GetPath())).ToHostDriveOfPartition()); Buffer mbr (VolumeFile->GetDeviceSectorSize()); driveDevice.ReadAt (mbr, 0); // Search for the string "VeraCrypt" or "TrueCrypt" const char* bootSignature = truecryptMode? "TrueCrypt" : TC_APP_NAME; size_t nameLen = strlen (bootSignature); for (size_t i = 0; i < mbr.Size() - nameLen; ++i) { if (memcmp (mbr.Ptr() + i, bootSignature, nameLen) == 0) throw PasswordOrMountOptionsIncorrect (SRC_POS); } } catch (PasswordOrMountOptionsIncorrect&) { throw; } catch (...) { } } if (keyfiles && !keyfiles->empty()) throw PasswordKeyfilesIncorrect (SRC_POS); throw PasswordIncorrect (SRC_POS); } catch (...) { Close(); throw; } } void Volume::ReadSectors (const BufferPtr &buffer, uint64 byteOffset) { if_debug (ValidateState ()); uint64 length = buffer.Size(); uint64 hostOffset = VolumeDataOffset + byteOffset; if (length % SectorSize != 0 || byteOffset % SectorSize != 0) throw ParameterIncorrect (SRC_POS); if (VolumeFile->ReadAt (buffer, hostOffset) != length) throw MissingVolumeData (SRC_POS); EA->DecryptSectors (buffer, hostOffset / SectorSize, length / SectorSize, SectorSize); TotalDataRead += length; } void Volume::ReEncryptHeader (bool backupHeader, const ConstBufferPtr &newSalt, const ConstBufferPtr &newHeaderKey, shared_ptr <Pkcs5Kdf> newPkcs5Kdf) { if_debug (ValidateState ()); if (Protection == VolumeProtection::ReadOnly) throw VolumeReadOnly (SRC_POS); SecureBuffer newHeaderBuffer (Layout->GetHeaderSize()); Header->EncryptNew (newHeaderBuffer, newSalt, newHeaderKey, newPkcs5Kdf); int headerOffset = backupHeader ? Layout->GetBackupHeaderOffset() : Layout->GetHeaderOffset(); if (headerOffset >= 0) VolumeFile->SeekAt (headerOffset); else VolumeFile->SeekEnd (headerOffset); VolumeFile->Write (newHeaderBuffer); } void Volume::ValidateState () const { if (VolumeFile.get() == nullptr) throw NotInitialized (SRC_POS); } void Volume::WriteSectors (const ConstBufferPtr &buffer, uint64 byteOffset) { if_debug (ValidateState ()); uint64 length = buffer.Size(); uint64 hostOffset = VolumeDataOffset + byteOffset; if (length % SectorSize != 0 || byteOffset % SectorSize != 0 || byteOffset + length > VolumeDataSize) throw ParameterIncorrect (SRC_POS); if (Protection == VolumeProtection::ReadOnly) throw VolumeReadOnly (SRC_POS); if (HiddenVolumeProtectionTriggered) throw VolumeProtected (SRC_POS); if (Protection == VolumeProtection::HiddenVolumeReadOnly) CheckProtectedRange (hostOffset, length); SecureBuffer encBuf (buffer.Size()); encBuf.CopyFrom (buffer); EA->EncryptSectors (encBuf, hostOffset / SectorSize, length / SectorSize, SectorSize); VolumeFile->WriteAt (encBuf, hostOffset); TotalDataWritten += length; uint64 writeEndOffset = byteOffset + buffer.Size(); if (writeEndOffset > TopWriteOffset) TopWriteOffset = writeEndOffset; } }