mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: correctly handle SEH exceptions during self-tests in order to disable CPU extended features in such case.
This commit is contained in:
@@ -1156,20 +1156,20 @@ static BOOL HwEncryptionDisabled = FALSE;
|
|||||||
|
|
||||||
BOOL IsAesHwCpuSupported ()
|
BOOL IsAesHwCpuSupported ()
|
||||||
{
|
{
|
||||||
|
#ifdef TC_WINDOWS_BOOT_AES
|
||||||
static BOOL state = FALSE;
|
static BOOL state = FALSE;
|
||||||
static BOOL stateValid = FALSE;
|
static BOOL stateValid = FALSE;
|
||||||
|
|
||||||
if (!stateValid)
|
if (!stateValid)
|
||||||
{
|
{
|
||||||
#ifdef TC_WINDOWS_BOOT_AES
|
|
||||||
state = is_aes_hw_cpu_supported() ? TRUE : FALSE;
|
state = is_aes_hw_cpu_supported() ? TRUE : FALSE;
|
||||||
#else
|
|
||||||
state = g_hasAESNI ? TRUE : FALSE;
|
|
||||||
#endif
|
|
||||||
stateValid = TRUE;
|
stateValid = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return state && !HwEncryptionDisabled;
|
return state && !HwEncryptionDisabled;
|
||||||
|
#else
|
||||||
|
return (HasAESNI() && !HwEncryptionDisabled)? TRUE : FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnableHwEncryption (BOOL enable)
|
void EnableHwEncryption (BOOL enable)
|
||||||
|
|||||||
@@ -1355,7 +1355,11 @@ BOOL AutoTestAlgorithms (void)
|
|||||||
{
|
{
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
BOOL hwEncryptionEnabled = IsHwEncryptionEnabled();
|
BOOL hwEncryptionEnabled = IsHwEncryptionEnabled();
|
||||||
|
#if defined (_MSC_VER) && !defined (_UEFI)
|
||||||
|
BOOL exceptionCatched = FALSE;
|
||||||
|
__try
|
||||||
|
{
|
||||||
|
#endif
|
||||||
EnableHwEncryption (FALSE);
|
EnableHwEncryption (FALSE);
|
||||||
|
|
||||||
if (!DoAutoTestAlgorithms())
|
if (!DoAutoTestAlgorithms())
|
||||||
@@ -1367,6 +1371,29 @@ BOOL AutoTestAlgorithms (void)
|
|||||||
result = FALSE;
|
result = FALSE;
|
||||||
|
|
||||||
EnableHwEncryption (hwEncryptionEnabled);
|
EnableHwEncryption (hwEncryptionEnabled);
|
||||||
|
#if defined (_MSC_VER) && !defined (_UEFI)
|
||||||
|
}
|
||||||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
exceptionCatched = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exceptionCatched)
|
||||||
|
{
|
||||||
|
/* unexepected exception raised. Disable all CPU extended feature and try again */
|
||||||
|
EnableHwEncryption (hwEncryptionEnabled);
|
||||||
|
DisableCPUExtendedFeatures ();
|
||||||
|
__try
|
||||||
|
{
|
||||||
|
result = DoAutoTestAlgorithms();
|
||||||
|
}
|
||||||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
/* exception still occuring. Report failure. */
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -200,10 +200,10 @@ static uint64 xgetbv()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int g_x86DetectionDone = 0;
|
volatile int g_x86DetectionDone = 0;
|
||||||
int g_hasISSE = 0, g_hasSSE2 = 0, g_hasSSSE3 = 0, g_hasMMX = 0, g_hasAESNI = 0, g_hasCLMUL = 0, g_isP4 = 0;
|
volatile int g_hasISSE = 0, g_hasSSE2 = 0, g_hasSSSE3 = 0, g_hasMMX = 0, g_hasAESNI = 0, g_hasCLMUL = 0, g_isP4 = 0;
|
||||||
int g_hasAVX = 0, g_hasAVX2 = 0, g_hasBMI2 = 0, g_hasSSE42 = 0, g_hasSSE41 = 0, g_isIntel = 0, g_isAMD = 0;
|
volatile int g_hasAVX = 0, g_hasAVX2 = 0, g_hasBMI2 = 0, g_hasSSE42 = 0, g_hasSSE41 = 0, g_isIntel = 0, g_isAMD = 0;
|
||||||
uint32 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
|
volatile uint32 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
|
||||||
|
|
||||||
VC_INLINE int IsIntel(const uint32 output[4])
|
VC_INLINE int IsIntel(const uint32 output[4])
|
||||||
{
|
{
|
||||||
@@ -381,5 +381,23 @@ int is_aes_hw_cpu_supported ()
|
|||||||
return bHasAESNI;
|
return bHasAESNI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DisableCPUExtendedFeatures ()
|
||||||
|
{
|
||||||
|
g_hasSSE2 = 0;
|
||||||
|
g_hasISSE = 0;
|
||||||
|
g_hasMMX = 0;
|
||||||
|
g_hasSSE2 = 0;
|
||||||
|
g_hasISSE = 0;
|
||||||
|
g_hasMMX = 0;
|
||||||
|
g_hasAVX = 0;
|
||||||
|
g_hasAVX2 = 0;
|
||||||
|
g_hasBMI2 = 0;
|
||||||
|
g_hasSSE42 = 0;
|
||||||
|
g_hasSSE41 = 0;
|
||||||
|
g_hasSSSE3 = 0;
|
||||||
|
g_hasAESNI = 0;
|
||||||
|
g_hasCLMUL = 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -186,38 +186,31 @@ extern "C" {
|
|||||||
#define CRYPTOPP_CPUID_AVAILABLE
|
#define CRYPTOPP_CPUID_AVAILABLE
|
||||||
|
|
||||||
// these should not be used directly
|
// these should not be used directly
|
||||||
extern int g_x86DetectionDone;
|
extern volatile int g_x86DetectionDone;
|
||||||
extern int g_hasAVX;
|
extern volatile int g_hasSSE2;
|
||||||
extern int g_hasAVX2;
|
extern volatile int g_hasISSE;
|
||||||
extern int g_hasBMI2;
|
extern volatile int g_hasMMX;
|
||||||
extern int g_hasSSE42;
|
extern volatile int g_hasAVX;
|
||||||
extern int g_hasSSE41;
|
extern volatile int g_hasAVX2;
|
||||||
extern int g_hasSSSE3;
|
extern volatile int g_hasBMI2;
|
||||||
extern int g_hasAESNI;
|
extern volatile int g_hasSSE42;
|
||||||
extern int g_hasCLMUL;
|
extern volatile int g_hasSSE41;
|
||||||
extern int g_isP4;
|
extern volatile int g_hasSSSE3;
|
||||||
extern int g_isIntel;
|
extern volatile int g_hasAESNI;
|
||||||
extern int g_isAMD;
|
extern volatile int g_hasCLMUL;
|
||||||
extern uint32 g_cacheLineSize;
|
extern volatile int g_isP4;
|
||||||
|
extern volatile int g_isIntel;
|
||||||
|
extern volatile int g_isAMD;
|
||||||
|
extern volatile uint32 g_cacheLineSize;
|
||||||
void DetectX86Features(); // must be called at the start of the program/driver
|
void DetectX86Features(); // must be called at the start of the program/driver
|
||||||
int CpuId(uint32 input, uint32 *output);
|
int CpuId(uint32 input, uint32 *output);
|
||||||
|
// disable all CPU extended features (e.g. SSE, AVX, AES) that may have
|
||||||
#if CRYPTOPP_BOOL_X64
|
// been enabled by DetectX86Features.
|
||||||
#define HasSSE2() 1
|
void DisableCPUExtendedFeatures ();
|
||||||
#define HasISSE() 1
|
|
||||||
#define HasMMX() 1
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern int g_hasSSE2;
|
|
||||||
extern int g_hasISSE;
|
|
||||||
extern int g_hasMMX;
|
|
||||||
|
|
||||||
#define HasSSE2() g_hasSSE2
|
#define HasSSE2() g_hasSSE2
|
||||||
#define HasISSE() g_hasISSE
|
#define HasISSE() g_hasISSE
|
||||||
#define HasMMX() g_hasMMX
|
#define HasMMX() g_hasMMX
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HasSSE42() g_hasSSE42
|
#define HasSSE42() g_hasSSE42
|
||||||
#define HasSSE41() g_hasSSE41
|
#define HasSSE41() g_hasSSE41
|
||||||
#define HasSAVX() g_hasAVX
|
#define HasSAVX() g_hasAVX
|
||||||
|
|||||||
@@ -66,18 +66,8 @@ NTSTATUS DumpFilterEntry (PFILTER_EXTENSION filterExtension, PFILTER_INITIALIZAT
|
|||||||
if (filterExtension->DumpType == DumpTypeCrashdump)
|
if (filterExtension->DumpType == DumpTypeCrashdump)
|
||||||
{
|
{
|
||||||
dumpConfig.HwEncryptionEnabled = FALSE;
|
dumpConfig.HwEncryptionEnabled = FALSE;
|
||||||
// disable also SSE optimizations
|
// disable also CPU extended features used in optimizations
|
||||||
HasMMX() = 0;
|
DisableCPUExtendedFeatures ();
|
||||||
HasISSE() = 0;
|
|
||||||
HasSSE2() = 0;
|
|
||||||
HasSSSE3() = 0;
|
|
||||||
HasSSE41() = 0;
|
|
||||||
HasSSE42() = 0;
|
|
||||||
HasAESNI() = 0;
|
|
||||||
HasCLMUL() = 0;
|
|
||||||
HasSAVX() = 0;
|
|
||||||
HasSAVX2() = 0;
|
|
||||||
HasSBMI2() = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -152,8 +152,17 @@ NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
|
|||||||
{
|
{
|
||||||
if (startKeyValue->Type == REG_DWORD && *((uint32 *) startKeyValue->Data) == SERVICE_BOOT_START)
|
if (startKeyValue->Type == REG_DWORD && *((uint32 *) startKeyValue->Data) == SERVICE_BOOT_START)
|
||||||
{
|
{
|
||||||
|
if (!SelfTestsPassed)
|
||||||
|
{
|
||||||
|
// in case of system encryption, if self-tests fail, disable all extended CPU
|
||||||
|
// features and try again in order to workaround faulty configurations
|
||||||
|
DisableCPUExtendedFeatures ();
|
||||||
|
SelfTestsPassed = AutoTestAlgorithms();
|
||||||
|
|
||||||
|
// BUG CHECK if the self-tests still fail
|
||||||
if (!SelfTestsPassed)
|
if (!SelfTestsPassed)
|
||||||
TC_BUG_CHECK (STATUS_INVALID_PARAMETER);
|
TC_BUG_CHECK (STATUS_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
LoadBootArguments();
|
LoadBootArguments();
|
||||||
VolumeClassFilterRegistered = IsVolumeClassFilterRegistered();
|
VolumeClassFilterRegistered = IsVolumeClassFilterRegistered();
|
||||||
|
|||||||
Reference in New Issue
Block a user