1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-11 19:08:26 -06:00

Linux/MacOSX/FreeBSD: better handling for mounting systen encrypted disks whose first sector has been overwritten (e.g. during windows repair).

This commit is contained in:
Mounir IDRASSI
2018-06-13 18:03:21 +02:00
parent d5dca62b04
commit 22b9ca94b3

View File

@@ -316,6 +316,7 @@ namespace VeraCrypt
uint64 length = buffer.Size(); uint64 length = buffer.Size();
uint64 hostOffset = VolumeDataOffset + byteOffset; uint64 hostOffset = VolumeDataOffset + byteOffset;
size_t bufferOffset = 0;
if (length % SectorSize != 0 || byteOffset % SectorSize != 0) if (length % SectorSize != 0 || byteOffset % SectorSize != 0)
throw ParameterIncorrect (SRC_POS); throw ParameterIncorrect (SRC_POS);
@@ -323,31 +324,30 @@ namespace VeraCrypt
if (VolumeFile->ReadAt (buffer, hostOffset) != length) if (VolumeFile->ReadAt (buffer, hostOffset) != length)
throw MissingVolumeData (SRC_POS); throw MissingVolumeData (SRC_POS);
if (EncryptionNotCompleted) // first sector can be unencrypted in some cases (e.g. windows repair)
{ // detect this case by looking for NTFS header
// if encryption is not complete, we decrypt only the encrypted sectors if (SystemEncryption && (hostOffset == 0) && ((BE64 (*(uint64 *) buffer.Get ())) == 0xEB52904E54465320ULL))
if (hostOffset < EncryptedDataSize)
{
size_t bufferOffset = 0;
// first sector is not encrypted in case of incomplete encryption
if (hostOffset == 0)
{ {
bufferOffset = (size_t) SectorSize; bufferOffset = (size_t) SectorSize;
hostOffset += SectorSize; hostOffset += SectorSize;
length -= SectorSize; length -= SectorSize;
} }
if (length && (hostOffset < EncryptedDataSize)) if (length)
{
if (EncryptionNotCompleted)
{
// if encryption is not complete, we decrypt only the encrypted sectors
if (hostOffset < EncryptedDataSize)
{ {
uint64 encryptedLength = VC_MIN (length, (EncryptedDataSize - hostOffset)); uint64 encryptedLength = VC_MIN (length, (EncryptedDataSize - hostOffset));
EA->DecryptSectors (buffer.GetRange (bufferOffset, encryptedLength), hostOffset / SectorSize, encryptedLength / SectorSize, SectorSize); EA->DecryptSectors (buffer.GetRange (bufferOffset, encryptedLength), hostOffset / SectorSize, encryptedLength / SectorSize, SectorSize);
} }
} }
}
else else
EA->DecryptSectors (buffer, hostOffset / SectorSize, length / SectorSize, SectorSize); EA->DecryptSectors (buffer.GetRange (bufferOffset, length), hostOffset / SectorSize, length / SectorSize, SectorSize);
}
TotalDataRead += length; TotalDataRead += length;
} }