7 #ifndef EXCEPTION_EXECUTE_HANDLER
8 # define EXCEPTION_EXECUTE_HANDLER 1
11 #ifndef CRYPTOPP_IMPORTS
19 #if (CRYPTOPP_MSC_VERSION >= 1600) && (defined(_M_IX86) || defined(_M_X64))
20 # include <immintrin.h>
25 #if defined(_WIN32) && defined(_M_ARM64)
27 # include <processthreadsapi.h>
31 # include <sys/systemcfg.h>
40 #if (((__GLIBC__ * 100) + __GLIBC_MINOR__) >= 216)
41 # define CRYPTOPP_GETAUXV_AVAILABLE 1
44 #if CRYPTOPP_GETAUXV_AVAILABLE
45 # include <sys/auxv.h>
53 unsigned long int getauxval(
unsigned long int) {
return 0; }
56 #if defined(__APPLE__)
57 # include <sys/utsname.h>
58 # include <sys/sysctl.h>
63 #if defined(__FreeBSD__)
64 # include <sys/auxv.h>
65 # include <sys/elf_common.h>
72 #if defined(__ANDROID__)
73 # include "cpu-features.h"
76 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
84 #if defined(_M_X64) && defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY)
85 extern "C" unsigned long long __fastcall XGETBV64(
unsigned int);
86 extern "C" unsigned long long __fastcall CPUID64(
unsigned int,
unsigned int,
unsigned int*);
89 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
91 typedef void (*SigHandler)(int);
96 static jmp_buf s_jmpNoCPUID;
97 static void SigIllHandler(
int)
99 longjmp(s_jmpNoCPUID, 1);
104 ANONYMOUS_NAMESPACE_BEGIN
106 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
110 inline bool IsIntel(
const word32 output[4])
113 return (output[1] == 0x756e6547) &&
114 (output[2] == 0x6c65746e) &&
115 (output[3] == 0x49656e69);
118 inline bool IsAMD(
const word32 output[4])
121 return ((output[1] == 0x68747541) &&
122 (output[2] == 0x444D4163) &&
123 (output[3] == 0x69746E65)) ||
125 ((output[1] == 0x69444d41) &&
126 (output[2] == 0x74656273) &&
127 (output[3] == 0x21726574));
130 inline bool IsHygon(
const word32 output[4])
133 return (output[1] == 0x6f677948) &&
134 (output[2] == 0x656e6975) &&
135 (output[3] == 0x6e65476e);
138 inline bool IsVIA(
const word32 output[4])
141 return ((output[1] == 0x746e6543) &&
142 (output[2] == 0x736c7561) &&
143 (output[3] == 0x48727561)) ||
145 ((output[1] == 0x32414956) &&
146 (output[2] == 0x32414956) &&
147 (output[3] == 0x32414956));
152 #if defined(__APPLE__)
155 class AppleMachineInfo
158 enum { PowerMac=1, Mac, iPhone, iPod, iPad, AppleTV, AppleWatch };
159 enum { PowerPC=1, I386, I686, X86_64, ARM32, ARMV8, ARMV82, ARMV83 };
161 AppleMachineInfo() : m_device(0), m_version(0), m_arch(0)
163 struct utsname systemInfo;
164 systemInfo.machine[0] =
'\0';
167 std::string machine(systemInfo.machine);
169 std::string::size_type pos = machine.find_first_of(
"0123456789");
170 if (pos != std::string::npos)
171 m_version = std::atoi(machine.substr(pos).c_str());
173 if (machine.find(
"iPhone") != std::string::npos)
176 if (m_version >= 6) { m_arch = ARMV8; }
177 else { m_arch = ARM32; }
179 else if (machine.find(
"iPod") != std::string::npos)
182 if (m_version >= 6) { m_arch = ARMV8; }
183 else { m_arch = ARM32; }
185 else if (machine.find(
"iPad") != std::string::npos)
188 if (m_version >= 5) { m_arch = ARMV8; }
189 else { m_arch = ARM32; }
191 else if (machine.find(
"PowerMac") != std::string::npos ||
192 machine.find(
"Power Macintosh") != std::string::npos)
197 else if (machine.find(
"Mac") != std::string::npos ||
198 machine.find(
"Macintosh") != std::string::npos)
200 #if defined(__x86_64) || defined(__amd64)
203 #elif defined(__i386)
206 #elif defined(__i686)
215 else if (machine.find(
"AppleTV") != std::string::npos)
218 if (m_version >= 4) { m_arch = ARMV8; }
219 else { m_arch = ARM32; }
221 else if (machine.find(
"AppleWatch") != std::string::npos)
223 m_device = AppleWatch;
224 if (m_version >= 4) { m_arch = ARMV8; }
225 else { m_arch = ARM32; }
227 else if (machine.find(
"arm64") != std::string::npos)
236 if (sysctlbyname(
"machdep.cpu.brand_string", &brand[0], &size, NULL, 0) == 0 && size > 0)
238 if (brand[size-1] ==
'\0')
243 if (brand ==
"Apple M1")
261 unsigned int Device()
const {
269 unsigned int Arch()
const {
273 bool IsARM32()
const {
274 return m_arch == ARM32;
277 bool IsARMv8()
const {
278 return m_arch >= ARMV8;
281 bool IsARMv82()
const {
282 return m_arch >= ARMV82;
285 bool IsARMv83()
const {
286 return m_arch >= ARMV83;
290 unsigned int m_device, m_version, m_arch;
293 void GetAppleMachineInfo(
unsigned int& device,
unsigned int& version,
unsigned int& arch)
295 #if CRYPTOPP_CXX11_STATIC_INIT
296 static const AppleMachineInfo info;
298 using CryptoPP::Singleton;
302 device = info.Device();
303 version = info.Version();
307 inline bool IsAppleMachineARM32()
309 static unsigned int arch;
313 GetAppleMachineInfo(unused, unused, arch);
315 return arch == AppleMachineInfo::ARM32;
318 inline bool IsAppleMachineARMv8()
320 static unsigned int arch;
324 GetAppleMachineInfo(unused, unused, arch);
326 return arch >= AppleMachineInfo::ARMV8;
329 inline bool IsAppleMachineARMv82()
331 static unsigned int arch;
335 GetAppleMachineInfo(unused, unused, arch);
337 return arch >= AppleMachineInfo::ARMV82;
340 inline bool IsAppleMachineARMv83()
342 static unsigned int arch;
346 GetAppleMachineInfo(unused, unused, arch);
348 return arch >= AppleMachineInfo::ARMV83;
353 ANONYMOUS_NAMESPACE_END
359 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
384 extern bool CPU_ProbeSSE2();
393 #if defined(_M_X64) && defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY)
395 return XGETBV64(num);
399 #elif defined(_M_IX86) && defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY)
416 return (
static_cast<word64>(d) << 32) | a;
419 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
424 "xgetbv" :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
426 return (
static_cast<word64>(d) << 32) | a;
429 #elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC)
436 ".byte 0x0f, 0x01, 0xd0" "\n\t"
437 :
"=a"(a),
"=d"(d) :
"c"(num) :
"cc"
439 return (
static_cast<word64>(d) << 32) | a;
441 # error "Need an xgetbv function"
451 #if defined(_M_X64) && defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY)
453 CPUID64(func, subfunc, output);
458 #elif defined(_M_IX86) && defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY)
482 __except (EXCEPTION_EXECUTE_HANDLER)
494 volatile bool result =
true;
496 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
497 if (oldHandler == SIG_ERR)
501 volatile sigset_t oldMask;
502 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
504 signal(SIGILL, oldHandler);
509 if (setjmp(s_jmpNoCPUID))
516 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
517 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
519 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
521 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
522 :
"a" (func),
"c" (subfunc)
528 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
531 signal(SIGILL, oldHandler);
536 void DetectX86Features()
540 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
542 #if defined(CRYPTOPP_DISABLE_ASM)
546 if (!CpuId(0, 0, cpuid0))
548 if (!CpuId(1, 0, cpuid1))
552 CRYPTOPP_CONSTANT(EAX_REG = 0);
553 CRYPTOPP_CONSTANT(EBX_REG = 1);
554 CRYPTOPP_CONSTANT(ECX_REG = 2);
555 CRYPTOPP_CONSTANT(EDX_REG = 3);
557 CRYPTOPP_CONSTANT(MMX_FLAG = (1 << 24));
558 CRYPTOPP_CONSTANT(SSE_FLAG = (1 << 25));
559 CRYPTOPP_CONSTANT(SSE2_FLAG = (1 << 26));
561 CRYPTOPP_CONSTANT(SSE3_FLAG = (1 << 0));
562 CRYPTOPP_CONSTANT(SSSE3_FLAG = (1 << 9));
563 CRYPTOPP_CONSTANT(SSE41_FLAG = (1 << 19));
564 CRYPTOPP_CONSTANT(SSE42_FLAG = (1 << 20));
565 CRYPTOPP_CONSTANT(MOVBE_FLAG = (1 << 22));
566 CRYPTOPP_CONSTANT(AESNI_FLAG = (1 << 25));
567 CRYPTOPP_CONSTANT(CLMUL_FLAG = (1 << 1));
569 CRYPTOPP_CONSTANT(XSAVE_FLAG = (1 << 26));
570 CRYPTOPP_CONSTANT(OSXSAVE_FLAG = (1 << 27));
572 CRYPTOPP_CONSTANT(AVX_FLAG = (3 << 27));
573 CRYPTOPP_CONSTANT(YMM_FLAG = (3 << 1));
577 CRYPTOPP_UNUSED(MMX_FLAG); CRYPTOPP_UNUSED(SSE_FLAG);
578 CRYPTOPP_UNUSED(SSE2_FLAG); CRYPTOPP_UNUSED(SSE3_FLAG);
579 CRYPTOPP_UNUSED(XSAVE_FLAG);
581 #if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
584 g_hasSSE2 = (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
590 if ((cpuid1[EDX_REG] & SSE2_FLAG) == SSE2_FLAG)
591 g_hasSSE2 = (cpuid1[ECX_REG] & XSAVE_FLAG) != 0 &&
592 (cpuid1[ECX_REG] & OSXSAVE_FLAG) != 0;
598 if (g_hasSSE2 ==
false)
599 g_hasSSE2 = CPU_ProbeSSE2();
602 if (g_hasSSE2 ==
false)
605 g_hasSSSE3 = (cpuid1[ECX_REG] & SSSE3_FLAG) != 0;
606 g_hasSSE41 = (cpuid1[ECX_REG] & SSE41_FLAG) != 0;
607 g_hasSSE42 = (cpuid1[ECX_REG] & SSE42_FLAG) != 0;
608 g_hasMOVBE = (cpuid1[ECX_REG] & MOVBE_FLAG) != 0;
609 g_hasAESNI = (cpuid1[ECX_REG] & AESNI_FLAG) != 0;
610 g_hasCLMUL = (cpuid1[ECX_REG] & CLMUL_FLAG) != 0;
615 if ((cpuid1[ECX_REG] & AVX_FLAG) == AVX_FLAG)
618 g_hasAVX = (xcr0 & YMM_FLAG) == YMM_FLAG;
623 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
624 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
625 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
626 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
627 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
629 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
630 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
631 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
633 if (cpuid0[EAX_REG] >= 7)
635 if (CpuId(7, 0, cpuid2))
637 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
638 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
639 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
640 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
644 else if (IsAMD(cpuid0) || IsHygon(cpuid0))
646 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30));
647 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18));
648 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19));
649 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29));
650 CRYPTOPP_CONSTANT( AVX2_FLAG = (1 << 5));
652 CpuId(0x80000005, 0, cpuid2);
653 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
654 g_hasRDRAND = (cpuid1[ECX_REG] & RDRAND_FLAG) != 0;
656 if (cpuid0[EAX_REG] >= 7)
658 if (CpuId(7, 0, cpuid2))
660 g_hasRDSEED = (cpuid2[EBX_REG] & RDSEED_FLAG) != 0;
661 g_hasADX = (cpuid2[EBX_REG] & ADX_FLAG) != 0;
662 g_hasSHA = (cpuid2[EBX_REG] & SHA_FLAG) != 0;
663 g_hasAVX2 = (cpuid2[EBX_REG] & AVX2_FLAG) != 0;
672 CRYPTOPP_CONSTANT(FAMILY_BASE_FLAG = (0x0f << 8));
673 CRYPTOPP_CONSTANT(FAMILY_EXT_FLAG = (0xff << 20));
675 word32 family = (cpuid1[0] & FAMILY_BASE_FLAG) >> 8;
677 family += (cpuid1[0] & FAMILY_EXT_FLAG) >> 20;
678 if (family == 0x15 || family == 0x16)
685 else if (IsVIA(cpuid0))
688 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2));
689 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6));
690 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8));
691 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10));
692 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12));
694 CpuId(0xC0000000, 0, cpuid2);
695 word32 extendedFeatures = cpuid2[0];
697 if (extendedFeatures >= 0xC0000001)
699 CpuId(0xC0000001, 0, cpuid2);
700 g_hasPadlockRNG = (cpuid2[EDX_REG] & RNG_FLAGS) != 0;
701 g_hasPadlockACE = (cpuid2[EDX_REG] & ACE_FLAGS) != 0;
702 g_hasPadlockACE2 = (cpuid2[EDX_REG] & ACE2_FLAGS) != 0;
703 g_hasPadlockPHE = (cpuid2[EDX_REG] & PHE_FLAGS) != 0;
704 g_hasPadlockPMM = (cpuid2[EDX_REG] & PMM_FLAGS) != 0;
707 if (extendedFeatures >= 0xC0000005)
709 CpuId(0xC0000005, 0, cpuid2);
710 g_cacheLineSize = GETBYTE(cpuid2[ECX_REG], 0);
716 g_hasAVX2 &= g_hasAVX;
720 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
723 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
724 if (g_cacheLineSize == 0 && cacheLineSize > 0)
725 g_cacheLineSize = cacheLineSize;
728 if (g_cacheLineSize == 0)
731 *
const_cast<volatile bool*
>(&g_x86DetectionDone) =
true;
736 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8)
766 extern bool CPU_ProbeARMv7();
767 extern bool CPU_ProbeNEON();
768 extern bool CPU_ProbeCRC32();
769 extern bool CPU_ProbeAES();
770 extern bool CPU_ProbeSHA1();
771 extern bool CPU_ProbeSHA256();
772 extern bool CPU_ProbeSHA512();
773 extern bool CPU_ProbeSHA3();
774 extern bool CPU_ProbeSM3();
775 extern bool CPU_ProbeSM4();
776 extern bool CPU_ProbePMULL();
781 # define HWCAP_ARMv7 (1 << 29)
784 # define HWCAP_ASIMD (1 << 1)
787 # define HWCAP_NEON (1 << 12)
790 # define HWCAP_CRC32 (1 << 7)
793 # define HWCAP2_CRC32 (1 << 4)
796 # define HWCAP_PMULL (1 << 4)
799 # define HWCAP2_PMULL (1 << 1)
802 # define HWCAP_AES (1 << 3)
805 # define HWCAP2_AES (1 << 0)
808 # define HWCAP_SHA1 (1 << 5)
811 # define HWCAP_SHA2 (1 << 6)
814 # define HWCAP2_SHA1 (1 << 2)
817 # define HWCAP2_SHA2 (1 << 3)
820 # define HWCAP_SHA3 (1 << 17)
823 # define HWCAP_SM3 (1 << 18)
826 # define HWCAP_SM4 (1 << 19)
829 # define HWCAP_SHA512 (1 << 21)
832 inline bool CPU_QueryARMv7()
834 #if defined(__ANDROID__) && defined(__arm__)
835 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
836 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
838 #elif defined(__linux__) && defined(__arm__)
839 if ((getauxval(AT_HWCAP) & HWCAP_ARMv7) != 0 ||
840 (getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
842 #elif defined(__APPLE__) && defined(__arm__)
845 #elif defined(_WIN32) && defined(_M_ARM64)
852 inline bool CPU_QueryNEON()
854 #if defined(__ANDROID__) && defined(__aarch64__)
855 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
856 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
858 #elif defined(__ANDROID__) && defined(__arm__)
859 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
860 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
862 #elif defined(__linux__) && defined(__aarch64__)
863 if ((getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0)
865 #elif defined(__linux__) && defined(__aarch32__)
866 if ((getauxval(AT_HWCAP2) & HWCAP2_ASIMD) != 0)
868 #elif defined(__linux__) && defined(__arm__)
869 if ((getauxval(AT_HWCAP) & HWCAP_NEON) != 0)
871 #elif defined(__APPLE__) && defined(__aarch64__)
873 if (IsAppleMachineARMv8())
875 #elif defined(_WIN32) && defined(_M_ARM64)
877 if (IsProcessorFeaturePresent(PF_ARM_V8_INSTRUCTIONS_AVAILABLE) != 0)
883 inline bool CPU_QueryCRC32()
885 #if defined(__ANDROID__) && defined(__aarch64__)
886 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
887 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) != 0))
889 #elif defined(__ANDROID__) && defined(__aarch32__)
890 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
891 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32) != 0))
893 #elif defined(__linux__) && defined(__aarch64__)
894 if ((getauxval(AT_HWCAP) & HWCAP_CRC32) != 0)
896 #elif defined(__linux__) && defined(__aarch32__)
897 if ((getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0)
899 #elif defined(__APPLE__) && defined(__aarch64__)
901 if (IsAppleMachineARMv82())
903 #elif defined(_WIN32) && defined(_M_ARM64)
904 if (IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) != 0)
910 inline bool CPU_QueryPMULL()
912 #if defined(__ANDROID__) && defined(__aarch64__)
913 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
914 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) != 0))
916 #elif defined(__ANDROID__) && defined(__aarch32__)
917 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
918 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL) != 0))
920 #elif defined(__linux__) && defined(__aarch64__)
921 if ((getauxval(AT_HWCAP) & HWCAP_PMULL) != 0)
923 #elif defined(__linux__) && defined(__aarch32__)
924 if ((getauxval(AT_HWCAP2) & HWCAP2_PMULL) != 0)
926 #elif defined(__APPLE__) && defined(__aarch64__)
928 if (IsAppleMachineARMv82())
930 #elif defined(_WIN32) && defined(_M_ARM64)
931 if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0)
937 inline bool CPU_QueryAES()
939 #if defined(__ANDROID__) && defined(__aarch64__)
940 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
941 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) != 0))
943 #elif defined(__ANDROID__) && defined(__aarch32__)
944 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
945 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES) != 0))
947 #elif defined(__linux__) && defined(__aarch64__)
948 if ((getauxval(AT_HWCAP) & HWCAP_AES) != 0)
950 #elif defined(__linux__) && defined(__aarch32__)
951 if ((getauxval(AT_HWCAP2) & HWCAP2_AES) != 0)
953 #elif defined(__APPLE__) && defined(__aarch64__)
955 if (IsAppleMachineARMv82())
957 #elif defined(_WIN32) && defined(_M_ARM64)
958 if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0)
964 inline bool CPU_QuerySHA1()
966 #if defined(__ANDROID__) && defined(__aarch64__)
967 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
968 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) != 0))
970 #elif defined(__ANDROID__) && defined(__aarch32__)
971 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
972 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1) != 0))
974 #elif defined(__linux__) && defined(__aarch64__)
975 if ((getauxval(AT_HWCAP) & HWCAP_SHA1) != 0)
977 #elif defined(__linux__) && defined(__aarch32__)
978 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA1) != 0)
980 #elif defined(__APPLE__) && defined(__aarch64__)
982 if (IsAppleMachineARMv82())
984 #elif defined(_WIN32) && defined(_M_ARM64)
985 if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0)
991 inline bool CPU_QuerySHA256()
993 #if defined(__ANDROID__) && defined(__aarch64__)
994 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
995 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) != 0))
997 #elif defined(__ANDROID__) && defined(__aarch32__)
998 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
999 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2) != 0))
1001 #elif defined(__linux__) && defined(__aarch64__)
1002 if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
1004 #elif defined(__linux__) && defined(__aarch32__)
1005 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA2) != 0)
1007 #elif defined(__APPLE__) && defined(__aarch64__)
1009 if (IsAppleMachineARMv82())
1011 #elif defined(_WIN32) && defined(_M_ARM64)
1012 if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0)
1019 inline bool CPU_QuerySHA3()
1025 if (!g_hasSHA1 || !g_hasSHA2) {
return false; }
1027 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1028 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1029 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA3) != 0))
1031 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1032 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1033 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA3) != 0))
1035 #elif defined(__linux__) && defined(__aarch64__)
1036 if ((getauxval(AT_HWCAP) & HWCAP_SHA3) != 0)
1038 #elif defined(__linux__) && defined(__aarch32__)
1039 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA3) != 0)
1041 #elif defined(__APPLE__) && defined(__aarch64__)
1043 if (IsAppleMachineARMv82())
1050 inline bool CPU_QuerySHA512()
1056 if (!g_hasSHA1 || !g_hasSHA2) {
return false; }
1058 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1059 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1060 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA512) != 0))
1062 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1063 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1064 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA512) != 0))
1066 #elif defined(__linux__) && defined(__aarch64__)
1067 if ((getauxval(AT_HWCAP) & HWCAP_SHA512) != 0)
1069 #elif defined(__linux__) && defined(__aarch32__)
1070 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA512) != 0)
1072 #elif defined(__APPLE__) && defined(__aarch64__)
1074 if (IsAppleMachineARMv82())
1081 inline bool CPU_QuerySM3()
1083 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1084 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1085 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM3) != 0))
1087 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1088 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1089 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM3) != 0))
1091 #elif defined(__linux__) && defined(__aarch64__)
1092 if ((getauxval(AT_HWCAP) & HWCAP_SM3) != 0)
1094 #elif defined(__linux__) && defined(__aarch32__)
1095 if ((getauxval(AT_HWCAP2) & HWCAP2_SM3) != 0)
1097 #elif defined(__APPLE__) && defined(__aarch64__) && 0
1104 inline bool CPU_QuerySM4()
1106 #if defined(__ANDROID__) && defined(__aarch64__) && 0
1107 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
1108 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SM4) != 0))
1110 #elif defined(__ANDROID__) && defined(__aarch32__) && 0
1111 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
1112 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SM4) != 0))
1114 #elif defined(__linux__) && defined(__aarch64__)
1115 if ((getauxval(AT_HWCAP) & HWCAP_SM4) != 0)
1117 #elif defined(__linux__) && defined(__aarch32__)
1118 if ((getauxval(AT_HWCAP2) & HWCAP2_SM4) != 0)
1120 #elif defined(__APPLE__) && defined(__aarch64__) && 0
1126 void DetectArmFeatures()
1128 #ifndef CRYPTOPP_DISABLE_ASM
1132 g_hasARMv7 = CPU_QueryARMv7() || CPU_ProbeARMv7();
1133 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
1134 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
1135 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1136 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1137 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
1138 g_hasSHA2 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1139 g_hasSHA512 = CPU_QuerySHA512();
1140 g_hasSHA3 = CPU_QuerySHA3();
1141 g_hasSM3 = CPU_QuerySM3();
1142 g_hasSM4 = CPU_QuerySM4();
1144 #if defined(_SC_LEVEL1_DCACHE_LINESIZE)
1147 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1148 if (cacheLineSize > 0)
1149 g_cacheLineSize = cacheLineSize;
1152 if (g_cacheLineSize == 0)
1157 *
const_cast<volatile bool*
>(&g_ArmDetectionDone) =
true;
1162 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
1176 extern bool CPU_ProbeAltivec();
1177 extern bool CPU_ProbePower7();
1178 extern bool CPU_ProbePower8();
1179 extern bool CPU_ProbePower9();
1180 extern bool CPU_ProbeAES();
1181 extern bool CPU_ProbePMULL();
1182 extern bool CPU_ProbeSHA256();
1183 extern bool CPU_ProbeSHA512();
1184 extern bool CPU_ProbeDARN();
1190 #ifndef __power_6_andup
1191 # define __power_6_andup() __power_set(0xffffffffU<<14)
1193 #ifndef __power_7_andup
1194 # define __power_7_andup() __power_set(0xffffffffU<<15)
1196 #ifndef __power_8_andup
1197 # define __power_8_andup() __power_set(0xffffffffU<<16)
1199 #ifndef __power_9_andup
1200 # define __power_9_andup() __power_set(0xffffffffU<<17)
1205 inline bool CPU_QueryAltivec()
1207 #if defined(__linux__) && defined(PPC_FEATURE_HAS_ALTIVEC)
1208 if ((getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC) != 0)
1211 if (__power_6_andup() != 0)
1213 #elif defined(__APPLE__) && defined(__POWERPC__)
1214 unsigned int unused, arch;
1215 GetAppleMachineInfo(unused, unused, arch);
1216 return arch == AppleMachineInfo::PowerMac;
1217 #elif defined(__FreeBSD__) && defined(PPC_FEATURE_HAS_ALTIVEC)
1218 unsigned long cpufeatures;
1219 if (elf_aux_info(AT_HWCAP, &cpufeatures,
sizeof(cpufeatures)) == 0)
1220 if ((cpufeatures & PPC_FEATURE_HAS_ALTIVEC) != 0)
1226 inline bool CPU_QueryPower7()
1229 #if defined(__linux__) && defined(PPC_FEATURE_ARCH_2_06)
1230 if ((getauxval(AT_HWCAP) & PPC_FEATURE_ARCH_2_06) != 0)
1233 if (__power_7_andup() != 0)
1235 #elif defined(__FreeBSD__) && defined(PPC_FEATURE_ARCH_2_06)
1236 unsigned long cpufeatures;
1237 if (elf_aux_info(AT_HWCAP, &cpufeatures,
sizeof(cpufeatures)) == 0)
1238 if ((cpufeatures & PPC_FEATURE_ARCH_2_06) != 0)
1244 inline bool CPU_QueryPower8()
1247 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_2_07)
1248 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) != 0)
1251 if (__power_8_andup() != 0)
1253 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_ARCH_2_07)
1254 unsigned long cpufeatures;
1255 if (elf_aux_info(AT_HWCAP, &cpufeatures,
sizeof(cpufeatures)) == 0)
1256 if ((cpufeatures & PPC_FEATURE_ARCH_2_07) != 0)
1262 inline bool CPU_QueryPower9()
1265 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1266 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1269 if (__power_9_andup() != 0)
1271 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_ARCH_3_00)
1272 unsigned long cpufeatures;
1273 if (elf_aux_info(AT_HWCAP, &cpufeatures,
sizeof(cpufeatures)) == 0)
1274 if ((cpufeatures & PPC_FEATURE_ARCH2_3_00) != 0)
1280 inline bool CPU_QueryAES()
1284 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1285 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1288 if (__power_8_andup() != 0)
1290 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_HAS_VEC_CRYPTO)
1291 unsigned long cpufeatures;
1292 if (elf_aux_info(AT_HWCAP2, &cpufeatures,
sizeof(cpufeatures)) == 0)
1293 if ((cpufeatures & PPC_FEATURE2_HAS_VEC_CRYPTO != 0)
1299 inline bool CPU_QueryPMULL()
1303 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1304 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1307 if (__power_8_andup() != 0)
1309 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_HAS_VEC_CRYPTO)
1310 unsigned long cpufeatures;
1311 if (elf_aux_info(AT_HWCAP2, &cpufeatures,
sizeof(cpufeatures)) == 0)
1312 if ((cpufeatures & PPC_FEATURE2_HAS_VEC_CRYPTO != 0)
1318 inline bool CPU_QuerySHA256()
1322 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1323 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1326 if (__power_8_andup() != 0)
1328 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_HAS_VEC_CRYPTO)
1329 unsigned long cpufeatures;
1330 if (elf_aux_info(AT_HWCAP2, &cpufeatures,
sizeof(cpufeatures)) == 0)
1331 if ((cpufeatures & PPC_FEATURE2_HAS_VEC_CRYPTO != 0)
1336 inline bool CPU_QuerySHA512()
1340 #if defined(__linux__) && defined(PPC_FEATURE2_VEC_CRYPTO)
1341 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
1344 if (__power_8_andup() != 0)
1346 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_HAS_VEC_CRYPTO)
1347 unsigned long cpufeatures;
1348 if (elf_aux_info(AT_HWCAP2, &cpufeatures,
sizeof(cpufeatures)) == 0)
1349 if ((cpufeatures & PPC_FEATURE2_HAS_VEC_CRYPTO != 0)
1356 inline bool CPU_QueryDARN()
1360 #if defined(__linux__) && defined(PPC_FEATURE2_ARCH_3_00)
1361 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00) != 0)
1364 if (__power_9_andup() != 0)
1366 #elif defined(__FreeBSD__) && defined(PPC_FEATURE2_ARCH_3_00)
1367 unsigned long cpufeatures;
1368 if (elf_aux_info(AT_HWCAP2, &cpufeatures,
sizeof(cpufeatures)) == 0)
1369 if ((cpufeatures & PPC_FEATURE2_ARCH_3_00) != 0)
1375 void DetectPowerPcFeatures()
1383 #ifndef CRYPTOPP_DISABLE_ASM
1387 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
1388 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
1389 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
1390 g_hasPower9 = CPU_QueryPower9() || CPU_ProbePower9();
1391 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
1392 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
1393 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
1394 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
1395 g_hasDARN = CPU_QueryDARN() || CPU_ProbeDARN();
1397 #if defined(_AIX) && defined(SC_L1C_DLS)
1399 int cacheLineSize = getsystemcfg(SC_L1C_DLS);
1400 if (cacheLineSize > 0)
1401 g_cacheLineSize = cacheLineSize;
1402 #elif defined(_SC_LEVEL1_DCACHE_LINESIZE)
1405 int cacheLineSize = (int)sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
1406 if (cacheLineSize > 0)
1407 g_cacheLineSize = cacheLineSize;
1410 if (g_cacheLineSize == 0)
1415 *
const_cast<volatile bool*
>(&g_PowerPcDetectionDone) =
true;
1423 ANONYMOUS_NAMESPACE_BEGIN
1430 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
1431 CryptoPP::DetectX86Features();
1432 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8
1433 CryptoPP::DetectArmFeatures();
1434 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64
1435 CryptoPP::DetectPowerPcFeatures();
1444 #if HAVE_GCC_INIT_PRIORITY
1445 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
1446 #elif HAVE_MSC_INIT_PRIORITY
1447 #pragma warning(disable: 4075)
1448 #pragma init_seg(".CRT$XCU")
1449 const InitCpu s_init;
1450 #pragma warning(default: 4075)
1451 #elif HAVE_XLC_INIT_PRIORITY
1453 #pragma priority(270)
1454 const InitCpu s_init;
1456 const InitCpu s_init;
1459 ANONYMOUS_NAMESPACE_END
Restricts the instantiation of a class to one static object without locks.
const T & Ref(...) const
Return a reference to the inner Singleton object.
Library configuration file.
#define CRYPTOPP_L1_CACHE_LINE_SIZE
L1 data cache line size.
#define CRYPTOPP_SECTION_INIT
Initialized data section.
unsigned int word32
32-bit unsigned datatype
unsigned long long word64
64-bit unsigned datatype
Functions for CPU features and intrinsics.
Utility functions for the Crypto++ library.
Crypto++ library namespace.
const char * Version()
int
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.