diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2020-01-22 11:46:37 +0100 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2020-01-22 18:20:11 +0100 |
commit | be1aee00340f40f9c81676d8b65f728f4a34cd9b (patch) | |
tree | 8b793876db52e6d4bd5cb8170e8705145acb86a6 /src/Format | |
parent | 56775af8d7578bfb5fd5d938def23ba32e4e7bb2 (diff) | |
download | VeraCrypt-be1aee00340f40f9c81676d8b65f728f4a34cd9b.tar.gz VeraCrypt-be1aee00340f40f9c81676d8b65f728f4a34cd9b.zip |
Windows: Fix regression in Expander and Format when RAM encryption is enable that was causing volume headers to be corrupted.
Diffstat (limited to 'src/Format')
-rw-r--r-- | src/Format/InPlace.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Format/InPlace.c b/src/Format/InPlace.c index 7117a8a4..d844be2c 100644 --- a/src/Format/InPlace.c +++ b/src/Format/InPlace.c @@ -1097,6 +1097,19 @@ inplace_enc_read: { PCRYPTO_INFO dummyInfo = NULL; +#ifdef _WIN64 + CRYPTO_INFO tmpCI; + PCRYPTO_INFO cryptoInfoBackup = NULL; + if (IsRamEncryptionEnabled ()) + { + VirtualLock (&tmpCI, sizeof(tmpCI)); + memcpy (&tmpCI, masterCryptoInfo, sizeof (CRYPTO_INFO)); + VcUnprotectKeys (&tmpCI, VcGetEncryptionID (masterCryptoInfo)); + cryptoInfoBackup = masterCryptoInfo; + masterCryptoInfo = &tmpCI; + } +#endif + nStatus = CreateVolumeHeaderInMemory (hwndDlg, FALSE, header, headerCryptoInfo->ea, @@ -1115,6 +1128,15 @@ inplace_enc_read: masterCryptoInfo->SectorSize, wipeAlgorithm == TC_WIPE_NONE ? FALSE : (wipePass < PRAND_HEADER_WIPE_PASSES - 1)); +#ifdef _WIN64 + if (IsRamEncryptionEnabled ()) + { + masterCryptoInfo = cryptoInfoBackup; + burn (&tmpCI, sizeof (CRYPTO_INFO)); + VirtualUnlock (&tmpCI, sizeof(tmpCI)); + } +#endif + if (nStatus != ERR_SUCCESS) goto closing_seq; @@ -1128,9 +1150,28 @@ inplace_enc_read: goto closing_seq; } +#ifdef _WIN64 + if (IsRamEncryptionEnabled ()) + { + VirtualLock (&tmpCI, sizeof(tmpCI)); + memcpy (&tmpCI, headerCryptoInfo, sizeof (CRYPTO_INFO)); + VcUnprotectKeys (&tmpCI, VcGetEncryptionID (headerCryptoInfo)); + cryptoInfoBackup = headerCryptoInfo; + headerCryptoInfo = &tmpCI; + } +#endif // Fill the reserved sectors of the header area with random data nStatus = WriteRandomDataToReservedHeaderAreas (hwndDlg, dev, headerCryptoInfo, masterCryptoInfo->VolumeSize.Value, TRUE, FALSE); +#ifdef _WIN64 + if (IsRamEncryptionEnabled ()) + { + headerCryptoInfo = cryptoInfoBackup; + burn (&tmpCI, sizeof (CRYPTO_INFO)); + VirtualUnlock (&tmpCI, sizeof(tmpCI)); + } +#endif + if (nStatus != ERR_SUCCESS) goto closing_seq; |