1
0
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:
Mounir IDRASSI
2017-07-04 11:19:53 +02:00
parent 0358eb6c71
commit 88cc8a00f4
6 changed files with 91 additions and 54 deletions

View File

@@ -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)

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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();