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
53unsigned long int getauxval(
unsigned long int) {
return 0; }
57# include <sys/utsname.h>
58# include <sys/sysctl.h>
63#if defined(__FreeBSD__)
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)
85extern "C" unsigned long long __fastcall XGETBV64(
unsigned int);
86extern "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);
104ANONYMOUS_NAMESPACE_BEGIN
106#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
108using CryptoPP::word32;
110inline bool IsIntel(
const word32 output[4])
113 return (output[1] == 0x756e6547) &&
114 (output[2] == 0x6c65746e) &&
115 (output[3] == 0x49656e69);
118inline 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));
130inline bool IsHygon(
const word32 output[4])
133 return (output[1] == 0x6f677948) &&
134 (output[2] == 0x656e6975) &&
135 (output[3] == 0x6e65476e);
138inline 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__)
155class 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)
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;
293void 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();
307inline bool IsAppleMachineARM32()
309 static unsigned int arch;
313 GetAppleMachineInfo(unused, unused, arch);
315 return arch == AppleMachineInfo::ARM32;
318inline bool IsAppleMachineARMv8()
320 static unsigned int arch;
324 GetAppleMachineInfo(unused, unused, arch);
326 return arch >= AppleMachineInfo::ARMV8;
329inline bool IsAppleMachineARMv82()
331 static unsigned int arch;
335 GetAppleMachineInfo(unused, unused, arch);
337 return arch >= AppleMachineInfo::ARMV82;
340inline bool IsAppleMachineARMv83()
342 static unsigned int arch;
346 GetAppleMachineInfo(unused, unused, arch);
348 return arch >= AppleMachineInfo::ARMV83;
353ANONYMOUS_NAMESPACE_END
359#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
384extern 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);
536void 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)
766extern bool CPU_ProbeARMv7();
767extern bool CPU_ProbeNEON();
768extern bool CPU_ProbeCRC32();
769extern bool CPU_ProbeAES();
770extern bool CPU_ProbeSHA1();
771extern bool CPU_ProbeSHA256();
772extern bool CPU_ProbeSHA512();
773extern bool CPU_ProbeSHA3();
774extern bool CPU_ProbeSM3();
775extern bool CPU_ProbeSM4();
776extern 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)
832inline 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)
852inline 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)
883inline 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)
910inline 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)
937inline 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)
964inline 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)
991inline 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)
1019inline 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())
1050inline 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())
1081inline 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
1104inline 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
1126void 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)
1176extern bool CPU_ProbeAltivec();
1177extern bool CPU_ProbePower7();
1178extern bool CPU_ProbePower8();
1179extern bool CPU_ProbePower9();
1180extern bool CPU_ProbeAES();
1181extern bool CPU_ProbePMULL();
1182extern bool CPU_ProbeSHA256();
1183extern bool CPU_ProbeSHA512();
1184extern 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)
1205inline 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)
1226inline 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)
1244inline 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)
1262inline 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)
1280inline 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)
1299inline 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)
1318inline 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)
1336inline 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)
1356inline 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)
1375void 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;
1423ANONYMOUS_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;
1459ANONYMOUS_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.