Mirror of BoringSSL (grpc依赖)
https://boringssl.googlesource.com/boringssl
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
8.5 KiB
239 lines
8.5 KiB
/* Copyright 2023 The BoringSSL Authors |
|
* |
|
* Permission to use, copy, modify, and/or distribute this software for any |
|
* purpose with or without fee is hereby granted, provided that the above |
|
* copyright notice and this permission notice appear in all copies. |
|
* |
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ |
|
|
|
#ifndef OPENSSL_HEADER_TARGET_H |
|
#define OPENSSL_HEADER_TARGET_H |
|
|
|
// Preprocessor symbols that define the target platform. |
|
// |
|
// This file may be included in C, C++, and assembler and must be compatible |
|
// with each environment. It is separated out only to share code between |
|
// <openssl/base.h> and <openssl/asm_base.h>. Prefer to include those headers |
|
// instead. |
|
|
|
#if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) |
|
#define OPENSSL_64_BIT |
|
#define OPENSSL_X86_64 |
|
#elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86) |
|
#define OPENSSL_32_BIT |
|
#define OPENSSL_X86 |
|
#elif defined(__AARCH64EL__) || defined(_M_ARM64) |
|
#define OPENSSL_64_BIT |
|
#define OPENSSL_AARCH64 |
|
#elif defined(__ARMEL__) || defined(_M_ARM) |
|
#define OPENSSL_32_BIT |
|
#define OPENSSL_ARM |
|
#elif defined(__MIPSEL__) && !defined(__LP64__) |
|
#define OPENSSL_32_BIT |
|
#define OPENSSL_MIPS |
|
#elif defined(__MIPSEL__) && defined(__LP64__) |
|
#define OPENSSL_64_BIT |
|
#define OPENSSL_MIPS64 |
|
#elif defined(__riscv) && __SIZEOF_POINTER__ == 8 |
|
#define OPENSSL_64_BIT |
|
#define OPENSSL_RISCV64 |
|
#elif defined(__riscv) && __SIZEOF_POINTER__ == 4 |
|
#define OPENSSL_32_BIT |
|
#elif defined(__pnacl__) |
|
#define OPENSSL_32_BIT |
|
#define OPENSSL_PNACL |
|
#elif defined(__wasm__) |
|
#define OPENSSL_32_BIT |
|
#elif defined(__asmjs__) |
|
#define OPENSSL_32_BIT |
|
#elif defined(__myriad2__) |
|
#define OPENSSL_32_BIT |
|
#else |
|
// The list above enumerates the platforms that BoringSSL supports. For these |
|
// platforms we keep a reasonable bar of not breaking them: automated test |
|
// coverage, for one, but also we need access to these types for machines for |
|
// fixing them. |
|
// |
|
// However, we know that anything that seems to work will soon be expected |
|
// to work and, quickly, the implicit expectation is that every machine will |
|
// always work. So this list serves to mark the boundary of what we guarantee. |
|
// Of course, you can run the code any many more machines, but then you're |
|
// taking on the burden of fixing it and, if you're doing that, then you must |
|
// be able to carry local patches. In which case patching this list is trivial. |
|
// |
|
// BoringSSL will only possibly work on standard 32-bit and 64-bit |
|
// two's-complement, little-endian architectures. Functions will not produce |
|
// the correct answer on other systems. Run the crypto_test binary, notably |
|
// crypto/compiler_test.cc, before trying a new architecture. |
|
#error "Unknown target CPU" |
|
#endif |
|
|
|
#if defined(__APPLE__) |
|
#define OPENSSL_APPLE |
|
#endif |
|
|
|
#if defined(_WIN32) |
|
#define OPENSSL_WINDOWS |
|
#endif |
|
|
|
// Trusty and Android baremetal aren't Linux but currently define __linux__. |
|
// As a workaround, we exclude them here. |
|
// We also exclude nanolibc/CrOS EC. nanolibc/CrOS EC sometimes build for a |
|
// non-Linux target (which should not define __linux__), but also sometimes |
|
// build for Linux. Although technically running in Linux userspace, this lacks |
|
// all the libc APIs we'd normally expect on Linux, so we treat it as a |
|
// non-Linux target. |
|
// |
|
// TODO(b/169780122): Remove this workaround once Trusty no longer defines it. |
|
// TODO(b/291101350): Remove this workaround once Android baremetal no longer |
|
// defines it. |
|
#if defined(__linux__) && !defined(__TRUSTY__) && \ |
|
!defined(ANDROID_BAREMETAL) && !defined(OPENSSL_NANOLIBC) && \ |
|
!defined(CROS_EC) |
|
#define OPENSSL_LINUX |
|
#endif |
|
|
|
#if defined(__Fuchsia__) |
|
#define OPENSSL_FUCHSIA |
|
#endif |
|
|
|
// Trusty is Android's TEE target. See |
|
// https://source.android.com/docs/security/features/trusty |
|
// |
|
// Defining this on any other platform is not supported. Other embedded |
|
// platforms must introduce their own defines. |
|
#if defined(__TRUSTY__) |
|
#define OPENSSL_TRUSTY |
|
#define OPENSSL_NO_FILESYSTEM |
|
#define OPENSSL_NO_POSIX_IO |
|
#define OPENSSL_NO_SOCK |
|
#define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED |
|
#endif |
|
|
|
// nanolibc is a particular minimal libc implementation. Defining this on any |
|
// other platform is not supported. Other embedded platforms must introduce |
|
// their own defines. |
|
#if defined(OPENSSL_NANOLIBC) |
|
#define OPENSSL_NO_FILESYSTEM |
|
#define OPENSSL_NO_POSIX_IO |
|
#define OPENSSL_NO_SOCK |
|
#define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED |
|
#endif |
|
|
|
// Android baremetal is an embedded target that uses a subset of bionic. |
|
// Defining this on any other platform is not supported. Other embedded |
|
// platforms must introduce their own defines. |
|
#if defined(ANDROID_BAREMETAL) |
|
#define OPENSSL_NO_FILESYSTEM |
|
#define OPENSSL_NO_POSIX_IO |
|
#define OPENSSL_NO_SOCK |
|
#define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED |
|
#endif |
|
|
|
// CROS_EC is an embedded target for ChromeOS Embedded Controller. Defining |
|
// this on any other platform is not supported. Other embedded platforms must |
|
// introduce their own defines. |
|
// |
|
// https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md |
|
#if defined(CROS_EC) |
|
#define OPENSSL_NO_FILESYSTEM |
|
#define OPENSSL_NO_POSIX_IO |
|
#define OPENSSL_NO_SOCK |
|
#define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED |
|
#endif |
|
|
|
// Zephyr is an open source RTOS, optimized for embedded devices. |
|
// Defining this on any other platform is not supported. Other embedded |
|
// platforms must introduce their own defines. |
|
// |
|
// Zephyr supports multithreading with cooperative and preemptive scheduling. |
|
// It also implements POSIX Threads (pthread) API, so it's not necessary to |
|
// implement BoringSSL internal threading API using some custom API. |
|
// |
|
// https://www.zephyrproject.org/ |
|
#if defined(__ZEPHYR__) |
|
#define OPENSSL_NO_FILESYSTEM |
|
#define OPENSSL_NO_POSIX_IO |
|
#define OPENSSL_NO_SOCK |
|
#endif |
|
|
|
#if defined(__ANDROID_API__) |
|
#define OPENSSL_ANDROID |
|
#endif |
|
|
|
#if defined(__FreeBSD__) |
|
#define OPENSSL_FREEBSD |
|
#endif |
|
|
|
#if defined(__OpenBSD__) |
|
#define OPENSSL_OPENBSD |
|
#endif |
|
|
|
// BoringSSL requires platform's locking APIs to make internal global state |
|
// thread-safe, including the PRNG. On some single-threaded embedded platforms, |
|
// locking APIs may not exist, so this dependency may be disabled with the |
|
// following build flag. |
|
// |
|
// IMPORTANT: Doing so means the consumer promises the library will never be |
|
// used in any multi-threaded context. It causes BoringSSL to be globally |
|
// thread-unsafe. Setting it inappropriately will subtly and unpredictably |
|
// corrupt memory and leak secret keys. |
|
// |
|
// Do not set this flag on any platform where threads are possible. BoringSSL |
|
// maintainers will not provide support for any consumers that do so. Changes |
|
// which break such unsupported configurations will not be reverted. |
|
#if !defined(OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED) |
|
#define OPENSSL_THREADS |
|
#endif |
|
|
|
#if defined(BORINGSSL_UNSAFE_FUZZER_MODE) && \ |
|
!defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) |
|
#define BORINGSSL_UNSAFE_DETERMINISTIC_MODE |
|
#endif |
|
|
|
#if defined(__has_feature) |
|
#if __has_feature(address_sanitizer) |
|
#define OPENSSL_ASAN |
|
#endif |
|
#if __has_feature(thread_sanitizer) |
|
#define OPENSSL_TSAN |
|
#endif |
|
#if __has_feature(memory_sanitizer) |
|
#define OPENSSL_MSAN |
|
#define OPENSSL_ASM_INCOMPATIBLE |
|
#endif |
|
#if __has_feature(hwaddress_sanitizer) |
|
#define OPENSSL_HWASAN |
|
#endif |
|
#endif |
|
|
|
// Disable 32-bit Arm assembly on Apple platforms. The last iOS version that |
|
// supported 32-bit Arm was iOS 10. |
|
#if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM) |
|
#define OPENSSL_ASM_INCOMPATIBLE |
|
#endif |
|
|
|
#if defined(OPENSSL_ASM_INCOMPATIBLE) |
|
#undef OPENSSL_ASM_INCOMPATIBLE |
|
#if !defined(OPENSSL_NO_ASM) |
|
#define OPENSSL_NO_ASM |
|
#endif |
|
#endif // OPENSSL_ASM_INCOMPATIBLE |
|
|
|
// We do not detect any features at runtime on several 32-bit Arm platforms. |
|
// Apple platforms and OpenBSD require NEON and moved to 64-bit to pick up Armv8 |
|
// extensions. Android baremetal does not aim to support 32-bit Arm at all, but |
|
// it simplifies things to make it build. |
|
#if defined(OPENSSL_ARM) && !defined(OPENSSL_STATIC_ARMCAP) && \ |
|
(defined(OPENSSL_APPLE) || defined(OPENSSL_OPENBSD) || \ |
|
defined(ANDROID_BAREMETAL)) |
|
#define OPENSSL_STATIC_ARMCAP |
|
#endif |
|
|
|
#endif // OPENSSL_HEADER_TARGET_H
|
|
|