From d3af4d6f269561d187d1ba304b65d385da87e1df Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Fri, 3 Aug 2018 14:17:20 +0200 Subject: [PATCH] Mayaqua: use "cpu_features" to check whether AES-NI is supported --- src/Mayaqua/CMakeLists.txt | 6 +++++- src/Mayaqua/Encrypt.c | 42 ++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Mayaqua/CMakeLists.txt b/src/Mayaqua/CMakeLists.txt index c4f08cfd..1117f637 100644 --- a/src/Mayaqua/CMakeLists.txt +++ b/src/Mayaqua/CMakeLists.txt @@ -19,7 +19,11 @@ find_package(ZLIB REQUIRED) # In some cases libiconv is not included in libc find_library(LIB_ICONV iconv) -target_link_libraries(mayaqua OpenSSL::SSL OpenSSL::Crypto Threads::Threads ZLIB::ZLIB) +add_subdirectory(cpu_features) + +target_include_directories(mayaqua PRIVATE cpu_features/include) + +target_link_libraries(mayaqua cpu_features OpenSSL::SSL OpenSSL::Crypto Threads::Threads ZLIB::ZLIB) if(LIB_ICONV) target_link_libraries(mayaqua ${LIB_ICONV}) diff --git a/src/Mayaqua/Encrypt.c b/src/Mayaqua/Encrypt.c index ab42677a..8a90e592 100644 --- a/src/Mayaqua/Encrypt.c +++ b/src/Mayaqua/Encrypt.c @@ -146,10 +146,21 @@ #include #ifdef _MSC_VER -#include // For __cpuid() -#else -#include // For __get_cpuid() -#endif + #include // For __cpuid() +#else // _MSC_VER + #include "cpu_features_macros.h" + #if defined(CPU_FEATURES_ARCH_X86) + #include "cpuinfo_x86.h" + #elif defined(CPU_FEATURES_ARCH_ARM) + #include "cpuinfo_arm.h" + #elif defined(CPU_FEATURES_ARCH_AARCH64) + #include "cpuinfo_aarch64.h" + #elif defined(CPU_FEATURES_ARCH_MIPS) + #include "cpuinfo_mips.h" + #elif defined(CPU_FEATURES_ARCH_PPC) + #include "cpuinfo_ppc.h" + #endif +#endif // _MSC_VER LOCK *openssl_lock = NULL; @@ -4222,11 +4233,24 @@ bool IsAesNiSupported() int regs[4]; // EAX, EBX, ECX, EDX __cpuid(regs, 1); supported = (regs[2] >> 25) & 1; -#else - uint32_t eax, ebx, ecx, edx; - __get_cpuid(1, &eax, &ebx, &ecx, &edx); - supported = (ecx & bit_AES) > 0; -#endif +#else // _MSC_VER + #if defined(CPU_FEATURES_ARCH_X86) + const X86Features features = GetX86Info().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_ARM) + const ArmFeatures features = GetArmInfo().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_AARCH64) + const Aarch64Features features = GetAarch64Info().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_MIPS) + const MipsFeatures features = GetMipsInfo().features; + supported = features.aes; + #elif defined(CPU_FEATURES_ARCH_PPC) + const PPCFeatures features = GetPPCInfo().features; + supported = features.aes; + #endif +#endif // _MSC_VER return supported; }