1 // config_os.h - written and placed in public domain by Jeffrey Walton 2 // the bits that make up this source file are from the 3 // library's monolithic config.h. 4 5 /// \file config_os.h 6 /// \brief Library configuration file 7 /// \details <tt>config_os.h</tt> provides defines for platforms and operating 8 /// systems. 9 /// \details <tt>config.h</tt> was split into components in May 2019 to better 10 /// integrate with Autoconf and its feature tests. The splitting occurred so 11 /// users could continue to include <tt>config.h</tt> while allowing Autoconf 12 /// to write new <tt>config_asm.h</tt> and new <tt>config_cxx.h</tt> using 13 /// its feature tests. 14 /// \note You should include <tt>config.h</tt> rather than <tt>config_os.h</tt> 15 /// directly. 16 /// \sa <A HREF="https://github.com/weidai11/cryptopp/issues/835">Issue 835, 17 /// Make config.h more autoconf friendly</A>, 18 /// <A HREF="https://www.cryptopp.com/wiki/Configure.sh">Configure.sh script</A> 19 /// on the Crypto++ wiki 20 /// \since Crypto++ 8.3 21 22 #ifndef CRYPTOPP_CONFIG_OS_H 23 #define CRYPTOPP_CONFIG_OS_H 24 25 #include "config_ver.h" 26 27 // It is OK to remove the hard stop below, but you are on your own. 28 // After building the library be sure to run self tests described 29 // https://www.cryptopp.com/wiki/Release_Process#Self_Tests 30 // The problems with Clang pretending to be other compilers is 31 // discussed at http://github.com/weidai11/cryptopp/issues/147. 32 #if (defined(_MSC_VER) && defined(__clang__) && \ 33 !(defined( __clang_analyzer__)) && !defined(__INTEL_LLVM_COMPILER)) 34 # error: "Unsupported configuration" 35 #endif 36 37 // Windows platform 38 #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) 39 #define CRYPTOPP_WIN32_AVAILABLE 40 #endif 41 42 // Unix and Linux platforms 43 #if defined(__unix__) || defined(__MACH__) || defined(__NetBSD__) || defined(__sun) 44 #define CRYPTOPP_UNIX_AVAILABLE 45 #endif 46 47 // BSD platforms 48 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) 49 #define CRYPTOPP_BSD_AVAILABLE 50 #endif 51 52 // Microsoft compilers 53 #if defined(_MSC_VER) || defined(__fastcall) 54 #define CRYPTOPP_FASTCALL __fastcall 55 #else 56 #define CRYPTOPP_FASTCALL 57 #endif 58 59 // Microsoft compilers 60 #if defined(_MSC_VER) 61 #define CRYPTOPP_NO_VTABLE __declspec(novtable) 62 #else 63 #define CRYPTOPP_NO_VTABLE 64 #endif 65 66 // Define this if you want to disable all OS-dependent features, 67 // such as sockets and OS-provided random number generators 68 // #define NO_OS_DEPENDENCE 69 70 // Define this to use features provided by Microsoft's CryptoAPI. 71 // Currently the only feature used is Windows random number generation. 72 // This macro will be ignored if NO_OS_DEPENDENCE is defined. 73 // #define USE_MS_CRYPTOAPI 74 75 // Define this to use features provided by Microsoft's CryptoNG API. 76 // CryptoNG API is available in Vista and above and its cross platform, 77 // including desktop apps and store apps. Currently the only feature 78 // used is Windows random number generation. 79 // This macro will be ignored if NO_OS_DEPENDENCE is defined. 80 // #define USE_MS_CNGAPI 81 82 // If the user did not make a choice, then select CryptoNG if 83 // targeting Windows 8 or above. 84 #if !defined(USE_MS_CRYPTOAPI) && !defined(USE_MS_CNGAPI) 85 # if !defined(_USING_V110_SDK71_) && ((WINVER >= 0x0602 /*_WIN32_WINNT_WIN8*/) || \ 86 (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)) 87 # define USE_MS_CNGAPI 88 # else 89 # define USE_MS_CRYPTOAPI 90 # endif 91 #endif 92 93 // Begin OS features, like init priorities and random numbers 94 #ifndef NO_OS_DEPENDENCE 95 96 // CRYPTOPP_INIT_PRIORITY attempts to manage initialization of C++ static objects. 97 // Under GCC, the library uses init_priority attribute in the range 98 // [CRYPTOPP_INIT_PRIORITY, CRYPTOPP_INIT_PRIORITY+100]. Under Windows, 99 // CRYPTOPP_INIT_PRIORITY enlists "#pragma init_seg(lib)". The platforms 100 // with gaps are Apple and Sun because they require linker scripts. Apple and 101 // Sun will use the library's Singletons to initialize and acquire resources. 102 // Also see http://cryptopp.com/wiki/Static_Initialization_Order_Fiasco 103 #ifndef CRYPTOPP_INIT_PRIORITY 104 # define CRYPTOPP_INIT_PRIORITY 250 105 #endif 106 107 // CRYPTOPP_USER_PRIORITY is for other libraries and user code that is using Crypto++ 108 // and managing C++ static object creation. It is guaranteed not to conflict with 109 // values used by (or would be used by) the Crypto++ library. 110 #ifndef CRYPTOPP_USER_PRIORITY 111 # define CRYPTOPP_USER_PRIORITY (CRYPTOPP_INIT_PRIORITY+101) 112 #endif 113 114 // Most platforms allow us to specify when to create C++ objects. Apple and Sun do not. 115 #if (CRYPTOPP_INIT_PRIORITY > 0) && !(defined(NO_OS_DEPENDENCE) || defined(__APPLE__) || defined(__sun__)) 116 # if (CRYPTOPP_GCC_VERSION >= 30000) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (_INTEL_COMPILER >= 800) 117 # define HAVE_GCC_INIT_PRIORITY 1 118 # elif (CRYPTOPP_MSC_VERSION >= 1310) 119 # define HAVE_MSC_INIT_PRIORITY 1 120 # elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__) 121 # define HAVE_XLC_INIT_PRIORITY 1 122 # endif 123 #endif // CRYPTOPP_INIT_PRIORITY, NO_OS_DEPENDENCE, Apple, Sun 124 125 #if defined(CRYPTOPP_WIN32_AVAILABLE) || defined(CRYPTOPP_UNIX_AVAILABLE) 126 # define HIGHRES_TIMER_AVAILABLE 127 #endif 128 129 #ifdef CRYPTOPP_WIN32_AVAILABLE 130 # if !defined(WINAPI_FAMILY) 131 # define THREAD_TIMER_AVAILABLE 132 # elif defined(WINAPI_FAMILY) 133 # if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) 134 # define THREAD_TIMER_AVAILABLE 135 # endif 136 # endif 137 #endif 138 139 #if defined(CRYPTOPP_UNIX_AVAILABLE) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 140 # define NONBLOCKING_RNG_AVAILABLE 141 # define BLOCKING_RNG_AVAILABLE 142 # define OS_RNG_AVAILABLE 143 #endif 144 145 // Cygwin/Newlib requires _XOPEN_SOURCE=600 146 #if defined(CRYPTOPP_UNIX_AVAILABLE) 147 # define UNIX_SIGNALS_AVAILABLE 1 148 #endif 149 150 #ifdef CRYPTOPP_WIN32_AVAILABLE 151 # if !defined(WINAPI_FAMILY) 152 # define NONBLOCKING_RNG_AVAILABLE 153 # define OS_RNG_AVAILABLE 154 # elif defined(WINAPI_FAMILY) 155 # if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) 156 # define NONBLOCKING_RNG_AVAILABLE 157 # define OS_RNG_AVAILABLE 158 # elif !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) 159 # if ((WINVER >= 0x0A00 /*_WIN32_WINNT_WIN10*/) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)) 160 # define NONBLOCKING_RNG_AVAILABLE 161 # define OS_RNG_AVAILABLE 162 # endif 163 # endif 164 # endif 165 #endif 166 167 #endif // NO_OS_DEPENDENCE 168 169 #endif // CRYPTOPP_CONFIG_OS_H 170