6 #ifndef CRYPTOPP_CONFIG_H
7 #define CRYPTOPP_CONFIG_H
13 #if !defined(CRYPTOPP_LITTLE_ENDIAN) && !defined(CRYPTOPP_BIG_ENDIAN) && (defined(__BIG_ENDIAN__) || (defined(__s390__) || defined(__s390x__) || defined(__zarch__)) || (defined(__m68k__) || defined(__MC68K__)) || defined(__sparc) || defined(__sparc__) || defined(__hppa__) || defined(__MIPSEB__) || defined(__ARMEB__) || (defined(__MWERKS__) && !defined(__INTEL__)))
14 # define CRYPTOPP_BIG_ENDIAN 1
19 #if !defined(CRYPTOPP_BIG_ENDIAN) && !defined(CRYPTOPP_LITTLE_ENDIAN)
20 # define CRYPTOPP_LITTLE_ENDIAN 1
25 #if (CRYPTOPP_BIG_ENDIAN) && defined(__GNUC__) && defined(__BYTE_ORDER__) && (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
26 # error "(CRYPTOPP_BIG_ENDIAN) is set, but __BYTE_ORDER__ is not __ORDER_BIG_ENDIAN__"
28 #if (CRYPTOPP_LITTLE_ENDIAN) && defined(__GNUC__) && defined(__BYTE_ORDER__) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
29 # error "(CRYPTOPP_LITTLE_ENDIAN) is set, but __BYTE_ORDER__ is not __ORDER_LITTLE_ENDIAN__"
50 #if !defined(USE_MS_CRYPTOAPI) && !defined(USE_MS_CNGAPI)
51 # if !defined(_USING_V110_SDK71_) && ((WINVER >= 0x0602 ) || (_WIN32_WINNT >= 0x0602 ))
52 # define USE_MS_CNGAPI
54 # define USE_MS_CRYPTOAPI
67 #if defined(__native_client__)
68 # define CRYPTOPP_DISABLE_ASM 1
101 #define CRYPTOPP_MAJOR 8
102 #define CRYPTOPP_MINOR 2
103 #define CRYPTOPP_REVISION 0
104 #define CRYPTOPP_VERSION 820
111 #ifndef CRYPTOPP_DATA_DIR
112 # define CRYPTOPP_DATA_DIR ""
132 #if !defined(GZIP_OS_CODE)
133 # if defined(__macintosh__)
134 # define GZIP_OS_CODE 7
135 # elif defined(__unix__) || defined(__linux__)
136 # define GZIP_OS_CODE 3
138 # define GZIP_OS_CODE 0
163 #define CRYPTOPP_SLOW_ARMV8_SHIFT 1
173 #define CRYPTOPP_RIJNDAEL_NAME "AES"
181 #if (defined(DEBUG) || defined(_DEBUG)) && !defined(CRYPTOPP_DEBUG)
182 # define CRYPTOPP_DEBUG 1
190 # error namespace support is now required
193 #ifdef CRYPTOPP_DOXYGEN_PROCESSING
208 # define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
212 # define NAMESPACE_BEGIN(x)
213 # define NAMESPACE_END
215 # define DOCUMENTED_TYPEDEF(x, y) class y : public x {};
217 # define protected private
219 # define NAMESPACE_BEGIN(x) namespace x {
220 # define NAMESPACE_END }
221 # define DOCUMENTED_TYPEDEF(x, y) typedef x y;
223 #define ANONYMOUS_NAMESPACE_BEGIN namespace {
224 #define ANONYMOUS_NAMESPACE_END }
225 #define USING_NAMESPACE(x) using namespace x;
226 #define DOCUMENTED_NAMESPACE_BEGIN(x) namespace x {
227 #define DOCUMENTED_NAMESPACE_END }
233 #define CRYPTOPP_NO_GLOBAL_BYTE 1
240 typedef unsigned char byte;
241 typedef unsigned short word16;
242 typedef unsigned int word32;
244 typedef signed char sbyte;
245 typedef signed short sword16;
246 typedef signed int sword32;
248 #if defined(_MSC_VER) || defined(__BORLANDC__)
249 typedef signed __int64 sword64;
250 typedef unsigned __int64 word64;
251 #define SW64LIT(x) x##i64
252 #define W64LIT(x) x##ui64
253 #elif (_LP64 || __LP64__)
254 typedef signed long sword64;
255 typedef unsigned long word64;
256 #define SW64LIT(x) x##L
257 #define W64LIT(x) x##UL
259 typedef signed long long sword64;
260 typedef unsigned long long word64;
261 #define SW64LIT(x) x##LL
262 #define W64LIT(x) x##ULL
266 typedef word64 lword;
267 const lword LWORD_MAX = W64LIT(0xffffffffffffffff);
275 #if (defined(_MSC_VER) && defined(__clang__))
276 # error: "Unsupported configuration"
280 #define CRYPTOPP_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
283 #if defined(__xlc__) || defined(__xlC__)
284 #define CRYPTOPP_XLC_VERSION ((__xlC__ / 256) * 10000 + (__xlC__ % 256) * 100)
288 #if defined(__clang__) && defined(__apple_build_version__)
289 #define CRYPTOPP_APPLE_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
290 #elif defined(__clang__)
291 #define CRYPTOPP_LLVM_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
295 #define CRYPTOPP_MSC_VERSION (_MSC_VER)
299 #if (CRYPTOPP_GCC_VERSION >= 40600) || (CRYPTOPP_LLVM_CLANG_VERSION >= 10700) || (CRYPTOPP_APPLE_CLANG_VERSION >= 20000)
300 #define CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 1
305 #if (defined(_MSC_VER) && (!defined(__INTEL_COMPILER) || __INTEL_COMPILER >= 1000) && (defined(_M_X64) || defined(_M_IA64))) || (defined(__DECCXX) && defined(__alpha__)) || (defined(__INTEL_COMPILER) && defined(__x86_64__)) || (defined(__SUNPRO_CC) && defined(__x86_64__))
306 typedef word32 hword;
309 #define CRYPTOPP_NATIVE_DWORD_AVAILABLE 1
310 #if defined(__alpha__) || defined(__ia64__) || defined(_ARCH_PPC64) || defined(__x86_64__) || defined(__mips64) || defined(__sparc64__)
311 #if ((CRYPTOPP_GCC_VERSION >= 30400) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30000) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300)) && (__SIZEOF_INT128__ >= 16)
315 typedef word32 hword;
317 typedef __uint128_t dword;
318 typedef __uint128_t word128;
319 #define CRYPTOPP_WORD128_AVAILABLE 1
322 typedef word16 hword;
324 typedef word64 dword;
328 #define CRYPTOPP_BOOL_SLOW_WORD64 1
329 typedef word16 hword;
331 typedef word64 dword;
334 #ifndef CRYPTOPP_BOOL_SLOW_WORD64
335 #define CRYPTOPP_BOOL_SLOW_WORD64 0
338 const unsigned int WORD_SIZE =
sizeof(word);
339 const unsigned int WORD_BITS = WORD_SIZE * 8;
343 #ifndef CRYPTOPP_L1_CACHE_LINE_SIZE
346 #if defined(_M_X64) || defined(__x86_64__) || defined(__arm64__) || defined(__aarch64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
347 #define CRYPTOPP_L1_CACHE_LINE_SIZE 64
350 #define CRYPTOPP_L1_CACHE_LINE_SIZE 32
358 #ifndef CRYPTOPP_ALIGN_DATA
359 #if defined(_MSC_VER)
360 #define CRYPTOPP_ALIGN_DATA(x) __declspec(align(x))
361 #elif defined(__GNUC__) || (__SUNPRO_CC >= 0x5100)
362 #define CRYPTOPP_ALIGN_DATA(x) __attribute__((aligned(x)))
363 #elif defined(__xlc__) || defined(__xlC__)
364 #define CRYPTOPP_ALIGN_DATA(x) __attribute__((aligned(x)))
366 #define CRYPTOPP_ALIGN_DATA(x)
371 #if ((defined(__MACH__) && defined(__APPLE__)) && ((CRYPTOPP_LLVM_CLANG_VERSION >= 30600) || (CRYPTOPP_APPLE_CLANG_VERSION >= 70100) || (CRYPTOPP_GCC_VERSION >= 40300)))
372 #define CRYPTOPP_SECTION_INIT __attribute__((section ("__DATA,__data")))
373 #elif (defined(__ELF__) && (CRYPTOPP_GCC_VERSION >= 40300))
374 #define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon")))
375 #elif defined(__ELF__) && (defined(__xlC__) || defined(__ibmxl__))
376 #define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon")))
378 #define CRYPTOPP_SECTION_INIT
381 #if defined(_MSC_VER) || defined(__fastcall)
382 #define CRYPTOPP_FASTCALL __fastcall
384 #define CRYPTOPP_FASTCALL
388 #define CRYPTOPP_NO_VTABLE __declspec(novtable)
390 #define CRYPTOPP_NO_VTABLE
398 # pragma warning(disable: 4127 4512 4661 4910)
401 # pragma warning(once: 4191 4242 4263 4264 4266 4302 4826 4905 4906 4928)
410 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
411 # pragma GCC diagnostic ignored "-Wunknown-pragmas"
412 # pragma GCC diagnostic ignored "-Wunused-function"
418 #if (defined(_MSC_VER) && _MSC_VER <= 1300) || defined(__MWERKS__) || (defined(_STLPORT_VERSION) && ((_STLPORT_VERSION < 0x450) || defined(_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)))
419 #define CRYPTOPP_DISABLE_UNCAUGHT_EXCEPTION
422 #ifndef CRYPTOPP_DISABLE_UNCAUGHT_EXCEPTION
423 #define CRYPTOPP_UNCAUGHT_EXCEPTION_AVAILABLE
433 #if (defined(__ILP32__) || defined(_ILP32)) && defined(__x86_64__)
434 #define CRYPTOPP_BOOL_X32 1
438 #if (defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(_X86_) || defined(__I86__) || defined(__INTEL__)) && !CRYPTOPP_BOOL_X32
439 #define CRYPTOPP_BOOL_X86 1
442 #if (defined(_M_X64) || defined(__x86_64__)) && !CRYPTOPP_BOOL_X32
443 #define CRYPTOPP_BOOL_X64 1
447 #if CRYPTOPP_BOOL_X32
448 # undef CRYPTOPP_BOOL_X64
449 # undef CRYPTOPP_X64_ASM_AVAILABLE
450 # undef CRYPTOPP_X64_MASM_AVAILABLE
454 #if defined(__arm64__) || defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
455 #define CRYPTOPP_BOOL_ARMV8 1
456 #elif defined(__arm__) || defined(_M_ARM)
457 #define CRYPTOPP_BOOL_ARM32 1
461 #if defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
462 #define CRYPTOPP_BOOL_PPC64 1
463 #elif defined(__powerpc__) || defined(_ARCH_PPC)
464 #define CRYPTOPP_BOOL_PPC32 1
468 #if defined(__mips64__)
469 #define CRYPTOPP_BOOL_MIPS64 1
470 #elif defined(__mips__)
471 #define CRYPTOPP_BOOL_MIPS32 1
474 #if defined(_MSC_VER) || defined(__BORLANDC__)
475 # define CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 1
477 # define CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 1
482 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
485 #if defined(CRYPTOPP_APPLE_CLANG_VERSION) && (CRYPTOPP_APPLE_CLANG_VERSION < 50000)
486 # define CRYPTOPP_DISABLE_ASM 1
491 #if !defined(CRYPTOPP_DISABLE_ASM) && defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5100)
492 # define CRYPTOPP_DISABLE_ASM 1
495 #if !defined(CRYPTOPP_DISABLE_ASM) && ((defined(_MSC_VER) && defined(_M_IX86)) || (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))))
497 #define CRYPTOPP_X86_ASM_AVAILABLE 1
499 #if !defined(CRYPTOPP_DISABLE_SSE2) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__))
500 #define CRYPTOPP_SSE2_ASM_AVAILABLE 1
503 #if !defined(CRYPTOPP_DISABLE_SSSE3) && (_MSC_VER >= 1500 || CRYPTOPP_GCC_VERSION >= 40300 || defined(__SSSE3__))
504 #define CRYPTOPP_SSSE3_ASM_AVAILABLE 1
508 #if !defined(CRYPTOPP_DISABLE_ASM) && defined(_MSC_VER) && defined(_M_X64)
509 #define CRYPTOPP_X64_MASM_AVAILABLE 1
512 #if !defined(CRYPTOPP_DISABLE_ASM) && defined(__GNUC__) && defined(__x86_64__)
513 #define CRYPTOPP_X64_ASM_AVAILABLE 1
517 #if !defined(CRYPTOPP_DISABLE_ASM) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__) || (__SUNPRO_CC >= 0x5100))
518 #define CRYPTOPP_SSE2_INTRIN_AVAILABLE 1
521 #if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_SSSE3)
522 # if defined(__SSSE3__) || (_MSC_VER >= 1500) || \
523 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \
524 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000)
525 #define CRYPTOPP_SSSE3_AVAILABLE 1
532 #if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \
533 (defined(__SSE4_1__) || (CRYPTOPP_MSC_VERSION >= 1500) || \
534 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \
535 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000))
536 #define CRYPTOPP_SSE41_AVAILABLE 1
539 #if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \
540 (defined(__SSE4_2__) || (CRYPTOPP_MSC_VERSION >= 1500) || (__SUNPRO_CC >= 0x5110) || \
541 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || \
542 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000))
543 #define CRYPTOPP_SSE42_AVAILABLE 1
548 #if defined(CRYPTOPP_DISABLE_AESNI)
549 #define CRYPTOPP_DISABLE_CLMUL 1
553 #if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_CLMUL) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
554 (defined(__PCLMUL__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \
555 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \
556 (CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300))
557 #define CRYPTOPP_CLMUL_AVAILABLE 1
561 #if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_AESNI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
562 (defined(__AES__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \
563 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \
564 (CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300))
565 #define CRYPTOPP_AESNI_AVAILABLE 1
569 #if !defined(CRYPTOPP_DISABLE_AVX) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
570 (defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \
571 (CRYPTOPP_GCC_VERSION >= 40700) || (__INTEL_COMPILER >= 1400) || \
572 (CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600))
573 #define CRYPTOPP_AVX_AVAILABLE 1
577 #if !defined(CRYPTOPP_DISABLE_AVX2) && defined(CRYPTOPP_AVX_AVAILABLE) && \
578 (defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \
579 (CRYPTOPP_GCC_VERSION >= 40900) || (__INTEL_COMPILER >= 1400) || \
580 (CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600))
581 #define CRYPTOPP_AVX2_AVAILABLE 1
586 #if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_SHANI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
587 (defined(__SHA__) || (CRYPTOPP_MSC_VERSION >= 1900) || (__SUNPRO_CC >= 0x5160) || \
588 (CRYPTOPP_GCC_VERSION >= 40900) || (__INTEL_COMPILER >= 1300) || \
589 (CRYPTOPP_LLVM_CLANG_VERSION >= 30400) || (CRYPTOPP_APPLE_CLANG_VERSION >= 50100))
590 #define CRYPTOPP_SHANI_AVAILABLE 1
594 #if (defined(__ANDROID__) || defined(ANDROID))
595 # if (CRYPTOPP_BOOL_X86)
596 # undef CRYPTOPP_SSE41_AVAILABLE
597 # undef CRYPTOPP_SSE42_AVAILABLE
598 # undef CRYPTOPP_CLMUL_AVAILABLE
599 # undef CRYPTOPP_AESNI_AVAILABLE
600 # undef CRYPTOPP_SHANI_AVAILABLE
602 # if (CRYPTOPP_BOOL_X64)
603 # undef CRYPTOPP_CLMUL_AVAILABLE
604 # undef CRYPTOPP_AESNI_AVAILABLE
605 # undef CRYPTOPP_SHANI_AVAILABLE
610 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5130)
611 # undef CRYPTOPP_AESNI_AVAILABLE
616 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5150)
617 # undef CRYPTOPP_CLMUL_AVAILABLE
624 #if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8)
628 #if (CRYPTOPP_BIG_ENDIAN)
629 # define CRYPTOPP_DISABLE_ASM 1
635 #if !defined(CRYPTOPP_ARM_NEON_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
636 # if defined(__arm__) || defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(_M_ARM)
637 # if (CRYPTOPP_GCC_VERSION >= 40300) || (CRYPTOPP_CLANG_VERSION >= 20800) || \
638 (CRYPTOPP_MSC_VERSION >= 1700)
639 # define CRYPTOPP_ARM_NEON_AVAILABLE 1
647 #if !defined(CRYPTOPP_ARM_ASIMD_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
648 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
649 # if defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(__ARM_FEATURE_ASIMD) || \
650 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 30300) || \
651 (CRYPTOPP_MSC_VERSION >= 1916)
652 # define CRYPTOPP_ARM_NEON_AVAILABLE 1
653 # define CRYPTOPP_ARM_ASIMD_AVAILABLE 1
661 #if !defined(CRYPTOPP_ARM_CRC32_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
662 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
663 # if defined(__ARM_FEATURE_CRC32) || (CRYPTOPP_GCC_VERSION >= 40800) || \
664 (CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
665 # define CRYPTOPP_ARM_CRC32_AVAILABLE 1
673 #if !defined(CRYPTOPP_ARM_PMULL_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
674 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
675 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
676 (CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
677 # define CRYPTOPP_ARM_PMULL_AVAILABLE 1
685 #if !defined(CRYPTOPP_ARM_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
686 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
687 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
688 (CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1910)
689 # define CRYPTOPP_ARM_AES_AVAILABLE 1
697 #if !defined(CRYPTOPP_ARM_SHA_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
698 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
699 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
700 (CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
701 # define CRYPTOPP_ARM_SHA1_AVAILABLE 1
702 # define CRYPTOPP_ARM_SHA2_AVAILABLE 1
710 #if !defined(CRYPTOPP_ARM_SHA_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
711 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
712 # if defined(__ARM_FEATURE_SHA3) || (CRYPTOPP_GCC_VERSION >= 80000) || \
713 (CRYPTOPP_MSC_VERSION >= 5000)
714 # define CRYPTOPP_ARM_SHA512_AVAILABLE 1
715 # define CRYPTOPP_ARM_SHA3_AVAILABLE 1
723 #if !defined(CRYPTOPP_ARM_SM3_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
724 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
725 # if defined(__ARM_FEATURE_SM3) || (CRYPTOPP_GCC_VERSION >= 80000) || \
726 (CRYPTOPP_MSC_VERSION >= 5000)
727 # define CRYPTOPP_ARM_SM3_AVAILABLE 1
728 # define CRYPTOPP_ARM_SM4_AVAILABLE 1
734 #if !defined(CRYPTOPP_ARM_ACLE_AVAILABLE)
735 # if defined(__aarch32__) || defined(__aarch64__) || (__ARM_ARCH >= 8) || defined(__ARM_ACLE)
736 # if !defined(__ANDROID__) && !defined(ANDROID) && !defined(__APPLE__)
737 # define CRYPTOPP_ARM_ACLE_AVAILABLE 1
744 #if defined(CRYPTOPP_APPLE_CLANG_VERSION) && (CRYPTOPP_APPLE_CLANG_VERSION < 70000)
745 # undef CRYPTOPP_ARM_PMULL_AVAILABLE
749 #if (defined(__ANDROID__) || defined(ANDROID)) && !defined(__ARM_FEATURE_CRC32)
750 # undef CRYPTOPP_ARM_CRC32_AVAILABLE
754 #if (defined(__ANDROID__) || defined(ANDROID)) && !defined(__ARM_FEATURE_CRYPTO)
755 # undef CRYPTOPP_ARM_PMULL_AVAILABLE
756 # undef CRYPTOPP_ARM_AES_AVAILABLE
757 # undef CRYPTOPP_ARM_SHA1_AVAILABLE
758 # undef CRYPTOPP_ARM_SHA2_AVAILABLE
767 #if !defined(CRYPTOPP_DISABLE_ASM) && defined(__arm__)
768 # if defined(__GNUC__) && !defined(__clang__)
769 # define CRYPTOGAMS_ARM_AES 1
777 #if (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
779 #if defined(CRYPTOPP_DISABLE_ALTIVEC) || defined(CRYPTOPP_DISABLE_ASM)
780 # undef CRYPTOPP_DISABLE_ALTIVEC
781 # undef CRYPTOPP_DISABLE_POWER7
782 # undef CRYPTOPP_DISABLE_POWER8
783 # undef CRYPTOPP_DISABLE_POWER9
784 # define CRYPTOPP_DISABLE_ALTIVEC 1
785 # define CRYPTOPP_DISABLE_POWER7 1
786 # define CRYPTOPP_DISABLE_POWER8 1
787 # define CRYPTOPP_DISABLE_POWER9 1
791 #if !defined(CRYPTOPP_ALTIVEC_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ALTIVEC)
792 # if defined(_ARCH_PWR4) || defined(__ALTIVEC__) || \
793 (CRYPTOPP_XLC_VERSION >= 100000) || (CRYPTOPP_GCC_VERSION >= 40001) || \
794 (CRYPTOPP_CLANG_VERSION >= 20900)
795 # define CRYPTOPP_ALTIVEC_AVAILABLE 1
800 #if !defined(CRYPTOPP_POWER7_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER7) && defined(CRYPTOPP_ALTIVEC_AVAILABLE)
801 # if defined(_ARCH_PWR7) || (CRYPTOPP_XLC_VERSION >= 100000) || \
802 (CRYPTOPP_GCC_VERSION >= 40100) || (CRYPTOPP_CLANG_VERSION >= 30100)
803 # define CRYPTOPP_POWER7_AVAILABLE 1
808 #if !defined(CRYPTOPP_POWER8_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8) && defined(CRYPTOPP_POWER7_AVAILABLE)
809 # if defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \
810 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 70000)
811 # define CRYPTOPP_POWER8_AVAILABLE 1
816 #if !defined(CRYPTOPP_POWER9_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER9) && defined(CRYPTOPP_POWER8_AVAILABLE)
817 # if defined(_ARCH_PWR9) || (CRYPTOPP_XLC_VERSION >= 130200) || \
818 (CRYPTOPP_GCC_VERSION >= 70000) || (CRYPTOPP_CLANG_VERSION >= 80000)
819 # define CRYPTOPP_POWER9_AVAILABLE 1
823 #if !defined(CRYPTOPP_POWER8_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8_AES) && defined(CRYPTOPP_POWER8_AVAILABLE)
824 # if defined(__CRYPTO__) || defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \
825 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 70000)
827 # define CRYPTOPP_POWER8_AES_AVAILABLE 1
828 # define CRYPTOPP_POWER8_VMULL_AVAILABLE 1
829 # define CRYPTOPP_POWER8_SHA_AVAILABLE 1
838 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) && !defined(CRYPTOPP_DISABLE_ASM)
839 #define CRYPTOPP_BOOL_ALIGN16 1
841 #define CRYPTOPP_BOOL_ALIGN16 0
846 #if defined(_MSC_VER)
847 #define CRYPTOPP_MM_MALLOC_AVAILABLE
848 #elif defined(__linux__) || defined(__sun__) || defined(__CYGWIN__)
849 #define CRYPTOPP_MEMALIGN_AVAILABLE
850 #elif defined(__APPLE__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
851 #define CRYPTOPP_MALLOC_ALIGNMENT_IS_16
852 #elif (defined(_GNU_SOURCE) || ((_XOPEN_SOURCE + 0) >= 600)) && (_POSIX_ADVISORY_INFO > 0)
853 #define CRYPTOPP_POSIX_MEMALIGN_AVAILABLE
855 #define CRYPTOPP_NO_ALIGNED_ALLOC
859 #if defined(_MSC_VER)
860 # define CRYPTOPP_NOINLINE_DOTDOTDOT
861 # define CRYPTOPP_NOINLINE __declspec(noinline)
862 #elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__)
863 # define CRYPTOPP_NOINLINE_DOTDOTDOT ...
864 # define CRYPTOPP_NOINLINE __attribute__((noinline))
865 #elif defined(__GNUC__)
866 # define CRYPTOPP_NOINLINE_DOTDOTDOT
867 # define CRYPTOPP_NOINLINE __attribute__((noinline))
869 # define CRYPTOPP_NOINLINE_DOTDOTDOT ...
870 # define CRYPTOPP_NOINLINE
874 #if defined(CRYPTOPP_DOXYGEN_PROCESSING) || defined(__BORLANDC__)
875 # define CRYPTOPP_CONSTANT(x) static const int x;
877 # define CRYPTOPP_CONSTANT(x) enum {x};
888 #if defined(__APPLE__)
889 # define CRYPTOPP_NO_CPU_FEATURE_PROBES 1
901 #ifndef CRYPTOPP_INIT_PRIORITY
902 # define CRYPTOPP_INIT_PRIORITY 250
908 #ifndef CRYPTOPP_USER_PRIORITY
909 # define CRYPTOPP_USER_PRIORITY (CRYPTOPP_INIT_PRIORITY+101)
913 #if (CRYPTOPP_INIT_PRIORITY > 0) && !(defined(NO_OS_DEPENDENCE) || defined(__APPLE__) || defined(__sun__))
914 # if (CRYPTOPP_GCC_VERSION >= 30000) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (_INTEL_COMPILER >= 800)
915 # define HAVE_GCC_INIT_PRIORITY 1
916 # elif (CRYPTOPP_MSC_VERSION >= 1310)
917 # define HAVE_MSC_INIT_PRIORITY 1
918 # elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__)
919 # define HAVE_XLC_INIT_PRIORITY 1
925 #ifndef NO_OS_DEPENDENCE
927 #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
928 #define CRYPTOPP_WIN32_AVAILABLE
931 #if defined(__unix__) || defined(__MACH__) || defined(__NetBSD__) || defined(__sun)
932 #define CRYPTOPP_UNIX_AVAILABLE
935 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
936 #define CRYPTOPP_BSD_AVAILABLE
939 #if defined(CRYPTOPP_WIN32_AVAILABLE) || defined(CRYPTOPP_UNIX_AVAILABLE)
940 # define HIGHRES_TIMER_AVAILABLE
943 #ifdef CRYPTOPP_WIN32_AVAILABLE
944 # if !defined(WINAPI_FAMILY)
945 # define THREAD_TIMER_AVAILABLE
946 # elif defined(WINAPI_FAMILY)
947 # if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
948 # define THREAD_TIMER_AVAILABLE
953 #if defined(CRYPTOPP_UNIX_AVAILABLE) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
954 # define NONBLOCKING_RNG_AVAILABLE
955 # define BLOCKING_RNG_AVAILABLE
956 # define OS_RNG_AVAILABLE
960 #if defined(CRYPTOPP_UNIX_AVAILABLE)
961 # define UNIX_SIGNALS_AVAILABLE 1
964 #ifdef CRYPTOPP_WIN32_AVAILABLE
965 # if !defined(WINAPI_FAMILY)
966 # define NONBLOCKING_RNG_AVAILABLE
967 # define OS_RNG_AVAILABLE
968 # elif defined(WINAPI_FAMILY)
969 # if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
970 # define NONBLOCKING_RNG_AVAILABLE
971 # define OS_RNG_AVAILABLE
972 # elif !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
973 # if ((WINVER >= 0x0A00 ) || (_WIN32_WINNT >= 0x0A00 ))
974 # define NONBLOCKING_RNG_AVAILABLE
975 # define OS_RNG_AVAILABLE
985 #if defined(CRYPTOPP_WIN32_AVAILABLE) && !defined(CRYPTOPP_DOXYGEN_PROCESSING)
987 #ifdef CRYPTOPP_EXPORTS
988 #define CRYPTOPP_IS_DLL
989 #define CRYPTOPP_DLL __declspec(dllexport)
990 #elif defined(CRYPTOPP_IMPORTS)
991 #define CRYPTOPP_IS_DLL
992 #define CRYPTOPP_DLL __declspec(dllimport)
998 #define CRYPTOPP_TABLE extern
999 #define CRYPTOPP_API __cdecl
1004 #define CRYPTOPP_TABLE extern
1005 #define CRYPTOPP_DLL
1006 #define CRYPTOPP_API
1010 #if defined(__MWERKS__)
1011 #define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern class CRYPTOPP_DLL
1012 #elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
1013 #define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
1015 #define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
1018 #if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
1019 #define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
1021 #define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS
1024 #if defined(__MWERKS__)
1025 #define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern class
1026 #elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
1027 #define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS template class
1029 #define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern template class
1032 #if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
1033 #define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
1035 #define CRYPTOPP_STATIC_TEMPLATE_CLASS CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS
1042 #define CRYPTOPP_UNUSED(x) ((void)(x))
1046 #if (CRYPTOPP_GCC_VERSION >= 40500) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40200)
1047 # define CRYPTOPP_DEPRECATED(msg) __attribute__((deprecated (msg)))
1048 #elif (CRYPTOPP_GCC_VERSION)
1049 # define CRYPTOPP_DEPRECATED(msg) __attribute__((deprecated))
1051 # define CRYPTOPP_DEPRECATED(msg)
1063 #ifndef __has_feature
1064 # define __has_feature(x) 0
1067 #if !defined(CRYPTOPP_NO_CXX11)
1068 # if ((_MSC_VER >= 1600) || (__cplusplus >= 201103L)) && !defined(_STLPORT_VERSION)
1069 # define CRYPTOPP_CXX11 1
1078 #if defined(__APPLE__) && defined(__clang__)
1079 # if !(defined(__has_include) && __has_include(<forward_list>))
1080 # undef CRYPTOPP_CXX11
1085 #if defined(CRYPTOPP_CXX11)
1088 #if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_atomic) || \
1089 (__INTEL_COMPILER >= 1300) || (CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5140)
1090 # define CRYPTOPP_CXX11_ATOMICS 1
1095 #if (CRYPTOPP_MSC_VERSION >= 1700) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || \
1096 (CRYPTOPP_APPLE_CLANG_VERSION >= 50000) || (__INTEL_COMPILER >= 1200) || \
1097 (CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5130)
1104 # if !defined(__GLIBCXX__) || defined(_GLIBCXX_HAS_GTHREADS)
1105 # define CRYPTOPP_CXX11_SYNCHRONIZATION 1
1113 #if (CRYPTOPP_MSC_VERSION >= 1900) && ((WINVER >= 0x0600) || (_WIN32_WINNT >= 0x0600)) || \
1114 (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000) || \
1115 (__INTEL_COMPILER >= 1110) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
1116 # define CRYPTOPP_CXX11_DYNAMIC_INIT 1
1120 #if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_alignas) || \
1121 (__INTEL_COMPILER >= 1500) || (CRYPTOPP_GCC_VERSION >= 40800) || (__SUNPRO_CC >= 0x5130)
1122 # define CRYPTOPP_CXX11_ALIGNAS 1
1126 #if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_alignof) || \
1127 (__INTEL_COMPILER >= 1500) || (CRYPTOPP_GCC_VERSION >= 40500) || (__SUNPRO_CC >= 0x5130)
1128 # define CRYPTOPP_CXX11_ALIGNOF 1
1132 #if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_lambdas) || \
1133 (__INTEL_COMPILER >= 1200) || (CRYPTOPP_GCC_VERSION >= 40900) || (__SUNPRO_CC >= 0x5140)
1134 # define CRYPTOPP_CXX11_LAMBDA 1
1138 #if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_noexcept) || \
1139 (__INTEL_COMPILER >= 1400) || (CRYPTOPP_GCC_VERSION >= 40600) || (__SUNPRO_CC >= 0x5130)
1140 # define CRYPTOPP_CXX11_NOEXCEPT 1
1144 #if (CRYPTOPP_MSC_VERSION >= 1800) || __has_feature(cxx_variadic_templates) || \
1145 (__INTEL_COMPILER >= 1210) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
1146 # define CRYPTOPP_CXX11_VARIADIC_TEMPLATES 1
1151 #if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_constexpr) || \
1152 (__INTEL_COMPILER >= 1600) || (CRYPTOPP_GCC_VERSION >= 40600) || (__SUNPRO_CC >= 0x5130)
1153 # define CRYPTOPP_CXX11_CONSTEXPR 1
1158 #if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_strong_enums) || \
1159 (__INTEL_COMPILER >= 1400) || (CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5120)
1160 # define CRYPTOPP_CXX11_ENUM 1
1164 #if (CRYPTOPP_MSC_VERSION >= 1600) || __has_feature(cxx_nullptr) || \
1165 (__INTEL_COMPILER >= 1000) || (CRYPTOPP_GCC_VERSION >= 40600) || \
1166 (__SUNPRO_CC >= 0x5130) || defined(__IBMCPP_NULLPTR)
1167 # define CRYPTOPP_CXX11_NULLPTR 1
1175 #if defined(CRYPTOPP_CXX11) && !defined(CRYPTOPP_NO_CXX17)
1176 # if ((_MSC_VER >= 1900) || (__cplusplus >= 201703L)) && !defined(_STLPORT_VERSION)
1177 # define CRYPTOPP_CXX17 1
1182 #if defined(CRYPTOPP_CXX17)
1186 #if defined(__clang__)
1187 # if __EXCEPTIONS && __has_feature(cxx_exceptions)
1188 # if __cpp_lib_uncaught_exceptions
1189 # define CRYPTOPP_CXX17_EXCEPTIONS 1
1192 #elif (CRYPTOPP_MSC_VERSION >= 1900) || (__INTEL_COMPILER >= 1800) || (CRYPTOPP_GCC_VERSION >= 60000) || (__cpp_lib_uncaught_exceptions)
1193 # define CRYPTOPP_CXX17_EXCEPTIONS 1
1200 #if defined(CRYPTOPP_CXX11_NOEXCEPT)
1201 # define CRYPTOPP_THROW noexcept(false)
1202 # define CRYPTOPP_NO_THROW noexcept(true)
1204 # define CRYPTOPP_THROW
1205 # define CRYPTOPP_NO_THROW
1209 #if defined(CRYPTOPP_CXX11_CONSTEXPR)
1210 # define CRYPTOPP_STATIC_CONSTEXPR static constexpr
1211 # define CRYPTOPP_CONSTEXPR constexpr
1213 # define CRYPTOPP_STATIC_CONSTEXPR static
1214 # define CRYPTOPP_CONSTEXPR
1218 #if defined(CRYPTOPP_CXX11_ALIGNAS)
1219 # undef CRYPTOPP_ALIGN_DATA
1220 # define CRYPTOPP_ALIGN_DATA(x) alignas(x)
1232 #if defined(CRYPTOPP_CXX11_ENUM)
1233 # undef CRYPTOPP_CONSTANT
1234 # define CRYPTOPP_CONSTANT(x) enum : int { x };
1235 #elif defined(CRYPTOPP_CXX11_CONSTEXPR)
1236 # undef CRYPTOPP_CONSTANT
1237 # define CRYPTOPP_CONSTANT(x) constexpr static int x;
1241 #if defined(CRYPTOPP_CXX11_NULLPTR) && !defined(NULLPTR)
1242 # define NULLPTR nullptr
1243 #elif !defined(NULLPTR)
1244 # define NULLPTR NULL
1249 #if (defined(__cplusplus) && (__cplusplus >= 199711L) && (__cplusplus < 201402L)) && !defined(CRYPTOPP_UNCAUGHT_EXCEPTION_AVAILABLE)
1250 # error "std::uncaught_exception is not available. This is likely a configuration error."
Crypto++ library namespace.