blob: 2249aea6fa88b43557a8f5353f962aa6e5b5d36d [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* ====================================================================
2 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
Adam Langley428fb3a2018-07-09 17:03:57 -07009 * notice, this list of conditions and the following disclaimer.
Adam Langley95c29f32014-06-20 12:00:00 -070010 *
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * 3. All advertising materials mentioning features or use of this
17 * software must display the following acknowledgment:
18 * "This product includes software developed by the OpenSSL Project
19 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20 *
21 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22 * endorse or promote products derived from this software without
23 * prior written permission. For written permission, please contact
24 * openssl-core@openssl.org.
25 *
26 * 5. Products derived from this software may not be called "OpenSSL"
27 * nor may "OpenSSL" appear in their names without prior written
28 * permission of the OpenSSL Project.
29 *
30 * 6. Redistributions of any form whatsoever must retain the following
31 * acknowledgment:
32 * "This product includes software developed by the OpenSSL Project
33 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34 *
35 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46 * OF THE POSSIBILITY OF SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This product includes cryptographic software written by Eric Young
50 * (eay@cryptsoft.com). This product includes software written by Tim
51 * Hudson (tjh@cryptsoft.com). */
52
53#ifndef OPENSSL_HEADER_BASE_H
54#define OPENSSL_HEADER_BASE_H
55
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070056
David Benjamin4512b792017-08-18 19:21:50 -040057// This file should be the first included by all BoringSSL headers.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070058
Brian Smith054e6822015-03-27 21:12:01 -100059#include <stddef.h>
Adam Langley95c29f32014-06-20 12:00:00 -070060#include <stdint.h>
Adam Langley95c29f32014-06-20 12:00:00 -070061#include <sys/types.h>
62
David Benjamin8404bdb2016-10-10 14:41:44 -040063#if defined(__MINGW32__)
David Benjamin4512b792017-08-18 19:21:50 -040064// stdio.h is needed on MinGW for __MINGW_PRINTF_FORMAT.
David Benjamin8404bdb2016-10-10 14:41:44 -040065#include <stdio.h>
66#endif
67
David Benjamin7c3ce512018-09-30 18:50:26 -050068#if defined(__APPLE__)
69#include <TargetConditionals.h>
70#endif
71
David Benjamin4512b792017-08-18 19:21:50 -040072// Include a BoringSSL-only header so consumers including this header without
73// setting up include paths do not accidentally pick up the system
74// opensslconf.h.
David Benjamind403be92017-04-12 16:28:25 -040075#include <openssl/is_boringssl.h>
David Benjamine593fed2016-02-25 11:39:59 -050076#include <openssl/opensslconf.h>
Piotr Sikora987b8f12014-07-14 19:21:44 -070077
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -070078#if defined(BORINGSSL_PREFIX)
79#include <boringssl_prefix_symbols.h>
80#endif
81
Adam Langleyb2cb0ec2014-09-02 14:28:49 -070082#if defined(__cplusplus)
83extern "C" {
84#endif
85
86
Adam Langley95c29f32014-06-20 12:00:00 -070087#if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64)
88#define OPENSSL_64_BIT
89#define OPENSSL_X86_64
90#elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86)
91#define OPENSSL_32_BIT
92#define OPENSSL_X86
David Benjaminc3f46122020-12-01 17:47:57 -050093#elif defined(__AARCH64EL__) || defined(_M_ARM64)
Adam Langley95c29f32014-06-20 12:00:00 -070094#define OPENSSL_64_BIT
95#define OPENSSL_AARCH64
David Benjaminc3f46122020-12-01 17:47:57 -050096#elif defined(__ARMEL__) || defined(_M_ARM)
Adam Langley95c29f32014-06-20 12:00:00 -070097#define OPENSSL_32_BIT
98#define OPENSSL_ARM
David Benjaminc3f46122020-12-01 17:47:57 -050099#elif defined(__MIPSEL__) && !defined(__LP64__)
Adam Langley09020c22014-07-10 09:14:56 -0700100#define OPENSSL_32_BIT
101#define OPENSSL_MIPS
David Benjaminc3f46122020-12-01 17:47:57 -0500102#elif defined(__MIPSEL__) && defined(__LP64__)
Adam Langleyc11e13a2015-03-20 16:46:23 -0700103#define OPENSSL_64_BIT
104#define OPENSSL_MIPS64
Adam Langley56522622021-02-25 14:58:53 -0800105#elif defined(__riscv) && __SIZEOF_POINTER__ == 8
106#define OPENSSL_64_BIT
Rebecca Chang Swee Funb2d3c102022-08-24 02:38:49 +0000107#define OPENSSL_RISCV64
Adam Langley56522622021-02-25 14:58:53 -0800108#elif defined(__riscv) && __SIZEOF_POINTER__ == 4
109#define OPENSSL_32_BIT
Adam Langley0113a4f2014-07-10 17:07:14 -0700110#elif defined(__pnacl__)
111#define OPENSSL_32_BIT
112#define OPENSSL_PNACL
Adam Langley88e6a052018-03-20 16:12:56 -0700113#elif defined(__wasm__)
114#define OPENSSL_32_BIT
115#elif defined(__asmjs__)
116#define OPENSSL_32_BIT
Radu Margarint17b6a7f2016-07-21 15:46:57 -0700117#elif defined(__myriad2__)
118#define OPENSSL_32_BIT
Adam Langley95c29f32014-06-20 12:00:00 -0700119#else
David Benjamin4512b792017-08-18 19:21:50 -0400120// Note BoringSSL only supports standard 32-bit and 64-bit two's-complement,
121// little-endian architectures. Functions will not produce the correct answer
122// on other systems. Run the crypto_test binary, notably
123// crypto/compiler_test.cc, before adding a new architecture.
Adam Langley95c29f32014-06-20 12:00:00 -0700124#error "Unknown target CPU"
125#endif
126
Adam Langley30eda1d2014-06-24 11:15:12 -0700127#if defined(__APPLE__)
128#define OPENSSL_APPLE
David Benjamin40633ac2019-08-30 16:00:33 -0400129// Note |TARGET_OS_MAC| is set for all Apple OS variants. |TARGET_OS_OSX|
130// targets macOS specifically.
131#if defined(TARGET_OS_OSX) && TARGET_OS_OSX
132#define OPENSSL_MACOS
133#endif
David Benjamin13fd6272018-09-28 10:12:35 -0500134#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
135#define OPENSSL_IOS
136#endif
Adam Langley30eda1d2014-06-24 11:15:12 -0700137#endif
138
Brian Smith8a36e532015-07-31 16:11:31 -0400139#if defined(_WIN32)
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700140#define OPENSSL_WINDOWS
141#endif
142
David Benjamin9bf16342020-09-30 15:24:18 -0400143// Trusty isn't Linux but currently defines __linux__. As a workaround, we
144// exclude it here.
145// TODO(b/169780122): Remove this workaround once Trusty no longer defines it.
David Benjamina03c34c2021-09-03 17:13:15 -0400146#if defined(__linux__) && !defined(__TRUSTY__)
Alessandro Ghedini5e393fe2016-07-09 13:02:18 +0100147#define OPENSSL_LINUX
148#endif
149
Aaron Greenc80e4162017-01-13 11:49:38 -0800150#if defined(__Fuchsia__)
151#define OPENSSL_FUCHSIA
152#endif
153
David Benjamina03c34c2021-09-03 17:13:15 -0400154#if defined(__TRUSTY__)
Adam Langley65a7e942015-05-07 18:28:27 -0700155#define OPENSSL_TRUSTY
David Benjamin5b33eff2018-09-22 16:52:48 -0700156#define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
Adam Langley65a7e942015-05-07 18:28:27 -0700157#endif
158
Matthew Braithwaite548c2762018-06-22 18:53:05 -0700159#if defined(__ANDROID_API__)
160#define OPENSSL_ANDROID
161#endif
162
Bradley Hessc953ee42021-03-15 23:40:48 -0400163#if defined(__FreeBSD__)
164#define OPENSSL_FREEBSD
165#endif
166
Bob Beck4540c3c2023-03-08 12:40:29 -0700167#if defined(__OpenBSD__)
168#define OPENSSL_OPENBSD
169#endif
170
David Benjamin5b33eff2018-09-22 16:52:48 -0700171// BoringSSL requires platform's locking APIs to make internal global state
172// thread-safe, including the PRNG. On some single-threaded embedded platforms,
173// locking APIs may not exist, so this dependency may be disabled with the
174// following build flag.
175//
176// IMPORTANT: Doing so means the consumer promises the library will never be
177// used in any multi-threaded context. It causes BoringSSL to be globally
178// thread-unsafe. Setting it inappropriately will subtly and unpredictably
179// corrupt memory and leak secret keys.
180//
181// Do not set this flag on any platform where threads are possible. BoringSSL
182// maintainers will not provide support for any consumers that do so. Changes
183// which break such unsupported configurations will not be reverted.
184#if !defined(OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED)
David Benjamin81f030b2016-08-12 14:48:19 -0400185#define OPENSSL_THREADS
186#endif
187
Adam Langley95c29f32014-06-20 12:00:00 -0700188#define OPENSSL_IS_BORINGSSL
David Benjamin49e9f672020-09-16 12:29:13 -0400189#define OPENSSL_VERSION_NUMBER 0x1010107f
Matt Braithwaite6454a4c2015-07-31 15:57:07 -0700190#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
Adam Langley95c29f32014-06-20 12:00:00 -0700191
David Benjamin4512b792017-08-18 19:21:50 -0400192// BORINGSSL_API_VERSION is a positive integer that increments as BoringSSL
193// changes over time. The value itself is not meaningful. It will be incremented
194// whenever is convenient to coordinate an API change with consumers. This will
195// not denote any special point in development.
196//
197// A consumer may use this symbol in the preprocessor to temporarily build
198// against multiple revisions of BoringSSL at the same time. It is not
199// recommended to do so for longer than is necessary.
David Benjamin556a973f2023-06-03 23:32:27 -0400200#define BORINGSSL_API_VERSION 23
David Benjamin9d908ba2016-05-05 18:54:33 -0400201
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700202#if defined(BORINGSSL_SHARED_LIBRARY)
Adam Langley95c29f32014-06-20 12:00:00 -0700203
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700204#if defined(OPENSSL_WINDOWS)
205
206#if defined(BORINGSSL_IMPLEMENTATION)
207#define OPENSSL_EXPORT __declspec(dllexport)
208#else
209#define OPENSSL_EXPORT __declspec(dllimport)
210#endif
211
David Benjamin4512b792017-08-18 19:21:50 -0400212#else // defined(OPENSSL_WINDOWS)
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700213
214#if defined(BORINGSSL_IMPLEMENTATION)
215#define OPENSSL_EXPORT __attribute__((visibility("default")))
216#else
217#define OPENSSL_EXPORT
218#endif
219
David Benjamin4512b792017-08-18 19:21:50 -0400220#endif // defined(OPENSSL_WINDOWS)
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700221
David Benjamin4512b792017-08-18 19:21:50 -0400222#else // defined(BORINGSSL_SHARED_LIBRARY)
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700223
224#define OPENSSL_EXPORT
225
David Benjamin4512b792017-08-18 19:21:50 -0400226#endif // defined(BORINGSSL_SHARED_LIBRARY)
Adam Langley95c29f32014-06-20 12:00:00 -0700227
Bob Beckac6d5582023-03-28 14:23:03 -0600228#if defined(_MSC_VER)
229
230// OPENSSL_DEPRECATED is used to mark a function as deprecated. Use
231// of any functions so marked in caller code will produce a warning.
232// OPENSSL_BEGIN_ALLOW_DEPRECATED and OPENSSL_END_ALLOW_DEPRECATED
233// can be used to suppress the warning in regions of caller code.
234#define OPENSSL_DEPRECATED __declspec(deprecated)
235#define OPENSSL_BEGIN_ALLOW_DEPRECATED \
236 __pragma(warning(push)) __pragma(warning(disable : 4996))
237#define OPENSSL_END_ALLOW_DEPRECATED __pragma(warning(pop))
238
239#elif defined(__GNUC__) || defined(__clang__)
240
241#define OPENSSL_DEPRECATED __attribute__((__deprecated__))
242#define OPENSSL_BEGIN_ALLOW_DEPRECATED \
243 _Pragma("GCC diagnostic push") \
244 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
245#define OPENSSL_END_ALLOW_DEPRECATED _Pragma("GCC diagnostic pop")
246
247#else
248
249#define OPENSSL_DEPRECATED
250#define OPENSSL_BEGIN_ALLOW_DEPRECATED
251#define OPENSSL_END_ALLOW_DEPRECATED
252
253#endif
254
Brian Smith061332f2016-01-17 09:30:42 -1000255
David Benjamin02afbd32017-10-05 15:04:08 -0400256#if defined(__GNUC__) || defined(__clang__)
David Benjamin4512b792017-08-18 19:21:50 -0400257// MinGW has two different printf implementations. Ensure the format macro
258// matches the selected implementation. See
259// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
David Benjamin8404bdb2016-10-10 14:41:44 -0400260#if defined(__MINGW_PRINTF_FORMAT)
Brian Smith061332f2016-01-17 09:30:42 -1000261#define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
David Benjamin8404bdb2016-10-10 14:41:44 -0400262 __attribute__( \
263 (__format__(__MINGW_PRINTF_FORMAT, string_index, first_to_check)))
264#else
265#define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
266 __attribute__((__format__(__printf__, string_index, first_to_check)))
267#endif
Brian Smith061332f2016-01-17 09:30:42 -1000268#else
269#define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check)
270#endif
271
David Benjamin4512b792017-08-18 19:21:50 -0400272// OPENSSL_MSVC_PRAGMA emits a pragma on MSVC and nothing on other compilers.
David Benjamina353cdb2016-06-09 16:48:33 -0400273#if defined(_MSC_VER)
274#define OPENSSL_MSVC_PRAGMA(arg) __pragma(arg)
275#else
276#define OPENSSL_MSVC_PRAGMA(arg)
277#endif
278
David Benjamin806e18c2017-05-24 18:04:18 -0400279#if defined(__GNUC__) || defined(__clang__)
David Benjamin01f8a8c2017-04-15 18:12:55 -0400280#define OPENSSL_UNUSED __attribute__((unused))
281#else
282#define OPENSSL_UNUSED
283#endif
284
David Benjamina9436132018-09-23 18:36:01 -0500285// C and C++ handle inline functions differently. In C++, an inline function is
286// defined in just the header file, potentially emitted in multiple compilation
287// units (in cases the compiler did not inline), but each copy must be identical
288// to satsify ODR. In C, a non-static inline must be manually emitted in exactly
289// one compilation unit with a separate extern inline declaration.
290//
291// In both languages, exported inline functions referencing file-local symbols
292// are problematic. C forbids this altogether (though GCC and Clang seem not to
293// enforce it). It works in C++, but ODR requires the definitions be identical,
294// including all names in the definitions resolving to the "same entity". In
295// practice, this is unlikely to be a problem, but an inline function that
296// returns a pointer to a file-local symbol
297// could compile oddly.
298//
299// Historically, we used static inline in headers. However, to satisfy ODR, use
300// plain inline in C++, to allow inline consumer functions to call our header
301// functions. Plain inline would also work better with C99 inline, but that is
302// not used much in practice, extern inline is tedious, and there are conflicts
303// with the old gnu89 model:
304// https://stackoverflow.com/questions/216510/extern-inline
305#if defined(__cplusplus)
306#define OPENSSL_INLINE inline
307#else
308// Add OPENSSL_UNUSED so that, should an inline function be emitted via macro
309// (e.g. a |STACK_OF(T)| implementation) in a source file without tripping
310// clang's -Wunused-function.
311#define OPENSSL_INLINE static inline OPENSSL_UNUSED
312#endif
313
David Benjamin14c7e8d2016-11-09 17:57:31 -0500314#if defined(BORINGSSL_UNSAFE_FUZZER_MODE) && \
315 !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
316#define BORINGSSL_UNSAFE_DETERMINISTIC_MODE
317#endif
Brian Smith061332f2016-01-17 09:30:42 -1000318
Adam Langley208e2392017-05-08 12:53:15 -0700319#if defined(__has_feature)
320#if __has_feature(address_sanitizer)
321#define OPENSSL_ASAN
322#endif
Daniel Hirche9af1edb2018-07-24 10:56:15 +0200323#if __has_feature(thread_sanitizer)
324#define OPENSSL_TSAN
325#endif
Adam Langleyf64a6ee2017-05-17 13:05:50 -0700326#if __has_feature(memory_sanitizer)
327#define OPENSSL_MSAN
Adam Langleye77c27d2018-09-07 11:20:23 -0700328#define OPENSSL_ASM_INCOMPATIBLE
Adam Langleyf64a6ee2017-05-17 13:05:50 -0700329#endif
Adam Langley208e2392017-05-08 12:53:15 -0700330#endif
331
Adam Langleye77c27d2018-09-07 11:20:23 -0700332#if defined(OPENSSL_ASM_INCOMPATIBLE)
333#undef OPENSSL_ASM_INCOMPATIBLE
334#if !defined(OPENSSL_NO_ASM)
335#define OPENSSL_NO_ASM
336#endif
337#endif // OPENSSL_ASM_INCOMPATIBLE
338
Adam Langley7540cc22019-04-18 09:56:13 -0700339#if defined(__cplusplus)
340// enums can be predeclared, but only in C++ and only if given an explicit type.
341// C doesn't support setting an explicit type for enums thus a #define is used
342// to do this only for C++. However, the ABI type between C and C++ need to have
343// equal sizes, which is confirmed in a unittest.
344#define BORINGSSL_ENUM_INT : int
David Benjamin64770122019-05-04 11:00:04 -0500345enum ssl_early_data_reason_t BORINGSSL_ENUM_INT;
Adam Langley7540cc22019-04-18 09:56:13 -0700346enum ssl_encryption_level_t BORINGSSL_ENUM_INT;
David Benjamin64770122019-05-04 11:00:04 -0500347enum ssl_private_key_result_t BORINGSSL_ENUM_INT;
Adam Langley7540cc22019-04-18 09:56:13 -0700348enum ssl_renegotiate_mode_t BORINGSSL_ENUM_INT;
349enum ssl_select_cert_result_t BORINGSSL_ENUM_INT;
350enum ssl_select_cert_result_t BORINGSSL_ENUM_INT;
David Benjamin64770122019-05-04 11:00:04 -0500351enum ssl_ticket_aead_result_t BORINGSSL_ENUM_INT;
352enum ssl_verify_result_t BORINGSSL_ENUM_INT;
Adam Langley7540cc22019-04-18 09:56:13 -0700353#else
354#define BORINGSSL_ENUM_INT
355#endif
356
David Benjamindd81bf72022-10-18 21:41:30 -0400357// ossl_ssize_t is a signed type which is large enough to fit the size of any
358// valid memory allocation. We prefer using |size_t|, but sometimes we need a
359// signed type for OpenSSL API compatibility. This type can be used in such
360// cases to avoid overflow.
361//
362// Not all |size_t| values fit in |ossl_ssize_t|, but all |size_t| values that
363// are sizes of or indices into C objects, can be converted without overflow.
364typedef ptrdiff_t ossl_ssize_t;
365
David Benjamina1dffbf2022-10-25 16:29:43 -0400366// CBS_ASN1_TAG is the type used by |CBS| and |CBB| for ASN.1 tags. See that
367// header for details. This type is defined in base.h as a forward declaration.
368typedef uint32_t CBS_ASN1_TAG;
369
David Benjamin4512b792017-08-18 19:21:50 -0400370// CRYPTO_THREADID is a dummy value.
David Benjaminf0df86a2015-04-20 11:32:12 -0400371typedef int CRYPTO_THREADID;
372
David Benjamina406ad72021-10-04 19:21:01 -0400373// An |ASN1_NULL| is an opaque type. asn1.h represents the ASN.1 NULL value as
374// an opaque, non-NULL |ASN1_NULL*| pointer.
375typedef struct asn1_null_st ASN1_NULL;
376
Adam Langley95c29f32014-06-20 12:00:00 -0700377typedef int ASN1_BOOLEAN;
Adam Langley95c29f32014-06-20 12:00:00 -0700378typedef struct ASN1_ITEM_st ASN1_ITEM;
379typedef struct asn1_object_st ASN1_OBJECT;
380typedef struct asn1_pctx_st ASN1_PCTX;
381typedef struct asn1_string_st ASN1_BIT_STRING;
382typedef struct asn1_string_st ASN1_BMPSTRING;
383typedef struct asn1_string_st ASN1_ENUMERATED;
384typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
385typedef struct asn1_string_st ASN1_GENERALSTRING;
386typedef struct asn1_string_st ASN1_IA5STRING;
387typedef struct asn1_string_st ASN1_INTEGER;
388typedef struct asn1_string_st ASN1_OCTET_STRING;
389typedef struct asn1_string_st ASN1_PRINTABLESTRING;
390typedef struct asn1_string_st ASN1_STRING;
391typedef struct asn1_string_st ASN1_T61STRING;
392typedef struct asn1_string_st ASN1_TIME;
393typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
394typedef struct asn1_string_st ASN1_UTCTIME;
395typedef struct asn1_string_st ASN1_UTF8STRING;
396typedef struct asn1_string_st ASN1_VISIBLESTRING;
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700397typedef struct asn1_type_st ASN1_TYPE;
Adam Langley95c29f32014-06-20 12:00:00 -0700398typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700399typedef struct BASIC_CONSTRAINTS_st BASIC_CONSTRAINTS;
Adam Langley95c29f32014-06-20 12:00:00 -0700400typedef struct DIST_POINT_st DIST_POINT;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700401typedef struct DSA_SIG_st DSA_SIG;
Adam Langley95c29f32014-06-20 12:00:00 -0700402typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT;
403typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700404typedef struct Netscape_spkac_st NETSCAPE_SPKAC;
405typedef struct Netscape_spki_st NETSCAPE_SPKI;
Adam Langleyff452c12016-03-08 14:17:02 -0800406typedef struct RIPEMD160state_st RIPEMD160_CTX;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700407typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM;
Adam Langley95c29f32014-06-20 12:00:00 -0700408typedef struct X509_algor_st X509_ALGOR;
409typedef struct X509_crl_st X509_CRL;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700410typedef struct X509_extension_st X509_EXTENSION;
411typedef struct X509_info_st X509_INFO;
412typedef struct X509_name_entry_st X509_NAME_ENTRY;
413typedef struct X509_name_st X509_NAME;
Adam Langley95c29f32014-06-20 12:00:00 -0700414typedef struct X509_pubkey_st X509_PUBKEY;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700415typedef struct X509_req_st X509_REQ;
416typedef struct X509_sig_st X509_SIG;
Adam Langley95c29f32014-06-20 12:00:00 -0700417typedef struct bignum_ctx BN_CTX;
418typedef struct bignum_st BIGNUM;
419typedef struct bio_method_st BIO_METHOD;
420typedef struct bio_st BIO;
Adam Langleye1333452021-01-21 11:56:52 -0800421typedef struct blake2b_state_st BLAKE2B_CTX;
Adam Langley95c29f32014-06-20 12:00:00 -0700422typedef struct bn_gencb_st BN_GENCB;
423typedef struct bn_mont_ctx_st BN_MONT_CTX;
424typedef struct buf_mem_st BUF_MEM;
425typedef struct cbb_st CBB;
426typedef struct cbs_st CBS;
Adam Langley0d107e12015-05-05 16:36:32 -0700427typedef struct cmac_ctx_st CMAC_CTX;
Adam Langley95c29f32014-06-20 12:00:00 -0700428typedef struct conf_st CONF;
Brian Smith054e6822015-03-27 21:12:01 -1000429typedef struct conf_value_st CONF_VALUE;
Adam Langley9ef99d52016-10-25 17:33:49 -0700430typedef struct crypto_buffer_pool_st CRYPTO_BUFFER_POOL;
431typedef struct crypto_buffer_st CRYPTO_BUFFER;
Adam Langley24c01862022-05-06 16:14:47 -0700432typedef struct ctr_drbg_state_st CTR_DRBG_STATE;
Adam Langley95c29f32014-06-20 12:00:00 -0700433typedef struct dh_st DH;
Adam Langley95c29f32014-06-20 12:00:00 -0700434typedef struct dsa_st DSA;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700435typedef struct ec_group_st EC_GROUP;
Adam Langley95c29f32014-06-20 12:00:00 -0700436typedef struct ec_key_st EC_KEY;
Matt Braithwaiteb9afd512016-07-19 12:41:35 -0700437typedef struct ec_point_st EC_POINT;
Adam Langley95c29f32014-06-20 12:00:00 -0700438typedef struct ecdsa_method_st ECDSA_METHOD;
439typedef struct ecdsa_sig_st ECDSA_SIG;
440typedef struct engine_st ENGINE;
441typedef struct env_md_ctx_st EVP_MD_CTX;
442typedef struct env_md_st EVP_MD;
Adam Langleyfd772a52014-06-20 12:00:00 -0700443typedef struct evp_aead_st EVP_AEAD;
Adam Langleyce2a3532022-05-13 11:00:24 -0700444typedef struct evp_aead_ctx_st EVP_AEAD_CTX;
Adam Langley95c29f32014-06-20 12:00:00 -0700445typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
446typedef struct evp_cipher_st EVP_CIPHER;
David Benjamin97a33932015-09-19 15:17:34 -0400447typedef struct evp_encode_ctx_st EVP_ENCODE_CTX;
David Benjamin070a6c32021-05-05 15:39:27 -0400448typedef struct evp_hpke_aead_st EVP_HPKE_AEAD;
449typedef struct evp_hpke_ctx_st EVP_HPKE_CTX;
450typedef struct evp_hpke_kdf_st EVP_HPKE_KDF;
451typedef struct evp_hpke_kem_st EVP_HPKE_KEM;
452typedef struct evp_hpke_key_st EVP_HPKE_KEY;
Adam Langley95c29f32014-06-20 12:00:00 -0700453typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;
Adam Langley95c29f32014-06-20 12:00:00 -0700454typedef struct evp_pkey_st EVP_PKEY;
455typedef struct hmac_ctx_st HMAC_CTX;
Adam Langleyc9eb7ea2014-08-22 11:06:14 -0700456typedef struct md4_state_st MD4_CTX;
Adam Langley95c29f32014-06-20 12:00:00 -0700457typedef struct md5_state_st MD5_CTX;
David Benjamin81f030b2016-08-12 14:48:19 -0400458typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS;
Adam Langley5127db32014-09-19 10:49:56 -0700459typedef struct pkcs12_st PKCS12;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700460typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO;
461typedef struct private_key_st X509_PKEY;
Adam Langley95c29f32014-06-20 12:00:00 -0700462typedef struct rand_meth_st RAND_METHOD;
Adam Langley3f92d212015-02-20 15:32:52 -0800463typedef struct rc4_key_st RC4_KEY;
Adam Langley95c29f32014-06-20 12:00:00 -0700464typedef struct rsa_meth_st RSA_METHOD;
Shelley Vohr0446b592021-09-09 11:25:24 +0200465typedef struct rsa_pss_params_st RSA_PSS_PARAMS;
Adam Langley95c29f32014-06-20 12:00:00 -0700466typedef struct rsa_st RSA;
467typedef struct sha256_state_st SHA256_CTX;
468typedef struct sha512_state_st SHA512_CTX;
469typedef struct sha_state_st SHA_CTX;
Arnar Birgissonf27459e2016-02-09 18:09:00 -0800470typedef struct spake2_ctx_st SPAKE2_CTX;
David Benjamincfd65b62015-09-14 01:54:44 -0400471typedef struct srtp_protection_profile_st SRTP_PROTECTION_PROFILE;
David Benjamin79c117a2015-09-13 13:53:19 -0400472typedef struct ssl_cipher_st SSL_CIPHER;
Adam Langley95c29f32014-06-20 12:00:00 -0700473typedef struct ssl_ctx_st SSL_CTX;
David Benjamin45c8be92021-10-07 16:15:01 -0400474typedef struct ssl_early_callback_ctx SSL_CLIENT_HELLO;
David Benjaminc3b373b2021-06-06 13:04:26 -0400475typedef struct ssl_ech_keys_st SSL_ECH_KEYS;
David Benjamine39ac8f2017-07-20 12:22:21 -0400476typedef struct ssl_method_st SSL_METHOD;
Adam Langleyd04ca952017-02-28 11:26:51 -0800477typedef struct ssl_private_key_method_st SSL_PRIVATE_KEY_METHOD;
Steven Valdezc8e0f902018-07-14 11:23:01 -0400478typedef struct ssl_quic_method_st SSL_QUIC_METHOD;
David Benjamina6b8cdf2015-09-13 14:07:33 -0400479typedef struct ssl_session_st SSL_SESSION;
David Benjamine39ac8f2017-07-20 12:22:21 -0400480typedef struct ssl_st SSL;
Adam Langley4c341d02017-03-08 19:33:21 -0800481typedef struct ssl_ticket_aead_method_st SSL_TICKET_AEAD_METHOD;
Adam Langley95c29f32014-06-20 12:00:00 -0700482typedef struct st_ERR_FNS ERR_FNS;
Steven Valdez538a1242019-12-16 12:12:31 -0500483typedef struct trust_token_st TRUST_TOKEN;
484typedef struct trust_token_client_st TRUST_TOKEN_CLIENT;
485typedef struct trust_token_issuer_st TRUST_TOKEN_ISSUER;
David Benjamin239634d2020-04-29 11:17:51 -0400486typedef struct trust_token_method_st TRUST_TOKEN_METHOD;
Adam Langley95c29f32014-06-20 12:00:00 -0700487typedef struct v3_ext_ctx X509V3_CTX;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700488typedef struct x509_attributes_st X509_ATTRIBUTE;
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700489typedef struct x509_lookup_st X509_LOOKUP;
David Benjamindddb60e2021-08-11 01:23:09 -0400490typedef struct x509_lookup_method_st X509_LOOKUP_METHOD;
491typedef struct x509_object_st X509_OBJECT;
Adam Langley95c29f32014-06-20 12:00:00 -0700492typedef struct x509_revoked_st X509_REVOKED;
493typedef struct x509_st X509;
494typedef struct x509_store_ctx_st X509_STORE_CTX;
495typedef struct x509_store_st X509_STORE;
Matt Braithwaite16f774f2015-08-03 14:14:14 -0700496typedef struct x509_trust_st X509_TRUST;
497
Adam Langley95c29f32014-06-20 12:00:00 -0700498typedef void *OPENSSL_BLOCK;
499
500
Adam Langleyb2cb0ec2014-09-02 14:28:49 -0700501#if defined(__cplusplus)
David Benjamin4512b792017-08-18 19:21:50 -0400502} // extern C
David Benjaminebb4a372017-07-20 12:50:11 -0400503#elif !defined(BORINGSSL_NO_CXX)
504#define BORINGSSL_NO_CXX
505#endif
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700506
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700507#if defined(BORINGSSL_PREFIX)
508#define BSSL_NAMESPACE_BEGIN \
509 namespace bssl { \
510 inline namespace BORINGSSL_PREFIX {
511#define BSSL_NAMESPACE_END \
512 } \
513 }
514#else
515#define BSSL_NAMESPACE_BEGIN namespace bssl {
516#define BSSL_NAMESPACE_END }
517#endif
518
David Benjamin689019f2018-09-11 01:18:50 -0500519// MSVC doesn't set __cplusplus to 201103 to indicate C++11 support (see
520// https://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l)
521// so MSVC is just assumed to support C++11.
522#if !defined(BORINGSSL_NO_CXX) && __cplusplus < 201103L && !defined(_MSC_VER)
523#define BORINGSSL_NO_CXX
524#endif
525
526#if !defined(BORINGSSL_NO_CXX)
527
David Benjamin3e5619d2016-09-07 17:28:59 -0400528extern "C++" {
529
530#include <memory>
531
532// STLPort, used by some Android consumers, not have std::unique_ptr.
533#if defined(_STLPORT_VERSION)
534#define BORINGSSL_NO_CXX
535#endif
536
537} // extern C++
538#endif // !BORINGSSL_NO_CXX
539
David Benjaminf0e935d2016-09-06 18:10:19 -0400540#if defined(BORINGSSL_NO_CXX)
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700541
542#define BORINGSSL_MAKE_DELETER(type, deleter)
Adam Langley428fb3a2018-07-09 17:03:57 -0700543#define BORINGSSL_MAKE_UP_REF(type, up_ref_func)
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700544
545#else
546
David Benjaminf0e935d2016-09-06 18:10:19 -0400547extern "C++" {
548
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700549BSSL_NAMESPACE_BEGIN
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700550
551namespace internal {
552
David Benjamincfc11c22017-07-18 22:45:18 -0400553// The Enable parameter is ignored and only exists so specializations can use
554// SFINAE.
555template <typename T, typename Enable = void>
David Benjamin47092032016-09-09 14:54:10 -0400556struct DeleterImpl {};
557
David Benjamin47092032016-09-09 14:54:10 -0400558struct Deleter {
David Benjamin971b3302023-01-25 15:59:39 -0500559 template <typename T>
David Benjamin47092032016-09-09 14:54:10 -0400560 void operator()(T *ptr) {
561 // Rather than specialize Deleter for each type, we specialize
562 // DeleterImpl. This allows bssl::UniquePtr<T> to be used while only
563 // including base.h as long as the destructor is not emitted. This matches
564 // std::unique_ptr's behavior on forward-declared types.
565 //
566 // DeleterImpl itself is specialized in the corresponding module's header
567 // and must be included to release an object. If not included, the compiler
568 // will error that DeleterImpl<T> does not have a method Free.
569 DeleterImpl<T>::Free(ptr);
570 }
571};
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700572
David Benjaminf0e935d2016-09-06 18:10:19 -0400573template <typename T, typename CleanupRet, void (*init)(T *),
574 CleanupRet (*cleanup)(T *)>
575class StackAllocated {
576 public:
577 StackAllocated() { init(&ctx_); }
578 ~StackAllocated() { cleanup(&ctx_); }
579
David Benjamine9109cb2021-05-22 17:20:53 -0400580 StackAllocated(const StackAllocated &) = delete;
581 StackAllocated& operator=(const StackAllocated &) = delete;
582
583 T *get() { return &ctx_; }
584 const T *get() const { return &ctx_; }
585
586 T *operator->() { return &ctx_; }
587 const T *operator->() const { return &ctx_; }
588
589 void Reset() {
590 cleanup(&ctx_);
591 init(&ctx_);
592 }
593
594 private:
595 T ctx_;
596};
597
598template <typename T, typename CleanupRet, void (*init)(T *),
599 CleanupRet (*cleanup)(T *), void (*move)(T *, T *)>
600class StackAllocatedMovable {
601 public:
602 StackAllocatedMovable() { init(&ctx_); }
603 ~StackAllocatedMovable() { cleanup(&ctx_); }
604
605 StackAllocatedMovable(StackAllocatedMovable &&other) {
606 init(&ctx_);
607 move(&ctx_, &other.ctx_);
608 }
609 StackAllocatedMovable &operator=(StackAllocatedMovable &&other) {
610 move(&ctx_, &other.ctx_);
611 return *this;
612 }
Matthew Braithwaite1b0bd282016-09-27 13:25:32 -0700613
David Benjaminf0e935d2016-09-06 18:10:19 -0400614 T *get() { return &ctx_; }
615 const T *get() const { return &ctx_; }
616
David Benjamin4492a612017-08-02 17:16:31 -0400617 T *operator->() { return &ctx_; }
618 const T *operator->() const { return &ctx_; }
619
David Benjaminf0e935d2016-09-06 18:10:19 -0400620 void Reset() {
621 cleanup(&ctx_);
622 init(&ctx_);
623 }
624
625 private:
626 T ctx_;
627};
628
629} // namespace internal
630
David Benjamin47092032016-09-09 14:54:10 -0400631#define BORINGSSL_MAKE_DELETER(type, deleter) \
632 namespace internal { \
633 template <> \
634 struct DeleterImpl<type> { \
635 static void Free(type *ptr) { deleter(ptr); } \
636 }; \
David Benjaminf0e935d2016-09-06 18:10:19 -0400637 }
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700638
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700639// Holds ownership of heap-allocated BoringSSL structures. Sample usage:
David Benjamin8ee0d142017-05-02 09:54:05 -0400640// bssl::UniquePtr<RSA> rsa(RSA_new());
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700641// bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
642template <typename T>
David Benjamin971b3302023-01-25 15:59:39 -0500643using UniquePtr = std::unique_ptr<T, internal::Deleter>;
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700644
David Benjamina9436132018-09-23 18:36:01 -0500645#define BORINGSSL_MAKE_UP_REF(type, up_ref_func) \
646 inline UniquePtr<type> UpRef(type *v) { \
647 if (v != nullptr) { \
648 up_ref_func(v); \
649 } \
650 return UniquePtr<type>(v); \
651 } \
652 \
653 inline UniquePtr<type> UpRef(const UniquePtr<type> &ptr) { \
654 return UpRef(ptr.get()); \
David Benjamin2908dd12018-06-29 17:46:42 -0400655 }
656
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700657BSSL_NAMESPACE_END
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700658
David Benjamin4512b792017-08-18 19:21:50 -0400659} // extern C++
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700660
David Benjaminf0e935d2016-09-06 18:10:19 -0400661#endif // !BORINGSSL_NO_CXX
662
David Benjamin4512b792017-08-18 19:21:50 -0400663#endif // OPENSSL_HEADER_BASE_H