2017-01-27 12:05:45 +00:00
|
|
|
// config.h - originally written and placed in the public domain by Wei Dai
|
2015-11-18 20:32:28 +00:00
|
|
|
|
2017-11-29 15:54:33 +00:00
|
|
|
/// \file config.h
|
|
|
|
/// \brief Library configuration file
|
2015-11-18 20:32:28 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#ifndef CRYPTOPP_CONFIG_H
|
|
|
|
#define CRYPTOPP_CONFIG_H
|
|
|
|
|
|
|
|
// ***************** Important Settings ********************
|
|
|
|
|
|
|
|
// define this if running on a big-endian CPU
|
2018-10-28 08:24:22 +00:00
|
|
|
// big endian will be assumed if CRYPTOPP_LITTLE_ENDIAN is not non-0
|
2018-10-28 07:42:50 +00:00
|
|
|
#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__)))
|
2017-11-10 19:15:30 +00:00
|
|
|
# define CRYPTOPP_BIG_ENDIAN 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// define this if running on a little-endian CPU
|
2018-10-28 08:24:22 +00:00
|
|
|
// big endian will be assumed if CRYPTOPP_LITTLE_ENDIAN is not non-0
|
2018-10-28 07:42:50 +00:00
|
|
|
#if !defined(CRYPTOPP_BIG_ENDIAN) && !defined(CRYPTOPP_LITTLE_ENDIAN)
|
2017-11-10 19:15:30 +00:00
|
|
|
# define CRYPTOPP_LITTLE_ENDIAN 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2017-09-11 07:05:04 +00:00
|
|
|
// Sanity checks. Some processors have more than big, little and bi-endian modes. PDP mode, where order results in "4312", should
|
|
|
|
// raise red flags immediately. Additionally, mis-classified machines, like (previosuly) S/390, should raise red flags immediately.
|
2018-10-28 08:24:22 +00:00
|
|
|
#if (CRYPTOPP_BIG_ENDIAN) && defined(__GNUC__) && defined(__BYTE_ORDER__) && (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)
|
|
|
|
# error "(CRYPTOPP_BIG_ENDIAN) is set, but __BYTE_ORDER__ is not __ORDER_BIG_ENDIAN__"
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
2018-10-28 08:24:22 +00:00
|
|
|
#if (CRYPTOPP_LITTLE_ENDIAN) && defined(__GNUC__) && defined(__BYTE_ORDER__) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
|
|
|
|
# error "(CRYPTOPP_LITTLE_ENDIAN) is set, but __BYTE_ORDER__ is not __ORDER_LITTLE_ENDIAN__"
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2016-01-08 11:53:27 +00:00
|
|
|
// Define this if you want to disable all OS-dependent features,
|
2015-11-05 06:59:46 +00:00
|
|
|
// such as sockets and OS-provided random number generators
|
|
|
|
// #define NO_OS_DEPENDENCE
|
|
|
|
|
|
|
|
// Define this to use features provided by Microsoft's CryptoAPI.
|
2016-05-03 04:23:05 +00:00
|
|
|
// Currently the only feature used is Windows random number generation.
|
2015-11-05 06:59:46 +00:00
|
|
|
// This macro will be ignored if NO_OS_DEPENDENCE is defined.
|
2016-05-03 04:23:05 +00:00
|
|
|
// #define USE_MS_CRYPTOAPI
|
|
|
|
|
|
|
|
// Define this to use features provided by Microsoft's CryptoNG API.
|
|
|
|
// CryptoNG API is available in Vista and above and its cross platform,
|
|
|
|
// including desktop apps and store apps. Currently the only feature
|
|
|
|
// used is Windows random number generation.
|
|
|
|
// This macro will be ignored if NO_OS_DEPENDENCE is defined.
|
|
|
|
// #define USE_MS_CNGAPI
|
|
|
|
|
2017-06-24 21:41:20 +00:00
|
|
|
// If the user did not make a choice, then select CryptoNG if
|
|
|
|
// targeting Windows 8 or above.
|
2016-05-03 04:23:05 +00:00
|
|
|
#if !defined(USE_MS_CRYPTOAPI) && !defined(USE_MS_CNGAPI)
|
2017-06-24 21:41:20 +00:00
|
|
|
# if !defined(_USING_V110_SDK71_) && ((WINVER >= 0x0602 /*_WIN32_WINNT_WIN8*/) || (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/))
|
2016-05-03 04:23:05 +00:00
|
|
|
# define USE_MS_CNGAPI
|
|
|
|
# else
|
|
|
|
# define USE_MS_CRYPTOAPI
|
|
|
|
# endif
|
|
|
|
#endif
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2018-03-05 11:47:05 +00:00
|
|
|
// Define this to disable ASM, intrinsics and built-ins. The library will be
|
2018-02-17 15:51:55 +00:00
|
|
|
// compiled using C++ only. The library code will not include SSE2 (and
|
2018-12-09 15:24:55 +00:00
|
|
|
// above), NEON, Aarch32, Aarch64, or Altivec (and above). Note the compiler
|
2018-03-05 11:47:05 +00:00
|
|
|
// may use higher ISAs depending on compiler options, but the library will not
|
2018-10-27 16:46:01 +00:00
|
|
|
// explictly use the ISAs. When disabling ASM, it is best to do it from
|
|
|
|
// config.h to ensure the library and all programs share the setting.
|
2018-02-17 15:51:55 +00:00
|
|
|
// #define CRYPTOPP_DISABLE_ASM 1
|
|
|
|
|
2018-10-20 10:31:51 +00:00
|
|
|
// https://github.com/weidai11/cryptopp/issues/719
|
|
|
|
#if defined(__native_client__)
|
|
|
|
# define CRYPTOPP_DISABLE_ASM 1
|
|
|
|
#endif
|
|
|
|
|
2017-11-06 14:09:45 +00:00
|
|
|
// Define CRYPTOPP_NO_CXX11 to avoid C++11 related features shown at the
|
|
|
|
// end of this file. Some compilers and standard C++ headers advertise C++11
|
|
|
|
// but they are really just C++03 with some additional C++11 headers and
|
|
|
|
// non-conforming classes. You might also consider `-std=c++03` or
|
|
|
|
// `-std=gnu++03`, but they are required options when building the library
|
|
|
|
// and all programs. CRYPTOPP_NO_CXX11 is probably easier to manage but it may
|
|
|
|
// cause -Wterminate warnings under GCC. MSVC++ has a similar warning.
|
|
|
|
// Also see https://github.com/weidai11/cryptopp/issues/529
|
|
|
|
// #define CRYPTOPP_NO_CXX11 1
|
|
|
|
|
2018-03-05 11:47:05 +00:00
|
|
|
// Define CRYPTOPP_NO_CXX17 to avoid C++17 related features shown at the end of
|
|
|
|
// this file. At the moment it should only affect std::uncaught_exceptions.
|
|
|
|
// #define CRYPTOPP_NO_CXX17 1
|
|
|
|
|
2018-07-11 15:40:25 +00:00
|
|
|
// CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS is no longer honored. It
|
|
|
|
// was removed at https://github.com/weidai11/cryptopp/issues/682
|
2017-11-06 14:09:45 +00:00
|
|
|
// #define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS 1
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
// ***************** Less Important Settings ***************
|
|
|
|
|
2017-01-27 11:02:58 +00:00
|
|
|
// Library version macro. Since this macro is in a header, it reflects
|
|
|
|
// the version of the library the headers came from. It is not
|
|
|
|
// necessarily the version of the library built as a shared object if
|
|
|
|
// versions are inadvertently mixed and matched.
|
2018-12-28 13:25:44 +00:00
|
|
|
#define CRYPTOPP_VERSION 810
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2015-12-26 04:50:28 +00:00
|
|
|
// Define this if you want to set a prefix for TestData/ and TestVectors/
|
2018-12-07 17:25:52 +00:00
|
|
|
// Be sure to add the trailing slash since its simple concatenation.
|
|
|
|
// After https://github.com/weidai11/cryptopp/issues/760 the library
|
|
|
|
// should find the test vectors and data without much effort. It
|
|
|
|
// will search in "./" and "$ORIGIN/../share/cryptopp" automatically.
|
2015-12-26 04:50:28 +00:00
|
|
|
#ifndef CRYPTOPP_DATA_DIR
|
|
|
|
# define CRYPTOPP_DATA_DIR ""
|
|
|
|
#endif
|
|
|
|
|
2018-12-07 17:25:52 +00:00
|
|
|
// Define this to disable the test suite from searching for test
|
|
|
|
// vectors and data in "./" and "$ORIGIN/../share/cryptopp". The
|
|
|
|
// library will still search in CRYPTOPP_DATA_DIR, regardless.
|
|
|
|
// Some distros may want to disable this feature. Also see
|
|
|
|
// https://github.com/weidai11/cryptopp/issues/760
|
|
|
|
// #ifndef CRYPTOPP_DISABLE_DATA_DIR_SEARCH
|
|
|
|
// # define CRYPTOPP_DISABLE_DATA_DIR_SEARCH
|
|
|
|
// #endif
|
|
|
|
|
2015-11-18 20:32:28 +00:00
|
|
|
// Define this if you want or need the library's memcpy_s and memmove_s.
|
|
|
|
// See http://github.com/weidai11/cryptopp/issues/28.
|
|
|
|
// #if !defined(CRYPTOPP_WANT_SECURE_LIB)
|
|
|
|
// # define CRYPTOPP_WANT_SECURE_LIB
|
|
|
|
// #endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// File system code to write to GZIP archive.
|
2017-08-17 16:33:43 +00:00
|
|
|
// http://www.gzip.org/format.txt
|
2015-11-18 20:32:28 +00:00
|
|
|
#if !defined(GZIP_OS_CODE)
|
2017-08-17 16:33:43 +00:00
|
|
|
# if defined(__macintosh__)
|
|
|
|
# define GZIP_OS_CODE 7
|
|
|
|
# elif defined(__unix__) || defined(__linux__)
|
|
|
|
# define GZIP_OS_CODE 3
|
|
|
|
# else
|
|
|
|
# define GZIP_OS_CODE 0
|
|
|
|
# endif
|
2015-11-18 20:32:28 +00:00
|
|
|
#endif
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
// Try this if your CPU has 256K internal cache or a slow multiply instruction
|
|
|
|
// and you want a (possibly) faster IDEA implementation using log tables
|
|
|
|
// #define IDEA_LARGECACHE
|
|
|
|
|
|
|
|
// Define this if, for the linear congruential RNG, you want to use
|
|
|
|
// the original constants as specified in S.K. Park and K.W. Miller's
|
|
|
|
// CACM paper.
|
|
|
|
// #define LCRNG_ORIGINAL_NUMBERS
|
|
|
|
|
2016-01-13 21:38:56 +00:00
|
|
|
// Define this if you want Integer's operator<< to honor std::showbase (and
|
|
|
|
// std::noshowbase). If defined, Integer will use a suffix of 'b', 'o', 'h'
|
|
|
|
// or '.' (the last for decimal) when std::showbase is in effect. If
|
|
|
|
// std::noshowbase is set, then the suffix is not added to the Integer. If
|
|
|
|
// not defined, existing behavior is preserved and Integer will use a suffix
|
|
|
|
// of 'b', 'o', 'h' or '.' (the last for decimal).
|
|
|
|
// #define CRYPTOPP_USE_STD_SHOWBASE
|
|
|
|
|
2017-11-23 07:22:27 +00:00
|
|
|
// Define this if ARMv8 shifts are slow. ARM Cortex-A53 and Cortex-A57 shift
|
|
|
|
// operation perform poorly, so NEON and ASIMD code that relies on shifts
|
2018-01-25 20:59:47 +00:00
|
|
|
// or rotates often performs worse than C/C++ code. Also see
|
2017-11-23 07:22:27 +00:00
|
|
|
// http://github.com/weidai11/cryptopp/issues/367.
|
|
|
|
#define CRYPTOPP_SLOW_ARMV8_SHIFT 1
|
|
|
|
|
2017-03-25 20:38:42 +00:00
|
|
|
// Define this if you want to decouple AlgorithmParameters and Integer
|
|
|
|
// The decoupling should make it easier for the linker to remove Integer
|
|
|
|
// related code for those who do not need Integer, and avoid a potential
|
|
|
|
// race during AssignIntToInteger pointer initialization. Also
|
|
|
|
// see http://github.com/weidai11/cryptopp/issues/389.
|
|
|
|
// #define CRYPTOPP_NO_ASSIGN_TO_INTEGER
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// set the name of Rijndael cipher, was "Rijndael" before version 5.3
|
|
|
|
#define CRYPTOPP_RIJNDAEL_NAME "AES"
|
|
|
|
|
2016-09-20 01:18:58 +00:00
|
|
|
// CRYPTOPP_DEBUG enables the library's CRYPTOPP_ASSERT. CRYPTOPP_ASSERT
|
|
|
|
// raises a SIGTRAP (Unix) or calls DebugBreak() (Windows). CRYPTOPP_ASSERT
|
|
|
|
// is only in effect when CRYPTOPP_DEBUG, DEBUG or _DEBUG is defined. Unlike
|
|
|
|
// Posix assert, CRYPTOPP_ASSERT is not affected by NDEBUG (or failure to
|
|
|
|
// define it).
|
|
|
|
// Also see http://github.com/weidai11/cryptopp/issues/277, CVE-2016-7420
|
|
|
|
#if (defined(DEBUG) || defined(_DEBUG)) && !defined(CRYPTOPP_DEBUG)
|
|
|
|
# define CRYPTOPP_DEBUG 1
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// ***************** Important Settings Again ********************
|
|
|
|
// But the defaults should be ok.
|
|
|
|
|
|
|
|
// namespace support is now required
|
|
|
|
#ifdef NO_NAMESPACE
|
|
|
|
# error namespace support is now required
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CRYPTOPP_DOXYGEN_PROCESSING
|
|
|
|
// Document the namespce exists. Put it here before CryptoPP is undefined below.
|
2017-11-29 15:54:33 +00:00
|
|
|
/// \namespace CryptoPP
|
|
|
|
/// \brief Crypto++ library namespace
|
|
|
|
/// \details Nearly all classes are located in the CryptoPP namespace. Within
|
|
|
|
/// the namespace, there are two additional namespaces.
|
|
|
|
/// <ul>
|
|
|
|
/// <li>Name - namespace for names used with \p NameValuePairs and documented in argnames.h
|
Add interface to TweetNaCl library (#566)
TweetNaCl is a compact reimplementation of the NaCl library by Daniel J. Bernstein, Bernard van Gastel, Wesley Janssen, Tanja Lange, Peter Schwabe and Sjaak Smetsers. The library is less than 20 KB in size and provides 25 of the NaCl library functions.
The compact library uses curve25519, XSalsa20, Poly1305 and SHA-512 as default primitives, and includes both x25519 key exchange and ed25519 signatures. The complete list of functions can be found in TweetNaCl: A crypto library in 100 tweets (20140917), Table 1, page 5.
Crypto++ retained the function names and signatures but switched to data types provided by <stdint.h> to promote interoperability with Crypto++ and avoid size problems on platforms like Cygwin. For example, NaCl typdef'd u64 as an unsigned long long, but Cygwin, MinGW and MSYS are LP64 systems (not LLP64 systems). In addition, Crypto++ was missing NaCl's signed 64-bit integer i64.
Crypto++ enforces the 0-key restriction due to small points. The TweetNaCl library allowed the 0-keys to small points. Also see RFC 7748, Elliptic Curves for Security, Section 6.
TweetNaCl is well written but not well optimized. It runs 2x to 3x slower than optimized routines from libsodium. However, the library is still 2x to 4x faster than the algorithms NaCl was designed to replace.
The Crypto++ wrapper for TweetNaCl requires OS features. That is, NO_OS_DEPENDENCE cannot be defined. It is due to TweetNaCl's internal function randombytes. Crypto++ used DefaultAutoSeededRNG within randombytes, so OS integration must be enabled. You can use another generator like RDRAND to avoid the restriction.
2018-01-18 03:02:09 +00:00
|
|
|
/// <li>NaCl - namespace for NaCl library functions like crypto_box, crypto_box_open, crypto_sign, and crypto_sign_open
|
2018-12-12 15:14:27 +00:00
|
|
|
/// <li>Donna - namespace for curve25519 library operations. The name was selected due to use of Adam Langley's curve25519-donna.
|
2017-11-29 15:54:33 +00:00
|
|
|
/// <li>Test - namespace for testing and benchmarks classes
|
|
|
|
/// <li>Weak - namespace for weak and wounded algorithms, like ARC4, MD5 and Pananma
|
|
|
|
/// </ul>
|
2015-11-05 06:59:46 +00:00
|
|
|
namespace CryptoPP { }
|
2018-01-25 20:59:47 +00:00
|
|
|
// Bring in the symbols found in the weak namespace; and fold Weak1 into Weak
|
2015-11-05 06:59:46 +00:00
|
|
|
# define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
|
|
|
|
# define Weak1 Weak
|
|
|
|
// Avoid putting "CryptoPP::" in front of everything in Doxygen output
|
|
|
|
# define CryptoPP
|
|
|
|
# define NAMESPACE_BEGIN(x)
|
|
|
|
# define NAMESPACE_END
|
|
|
|
// Get Doxygen to generate better documentation for these typedefs
|
|
|
|
# define DOCUMENTED_TYPEDEF(x, y) class y : public x {};
|
2015-11-18 20:32:28 +00:00
|
|
|
// Make "protected" "private" so the functions and members are not documented
|
|
|
|
# define protected private
|
2015-11-05 06:59:46 +00:00
|
|
|
#else
|
|
|
|
# define NAMESPACE_BEGIN(x) namespace x {
|
|
|
|
# define NAMESPACE_END }
|
|
|
|
# define DOCUMENTED_TYPEDEF(x, y) typedef x y;
|
|
|
|
#endif
|
|
|
|
#define ANONYMOUS_NAMESPACE_BEGIN namespace {
|
2015-11-18 20:32:28 +00:00
|
|
|
#define ANONYMOUS_NAMESPACE_END }
|
2015-11-05 06:59:46 +00:00
|
|
|
#define USING_NAMESPACE(x) using namespace x;
|
|
|
|
#define DOCUMENTED_NAMESPACE_BEGIN(x) namespace x {
|
|
|
|
#define DOCUMENTED_NAMESPACE_END }
|
|
|
|
|
2017-07-20 13:55:29 +00:00
|
|
|
// Originally in global namespace to avoid ambiguity with other byte typedefs.
|
|
|
|
// Moved to Crypto++ namespace due to C++17, std::byte and potential compile problems. Also see
|
|
|
|
// http://www.cryptopp.com/wiki/std::byte and http://github.com/weidai11/cryptopp/issues/442
|
|
|
|
// typedef unsigned char byte;
|
|
|
|
#define CRYPTOPP_NO_GLOBAL_BYTE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
NAMESPACE_BEGIN(CryptoPP)
|
|
|
|
|
2018-03-28 00:47:20 +00:00
|
|
|
// Signed words added at Issue 609 for early versions of and Visual Studio and
|
|
|
|
// the NaCl gear. Also see https://github.com/weidai11/cryptopp/issues/609.
|
|
|
|
|
2017-07-20 13:55:29 +00:00
|
|
|
typedef unsigned char byte;
|
2015-11-05 06:59:46 +00:00
|
|
|
typedef unsigned short word16;
|
|
|
|
typedef unsigned int word32;
|
|
|
|
|
2018-03-28 00:47:20 +00:00
|
|
|
typedef signed char sbyte;
|
|
|
|
typedef signed short sword16;
|
|
|
|
typedef signed int sword32;
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
2018-03-28 00:47:20 +00:00
|
|
|
typedef signed __int64 sword64;
|
2015-11-05 06:59:46 +00:00
|
|
|
typedef unsigned __int64 word64;
|
2018-03-28 00:47:20 +00:00
|
|
|
#define SW64LIT(x) x##i64
|
2015-11-05 06:59:46 +00:00
|
|
|
#define W64LIT(x) x##ui64
|
2016-09-20 06:26:04 +00:00
|
|
|
#elif (_LP64 || __LP64__)
|
2018-03-28 00:47:20 +00:00
|
|
|
typedef signed long sword64;
|
2016-07-24 17:40:58 +00:00
|
|
|
typedef unsigned long word64;
|
2018-03-28 00:47:20 +00:00
|
|
|
#define SW64LIT(x) x##L
|
2016-07-24 17:40:58 +00:00
|
|
|
#define W64LIT(x) x##UL
|
2015-11-05 06:59:46 +00:00
|
|
|
#else
|
2018-03-28 00:47:20 +00:00
|
|
|
typedef signed long long sword64;
|
2015-11-05 06:59:46 +00:00
|
|
|
typedef unsigned long long word64;
|
2018-03-28 00:47:20 +00:00
|
|
|
#define SW64LIT(x) x##LL
|
2015-11-05 06:59:46 +00:00
|
|
|
#define W64LIT(x) x##ULL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// define large word type, used for file offsets and such
|
|
|
|
typedef word64 lword;
|
|
|
|
const lword LWORD_MAX = W64LIT(0xffffffffffffffff);
|
|
|
|
|
2018-10-20 10:31:51 +00:00
|
|
|
// It is OK to remove the hard stop below, but you are on your own.
|
|
|
|
// After building the library be sure to run self tests described
|
|
|
|
// https://www.cryptopp.com/wiki/Release_Process#Self_Tests
|
|
|
|
// Some relevant bug reports can be found at:
|
|
|
|
// * Clang: http://github.com/weidai11/cryptopp/issues/147
|
|
|
|
// * Native Client: https://github.com/weidai11/cryptopp/issues/719
|
|
|
|
#if (defined(_MSC_VER) && defined(__clang__))
|
2016-06-22 13:50:23 +00:00
|
|
|
# error: "Unsupported configuration"
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#ifdef __GNUC__
|
|
|
|
#define CRYPTOPP_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
|
|
|
|
#endif
|
|
|
|
|
2017-09-11 07:05:04 +00:00
|
|
|
#if defined(__xlc__) || defined(__xlC__)
|
|
|
|
#define CRYPTOPP_XLC_VERSION ((__xlC__ / 256) * 10000 + (__xlC__ % 256) * 100)
|
|
|
|
#endif
|
|
|
|
|
2015-11-18 20:32:28 +00:00
|
|
|
// Apple and LLVM's Clang. Apple Clang version 7.0 roughly equals LLVM Clang version 3.7
|
2017-11-25 02:38:49 +00:00
|
|
|
#if defined(__clang__) && defined(__apple_build_version__)
|
2015-11-18 20:32:28 +00:00
|
|
|
#define CRYPTOPP_APPLE_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
|
2017-11-25 02:38:49 +00:00
|
|
|
#elif defined(__clang__)
|
|
|
|
#define CRYPTOPP_LLVM_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define CRYPTOPP_MSC_VERSION (_MSC_VER)
|
|
|
|
#endif
|
|
|
|
|
2015-11-18 20:32:28 +00:00
|
|
|
// Need GCC 4.6/Clang 1.7/Apple Clang 2.0 or above due to "GCC diagnostic {push|pop}"
|
2016-07-06 18:39:18 +00:00
|
|
|
#if (CRYPTOPP_GCC_VERSION >= 40600) || (CRYPTOPP_LLVM_CLANG_VERSION >= 10700) || (CRYPTOPP_APPLE_CLANG_VERSION >= 20000)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
2019-01-16 22:06:39 +00:00
|
|
|
// Some Clang and SunCC cannot handle mixed asm with positional arguments,
|
|
|
|
// where the body is Intel style with no prefix and the templates are
|
|
|
|
// AT&T style. Define this is the Makefile misdetects the configuration.
|
2018-12-05 18:22:10 +00:00
|
|
|
// Also see https://bugs.llvm.org/show_bug.cgi?id=39895 .
|
|
|
|
// #define CRYPTOPP_DISABLE_MIXED_ASM 1
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2019-01-16 22:26:30 +00:00
|
|
|
// Several compilers discard SIMD code that loads unaligned data. The symptom
|
|
|
|
// is often self test failures and UBsan findings of unaligned loads. For
|
|
|
|
// example, Power7 can load unaligned data using vec_vsx_ld but some versions
|
|
|
|
// of GCC and Clang require 16-byte aligned arrays when using the builtin
|
|
|
|
// function. It is not limited to SSE and PowerPC code. Define this to disable
|
|
|
|
// Crypto++ code that uses potentially problematic builtins or intrinsics.
|
|
|
|
#define CRYPTOPP_BUGGY_SIMD_LOAD_AND_STORE 1
|
2019-01-16 22:06:39 +00:00
|
|
|
|
|
|
|
// This list will probably grow over time as more compilers are identified.
|
|
|
|
#if defined(CRYPTOPP_BUGGY_SIMD_LOAD_AND_STORE)
|
|
|
|
# define CRYPTOPP_DISABLE_LEA_SIMD 1
|
|
|
|
# define CRYPTOPP_DISABLE_SIMON_SIMD 1
|
|
|
|
# define CRYPTOPP_DISABLE_SPECK_SIMD 1
|
|
|
|
# define CRYPTOPP_DISABLE_SM4_SIMD 1
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// define hword, word, and dword. these are used for multiprecision integer arithmetic
|
|
|
|
// Intel compiler won't have _umul128 until version 10.0. See http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30231625.aspx
|
2016-01-08 11:53:27 +00:00
|
|
|
#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__))
|
2015-11-05 06:59:46 +00:00
|
|
|
typedef word32 hword;
|
|
|
|
typedef word64 word;
|
|
|
|
#else
|
2016-09-09 07:33:06 +00:00
|
|
|
#define CRYPTOPP_NATIVE_DWORD_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#if defined(__alpha__) || defined(__ia64__) || defined(_ARCH_PPC64) || defined(__x86_64__) || defined(__mips64) || defined(__sparc64__)
|
2018-01-21 21:25:09 +00:00
|
|
|
#if ((CRYPTOPP_GCC_VERSION >= 30400) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30000) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300)) && (__SIZEOF_INT128__ >= 16)
|
2015-11-05 06:59:46 +00:00
|
|
|
// GCC 4.0.1 on MacOS X is missing __umodti3 and __udivti3
|
2017-05-13 03:51:27 +00:00
|
|
|
// GCC 4.8.3 and bad uint128_t ops on PPC64/POWER7 (Issue 421)
|
2015-11-05 06:59:46 +00:00
|
|
|
// mode(TI) division broken on amd64 with GCC earlier than GCC 3.4
|
|
|
|
typedef word32 hword;
|
|
|
|
typedef word64 word;
|
|
|
|
typedef __uint128_t dword;
|
|
|
|
typedef __uint128_t word128;
|
2016-09-09 07:33:06 +00:00
|
|
|
#define CRYPTOPP_WORD128_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#else
|
|
|
|
// if we're here, it means we're on a 64-bit CPU but we don't have a way to obtain 128-bit multiplication results
|
|
|
|
typedef word16 hword;
|
|
|
|
typedef word32 word;
|
|
|
|
typedef word64 dword;
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
// being here means the native register size is probably 32 bits or less
|
|
|
|
#define CRYPTOPP_BOOL_SLOW_WORD64 1
|
|
|
|
typedef word16 hword;
|
|
|
|
typedef word32 word;
|
|
|
|
typedef word64 dword;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifndef CRYPTOPP_BOOL_SLOW_WORD64
|
|
|
|
#define CRYPTOPP_BOOL_SLOW_WORD64 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
const unsigned int WORD_SIZE = sizeof(word);
|
|
|
|
const unsigned int WORD_BITS = WORD_SIZE * 8;
|
|
|
|
|
|
|
|
NAMESPACE_END
|
|
|
|
|
|
|
|
#ifndef CRYPTOPP_L1_CACHE_LINE_SIZE
|
|
|
|
// This should be a lower bound on the L1 cache line size. It's used for defense against timing attacks.
|
|
|
|
// Also see http://stackoverflow.com/questions/794632/programmatically-get-the-cache-line-size.
|
2017-09-11 07:05:04 +00:00
|
|
|
#if defined(_M_X64) || defined(__x86_64__) || defined(__arm64__) || defined(__aarch64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_L1_CACHE_LINE_SIZE 64
|
|
|
|
#else
|
|
|
|
// L1 cache line size is 32 on Pentium III and earlier
|
|
|
|
#define CRYPTOPP_L1_CACHE_LINE_SIZE 32
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2018-07-30 16:42:53 +00:00
|
|
|
// Sun Studio Express 3 (December 2006) provides GCC-style attributes.
|
2018-07-31 00:32:45 +00:00
|
|
|
// IBM XL C/C++ alignment modifier per Optimization Guide, pp. 19-20.
|
2018-11-23 00:18:08 +00:00
|
|
|
// __IBM_ATTRIBUTES per XLC 12.1 AIX Compiler Manual, p. 473.
|
2018-07-31 00:32:45 +00:00
|
|
|
// CRYPTOPP_ALIGN_DATA may not be reliable on AIX.
|
2015-11-05 06:59:46 +00:00
|
|
|
#ifndef CRYPTOPP_ALIGN_DATA
|
2016-12-03 10:05:56 +00:00
|
|
|
#if defined(_MSC_VER)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_ALIGN_DATA(x) __declspec(align(x))
|
2018-07-30 15:27:50 +00:00
|
|
|
#elif defined(__GNUC__) || (__SUNPRO_CC >= 0x5100)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_ALIGN_DATA(x) __attribute__((aligned(x)))
|
2018-11-23 01:47:35 +00:00
|
|
|
#elif defined(__xlc__) || defined(__xlC__)
|
2018-07-31 00:32:45 +00:00
|
|
|
#define CRYPTOPP_ALIGN_DATA(x) __attribute__((aligned(x)))
|
2015-11-05 06:59:46 +00:00
|
|
|
#else
|
|
|
|
#define CRYPTOPP_ALIGN_DATA(x)
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2016-07-13 03:38:30 +00:00
|
|
|
// The section attribute attempts to initialize CPU flags to avoid Valgrind findings above -O1
|
2016-10-28 04:33:43 +00:00
|
|
|
#if ((defined(__MACH__) && defined(__APPLE__)) && ((CRYPTOPP_LLVM_CLANG_VERSION >= 30600) || (CRYPTOPP_APPLE_CLANG_VERSION >= 70100) || (CRYPTOPP_GCC_VERSION >= 40300)))
|
2016-07-13 03:05:00 +00:00
|
|
|
#define CRYPTOPP_SECTION_INIT __attribute__((section ("__DATA,__data")))
|
2016-10-28 04:33:43 +00:00
|
|
|
#elif (defined(__ELF__) && (CRYPTOPP_GCC_VERSION >= 40300))
|
2016-07-13 03:05:00 +00:00
|
|
|
#define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon")))
|
2018-11-30 13:23:35 +00:00
|
|
|
#elif defined(__ELF__) && (defined(__xlC__) || defined(__ibmxl__))
|
|
|
|
#define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon")))
|
2016-07-13 03:05:00 +00:00
|
|
|
#else
|
|
|
|
#define CRYPTOPP_SECTION_INIT
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if defined(_MSC_VER) || defined(__fastcall)
|
|
|
|
#define CRYPTOPP_FASTCALL __fastcall
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_FASTCALL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define CRYPTOPP_NO_VTABLE __declspec(novtable)
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_NO_VTABLE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
// 4127: conditional expression is constant
|
|
|
|
// 4512: assignment operator not generated
|
|
|
|
// 4661: no suitable definition provided for explicit template instantiation request
|
|
|
|
// 4910: '__declspec(dllexport)' and 'extern' are incompatible on an explicit instantiation
|
2017-11-12 16:55:57 +00:00
|
|
|
# pragma warning(disable: 4127 4512 4661 4910)
|
2015-11-05 06:59:46 +00:00
|
|
|
// Security related, possible defects
|
|
|
|
// http://blogs.msdn.com/b/vcblog/archive/2010/12/14/off-by-default-compiler-warnings-in-visual-c.aspx
|
|
|
|
# pragma warning(once: 4191 4242 4263 4264 4266 4302 4826 4905 4906 4928)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __BORLANDC__
|
|
|
|
// 8037: non-const function called for const object. needed to work around BCB2006 bug
|
|
|
|
# pragma warn -8037
|
|
|
|
#endif
|
2016-05-15 06:30:08 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// [GCC Bug 53431] "C++ preprocessor ignores #pragma GCC diagnostic". Clang honors it.
|
|
|
|
#if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
|
|
|
|
# pragma GCC diagnostic ignored "-Wunknown-pragmas"
|
|
|
|
# pragma GCC diagnostic ignored "-Wunused-function"
|
|
|
|
#endif
|
|
|
|
|
2016-07-18 00:20:36 +00:00
|
|
|
// You may need to force include a C++ header on Android when using STLPort to ensure
|
|
|
|
// _STLPORT_VERSION is defined: CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 -include iosfwd"
|
2016-07-12 15:05:05 +00:00
|
|
|
// TODO: Figure out C++17 and lack of std::uncaught_exception
|
2015-12-09 09:09:30 +00:00
|
|
|
#if (defined(_MSC_VER) && _MSC_VER <= 1300) || defined(__MWERKS__) || (defined(_STLPORT_VERSION) && ((_STLPORT_VERSION < 0x450) || defined(_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)))
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_DISABLE_UNCAUGHT_EXCEPTION
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef CRYPTOPP_DISABLE_UNCAUGHT_EXCEPTION
|
|
|
|
#define CRYPTOPP_UNCAUGHT_EXCEPTION_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
// ***************** Platform and CPU features ********************
|
|
|
|
|
2018-12-09 15:24:55 +00:00
|
|
|
// Linux provides X32, which is 32-bit integers, longs and pointers on x86_64
|
|
|
|
// using the full x86_64 register set. Detect via __ILP32__
|
|
|
|
// (http://wiki.debian.org/X32Port). However, __ILP32__ shows up in more places
|
|
|
|
// than the System V ABI specs calls out, like on some Solaris installations
|
|
|
|
// and just about any 32-bit system with Clang.
|
2017-08-17 16:33:43 +00:00
|
|
|
#if (defined(__ILP32__) || defined(_ILP32)) && defined(__x86_64__)
|
|
|
|
#define CRYPTOPP_BOOL_X32 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// see http://predef.sourceforge.net/prearch.html
|
|
|
|
#if (defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(_X86_) || defined(__I86__) || defined(__INTEL__)) && !CRYPTOPP_BOOL_X32
|
|
|
|
#define CRYPTOPP_BOOL_X86 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if (defined(_M_X64) || defined(__x86_64__)) && !CRYPTOPP_BOOL_X32
|
|
|
|
#define CRYPTOPP_BOOL_X64 1
|
|
|
|
#endif
|
|
|
|
|
2018-12-09 15:24:55 +00:00
|
|
|
// Undo the ASM related defines due to X32.
|
2017-08-17 16:33:43 +00:00
|
|
|
#if CRYPTOPP_BOOL_X32
|
|
|
|
# undef CRYPTOPP_BOOL_X64
|
|
|
|
# undef CRYPTOPP_X64_ASM_AVAILABLE
|
|
|
|
# undef CRYPTOPP_X64_MASM_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
2018-12-09 15:24:55 +00:00
|
|
|
// Microsoft added ARM64 define December 2017.
|
|
|
|
#if defined(__arm64__) || defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
#define CRYPTOPP_BOOL_ARMV8 1
|
|
|
|
#elif defined(__arm__) || defined(_M_ARM)
|
2017-09-02 23:25:37 +00:00
|
|
|
#define CRYPTOPP_BOOL_ARM32 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// AltiVec and Power8 crypto
|
2018-12-09 15:24:55 +00:00
|
|
|
#if defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
|
2017-09-02 23:25:37 +00:00
|
|
|
#define CRYPTOPP_BOOL_PPC64 1
|
2017-09-11 07:05:04 +00:00
|
|
|
#elif defined(__powerpc__) || defined(_ARCH_PPC)
|
2017-09-02 23:25:37 +00:00
|
|
|
#define CRYPTOPP_BOOL_PPC32 1
|
2017-08-17 16:33:43 +00:00
|
|
|
#endif
|
|
|
|
|
2018-12-13 09:21:38 +00:00
|
|
|
// And MIPS. TODO: finish these defines
|
|
|
|
#if defined(__mips64__)
|
|
|
|
#define CRYPTOPP_BOOL_MIPS64 1
|
|
|
|
#elif defined(__mips__)
|
|
|
|
#define CRYPTOPP_BOOL_MIPS32 1
|
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
|
|
|
# define CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 1
|
|
|
|
#else
|
|
|
|
# define CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ***************** IA32 CPU features ********************
|
|
|
|
|
|
|
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
|
|
|
|
|
|
|
// Apple Clang prior to 5.0 cannot handle SSE2
|
2015-11-18 20:32:28 +00:00
|
|
|
#if defined(CRYPTOPP_APPLE_CLANG_VERSION) && (CRYPTOPP_APPLE_CLANG_VERSION < 50000)
|
2018-10-20 10:31:51 +00:00
|
|
|
# define CRYPTOPP_DISABLE_ASM 1
|
2015-11-18 20:32:28 +00:00
|
|
|
#endif
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2018-11-10 01:35:27 +00:00
|
|
|
// Sun Studio 12.1 provides GCC inline assembly
|
|
|
|
// http://blogs.oracle.com/x86be/entry/gcc_style_asm_inlining_support
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5100)
|
2018-11-08 21:20:31 +00:00
|
|
|
# define CRYPTOPP_DISABLE_ASM 1
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && ((defined(_MSC_VER) && defined(_M_IX86)) || (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))))
|
|
|
|
// C++Builder 2010 does not allow "call label" where label is defined within inline assembly
|
2017-08-20 08:09:19 +00:00
|
|
|
#define CRYPTOPP_X86_ASM_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2016-12-03 10:05:56 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_SSE2) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__))
|
2017-08-21 01:25:29 +00:00
|
|
|
#define CRYPTOPP_SSE2_ASM_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2018-10-24 05:11:45 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_SSSE3) && (_MSC_VER >= 1500 || CRYPTOPP_GCC_VERSION >= 40300 || defined(__SSSE3__))
|
2017-08-21 01:25:29 +00:00
|
|
|
#define CRYPTOPP_SSSE3_ASM_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && defined(_MSC_VER) && defined(_M_X64)
|
2017-08-17 16:33:43 +00:00
|
|
|
#define CRYPTOPP_X64_MASM_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && defined(__GNUC__) && defined(__x86_64__)
|
2017-08-17 16:33:43 +00:00
|
|
|
#define CRYPTOPP_X64_ASM_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2017-08-27 23:01:00 +00:00
|
|
|
// 32-bit SunCC does not enable SSE2 by default.
|
2018-11-10 01:35:27 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__) || (__SUNPRO_CC >= 0x5100))
|
2017-08-18 06:11:41 +00:00
|
|
|
#define CRYPTOPP_SSE2_INTRIN_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_SSSE3)
|
2017-11-25 02:38:49 +00:00
|
|
|
# if defined(__SSSE3__) || (_MSC_VER >= 1500) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000)
|
2017-08-17 16:33:43 +00:00
|
|
|
#define CRYPTOPP_SSSE3_AVAILABLE 1
|
|
|
|
# endif
|
2017-04-13 03:28:41 +00:00
|
|
|
#endif
|
|
|
|
|
2016-04-15 20:23:04 +00:00
|
|
|
// Intrinsics availible in GCC 4.3 (http://gcc.gnu.org/gcc-4.3/changes.html) and
|
|
|
|
// MSVC 2008 (http://msdn.microsoft.com/en-us/library/bb892950%28v=vs.90%29.aspx)
|
2016-09-19 01:06:41 +00:00
|
|
|
// SunCC could generate SSE4 at 12.1, but the intrinsics are missing until 12.4.
|
2017-08-17 16:33:43 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \
|
|
|
|
(defined(__SSE4_1__) || (CRYPTOPP_MSC_VERSION >= 1500) || \
|
2017-08-24 23:17:21 +00:00
|
|
|
(CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \
|
2017-08-17 16:33:43 +00:00
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000))
|
|
|
|
#define CRYPTOPP_SSE41_AVAILABLE 1
|
2016-04-15 20:23:04 +00:00
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \
|
2017-08-24 23:17:21 +00:00
|
|
|
(defined(__SSE4_2__) || (CRYPTOPP_MSC_VERSION >= 1500) || (__SUNPRO_CC >= 0x5110) || \
|
2017-08-17 16:33:43 +00:00
|
|
|
(CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000))
|
|
|
|
#define CRYPTOPP_SSE42_AVAILABLE 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2018-05-04 01:28:17 +00:00
|
|
|
// Couple to CRYPTOPP_DISABLE_AESNI, but use CRYPTOPP_CLMUL_AVAILABLE so we can selectively
|
2017-08-27 23:01:00 +00:00
|
|
|
// disable for misbehaving platofrms and compilers, like Solaris or some Clang.
|
2018-05-04 01:28:17 +00:00
|
|
|
#if defined(CRYPTOPP_DISABLE_AESNI)
|
2017-08-27 23:01:00 +00:00
|
|
|
#define CRYPTOPP_DISABLE_CLMUL 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Requires Sun Studio 12.3 (SunCC 0x5120) in theory.
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_CLMUL) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
|
2017-08-24 23:17:21 +00:00
|
|
|
(defined(__PCLMUL__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \
|
2017-08-17 16:33:43 +00:00
|
|
|
(CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300))
|
|
|
|
#define CRYPTOPP_CLMUL_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
2017-08-24 23:17:21 +00:00
|
|
|
// Requires Sun Studio 12.3 (SunCC 0x5120)
|
2018-05-04 01:28:17 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_AESNI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
|
2017-08-24 23:17:21 +00:00
|
|
|
(defined(__AES__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \
|
2017-08-17 16:33:43 +00:00
|
|
|
(CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300))
|
|
|
|
#define CRYPTOPP_AESNI_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
2018-11-08 21:20:31 +00:00
|
|
|
// Requires Binutils 2.24
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_AVX) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
|
|
|
|
(defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40700) || (__INTEL_COMPILER >= 1400) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600))
|
|
|
|
#define CRYPTOPP_AVX_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Requires Binutils 2.24
|
|
|
|
#if !defined(CRYPTOPP_DISABLE_AVX2) && defined(CRYPTOPP_AVX_AVAILABLE) && \
|
|
|
|
(defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40700) || (__INTEL_COMPILER >= 1400) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600))
|
|
|
|
#define CRYPTOPP_AVX2_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
2017-08-31 12:05:48 +00:00
|
|
|
// Guessing at SHA for SunCC. Its not in Sun Studio 12.6. Also see
|
2017-08-31 10:41:44 +00:00
|
|
|
// http://stackoverflow.com/questions/45872180/which-xarch-for-sha-extensions-on-solaris
|
2018-05-04 14:10:50 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_SHANI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \
|
2017-08-31 10:41:44 +00:00
|
|
|
(defined(__SHA__) || (CRYPTOPP_MSC_VERSION >= 1900) || (__SUNPRO_CC >= 0x5160) || \
|
2017-08-17 16:33:43 +00:00
|
|
|
(CRYPTOPP_GCC_VERSION >= 40900) || (__INTEL_COMPILER >= 1300) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 30400) || (CRYPTOPP_APPLE_CLANG_VERSION >= 50100))
|
|
|
|
#define CRYPTOPP_SHANI_AVAILABLE 1
|
2016-09-20 04:35:27 +00:00
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Fixup Android and SSE, Crypto. It may be enabled based on compiler version.
|
|
|
|
#if (defined(__ANDROID__) || defined(ANDROID))
|
|
|
|
# if (CRYPTOPP_BOOL_X86)
|
|
|
|
# undef CRYPTOPP_SSE41_AVAILABLE
|
|
|
|
# undef CRYPTOPP_SSE42_AVAILABLE
|
|
|
|
# undef CRYPTOPP_CLMUL_AVAILABLE
|
|
|
|
# undef CRYPTOPP_AESNI_AVAILABLE
|
|
|
|
# undef CRYPTOPP_SHANI_AVAILABLE
|
|
|
|
# endif
|
|
|
|
# if (CRYPTOPP_BOOL_X64)
|
|
|
|
# undef CRYPTOPP_CLMUL_AVAILABLE
|
|
|
|
# undef CRYPTOPP_AESNI_AVAILABLE
|
|
|
|
# undef CRYPTOPP_SHANI_AVAILABLE
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2018-07-27 05:51:27 +00:00
|
|
|
// Fixup for SunCC 12.1-12.4. Bad code generation in AES_Encrypt and friends.
|
|
|
|
#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5130)
|
|
|
|
# undef CRYPTOPP_AESNI_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Fixup for SunCC 12.1-12.6. Compiler crash on GCM_Reduce_CLMUL and friends.
|
2018-07-16 13:39:01 +00:00
|
|
|
// http://github.com/weidai11/cryptopp/issues/226
|
|
|
|
#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5150)
|
|
|
|
# undef CRYPTOPP_CLMUL_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
#endif // X86, X32, X64
|
|
|
|
|
|
|
|
// ***************** ARM CPU features ********************
|
|
|
|
|
2018-12-09 15:24:55 +00:00
|
|
|
#if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8)
|
2018-08-18 11:21:42 +00:00
|
|
|
|
2018-08-18 08:31:49 +00:00
|
|
|
// We don't have an ARM big endian test rig. Disable
|
|
|
|
// ARM-BE ASM and instrinsics until we can test it.
|
2018-10-28 08:24:22 +00:00
|
|
|
#if (CRYPTOPP_BIG_ENDIAN)
|
2018-08-18 08:31:49 +00:00
|
|
|
# define CRYPTOPP_DISABLE_ASM 1
|
|
|
|
#endif
|
2017-08-17 16:33:43 +00:00
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Requires ARMv7 and ACLE 1.0. -march=armv7-a or above must be present
|
|
|
|
// Requires GCC 4.3, Clang 2.8 or Visual Studio 2012
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
2017-08-17 16:33:43 +00:00
|
|
|
#if !defined(CRYPTOPP_ARM_NEON_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# if defined(__arm__) || defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(_M_ARM)
|
|
|
|
# if (CRYPTOPP_GCC_VERSION >= 40300) || (CRYPTOPP_CLANG_VERSION >= 20800) || \
|
|
|
|
(CRYPTOPP_MSC_VERSION >= 1700)
|
|
|
|
# define CRYPTOPP_ARM_NEON_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
2016-05-21 19:50:04 +00:00
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// ARMv8 and ASIMD. -march=armv8-a or above must be present
|
|
|
|
// Requires GCC 4.8, Clang 3.3 or Visual Studio 2017
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
2018-01-20 18:23:41 +00:00
|
|
|
#if !defined(CRYPTOPP_ARM_ASIMD_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(__ARM_FEATURE_ASIMD) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 30300) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_MSC_VERSION >= 1916)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_NEON_AVAILABLE 1
|
|
|
|
# define CRYPTOPP_ARM_ASIMD_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and ASIMD. -march=armv8-a+crc or above must be present
|
|
|
|
// Requires GCC 4.8, Clang 3.3 or Visual Studio 2017
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_CRC32_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_CRC32) || (CRYPTOPP_GCC_VERSION >= 40800) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_CRC32_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and ASIMD. -march=armv8-a+crypto or above must be present
|
|
|
|
// Requires GCC 4.8, Clang 3.3 or Visual Studio 2017
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_PMULL_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_PMULL_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and AES. -march=armv8-a+crypto or above must be present
|
|
|
|
// Requires GCC 4.8, Clang 3.3 or Visual Studio 2017
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
|
|
|
|
(CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1910)
|
|
|
|
# define CRYPTOPP_ARM_AES_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and SHA-1, SHA-256. -march=armv8-a+crypto or above must be present
|
|
|
|
// Requires GCC 4.8, Clang 3.3 or Visual Studio 2017
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_SHA_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_SHA1_AVAILABLE 1
|
|
|
|
# define CRYPTOPP_ARM_SHA2_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and SHA-512, SHA-3. -march=armv8.4-a+crypto or above must be present
|
|
|
|
// Requires GCC 8.0, Clang 6.0 or Visual Studio 2021???
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_SHA_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_SHA3) || (CRYPTOPP_GCC_VERSION >= 80000) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_MSC_VERSION >= 5000)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_SHA512_AVAILABLE 1
|
|
|
|
# define CRYPTOPP_ARM_SHA3_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ARMv8 and SM3, SM4. -march=armv8.4-a+crypto or above must be present
|
|
|
|
// Requires GCC 8.0, Clang 6.0 or Visual Studio 2021???
|
|
|
|
// Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead.
|
|
|
|
#if !defined(CRYPTOPP_ARM_SM3_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64)
|
|
|
|
# if defined(__ARM_FEATURE_SM3) || (CRYPTOPP_GCC_VERSION >= 80000) || \
|
2019-01-04 21:55:42 +00:00
|
|
|
(CRYPTOPP_MSC_VERSION >= 5000)
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
# define CRYPTOPP_ARM_SM3_AVAILABLE 1
|
|
|
|
# define CRYPTOPP_ARM_SM4_AVAILABLE 1
|
|
|
|
# endif // Compilers
|
|
|
|
# endif // Platforms
|
2017-01-15 05:22:14 +00:00
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Limit the <arm_acle.h> include.
|
2018-11-12 19:59:36 +00:00
|
|
|
#if !defined(CRYPTOPP_ARM_ACLE_AVAILABLE)
|
|
|
|
# if defined(__aarch32__) || defined(__aarch64__) || (__ARM_ARCH >= 8) || defined(__ARM_ACLE)
|
|
|
|
# if !defined(__ANDROID__) && !defined(ANDROID) && !defined(__APPLE__)
|
|
|
|
# define CRYPTOPP_ARM_ACLE_AVAILABLE 1
|
|
|
|
# endif
|
2018-01-20 18:23:41 +00:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Fixup Apple Clang and PMULL. Apple defines __ARM_FEATURE_CRYPTO for Xcode 6
|
|
|
|
// but does not provide PMULL. TODO: determine when PMULL is available.
|
|
|
|
#if defined(CRYPTOPP_APPLE_CLANG_VERSION) && (CRYPTOPP_APPLE_CLANG_VERSION < 70000)
|
|
|
|
# undef CRYPTOPP_ARM_PMULL_AVAILABLE
|
2016-05-21 19:50:04 +00:00
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Fixup Android and CRC32. It may be enabled based on compiler version.
|
|
|
|
#if (defined(__ANDROID__) || defined(ANDROID)) && !defined(__ARM_FEATURE_CRC32)
|
|
|
|
# undef CRYPTOPP_ARM_CRC32_AVAILABLE
|
2017-12-09 18:07:50 +00:00
|
|
|
#endif
|
|
|
|
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// Fixup Android and Crypto. It may be enabled based on compiler version.
|
|
|
|
#if (defined(__ANDROID__) || defined(ANDROID)) && !defined(__ARM_FEATURE_CRYPTO)
|
|
|
|
# undef CRYPTOPP_ARM_PMULL_AVAILABLE
|
|
|
|
# undef CRYPTOPP_ARM_AES_AVAILABLE
|
|
|
|
# undef CRYPTOPP_ARM_SHA1_AVAILABLE
|
|
|
|
# undef CRYPTOPP_ARM_SHA2_AVAILABLE
|
2017-12-15 22:00:39 +00:00
|
|
|
#endif
|
|
|
|
|
2018-07-11 10:59:44 +00:00
|
|
|
// Cryptogams offers an ARM asm AES implementation. Crypto++ does
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
// not provide an asm implementation. The Cryptogams implementation
|
2018-07-11 10:59:44 +00:00
|
|
|
// is about 2x faster than C/C++. Define this to use the Cryptogams
|
|
|
|
// AES implementation on GNU Linux systems. When defined, Crypto++
|
2018-11-10 13:00:14 +00:00
|
|
|
// will use aes_armv4.S. LLVM miscompiles aes_armv4.S so disable
|
2018-07-11 13:19:11 +00:00
|
|
|
// under Clang. See https://bugs.llvm.org/show_bug.cgi?id=38133.
|
Add ARMv8.4 cpu feature detection support (GH #685) (#687)
This PR adds ARMv8.4 cpu feature detection support. Previously we only needed ARMv8.1 and things were much easier. For example, ARMv8.1 `__ARM_FEATURE_CRYPTO` meant PMULL, AES, SHA-1 and SHA-256 were available. ARMv8.4 `__ARM_FEATURE_CRYPTO` means PMULL, AES, SHA-1, SHA-256, SHA-512, SHA-3, SM3 and SM4 are available.
We still use the same pattern as before. We make something available based on compiler version and/or preprocessor macros. But this time around we had to tighten things up a bit to ensure ARMv8.4 did not cross-pollinate down into ARMv8.1.
ARMv8.4 is largely untested at the moment. There is no hardware in the field and CI lacks QEMU with the relevant patches/support. We will probably have to revisit some of this stuff in the future.
Since this update applies to ARM gadgets we took the time to expand Android and iOS testing on Travis. Travis now tests more platforms, and includes Autotools and CMake builds, too.
2018-07-15 12:35:14 +00:00
|
|
|
#if !defined(CRYPTOPP_DISABLE_ASM) && defined(__arm__)
|
|
|
|
# if defined(__GNUC__) && !defined(__clang__)
|
|
|
|
# define CRYPTOGAMS_ARM_AES 1
|
|
|
|
# endif
|
2018-07-11 10:59:44 +00:00
|
|
|
#endif
|
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
#endif // ARM32, ARM64
|
|
|
|
|
2017-09-02 23:25:37 +00:00
|
|
|
// ***************** AltiVec and Power8 ********************
|
|
|
|
|
|
|
|
#if (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
|
|
|
|
|
2017-11-15 01:54:43 +00:00
|
|
|
#if defined(CRYPTOPP_DISABLE_ALTIVEC) || defined(CRYPTOPP_DISABLE_ASM)
|
|
|
|
# undef CRYPTOPP_DISABLE_ALTIVEC
|
|
|
|
# undef CRYPTOPP_DISABLE_POWER7
|
|
|
|
# undef CRYPTOPP_DISABLE_POWER8
|
2018-11-27 07:54:26 +00:00
|
|
|
# undef CRYPTOPP_DISABLE_POWER9
|
2017-11-15 01:54:43 +00:00
|
|
|
# define CRYPTOPP_DISABLE_ALTIVEC 1
|
|
|
|
# define CRYPTOPP_DISABLE_POWER7 1
|
|
|
|
# define CRYPTOPP_DISABLE_POWER8 1
|
2018-11-27 07:54:26 +00:00
|
|
|
# define CRYPTOPP_DISABLE_POWER9 1
|
2017-11-15 01:54:43 +00:00
|
|
|
#endif
|
|
|
|
|
2017-10-18 00:47:14 +00:00
|
|
|
// An old Apple G5 with GCC 4.01 has AltiVec, but its only Power4 or so.
|
2017-11-15 01:54:43 +00:00
|
|
|
#if !defined(CRYPTOPP_ALTIVEC_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ALTIVEC)
|
2017-12-12 12:15:59 +00:00
|
|
|
# if defined(_ARCH_PWR4) || defined(__ALTIVEC__) || \
|
2018-11-27 07:54:26 +00:00
|
|
|
(CRYPTOPP_XLC_VERSION >= 100000) || (CRYPTOPP_GCC_VERSION >= 40001) || \
|
|
|
|
(CRYPTOPP_CLANG_VERSION >= 20900)
|
2017-09-11 07:05:04 +00:00
|
|
|
# define CRYPTOPP_ALTIVEC_AVAILABLE 1
|
2017-11-15 01:54:43 +00:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2017-12-12 13:09:31 +00:00
|
|
|
// We need Power7 for unaligned loads and stores
|
2017-11-15 01:54:43 +00:00
|
|
|
#if !defined(CRYPTOPP_POWER7_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER7) && defined(CRYPTOPP_ALTIVEC_AVAILABLE)
|
2018-11-27 07:54:26 +00:00
|
|
|
# if defined(_ARCH_PWR7) || (CRYPTOPP_XLC_VERSION >= 100000) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40100) || (CRYPTOPP_CLANG_VERSION >= 30100)
|
2017-10-18 02:50:45 +00:00
|
|
|
# define CRYPTOPP_POWER7_AVAILABLE 1
|
2017-09-11 07:05:04 +00:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2018-08-03 18:17:13 +00:00
|
|
|
// We need Power8 for in-core crypto and 64-bit vector types
|
2017-11-15 01:54:43 +00:00
|
|
|
#if !defined(CRYPTOPP_POWER8_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8) && defined(CRYPTOPP_POWER7_AVAILABLE)
|
2018-11-27 07:54:26 +00:00
|
|
|
# if defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 70000)
|
2017-09-11 07:05:04 +00:00
|
|
|
# define CRYPTOPP_POWER8_AVAILABLE 1
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2018-11-27 07:54:26 +00:00
|
|
|
// Power9 for random numbers
|
|
|
|
#if !defined(CRYPTOPP_POWER9_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER9) && defined(CRYPTOPP_POWER8_AVAILABLE)
|
|
|
|
# if defined(_ARCH_PWR9) || (CRYPTOPP_XLC_VERSION >= 130200) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 70000) || (CRYPTOPP_CLANG_VERSION >= 80000)
|
|
|
|
# define CRYPTOPP_POWER9_AVAILABLE 1
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2017-11-21 00:50:07 +00:00
|
|
|
#if !defined(CRYPTOPP_POWER8_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8_AES) && defined(CRYPTOPP_POWER8_AVAILABLE)
|
2018-11-27 07:54:26 +00:00
|
|
|
# if defined(__CRYPTO__) || defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_CLANG_VERSION >= 70000)
|
2018-08-06 09:40:38 +00:00
|
|
|
//# define CRYPTOPP_POWER8_CRC_AVAILABLE 1
|
2017-09-11 07:05:04 +00:00
|
|
|
# define CRYPTOPP_POWER8_AES_AVAILABLE 1
|
2018-08-10 03:28:49 +00:00
|
|
|
# define CRYPTOPP_POWER8_VMULL_AVAILABLE 1
|
2018-03-10 21:19:11 +00:00
|
|
|
# define CRYPTOPP_POWER8_SHA_AVAILABLE 1
|
2017-09-02 23:25:37 +00:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2018-11-27 07:54:26 +00:00
|
|
|
#endif // PPC32, PPC64
|
2017-09-02 23:25:37 +00:00
|
|
|
|
2017-08-17 16:33:43 +00:00
|
|
|
// ***************** Miscellaneous ********************
|
|
|
|
|
2017-08-27 23:01:00 +00:00
|
|
|
// Nearly all Intel's and AMD's have SSE. Enable it independent of SSE ASM and intrinscs
|
2017-09-05 20:28:00 +00:00
|
|
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) && !defined(CRYPTOPP_DISABLE_ASM)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_BOOL_ALIGN16 1
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_BOOL_ALIGN16 0
|
|
|
|
#endif
|
|
|
|
|
2018-01-31 02:05:55 +00:00
|
|
|
// How to allocate 16-byte aligned memory (for SSE2)
|
|
|
|
// posix_memalign see https://forum.kde.org/viewtopic.php?p=66274
|
2016-12-03 10:05:56 +00:00
|
|
|
#if defined(_MSC_VER)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_MM_MALLOC_AVAILABLE
|
|
|
|
#elif defined(__linux__) || defined(__sun__) || defined(__CYGWIN__)
|
|
|
|
#define CRYPTOPP_MEMALIGN_AVAILABLE
|
2018-01-31 03:03:34 +00:00
|
|
|
#elif defined(__APPLE__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
|
|
|
#define CRYPTOPP_MALLOC_ALIGNMENT_IS_16
|
|
|
|
#elif (defined(_GNU_SOURCE) || ((_XOPEN_SOURCE + 0) >= 600)) && (_POSIX_ADVISORY_INFO > 0)
|
|
|
|
#define CRYPTOPP_POSIX_MEMALIGN_AVAILABLE
|
2015-11-05 06:59:46 +00:00
|
|
|
#else
|
|
|
|
#define CRYPTOPP_NO_ALIGNED_ALLOC
|
|
|
|
#endif
|
2016-05-15 06:30:08 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// how to disable inlining
|
2016-12-03 10:05:56 +00:00
|
|
|
#if defined(_MSC_VER)
|
2015-11-05 06:59:46 +00:00
|
|
|
# define CRYPTOPP_NOINLINE_DOTDOTDOT
|
|
|
|
# define CRYPTOPP_NOINLINE __declspec(noinline)
|
2018-11-30 13:23:35 +00:00
|
|
|
#elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__)
|
2017-10-13 08:13:39 +00:00
|
|
|
# define CRYPTOPP_NOINLINE_DOTDOTDOT ...
|
|
|
|
# define CRYPTOPP_NOINLINE __attribute__((noinline))
|
|
|
|
#elif defined(__GNUC__)
|
2015-11-05 06:59:46 +00:00
|
|
|
# define CRYPTOPP_NOINLINE_DOTDOTDOT
|
|
|
|
# define CRYPTOPP_NOINLINE __attribute__((noinline))
|
|
|
|
#else
|
|
|
|
# define CRYPTOPP_NOINLINE_DOTDOTDOT ...
|
2016-05-15 06:30:08 +00:00
|
|
|
# define CRYPTOPP_NOINLINE
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2016-09-06 08:04:03 +00:00
|
|
|
// How to declare class constants
|
2017-09-20 22:18:51 +00:00
|
|
|
#if defined(CRYPTOPP_DOXYGEN_PROCESSING) || defined(__BORLANDC__)
|
2017-08-16 09:11:37 +00:00
|
|
|
# define CRYPTOPP_CONSTANT(x) static const int x;
|
|
|
|
#else
|
|
|
|
# define CRYPTOPP_CONSTANT(x) enum {x};
|
|
|
|
#endif
|
2016-01-08 11:53:27 +00:00
|
|
|
|
2017-09-20 01:08:37 +00:00
|
|
|
// How to disable CPU feature probing. We determine machine
|
|
|
|
// capabilities by performing an os/platform *query* first,
|
|
|
|
// like getauxv(). If the *query* fails, we move onto a
|
|
|
|
// cpu *probe*. The cpu *probe* tries to exeute an instruction
|
|
|
|
// and then catches a SIGILL on Linux or the exception
|
|
|
|
// EXCEPTION_ILLEGAL_INSTRUCTION on Windows. Some OSes
|
|
|
|
// fail to hangle a SIGILL gracefully, like Apple OSes. Apple
|
|
|
|
// machines corrupt memory and variables around the probe.
|
|
|
|
#if defined(__APPLE__)
|
|
|
|
# define CRYPTOPP_NO_CPU_FEATURE_PROBES 1
|
|
|
|
#endif
|
|
|
|
|
2017-03-20 12:51:10 +00:00
|
|
|
// ***************** Initialization and Constructor priorities ********************
|
|
|
|
|
|
|
|
// CRYPTOPP_INIT_PRIORITY attempts to manage initialization of C++ static objects.
|
|
|
|
// Under GCC, the library uses init_priority attribute in the range
|
|
|
|
// [CRYPTOPP_INIT_PRIORITY, CRYPTOPP_INIT_PRIORITY+100]. Under Windows,
|
|
|
|
// CRYPTOPP_INIT_PRIORITY enlists "#pragma init_seg(lib)". The platforms
|
|
|
|
// with gaps are Apple and Sun because they require linker scripts. Apple and
|
|
|
|
// Sun will use the library's Singletons to initialize and acquire resources.
|
|
|
|
// Also see http://cryptopp.com/wiki/Static_Initialization_Order_Fiasco
|
|
|
|
#ifndef CRYPTOPP_INIT_PRIORITY
|
|
|
|
# define CRYPTOPP_INIT_PRIORITY 250
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// CRYPTOPP_USER_PRIORITY is for other libraries and user code that is using Crypto++
|
|
|
|
// and managing C++ static object creation. It is guaranteed not to conflict with
|
|
|
|
// values used by (or would be used by) the Crypto++ library.
|
2018-11-30 13:23:35 +00:00
|
|
|
#ifndef CRYPTOPP_USER_PRIORITY
|
|
|
|
# define CRYPTOPP_USER_PRIORITY (CRYPTOPP_INIT_PRIORITY+101)
|
2017-03-20 12:51:10 +00:00
|
|
|
#endif
|
|
|
|
|
2017-03-27 10:06:12 +00:00
|
|
|
// Most platforms allow us to specify when to create C++ objects. Apple and Sun do not.
|
|
|
|
#if (CRYPTOPP_INIT_PRIORITY > 0) && !(defined(NO_OS_DEPENDENCE) || defined(__APPLE__) || defined(__sun__))
|
2017-03-20 12:51:10 +00:00
|
|
|
# if (CRYPTOPP_GCC_VERSION >= 30000) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (_INTEL_COMPILER >= 800)
|
|
|
|
# define HAVE_GCC_INIT_PRIORITY 1
|
|
|
|
# elif (CRYPTOPP_MSC_VERSION >= 1310)
|
|
|
|
# define HAVE_MSC_INIT_PRIORITY 1
|
2018-11-30 13:23:35 +00:00
|
|
|
# elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__)
|
|
|
|
# define HAVE_XLC_INIT_PRIORITY 1
|
2017-03-20 12:51:10 +00:00
|
|
|
# endif
|
2017-03-27 10:06:12 +00:00
|
|
|
#endif // CRYPTOPP_INIT_PRIORITY, NO_OS_DEPENDENCE, Apple, Sun
|
2017-03-20 12:51:10 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// ***************** determine availability of OS features ********************
|
|
|
|
|
|
|
|
#ifndef NO_OS_DEPENDENCE
|
|
|
|
|
2019-01-05 14:54:42 +00:00
|
|
|
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_WIN32_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__unix__) || defined(__MACH__) || defined(__NetBSD__) || defined(__sun)
|
|
|
|
#define CRYPTOPP_UNIX_AVAILABLE
|
|
|
|
#endif
|
2016-05-15 06:30:08 +00:00
|
|
|
|
2017-02-19 07:04:38 +00:00
|
|
|
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_BSD_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(CRYPTOPP_WIN32_AVAILABLE) || defined(CRYPTOPP_UNIX_AVAILABLE)
|
|
|
|
# define HIGHRES_TIMER_AVAILABLE
|
|
|
|
#endif
|
|
|
|
|
2016-05-03 04:23:05 +00:00
|
|
|
#ifdef CRYPTOPP_WIN32_AVAILABLE
|
|
|
|
# if !defined(WINAPI_FAMILY)
|
|
|
|
# define THREAD_TIMER_AVAILABLE
|
2016-05-15 06:30:08 +00:00
|
|
|
# elif defined(WINAPI_FAMILY)
|
2016-05-03 04:23:05 +00:00
|
|
|
# if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
|
|
|
|
# define THREAD_TIMER_AVAILABLE
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if defined(CRYPTOPP_UNIX_AVAILABLE) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
|
|
|
|
# define NONBLOCKING_RNG_AVAILABLE
|
|
|
|
# define BLOCKING_RNG_AVAILABLE
|
|
|
|
# define OS_RNG_AVAILABLE
|
2017-09-09 20:25:15 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Cygwin/Newlib requires _XOPEN_SOURCE=600
|
2017-03-10 06:53:51 +00:00
|
|
|
#if defined(CRYPTOPP_UNIX_AVAILABLE)
|
2016-10-02 02:12:08 +00:00
|
|
|
# define UNIX_SIGNALS_AVAILABLE 1
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#ifdef CRYPTOPP_WIN32_AVAILABLE
|
2016-05-03 04:23:05 +00:00
|
|
|
# if !defined(WINAPI_FAMILY)
|
|
|
|
# define NONBLOCKING_RNG_AVAILABLE
|
|
|
|
# define OS_RNG_AVAILABLE
|
2016-05-15 06:30:08 +00:00
|
|
|
# elif defined(WINAPI_FAMILY)
|
2016-05-03 04:23:05 +00:00
|
|
|
# if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
|
|
|
|
# define NONBLOCKING_RNG_AVAILABLE
|
|
|
|
# define OS_RNG_AVAILABLE
|
|
|
|
# elif !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
|
|
|
|
# if ((WINVER >= 0x0A00 /*_WIN32_WINNT_WIN10*/) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/))
|
|
|
|
# define NONBLOCKING_RNG_AVAILABLE
|
|
|
|
# define OS_RNG_AVAILABLE
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# endif
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // NO_OS_DEPENDENCE
|
|
|
|
|
|
|
|
// ***************** DLL related ********************
|
|
|
|
|
|
|
|
#if defined(CRYPTOPP_WIN32_AVAILABLE) && !defined(CRYPTOPP_DOXYGEN_PROCESSING)
|
|
|
|
|
|
|
|
#ifdef CRYPTOPP_EXPORTS
|
|
|
|
#define CRYPTOPP_IS_DLL
|
|
|
|
#define CRYPTOPP_DLL __declspec(dllexport)
|
|
|
|
#elif defined(CRYPTOPP_IMPORTS)
|
|
|
|
#define CRYPTOPP_IS_DLL
|
|
|
|
#define CRYPTOPP_DLL __declspec(dllimport)
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_DLL
|
|
|
|
#endif
|
|
|
|
|
2018-01-21 19:19:00 +00:00
|
|
|
// C++ makes const internal linkage
|
|
|
|
#define CRYPTOPP_TABLE extern
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_API __cdecl
|
|
|
|
|
2015-11-18 20:32:28 +00:00
|
|
|
#else // not CRYPTOPP_WIN32_AVAILABLE
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2018-01-21 19:19:00 +00:00
|
|
|
// C++ makes const internal linkage
|
|
|
|
#define CRYPTOPP_TABLE extern
|
2015-11-05 06:59:46 +00:00
|
|
|
#define CRYPTOPP_DLL
|
|
|
|
#define CRYPTOPP_API
|
|
|
|
|
|
|
|
#endif // CRYPTOPP_WIN32_AVAILABLE
|
|
|
|
|
|
|
|
#if defined(__MWERKS__)
|
|
|
|
#define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern class CRYPTOPP_DLL
|
|
|
|
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
|
|
|
|
#define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
|
|
|
|
#define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__MWERKS__)
|
|
|
|
#define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern class
|
|
|
|
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
|
|
|
|
#define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS template class
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern template class
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
|
|
|
|
#define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
|
|
|
|
#else
|
|
|
|
#define CRYPTOPP_STATIC_TEMPLATE_CLASS CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ************** Unused variable ***************
|
2015-11-18 20:32:28 +00:00
|
|
|
|
|
|
|
// Portable way to suppress warnings.
|
|
|
|
// Moved from misc.h due to circular depenedencies.
|
2016-09-19 21:55:36 +00:00
|
|
|
#define CRYPTOPP_UNUSED(x) ((void)(x))
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2016-04-23 20:45:35 +00:00
|
|
|
// ************** Deprecated ***************
|
|
|
|
|
2017-05-22 01:51:31 +00:00
|
|
|
#if (CRYPTOPP_GCC_VERSION >= 40500) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40200)
|
|
|
|
# define CRYPTOPP_DEPRECATED(msg) __attribute__((deprecated (msg)))
|
2016-04-23 20:45:35 +00:00
|
|
|
#elif (CRYPTOPP_GCC_VERSION)
|
2017-05-22 01:51:31 +00:00
|
|
|
# define CRYPTOPP_DEPRECATED(msg) __attribute__((deprecated))
|
2016-04-23 20:45:35 +00:00
|
|
|
#else
|
|
|
|
# define CRYPTOPP_DEPRECATED(msg)
|
|
|
|
#endif
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// ***************** C++11 related ********************
|
|
|
|
|
2018-02-21 14:59:52 +00:00
|
|
|
// Visual Studio began at VS2010, http://msdn.microsoft.com/en-us/library/hh567368%28v=vs.110%29.aspx
|
|
|
|
// and https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance .
|
|
|
|
// Intel, http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler
|
|
|
|
// GCC, http://gcc.gnu.org/projects/cxx0x.html
|
|
|
|
// Clang, http://clang.llvm.org/cxx_status.html
|
|
|
|
|
|
|
|
// Compatibility with non-clang compilers.
|
|
|
|
#ifndef __has_feature
|
|
|
|
# define __has_feature(x) 0
|
|
|
|
#endif
|
2017-11-06 14:09:45 +00:00
|
|
|
|
|
|
|
#if !defined(CRYPTOPP_NO_CXX11)
|
|
|
|
# if ((_MSC_VER >= 1600) || (__cplusplus >= 201103L)) && !defined(_STLPORT_VERSION)
|
|
|
|
# define CRYPTOPP_CXX11 1
|
|
|
|
# endif
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Hack ahead. Apple's standard library does not have C++'s unique_ptr in C++11. We can't
|
|
|
|
// test for unique_ptr directly because some of the non-Apple Clangs on OS X fail the same
|
|
|
|
// way. However, modern standard libraries have <forward_list>, so we test for it instead.
|
|
|
|
// Thanks to Jonathan Wakely for devising the clever test for modern/ancient versions.
|
|
|
|
// TODO: test under Xcode 3, where g++ is really g++.
|
2015-11-18 20:32:28 +00:00
|
|
|
#if defined(__APPLE__) && defined(__clang__)
|
|
|
|
# if !(defined(__has_include) && __has_include(<forward_list>))
|
2015-11-05 06:59:46 +00:00
|
|
|
# undef CRYPTOPP_CXX11
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// C++11 or C++14 is available
|
2016-05-15 06:30:08 +00:00
|
|
|
#if defined(CRYPTOPP_CXX11)
|
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// atomics: MS at VS2012 (17.00); GCC at 4.4; Clang at 3.1/3.2; Intel 13.0; SunCC 5.14.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_atomic) || \
|
|
|
|
(__INTEL_COMPILER >= 1300) || (CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5140)
|
|
|
|
# define CRYPTOPP_CXX11_ATOMICS 1
|
2016-05-15 06:30:08 +00:00
|
|
|
#endif // atomics
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// synchronization: MS at VS2012 (17.00); GCC at 4.4; Clang at 3.3; Xcode 5.0; Intel 12.0; SunCC 5.13.
|
2016-06-07 02:08:04 +00:00
|
|
|
// TODO: verify Clang and Intel versions; find __has_feature(x) extension for Clang
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1700) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || \
|
|
|
|
(CRYPTOPP_APPLE_CLANG_VERSION >= 50000) || (__INTEL_COMPILER >= 1200) || \
|
|
|
|
(CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5130)
|
2017-11-07 01:49:16 +00:00
|
|
|
// Hack ahead. New GCC compilers like GCC 6 on AIX 7.0 or earlier as well as original MinGW
|
|
|
|
// don't have the synchronization gear. However, Wakely's test used for Apple does not work
|
|
|
|
// on the GCC/AIX combination. Another twist is we need other stuff from C++11,
|
|
|
|
// like no-except destructors. Dumping preprocessors shows the following may
|
|
|
|
// apply: http://stackoverflow.com/q/14191566/608639.
|
|
|
|
# include <cstddef>
|
|
|
|
# if !defined(__GLIBCXX__) || defined(_GLIBCXX_HAS_GTHREADS)
|
|
|
|
# define CRYPTOPP_CXX11_SYNCHRONIZATION 1
|
|
|
|
# endif
|
2016-06-07 02:08:04 +00:00
|
|
|
#endif // synchronization
|
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// Dynamic Initialization and Destruction with Concurrency ("Magic Statics")
|
2017-08-31 10:41:44 +00:00
|
|
|
// MS at VS2015 with Vista (19.00); GCC at 4.3; LLVM Clang at 2.9; Apple Clang at 4.0; Intel 11.1; SunCC 5.13.
|
2017-03-15 10:20:45 +00:00
|
|
|
// Microsoft's implementation only works for Vista and above, so its further
|
|
|
|
// limited. http://connect.microsoft.com/VisualStudio/feedback/details/1789709
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1900) && ((WINVER >= 0x0600) || (_WIN32_WINNT >= 0x0600)) || \
|
|
|
|
(CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000) || \
|
|
|
|
(__INTEL_COMPILER >= 1110) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
|
|
|
|
# define CRYPTOPP_CXX11_DYNAMIC_INIT 1
|
2017-03-15 10:20:45 +00:00
|
|
|
#endif // Dynamic Initialization compilers
|
|
|
|
|
|
|
|
// alignof/alignas: MS at VS2015 (19.00); GCC at 4.8; Clang at 3.0; Intel 15.0; SunCC 5.13.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_alignas) || \
|
|
|
|
(__INTEL_COMPILER >= 1500) || (CRYPTOPP_GCC_VERSION >= 40800) || (__SUNPRO_CC >= 0x5130)
|
2016-06-15 09:02:28 +00:00
|
|
|
# define CRYPTOPP_CXX11_ALIGNAS 1
|
2017-03-15 10:20:45 +00:00
|
|
|
#endif // alignas
|
|
|
|
|
|
|
|
// alignof: MS at VS2015 (19.00); GCC at 4.5; Clang at 2.9; Intel 15.0; SunCC 5.13.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_alignof) || \
|
|
|
|
(__INTEL_COMPILER >= 1500) || (CRYPTOPP_GCC_VERSION >= 40500) || (__SUNPRO_CC >= 0x5130)
|
2016-06-15 09:02:28 +00:00
|
|
|
# define CRYPTOPP_CXX11_ALIGNOF 1
|
2017-03-15 10:20:45 +00:00
|
|
|
#endif // alignof
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2018-01-08 02:35:12 +00:00
|
|
|
// lambdas: MS at VS2012 (17.00); GCC at 4.9; Clang at 3.3; Intel 12.0; SunCC 5.14.
|
2018-02-15 02:35:46 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_lambdas) || \
|
2018-01-08 02:35:12 +00:00
|
|
|
(__INTEL_COMPILER >= 1200) || (CRYPTOPP_GCC_VERSION >= 40900) || (__SUNPRO_CC >= 0x5140)
|
|
|
|
# define CRYPTOPP_CXX11_LAMBDA 1
|
|
|
|
#endif // lambdas
|
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// noexcept: MS at VS2015 (19.00); GCC at 4.6; Clang at 3.0; Intel 14.0; SunCC 5.13.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_noexcept) || \
|
|
|
|
(__INTEL_COMPILER >= 1400) || (CRYPTOPP_GCC_VERSION >= 40600) || (__SUNPRO_CC >= 0x5130)
|
|
|
|
# define CRYPTOPP_CXX11_NOEXCEPT 1
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif // noexcept compilers
|
2016-05-03 04:23:05 +00:00
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// variadic templates: MS at VS2013 (18.00); GCC at 4.3; Clang at 2.9; Intel 12.1; SunCC 5.13.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1800) || __has_feature(cxx_variadic_templates) || \
|
|
|
|
(__INTEL_COMPILER >= 1210) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
|
|
|
|
# define CRYPTOPP_CXX11_VARIADIC_TEMPLATES 1
|
2015-11-18 20:32:28 +00:00
|
|
|
#endif // variadic templates
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// constexpr: MS at VS2015 (19.00); GCC at 4.6; Clang at 3.1; Intel 16.0; SunCC 5.13.
|
2016-09-02 02:45:44 +00:00
|
|
|
// Intel has mis-supported the feature since at least ICPC 13.00
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1900) || __has_feature(cxx_constexpr) || \
|
|
|
|
(__INTEL_COMPILER >= 1600) || (CRYPTOPP_GCC_VERSION >= 40600) || (__SUNPRO_CC >= 0x5130)
|
|
|
|
# define CRYPTOPP_CXX11_CONSTEXPR 1
|
2016-09-02 02:45:44 +00:00
|
|
|
#endif // constexpr compilers
|
|
|
|
|
2017-08-28 21:37:59 +00:00
|
|
|
// strong typed enums: MS at VS2012 (17.00); GCC at 4.4; Clang at 3.3; Intel 14.0; SunCC 5.12.
|
|
|
|
// Mircorosft and Intel had partial support earlier, but we require full support.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1700) || __has_feature(cxx_strong_enums) || \
|
|
|
|
(__INTEL_COMPILER >= 1400) || (CRYPTOPP_GCC_VERSION >= 40400) || (__SUNPRO_CC >= 0x5120)
|
|
|
|
# define CRYPTOPP_CXX11_ENUM 1
|
2017-08-28 21:37:59 +00:00
|
|
|
#endif // constexpr compilers
|
|
|
|
|
2017-03-15 10:20:45 +00:00
|
|
|
// nullptr_t: MS at VS2010 (16.00); GCC at 4.6; Clang at 3.3; Intel 10.0; SunCC 5.13.
|
2017-08-31 10:41:44 +00:00
|
|
|
#if (CRYPTOPP_MSC_VERSION >= 1600) || __has_feature(cxx_nullptr) || \
|
2018-11-23 00:44:41 +00:00
|
|
|
(__INTEL_COMPILER >= 1000) || (CRYPTOPP_GCC_VERSION >= 40600) || \
|
|
|
|
(__SUNPRO_CC >= 0x5130) || defined(__IBMCPP_NULLPTR)
|
2017-08-31 10:41:44 +00:00
|
|
|
# define CRYPTOPP_CXX11_NULLPTR 1
|
2017-03-01 11:10:06 +00:00
|
|
|
#endif // nullptr_t compilers
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif // CRYPTOPP_CXX11
|
2016-05-15 06:30:08 +00:00
|
|
|
|
2018-02-21 14:59:52 +00:00
|
|
|
// ***************** C++17 related ********************
|
|
|
|
|
2018-02-21 23:01:31 +00:00
|
|
|
// C++17 macro version, https://stackoverflow.com/q/38456127/608639
|
2018-03-05 11:47:05 +00:00
|
|
|
#if defined(CRYPTOPP_CXX11) && !defined(CRYPTOPP_NO_CXX17)
|
2018-02-21 23:01:31 +00:00
|
|
|
# if ((_MSC_VER >= 1900) || (__cplusplus >= 201703L)) && !defined(_STLPORT_VERSION)
|
2018-02-21 14:59:52 +00:00
|
|
|
# define CRYPTOPP_CXX17 1
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// C++17 is available
|
|
|
|
#if defined(CRYPTOPP_CXX17)
|
|
|
|
|
|
|
|
// C++17 uncaught_exceptions: MS at VS2015 (19.00); GCC at 6.0; Clang at 3.5; Intel 18.0.
|
|
|
|
// Clang and __EXCEPTIONS see http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html
|
|
|
|
#if defined(__clang__)
|
|
|
|
# if __EXCEPTIONS && __has_feature(cxx_exceptions)
|
2018-11-12 08:37:32 +00:00
|
|
|
# if __cpp_lib_uncaught_exceptions
|
|
|
|
# define CRYPTOPP_CXX17_EXCEPTIONS 1
|
|
|
|
# endif
|
2018-02-21 14:59:52 +00:00
|
|
|
# endif
|
2018-11-12 08:37:32 +00:00
|
|
|
#elif (CRYPTOPP_MSC_VERSION >= 1900) || (__INTEL_COMPILER >= 1800) || (CRYPTOPP_GCC_VERSION >= 60000) || (__cpp_lib_uncaught_exceptions)
|
2018-02-21 14:59:52 +00:00
|
|
|
# define CRYPTOPP_CXX17_EXCEPTIONS 1
|
|
|
|
#endif // uncaught_exceptions compilers
|
|
|
|
|
|
|
|
#endif // CRYPTOPP_CXX17
|
|
|
|
|
|
|
|
// ***************** C++ fixups ********************
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if defined(CRYPTOPP_CXX11_NOEXCEPT)
|
|
|
|
# define CRYPTOPP_THROW noexcept(false)
|
|
|
|
# define CRYPTOPP_NO_THROW noexcept(true)
|
|
|
|
#else
|
|
|
|
# define CRYPTOPP_THROW
|
|
|
|
# define CRYPTOPP_NO_THROW
|
|
|
|
#endif // CRYPTOPP_CXX11_NOEXCEPT
|
|
|
|
|
2016-11-12 14:34:34 +00:00
|
|
|
// http://stackoverflow.com/a/13867690/608639
|
2016-09-02 02:45:44 +00:00
|
|
|
#if defined(CRYPTOPP_CXX11_CONSTEXPR)
|
2016-12-01 14:37:04 +00:00
|
|
|
# define CRYPTOPP_STATIC_CONSTEXPR static constexpr
|
2016-09-02 02:45:44 +00:00
|
|
|
# define CRYPTOPP_CONSTEXPR constexpr
|
|
|
|
#else
|
2016-12-01 14:37:04 +00:00
|
|
|
# define CRYPTOPP_STATIC_CONSTEXPR static
|
2016-09-02 02:45:44 +00:00
|
|
|
# define CRYPTOPP_CONSTEXPR
|
|
|
|
#endif // CRYPTOPP_CXX11_CONSTEXPR
|
|
|
|
|
2016-06-14 23:14:09 +00:00
|
|
|
// Hack... CRYPTOPP_ALIGN_DATA is defined earlier, before C++11 alignas availability is determined
|
|
|
|
#if defined(CRYPTOPP_CXX11_ALIGNAS)
|
|
|
|
# undef CRYPTOPP_ALIGN_DATA
|
|
|
|
# define CRYPTOPP_ALIGN_DATA(x) alignas(x)
|
|
|
|
#endif // CRYPTOPP_CXX11_ALIGNAS
|
|
|
|
|
2016-09-06 12:53:55 +00:00
|
|
|
// Hack... CRYPTOPP_CONSTANT is defined earlier, before C++11 constexpr availability is determined
|
2016-11-13 16:50:34 +00:00
|
|
|
// http://stackoverflow.com/q/35213098/608639
|
2017-08-28 21:37:59 +00:00
|
|
|
// #if defined(CRYPTOPP_CXX11_CONSTEXPR)
|
|
|
|
// # undef CRYPTOPP_CONSTANT
|
|
|
|
// # define CRYPTOPP_CONSTANT(x) constexpr static int x;
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
// Hack... CRYPTOPP_CONSTANT is defined earlier, before C++11 constexpr availability is determined
|
|
|
|
// http://stackoverflow.com/q/35213098/608639
|
|
|
|
#if defined(CRYPTOPP_CXX11_ENUM)
|
|
|
|
# undef CRYPTOPP_CONSTANT
|
|
|
|
# define CRYPTOPP_CONSTANT(x) enum : int { x };
|
|
|
|
#elif defined(CRYPTOPP_CXX11_CONSTEXPR)
|
2016-09-06 12:53:55 +00:00
|
|
|
# undef CRYPTOPP_CONSTANT
|
|
|
|
# define CRYPTOPP_CONSTANT(x) constexpr static int x;
|
|
|
|
#endif
|
|
|
|
|
2017-03-01 11:10:06 +00:00
|
|
|
// Hack... C++11 nullptr_t type safety and analysis
|
|
|
|
#if defined(CRYPTOPP_CXX11_NULLPTR) && !defined(NULLPTR)
|
|
|
|
# define NULLPTR nullptr
|
|
|
|
#elif !defined(NULLPTR)
|
|
|
|
# define NULLPTR NULL
|
|
|
|
#endif // CRYPTOPP_CXX11_NULLPTR
|
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
// OK to comment the following out, but please report it so we can fix it.
|
2016-07-12 15:05:05 +00:00
|
|
|
// C++17 value taken from http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4567.pdf.
|
|
|
|
#if (defined(__cplusplus) && (__cplusplus >= 199711L) && (__cplusplus < 201402L)) && !defined(CRYPTOPP_UNCAUGHT_EXCEPTION_AVAILABLE)
|
2015-11-05 06:59:46 +00:00
|
|
|
# error "std::uncaught_exception is not available. This is likely a configuration error."
|
|
|
|
#endif
|
|
|
|
|
2018-02-21 14:59:52 +00:00
|
|
|
#endif // CRYPTOPP_CONFIG_H
|