blob: f74ef66c997a89fd530140e3ede33d4c932a4f1d [file] [log] [blame]
David Benjamina70c75c2014-09-11 19:11:15 -04001/* Copyright (c) 2014, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15#include <openssl/crypto.h>
16
David Benjamin20c37312015-11-11 21:33:18 -080017#include <openssl/cpu.h>
18
David Benjamina70c75c2014-09-11 19:11:15 -040019#include "internal.h"
20
Adam Langley3e652652015-01-09 15:44:37 -080021
Adam Langley6a7cfbe2015-10-16 15:46:46 -070022#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_STATIC_ARMCAP) && \
Adam Langley3e652652015-01-09 15:44:37 -080023 (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
Adam Langley4467e592016-09-23 12:47:24 -070024 defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) || \
25 defined(OPENSSL_PPC64LE))
26/* x86, x86_64, the ARMs and ppc64le need to record the result of a
27 * cpuid/getauxval call for the asm to work correctly, unless compiled without
28 * asm code. */
Adam Langley588d2522014-09-19 10:15:33 -070029#define NEED_CPUID
David Benjamina70c75c2014-09-11 19:11:15 -040030
Adam Langley588d2522014-09-19 10:15:33 -070031#else
32
33/* Otherwise, don't emit a static initialiser. */
34
35#if !defined(BORINGSSL_NO_STATIC_INITIALIZER)
David Benjamina70c75c2014-09-11 19:11:15 -040036#define BORINGSSL_NO_STATIC_INITIALIZER
37#endif
38
Adam Langley3e652652015-01-09 15:44:37 -080039#endif /* !OPENSSL_NO_ASM && (OPENSSL_X86 || OPENSSL_X86_64 ||
40 OPENSSL_ARM || OPENSSL_AARCH64) */
41
42
43/* The capability variables are defined in this file in order to work around a
44 * linker bug. When linking with a .a, if no symbols in a .o are referenced
45 * then the .o is discarded, even if it has constructor functions.
46 *
47 * This still means that any binaries that don't include some functionality
48 * that tests the capability values will still skip the constructor but, so
49 * far, the init constructor function only sets the capability variables. */
50
51#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
Adam Langleyb18cb6a2017-04-04 11:08:28 -070052
Adam Langley3e652652015-01-09 15:44:37 -080053/* This value must be explicitly initialised to zero in order to work around a
54 * bug in libtool or the linker on OS X.
55 *
56 * If not initialised then it becomes a "common symbol". When put into an
57 * archive, linking on OS X will fail to resolve common symbols. By
58 * initialising it to zero, it becomes a "data symbol", which isn't so
59 * affected. */
60uint32_t OPENSSL_ia32cap_P[4] = {0};
Adam Langleyb18cb6a2017-04-04 11:08:28 -070061
62#elif defined(OPENSSL_PPC64LE)
63
64unsigned long OPENSSL_ppc64le_hwcap2 = 0;
65
Adam Langley3e652652015-01-09 15:44:37 -080066#elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
67
Adam Langley73415b62015-08-24 18:03:17 -070068#include <openssl/arm_arch.h>
Adam Langley3e652652015-01-09 15:44:37 -080069
Adam Langley6a7cfbe2015-10-16 15:46:46 -070070#if defined(OPENSSL_STATIC_ARMCAP)
71
72uint32_t OPENSSL_armcap_P =
73#if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON__)
David Benjamin85003902016-02-23 18:04:15 -050074 ARMV7_NEON |
Adam Langley6a7cfbe2015-10-16 15:46:46 -070075#endif
David Benjamin3b33f3e2017-06-08 16:53:28 -040076#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_CRYPTO)
Adam Langley6a7cfbe2015-10-16 15:46:46 -070077 ARMV8_AES |
78#endif
David Benjamin3b33f3e2017-06-08 16:53:28 -040079#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_CRYPTO)
Adam Langley6a7cfbe2015-10-16 15:46:46 -070080 ARMV8_SHA1 |
81#endif
David Benjamin3b33f3e2017-06-08 16:53:28 -040082#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_CRYPTO)
Adam Langley6a7cfbe2015-10-16 15:46:46 -070083 ARMV8_SHA256 |
84#endif
David Benjamin3b33f3e2017-06-08 16:53:28 -040085#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO)
Adam Langley6a7cfbe2015-10-16 15:46:46 -070086 ARMV8_PMULL |
87#endif
88 0;
89
Adam Langley3e652652015-01-09 15:44:37 -080090#else
David Benjamin85003902016-02-23 18:04:15 -050091uint32_t OPENSSL_armcap_P = 0;
Adam Langley3e652652015-01-09 15:44:37 -080092#endif
93
94#endif
95
Adam Langleyfd499932017-04-04 14:21:43 -070096#if defined(BORINGSSL_FIPS)
97/* In FIPS mode, the power-on self-test function calls |CRYPTO_library_init|
98 * because we have to ensure that CPUID detection occurs first. */
99#define BORINGSSL_NO_STATIC_INITIALIZER
100#endif
Adam Langley588d2522014-09-19 10:15:33 -0700101
David Benjamin93a5b442015-11-19 11:39:46 -0500102#if defined(OPENSSL_WINDOWS) && !defined(BORINGSSL_NO_STATIC_INITIALIZER)
David Benjamina70c75c2014-09-11 19:11:15 -0400103#define OPENSSL_CDECL __cdecl
104#else
105#define OPENSSL_CDECL
106#endif
107
David Benjamin93a5b442015-11-19 11:39:46 -0500108#if defined(BORINGSSL_NO_STATIC_INITIALIZER)
109static CRYPTO_once_t once = CRYPTO_ONCE_INIT;
David Benjamine2568c42017-08-16 15:25:27 -0400110#elif defined(_MSC_VER)
David Benjamina70c75c2014-09-11 19:11:15 -0400111#pragma section(".CRT$XCU", read)
112static void __cdecl do_library_init(void);
113__declspec(allocate(".CRT$XCU")) void(*library_init_constructor)(void) =
114 do_library_init;
David Benjamin93a5b442015-11-19 11:39:46 -0500115#else
116static void do_library_init(void) __attribute__ ((constructor));
David Benjamina70c75c2014-09-11 19:11:15 -0400117#endif
David Benjamina70c75c2014-09-11 19:11:15 -0400118
119/* do_library_init is the actual initialization function. If
120 * BORINGSSL_NO_STATIC_INITIALIZER isn't defined, this is set as a static
121 * initializer. Otherwise, it is called by CRYPTO_library_init. */
122static void OPENSSL_CDECL do_library_init(void) {
Adam Langley3e652652015-01-09 15:44:37 -0800123 /* WARNING: this function may only configure the capability variables. See the
124 * note above about the linker bug. */
Adam Langley588d2522014-09-19 10:15:33 -0700125#if defined(NEED_CPUID)
David Benjamina70c75c2014-09-11 19:11:15 -0400126 OPENSSL_cpuid_setup();
127#endif
128}
129
130void CRYPTO_library_init(void) {
131 /* TODO(davidben): It would be tidier if this build knob could be replaced
132 * with an internal lazy-init mechanism that would handle things correctly
David Benjamin93a5b442015-11-19 11:39:46 -0500133 * in-library. https://crbug.com/542879 */
David Benjamina70c75c2014-09-11 19:11:15 -0400134#if defined(BORINGSSL_NO_STATIC_INITIALIZER)
David Benjamin93a5b442015-11-19 11:39:46 -0500135 CRYPTO_once(&once, do_library_init);
David Benjamina70c75c2014-09-11 19:11:15 -0400136#endif
137}
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700138
Adam Langleyb83c6802016-05-03 09:16:21 -0700139int CRYPTO_is_confidential_build(void) {
140#if defined(BORINGSSL_CONFIDENTIAL)
141 return 1;
142#else
143 return 0;
144#endif
145}
146
Adam Langley4fac8d02016-05-16 13:44:40 -0700147int CRYPTO_has_asm(void) {
148#if defined(OPENSSL_NO_ASM)
149 return 0;
150#else
151 return 1;
152#endif
153}
154
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700155const char *SSLeay_version(int unused) {
Adam Langleyb3a262c2015-05-19 16:30:20 -0700156 return "BoringSSL";
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700157}
158
Adam Langleyb3a262c2015-05-19 16:30:20 -0700159unsigned long SSLeay(void) {
160 return OPENSSL_VERSION_NUMBER;
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700161}
Adam Langley05ee4fd2015-08-02 09:35:44 -0700162
163int CRYPTO_malloc_init(void) {
164 return 1;
165}
166
167void ENGINE_load_builtin_engines(void) {}
David Benjamine5aa7912016-01-26 01:09:19 -0500168
Adam Langley27516f72016-07-12 10:26:56 -0700169int ENGINE_register_all_complete(void) {
170 return 1;
171}
172
David Benjamine5aa7912016-01-26 01:09:19 -0500173void OPENSSL_load_builtin_modules(void) {}