From c178e325b807258199ae45b2c50c265b4d7ce7af Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Tue, 30 Dec 2014 17:01:49 +0100 Subject: Linux/MacOSX: Implement TrueCrypt conversion and loading support. Correct many GTK issues linked to multi-threaded origine of events by implementing an automatic mechanism for handling such requests in the main thread. --- src/Volume/VolumeHeader.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'src/Volume/VolumeHeader.cpp') diff --git a/src/Volume/VolumeHeader.cpp b/src/Volume/VolumeHeader.cpp index fbdece50..dea3b1ef 100755 --- a/src/Volume/VolumeHeader.cpp +++ b/src/Volume/VolumeHeader.cpp @@ -78,7 +78,7 @@ namespace VeraCrypt EncryptNew (headerBuffer, options.Salt, options.HeaderKey, options.Kdf); } - bool VolumeHeader::Decrypt (const ConstBufferPtr &encryptedData, const VolumePassword &password, shared_ptr kdf, const Pkcs5KdfList &keyDerivationFunctions, const EncryptionAlgorithmList &encryptionAlgorithms, const EncryptionModeList &encryptionModes) + bool VolumeHeader::Decrypt (const ConstBufferPtr &encryptedData, const VolumePassword &password, shared_ptr kdf, bool truecryptMode, const Pkcs5KdfList &keyDerivationFunctions, const EncryptionAlgorithmList &encryptionAlgorithms, const EncryptionModeList &encryptionModes) { if (password.Size() < 1) throw PasswordEmpty (SRC_POS); @@ -121,7 +121,7 @@ namespace VeraCrypt header.CopyFrom (encryptedData.GetRange (EncryptedHeaderDataOffset, EncryptedHeaderDataSize)); ea->Decrypt (header); - if (Deserialize (header, ea, mode)) + if (Deserialize (header, ea, mode, truecryptMode)) { EA = ea; Pkcs5 = pkcs5; @@ -134,15 +134,21 @@ namespace VeraCrypt return false; } - bool VolumeHeader::Deserialize (const ConstBufferPtr &header, shared_ptr &ea, shared_ptr &mode) + bool VolumeHeader::Deserialize (const ConstBufferPtr &header, shared_ptr &ea, shared_ptr &mode, bool truecryptMode) { if (header.Size() != EncryptedHeaderDataSize) throw ParameterIncorrect (SRC_POS); - if (header[0] != 'V' || + if (truecryptMode && (header[0] != 'T' || + header[1] != 'R' || + header[2] != 'U' || + header[3] != 'E')) + return false; + + if (!truecryptMode && (header[0] != 'V' || header[1] != 'E' || header[2] != 'R' || - header[3] != 'A') + header[3] != 'A')) return false; size_t offset = 4; @@ -163,9 +169,16 @@ namespace VeraCrypt RequiredMinProgramVersion = DeserializeEntry (header, offset); - if (RequiredMinProgramVersion > Version::Number()) + if (!truecryptMode && (RequiredMinProgramVersion > Version::Number())) throw HigherVersionRequired (SRC_POS); + if (truecryptMode) + { + if (RequiredMinProgramVersion < 0x700 || RequiredMinProgramVersion > 0x71a) + throw UnsupportedTrueCryptFormat (SRC_POS); + RequiredMinProgramVersion = CurrentRequiredMinProgramVersion; + } + VolumeKeyAreaCrc32 = DeserializeEntry (header, offset); VolumeCreationTime = DeserializeEntry (header, offset); HeaderCreationTime = DeserializeEntry (header, offset); -- cgit v1.2.3