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/Common/Fat.c | |
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/Common/Fat.c')
-rw-r--r-- | src/Common/Fat.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/Common/Fat.c b/src/Common/Fat.c index b47e531c..8d4cc7d8 100644 --- a/src/Common/Fat.c +++ b/src/Common/Fat.c @@ -394,6 +394,8 @@ FormatFat (void* hwndDlgPtr, unsigned __int64 startSector, fatparams * ft, void if(!quickFormat) { + CRYPTO_INFO tmpCI; + if (!FlushFormatWriteBuffer (dev, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo)) goto fail; @@ -402,23 +404,41 @@ FormatFat (void* hwndDlgPtr, unsigned __int64 startSector, fatparams * ft, void deniability of hidden volumes (and also reduces the amount of predictable plaintext within the volume). */ + VirtualLock (&tmpCI, sizeof (tmpCI)); + memcpy (&tmpCI, cryptoInfo, sizeof (CRYPTO_INFO)); + cryptoInfo = &tmpCI; + // Temporary master key if (!RandgetBytes (hwndDlg, temporaryKey, EAGetKeySize (cryptoInfo->ea), FALSE)) + { + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); goto fail; + } // Temporary secondary key (XTS mode) if (!RandgetBytes (hwndDlg, cryptoInfo->k2, sizeof cryptoInfo->k2, FALSE)) + { + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); goto fail; + } retVal = EAInit (cryptoInfo->ea, temporaryKey, cryptoInfo->ks); if (retVal != ERR_SUCCESS) { + TCfree (write_buf); burn (temporaryKey, sizeof(temporaryKey)); + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); return retVal; } if (!EAInitMode (cryptoInfo, cryptoInfo->k2)) { + TCfree (write_buf); burn (temporaryKey, sizeof(temporaryKey)); + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); return ERR_MODE_INIT_FAILED; } @@ -430,12 +450,24 @@ FormatFat (void* hwndDlgPtr, unsigned __int64 startSector, fatparams * ft, void goto fail; } UpdateProgressBar (nSecNo * ft->sector_size); + + if (!FlushFormatWriteBuffer (dev, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo)) + { + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); + goto fail; + } + + burn (&tmpCI, sizeof (tmpCI)); + VirtualUnlock (&tmpCI, sizeof (tmpCI)); } else + { UpdateProgressBar ((uint64) ft->num_sectors * ft->sector_size); - if (!FlushFormatWriteBuffer (dev, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo)) - goto fail; + if (!FlushFormatWriteBuffer (dev, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo)) + goto fail; + } TCfree (write_buf); burn (temporaryKey, sizeof(temporaryKey)); |