1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2023, Google Inc. 2*8fb009dcSAndroid Build Coastguard Worker * 3*8fb009dcSAndroid Build Coastguard Worker * Permission to use, copy, modify, and/or distribute this software for any 4*8fb009dcSAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above 5*8fb009dcSAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies. 6*8fb009dcSAndroid Build Coastguard Worker * 7*8fb009dcSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8*8fb009dcSAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9*8fb009dcSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10*8fb009dcSAndroid Build Coastguard Worker * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11*8fb009dcSAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12*8fb009dcSAndroid Build Coastguard Worker * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13*8fb009dcSAndroid Build Coastguard Worker * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14*8fb009dcSAndroid Build Coastguard Worker 15*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_TARGET_H 16*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_TARGET_H 17*8fb009dcSAndroid Build Coastguard Worker 18*8fb009dcSAndroid Build Coastguard Worker // Preprocessor symbols that define the target platform. 19*8fb009dcSAndroid Build Coastguard Worker // 20*8fb009dcSAndroid Build Coastguard Worker // This file may be included in C, C++, and assembler and must be compatible 21*8fb009dcSAndroid Build Coastguard Worker // with each environment. It is separated out only to share code between 22*8fb009dcSAndroid Build Coastguard Worker // <openssl/base.h> and <openssl/asm_base.h>. Prefer to include those headers 23*8fb009dcSAndroid Build Coastguard Worker // instead. 24*8fb009dcSAndroid Build Coastguard Worker 25*8fb009dcSAndroid Build Coastguard Worker #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) 26*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT 27*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_X86_64 28*8fb009dcSAndroid Build Coastguard Worker #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86) 29*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 30*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_X86 31*8fb009dcSAndroid Build Coastguard Worker #elif defined(__AARCH64EL__) || defined(_M_ARM64) 32*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT 33*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_AARCH64 34*8fb009dcSAndroid Build Coastguard Worker #elif defined(__ARMEL__) || defined(_M_ARM) 35*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 36*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ARM 37*8fb009dcSAndroid Build Coastguard Worker #elif defined(__MIPSEL__) && !defined(__LP64__) 38*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 39*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MIPS 40*8fb009dcSAndroid Build Coastguard Worker #elif defined(__MIPSEL__) && defined(__LP64__) 41*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT 42*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MIPS64 43*8fb009dcSAndroid Build Coastguard Worker #elif defined(__riscv) && __SIZEOF_POINTER__ == 8 44*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT 45*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_RISCV64 46*8fb009dcSAndroid Build Coastguard Worker #elif defined(__riscv) && __SIZEOF_POINTER__ == 4 47*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 48*8fb009dcSAndroid Build Coastguard Worker #elif defined(__pnacl__) 49*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 50*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_PNACL 51*8fb009dcSAndroid Build Coastguard Worker #elif defined(__wasm__) 52*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 53*8fb009dcSAndroid Build Coastguard Worker #elif defined(__asmjs__) 54*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 55*8fb009dcSAndroid Build Coastguard Worker #elif defined(__myriad2__) 56*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT 57*8fb009dcSAndroid Build Coastguard Worker #else 58*8fb009dcSAndroid Build Coastguard Worker // The list above enumerates the platforms that BoringSSL supports. For these 59*8fb009dcSAndroid Build Coastguard Worker // platforms we keep a reasonable bar of not breaking them: automated test 60*8fb009dcSAndroid Build Coastguard Worker // coverage, for one, but also we need access to these types for machines for 61*8fb009dcSAndroid Build Coastguard Worker // fixing them. 62*8fb009dcSAndroid Build Coastguard Worker // 63*8fb009dcSAndroid Build Coastguard Worker // However, we know that anything that seems to work will soon be expected 64*8fb009dcSAndroid Build Coastguard Worker // to work and, quickly, the implicit expectation is that every machine will 65*8fb009dcSAndroid Build Coastguard Worker // always work. So this list serves to mark the boundary of what we guarantee. 66*8fb009dcSAndroid Build Coastguard Worker // Of course, you can run the code any many more machines, but then you're 67*8fb009dcSAndroid Build Coastguard Worker // taking on the burden of fixing it and, if you're doing that, then you must 68*8fb009dcSAndroid Build Coastguard Worker // be able to carry local patches. In which case patching this list is trivial. 69*8fb009dcSAndroid Build Coastguard Worker // 70*8fb009dcSAndroid Build Coastguard Worker // BoringSSL will only possibly work on standard 32-bit and 64-bit 71*8fb009dcSAndroid Build Coastguard Worker // two's-complement, little-endian architectures. Functions will not produce 72*8fb009dcSAndroid Build Coastguard Worker // the correct answer on other systems. Run the crypto_test binary, notably 73*8fb009dcSAndroid Build Coastguard Worker // crypto/compiler_test.cc, before trying a new architecture. 74*8fb009dcSAndroid Build Coastguard Worker #error "Unknown target CPU" 75*8fb009dcSAndroid Build Coastguard Worker #endif 76*8fb009dcSAndroid Build Coastguard Worker 77*8fb009dcSAndroid Build Coastguard Worker #if defined(__APPLE__) 78*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_APPLE 79*8fb009dcSAndroid Build Coastguard Worker #endif 80*8fb009dcSAndroid Build Coastguard Worker 81*8fb009dcSAndroid Build Coastguard Worker #if defined(_WIN32) 82*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_WINDOWS 83*8fb009dcSAndroid Build Coastguard Worker #endif 84*8fb009dcSAndroid Build Coastguard Worker 85*8fb009dcSAndroid Build Coastguard Worker // Trusty and Android baremetal aren't Linux but currently define __linux__. 86*8fb009dcSAndroid Build Coastguard Worker // As a workaround, we exclude them here. 87*8fb009dcSAndroid Build Coastguard Worker // We also exclude nanolibc/CrOS EC. nanolibc/CrOS EC sometimes build for a 88*8fb009dcSAndroid Build Coastguard Worker // non-Linux target (which should not define __linux__), but also sometimes 89*8fb009dcSAndroid Build Coastguard Worker // build for Linux. Although technically running in Linux userspace, this lacks 90*8fb009dcSAndroid Build Coastguard Worker // all the libc APIs we'd normally expect on Linux, so we treat it as a 91*8fb009dcSAndroid Build Coastguard Worker // non-Linux target. 92*8fb009dcSAndroid Build Coastguard Worker // 93*8fb009dcSAndroid Build Coastguard Worker // TODO(b/169780122): Remove this workaround once Trusty no longer defines it. 94*8fb009dcSAndroid Build Coastguard Worker // TODO(b/291101350): Remove this workaround once Android baremetal no longer 95*8fb009dcSAndroid Build Coastguard Worker // defines it. 96*8fb009dcSAndroid Build Coastguard Worker #if defined(__linux__) && !defined(__TRUSTY__) && \ 97*8fb009dcSAndroid Build Coastguard Worker !defined(ANDROID_BAREMETAL) && !defined(OPENSSL_NANOLIBC) && \ 98*8fb009dcSAndroid Build Coastguard Worker !defined(CROS_EC) 99*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_LINUX 100*8fb009dcSAndroid Build Coastguard Worker #endif 101*8fb009dcSAndroid Build Coastguard Worker 102*8fb009dcSAndroid Build Coastguard Worker #if defined(__Fuchsia__) 103*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_FUCHSIA 104*8fb009dcSAndroid Build Coastguard Worker #endif 105*8fb009dcSAndroid Build Coastguard Worker 106*8fb009dcSAndroid Build Coastguard Worker // Trusty is Android's TEE target. See 107*8fb009dcSAndroid Build Coastguard Worker // https://source.android.com/docs/security/features/trusty 108*8fb009dcSAndroid Build Coastguard Worker // 109*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded 110*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines. 111*8fb009dcSAndroid Build Coastguard Worker #if defined(__TRUSTY__) 112*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_TRUSTY 113*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM 114*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO 115*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK 116*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED 117*8fb009dcSAndroid Build Coastguard Worker #endif 118*8fb009dcSAndroid Build Coastguard Worker 119*8fb009dcSAndroid Build Coastguard Worker // nanolibc is a particular minimal libc implementation. Defining this on any 120*8fb009dcSAndroid Build Coastguard Worker // other platform is not supported. Other embedded platforms must introduce 121*8fb009dcSAndroid Build Coastguard Worker // their own defines. 122*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_NANOLIBC) 123*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM 124*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO 125*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK 126*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED 127*8fb009dcSAndroid Build Coastguard Worker #endif 128*8fb009dcSAndroid Build Coastguard Worker 129*8fb009dcSAndroid Build Coastguard Worker // Android baremetal is an embedded target that uses a subset of bionic. 130*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded 131*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines. 132*8fb009dcSAndroid Build Coastguard Worker #if defined(ANDROID_BAREMETAL) 133*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM 134*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO 135*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK 136*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED 137*8fb009dcSAndroid Build Coastguard Worker #endif 138*8fb009dcSAndroid Build Coastguard Worker 139*8fb009dcSAndroid Build Coastguard Worker // CROS_EC is an embedded target for ChromeOS Embedded Controller. Defining 140*8fb009dcSAndroid Build Coastguard Worker // this on any other platform is not supported. Other embedded platforms must 141*8fb009dcSAndroid Build Coastguard Worker // introduce their own defines. 142*8fb009dcSAndroid Build Coastguard Worker // 143*8fb009dcSAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md 144*8fb009dcSAndroid Build Coastguard Worker #if defined(CROS_EC) 145*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM 146*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO 147*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK 148*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED 149*8fb009dcSAndroid Build Coastguard Worker #endif 150*8fb009dcSAndroid Build Coastguard Worker 151*8fb009dcSAndroid Build Coastguard Worker // Zephyr is an open source RTOS, optimized for embedded devices. 152*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded 153*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines. 154*8fb009dcSAndroid Build Coastguard Worker // 155*8fb009dcSAndroid Build Coastguard Worker // Zephyr supports multithreading with cooperative and preemptive scheduling. 156*8fb009dcSAndroid Build Coastguard Worker // It also implements POSIX Threads (pthread) API, so it's not necessary to 157*8fb009dcSAndroid Build Coastguard Worker // implement BoringSSL internal threading API using some custom API. 158*8fb009dcSAndroid Build Coastguard Worker // 159*8fb009dcSAndroid Build Coastguard Worker // https://www.zephyrproject.org/ 160*8fb009dcSAndroid Build Coastguard Worker #if defined(__ZEPHYR__) 161*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM 162*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO 163*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK 164*8fb009dcSAndroid Build Coastguard Worker #endif 165*8fb009dcSAndroid Build Coastguard Worker 166*8fb009dcSAndroid Build Coastguard Worker #if defined(__ANDROID_API__) 167*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ANDROID 168*8fb009dcSAndroid Build Coastguard Worker #endif 169*8fb009dcSAndroid Build Coastguard Worker 170*8fb009dcSAndroid Build Coastguard Worker #if defined(__FreeBSD__) 171*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_FREEBSD 172*8fb009dcSAndroid Build Coastguard Worker #endif 173*8fb009dcSAndroid Build Coastguard Worker 174*8fb009dcSAndroid Build Coastguard Worker #if defined(__OpenBSD__) 175*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_OPENBSD 176*8fb009dcSAndroid Build Coastguard Worker #endif 177*8fb009dcSAndroid Build Coastguard Worker 178*8fb009dcSAndroid Build Coastguard Worker // BoringSSL requires platform's locking APIs to make internal global state 179*8fb009dcSAndroid Build Coastguard Worker // thread-safe, including the PRNG. On some single-threaded embedded platforms, 180*8fb009dcSAndroid Build Coastguard Worker // locking APIs may not exist, so this dependency may be disabled with the 181*8fb009dcSAndroid Build Coastguard Worker // following build flag. 182*8fb009dcSAndroid Build Coastguard Worker // 183*8fb009dcSAndroid Build Coastguard Worker // IMPORTANT: Doing so means the consumer promises the library will never be 184*8fb009dcSAndroid Build Coastguard Worker // used in any multi-threaded context. It causes BoringSSL to be globally 185*8fb009dcSAndroid Build Coastguard Worker // thread-unsafe. Setting it inappropriately will subtly and unpredictably 186*8fb009dcSAndroid Build Coastguard Worker // corrupt memory and leak secret keys. 187*8fb009dcSAndroid Build Coastguard Worker // 188*8fb009dcSAndroid Build Coastguard Worker // Do not set this flag on any platform where threads are possible. BoringSSL 189*8fb009dcSAndroid Build Coastguard Worker // maintainers will not provide support for any consumers that do so. Changes 190*8fb009dcSAndroid Build Coastguard Worker // which break such unsupported configurations will not be reverted. 191*8fb009dcSAndroid Build Coastguard Worker #if !defined(OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED) 192*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_THREADS 193*8fb009dcSAndroid Build Coastguard Worker #endif 194*8fb009dcSAndroid Build Coastguard Worker 195*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_UNSAFE_FUZZER_MODE) && \ 196*8fb009dcSAndroid Build Coastguard Worker !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) 197*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_UNSAFE_DETERMINISTIC_MODE 198*8fb009dcSAndroid Build Coastguard Worker #endif 199*8fb009dcSAndroid Build Coastguard Worker 200*8fb009dcSAndroid Build Coastguard Worker #if defined(__has_feature) 201*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(address_sanitizer) 202*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASAN 203*8fb009dcSAndroid Build Coastguard Worker #endif 204*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(thread_sanitizer) 205*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_TSAN 206*8fb009dcSAndroid Build Coastguard Worker #endif 207*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(memory_sanitizer) 208*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MSAN 209*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASM_INCOMPATIBLE 210*8fb009dcSAndroid Build Coastguard Worker #endif 211*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(hwaddress_sanitizer) 212*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HWASAN 213*8fb009dcSAndroid Build Coastguard Worker #endif 214*8fb009dcSAndroid Build Coastguard Worker #endif 215*8fb009dcSAndroid Build Coastguard Worker 216*8fb009dcSAndroid Build Coastguard Worker // Disable 32-bit Arm assembly on Apple platforms. The last iOS version that 217*8fb009dcSAndroid Build Coastguard Worker // supported 32-bit Arm was iOS 10. 218*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM) 219*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASM_INCOMPATIBLE 220*8fb009dcSAndroid Build Coastguard Worker #endif 221*8fb009dcSAndroid Build Coastguard Worker 222*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_ASM_INCOMPATIBLE) 223*8fb009dcSAndroid Build Coastguard Worker #undef OPENSSL_ASM_INCOMPATIBLE 224*8fb009dcSAndroid Build Coastguard Worker #if !defined(OPENSSL_NO_ASM) 225*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_ASM 226*8fb009dcSAndroid Build Coastguard Worker #endif 227*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_ASM_INCOMPATIBLE 228*8fb009dcSAndroid Build Coastguard Worker 229*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_TARGET_H 230