VeraCrypt
aboutsummaryrefslogtreecommitdiff
BranchCommit messageAuthorAge
Argon2_1.26.13Windows: define a new formula for Argon2 parameters derivation from PIM valueMounir IDRASSI3 months
CIGithub workflow: add wxWidgets source code to the cache of workflowMounir IDRASSI7 months
NewSysEncWizardWindows: fix buffer overrun caused by wrong use of wmemsetMounir IDRASSI3 years
SysEncWizardPR957New sys enc wizard (#957)Felix Reichmann2 years
VC_CHANGERwindows: Use correct name of VCPassChanger in its resource file.Mounir IDRASSI6 months
masterFix SetupDLL and ExpandVolume Error (#1495)白庭45 hours
revert-1404-masterRevert "Add Hausa translation (#1404)"Mounir IDRASSI6 months
 
TagDownloadAuthorAge
VeraCrypt_1.26.20VeraCrypt_1.26.20.tar.gz  VeraCrypt_1.26.20.zip  Mounir IDRASSI12 days
VeraCrypt_1.26.19VeraCrypt_1.26.19.tar.gz  VeraCrypt_1.26.19.zip  Mounir IDRASSI4 weeks
VeraCrypt_1.26.18VeraCrypt_1.26.18.tar.gz  VeraCrypt_1.26.18.zip  Mounir IDRASSI4 weeks
VeraCrypt_1.26.15VeraCrypt_1.26.15.tar.gz  VeraCrypt_1.26.15.zip  Mounir IDRASSI5 months
VeraCrypt_1.26.14VeraCrypt_1.26.14.tar.gz  VeraCrypt_1.26.14.zip  Mounir IDRASSI6 months
VeraCrypt_1.26.7VeraCrypt_1.26.7.tar.gz  VeraCrypt_1.26.7.zip  Mounir IDRASSI17 months
VeraCrypt_1.26.6VeraCrypt_1.26.6.tar.gz  VeraCrypt_1.26.6.zip  Mounir IDRASSI17 months
VeraCrypt_1.25.9VeraCrypt_1.25.9.tar.gz  VeraCrypt_1.25.9.zip  Mr-Update3 years
VeraCrypt_1.25.7VeraCrypt_1.25.7.tar.gz  VeraCrypt_1.25.7.zip  Mounir IDRASSI3 years
VeraCrypt_1.25.4VeraCrypt_1.25.4.tar.gz  VeraCrypt_1.25.4.zip  Mounir IDRASSI3 years
VeraCrypt_1.24-Update8_MacOSXVeraCrypt_1.24-Update8_MacOSX.tar.gz  VeraCrypt_1.24-Update8_MacOSX.zip  Mounir IDRASSI4 years
VeraCrypt_1.24-Update7VeraCrypt_1.24-Update7.tar.gz  VeraCrypt_1.24-Update7.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Update6VeraCrypt_1.24-Update6.tar.gz  VeraCrypt_1.24-Update6.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Update5VeraCrypt_1.24-Update5.tar.gz  VeraCrypt_1.24-Update5.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Update4VeraCrypt_1.24-Update4.tar.gz  VeraCrypt_1.24-Update4.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Update3VeraCrypt_1.24-Update3.tar.gz  VeraCrypt_1.24-Update3.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Update2VeraCrypt_1.24-Update2.tar.gz  VeraCrypt_1.24-Update2.zip  Mounir IDRASSI5 years
VeraCrypt_1.24-Hotfix1VeraCrypt_1.24-Hotfix1.tar.gz  VeraCrypt_1.24-Hotfix1.zip  Mounir IDRASSI5 years
VeraCrypt_1.24VeraCrypt_1.24.tar.gz  VeraCrypt_1.24.zip  Mounir IDRASSI5 years
VeraCrypt_1.23VeraCrypt_1.23.tar.gz  VeraCrypt_1.23.zip  Mounir IDRASSI6 years
VeraCrypt_1.22VeraCrypt_1.22.tar.gz  VeraCrypt_1.22.zip  Mounir IDRASSI7 years
VeraCrypt_1.21VeraCrypt_1.21.tar.gz  VeraCrypt_1.21.zip  Mounir IDRASSI8 years
VeraCrypt_1.20VeraCrypt_1.20.tar.gz  VeraCrypt_1.20.zip  Mounir IDRASSI8 years
VeraCrypt_1.19VeraCrypt_1.19.tar.gz  VeraCrypt_1.19.zip  Mounir IDRASSI8 years
VeraCrypt_1.18VeraCrypt_1.18.tar.gz  VeraCrypt_1.18.zip  Mounir IDRASSI9 years
VeraCrypt_1.18aVeraCrypt_1.18a.tar.gz  VeraCrypt_1.18a.zip  Mounir IDRASSI9 years
VeraCrypt_1.18_PreReleaseVeraCrypt_1.18_PreMounir IDRASSI10 years
VeraCrypt_MacOSX_1.0eVeraCrypt_MacOSX_1.0e.tar.gz  VeraCrypt_MacOSX_1.0e.zip  Mounir IDRASSI10 years
VeraCrypt_MacOSX_1.0dVeraCrypt_MacOSX_1.0d.tar.gz  VeraCrypt_MacOSX_1.0d.zip  Mounir IDRASSI10 years
VeraCrypt_Linux_1.0dVeraCrypt_Linux_1.0d.tar.gz  VeraCrypt_Linux_1.0d.zip  Mounir IDRASSI10 years
VeraCrypt_1.0dVeraCrypt_1.0d.tar.gz  VeraCrypt_1.0d.zip  Mounir IDRASSI10 years
VeraCrypt_1.0cVeraCrypt_1.0c.tar.gz  VeraCrypt_1.0c.zip  Mounir IDRASSI10 years
VeraCrypt_1.0bVeraCrypt_1.0b.tar.gz  VeraCrypt_1.0b.zip  Mounir IDRASSI10 years
VeraCrypt_1.0aVeraCrypt_1.0a.tar.gz  VeraCrypt_1.0a.zip  Mounir IDRASSI10 years
an class="k">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, shared_ptr <Pkcs5Kdf> kdf, bool truecryptMode, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection, shared_ptr <VolumePassword> protectionPassword, 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, kdf, truecryptMode, keyfiles, protection, protectionPassword, protectionKdf,protectionKeyfiles, volumeType, useBackupHeaders, partitionInSystemEncryptionScope); } void Volume::Open (shared_ptr <File> volumeFile, shared_ptr <VolumePassword> password, shared_ptr <Pkcs5Kdf> kdf, bool truecryptMode, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection, shared_ptr <VolumePassword> protectionPassword, 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; bool deviceHosted = GetPath().IsDevice(); size_t hostDeviceSectorSize = 0; if (deviceHosted) hostDeviceSectorSize = volumeFile->GetDeviceSectorSize(); // 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, 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; 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, protectionKdf, truecryptMode, protectionKeyfiles, VolumeProtection::ReadOnly, shared_ptr <VolumePassword> (), 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; } }