VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Crypto/Sha2Intel.c
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2024-11-11 00:04:46 +0100
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2024-11-11 00:04:46 +0100
commita1ade61c59abe516d12d0720ef34fd4b6a31fd4c (patch)
tree7c06efaf4087b2dc02e4cc9b2794a88ee442e9ce /src/Crypto/Sha2Intel.c
parent262b745940a3bcd3b926d91804be6ba9229d0542 (diff)
downloadVeraCrypt-a1ade61c59abe516d12d0720ef34fd4b6a31fd4c.tar.gz
VeraCrypt-a1ade61c59abe516d12d0720ef34fd4b6a31fd4c.zip
Linux: Fix build error caused by changes for dynamic CPU SHA support detection
Diffstat (limited to 'src/Crypto/Sha2Intel.c')
-rw-r--r--src/Crypto/Sha2Intel.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/Crypto/Sha2Intel.c b/src/Crypto/Sha2Intel.c
index c926f76a..943115bf 100644
--- a/src/Crypto/Sha2Intel.c
+++ b/src/Crypto/Sha2Intel.c
@@ -21,6 +21,66 @@
#if CRYPTOPP_SHANI_AVAILABLE
+#ifndef _MSC_VER
+#include <signal.h>
+#include <setjmp.h>
+
+typedef void (*SigHandler)(int);
+
+static jmp_buf s_jmpNoSHA;
+static void SigIllHandlerSHA(int p)
+{
+ longjmp(s_jmpNoSHA, 1);
+}
+#endif
+
+int TrySHA256()
+{
+ volatile int result = 0;
+#ifdef _MSC_VER
+ __try
+#else
+ SigHandler oldHandler = signal(SIGILL, SigIllHandlerSHA);
+ if (oldHandler == SIG_ERR)
+ return 0;
+ if (setjmp(s_jmpNoSHA))
+ result = 0;
+ else
+#endif
+ {
+ // Known input message block
+ __m128i msg0 = _mm_setr_epi32(0x12345678, 0x9ABCDEF0, 0x87654321, 0x0FEDCBA9);
+ __m128i msg1 = _mm_setr_epi32(0x11111111, 0x22222222, 0x33333333, 0x44444444);
+
+ // SHA256 message schedule update
+ __m128i tmp = _mm_sha256msg1_epu32(msg0, msg1);
+
+ // Verify result - these values were pre-computed for the given input
+#ifdef _MSC_VER
+ if (tmp.m128i_u32[0] == 0xD8131B44 &&
+ tmp.m128i_u32[1] == 0x9DE6E22B &&
+ tmp.m128i_u32[2] == 0xA86D643A &&
+ tmp.m128i_u32[3] == 0x74320FED)
+#else
+ if (((uint32_t*)(&tmp))[0] == 0xD8131B44 &&
+ ((uint32_t*)(&tmp))[1] == 0x9DE6E22B &&
+ ((uint32_t*)(&tmp))[2] == 0xA86D643A &&
+ ((uint32_t*)(&tmp))[3] == 0x74320FED)
+#endif
+ result = 1;
+ }
+#ifdef _MSC_VER
+ __except (EXCEPTION_EXECUTE_HANDLER)
+ {
+ // ignore error if SHA instructions not supported
+ }
+#else
+ signal(SIGILL, oldHandler);
+#endif
+
+ return result;
+}
+
//
void sha256_intel(void *mp, uint_32t state[8], uint_64t num_blks)
{