xref: /aosp_15_r20/external/boringssl/src/include/openssl/base.h (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /* ====================================================================
2*8fb009dcSAndroid Build Coastguard Worker  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
3*8fb009dcSAndroid Build Coastguard Worker  *
4*8fb009dcSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
5*8fb009dcSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
6*8fb009dcSAndroid Build Coastguard Worker  * are met:
7*8fb009dcSAndroid Build Coastguard Worker  *
8*8fb009dcSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
9*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8fb009dcSAndroid Build Coastguard Worker  *
11*8fb009dcSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
12*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
13*8fb009dcSAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
14*8fb009dcSAndroid Build Coastguard Worker  *    distribution.
15*8fb009dcSAndroid Build Coastguard Worker  *
16*8fb009dcSAndroid Build Coastguard Worker  * 3. All advertising materials mentioning features or use of this
17*8fb009dcSAndroid Build Coastguard Worker  *    software must display the following acknowledgment:
18*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
19*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20*8fb009dcSAndroid Build Coastguard Worker  *
21*8fb009dcSAndroid Build Coastguard Worker  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22*8fb009dcSAndroid Build Coastguard Worker  *    endorse or promote products derived from this software without
23*8fb009dcSAndroid Build Coastguard Worker  *    prior written permission. For written permission, please contact
24*8fb009dcSAndroid Build Coastguard Worker  *    [email protected].
25*8fb009dcSAndroid Build Coastguard Worker  *
26*8fb009dcSAndroid Build Coastguard Worker  * 5. Products derived from this software may not be called "OpenSSL"
27*8fb009dcSAndroid Build Coastguard Worker  *    nor may "OpenSSL" appear in their names without prior written
28*8fb009dcSAndroid Build Coastguard Worker  *    permission of the OpenSSL Project.
29*8fb009dcSAndroid Build Coastguard Worker  *
30*8fb009dcSAndroid Build Coastguard Worker  * 6. Redistributions of any form whatsoever must retain the following
31*8fb009dcSAndroid Build Coastguard Worker  *    acknowledgment:
32*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
33*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34*8fb009dcSAndroid Build Coastguard Worker  *
35*8fb009dcSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36*8fb009dcSAndroid Build Coastguard Worker  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37*8fb009dcSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38*8fb009dcSAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39*8fb009dcSAndroid Build Coastguard Worker  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41*8fb009dcSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42*8fb009dcSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43*8fb009dcSAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44*8fb009dcSAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45*8fb009dcSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46*8fb009dcSAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
47*8fb009dcSAndroid Build Coastguard Worker  * ====================================================================
48*8fb009dcSAndroid Build Coastguard Worker  *
49*8fb009dcSAndroid Build Coastguard Worker  * This product includes cryptographic software written by Eric Young
50*8fb009dcSAndroid Build Coastguard Worker  * ([email protected]).  This product includes software written by Tim
51*8fb009dcSAndroid Build Coastguard Worker  * Hudson ([email protected]). */
52*8fb009dcSAndroid Build Coastguard Worker 
53*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_BASE_H
54*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_BASE_H
55*8fb009dcSAndroid Build Coastguard Worker 
56*8fb009dcSAndroid Build Coastguard Worker 
57*8fb009dcSAndroid Build Coastguard Worker // This file should be the first included by all BoringSSL headers.
58*8fb009dcSAndroid Build Coastguard Worker 
59*8fb009dcSAndroid Build Coastguard Worker #include <stddef.h>
60*8fb009dcSAndroid Build Coastguard Worker #include <stdint.h>
61*8fb009dcSAndroid Build Coastguard Worker #include <stdlib.h>
62*8fb009dcSAndroid Build Coastguard Worker #include <sys/types.h>
63*8fb009dcSAndroid Build Coastguard Worker 
64*8fb009dcSAndroid Build Coastguard Worker #if defined(__MINGW32__)
65*8fb009dcSAndroid Build Coastguard Worker // stdio.h is needed on MinGW for __MINGW_PRINTF_FORMAT.
66*8fb009dcSAndroid Build Coastguard Worker #include <stdio.h>
67*8fb009dcSAndroid Build Coastguard Worker #endif
68*8fb009dcSAndroid Build Coastguard Worker 
69*8fb009dcSAndroid Build Coastguard Worker #if defined(__APPLE__)
70*8fb009dcSAndroid Build Coastguard Worker #include <TargetConditionals.h>
71*8fb009dcSAndroid Build Coastguard Worker #endif
72*8fb009dcSAndroid Build Coastguard Worker 
73*8fb009dcSAndroid Build Coastguard Worker // Include a BoringSSL-only header so consumers including this header without
74*8fb009dcSAndroid Build Coastguard Worker // setting up include paths do not accidentally pick up the system
75*8fb009dcSAndroid Build Coastguard Worker // opensslconf.h.
76*8fb009dcSAndroid Build Coastguard Worker #include <openssl/is_boringssl.h>
77*8fb009dcSAndroid Build Coastguard Worker #include <openssl/opensslconf.h>
78*8fb009dcSAndroid Build Coastguard Worker #include <openssl/target.h>  // IWYU pragma: export
79*8fb009dcSAndroid Build Coastguard Worker 
80*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_PREFIX)
81*8fb009dcSAndroid Build Coastguard Worker #include <boringssl_prefix_symbols.h>
82*8fb009dcSAndroid Build Coastguard Worker #endif
83*8fb009dcSAndroid Build Coastguard Worker 
84*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
85*8fb009dcSAndroid Build Coastguard Worker extern "C" {
86*8fb009dcSAndroid Build Coastguard Worker #endif
87*8fb009dcSAndroid Build Coastguard Worker 
88*8fb009dcSAndroid Build Coastguard Worker 
89*8fb009dcSAndroid Build Coastguard Worker #if defined(__APPLE__)
90*8fb009dcSAndroid Build Coastguard Worker // Note |TARGET_OS_MAC| is set for all Apple OS variants. |TARGET_OS_OSX|
91*8fb009dcSAndroid Build Coastguard Worker // targets macOS specifically.
92*8fb009dcSAndroid Build Coastguard Worker #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
93*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MACOS
94*8fb009dcSAndroid Build Coastguard Worker #endif
95*8fb009dcSAndroid Build Coastguard Worker #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
96*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_IOS
97*8fb009dcSAndroid Build Coastguard Worker #endif
98*8fb009dcSAndroid Build Coastguard Worker #endif
99*8fb009dcSAndroid Build Coastguard Worker 
100*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_IS_BORINGSSL
101*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_VERSION_NUMBER 0x1010107f
102*8fb009dcSAndroid Build Coastguard Worker #define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
103*8fb009dcSAndroid Build Coastguard Worker 
104*8fb009dcSAndroid Build Coastguard Worker // BORINGSSL_API_VERSION is a positive integer that increments as BoringSSL
105*8fb009dcSAndroid Build Coastguard Worker // changes over time. The value itself is not meaningful. It will be incremented
106*8fb009dcSAndroid Build Coastguard Worker // whenever is convenient to coordinate an API change with consumers. This will
107*8fb009dcSAndroid Build Coastguard Worker // not denote any special point in development.
108*8fb009dcSAndroid Build Coastguard Worker //
109*8fb009dcSAndroid Build Coastguard Worker // A consumer may use this symbol in the preprocessor to temporarily build
110*8fb009dcSAndroid Build Coastguard Worker // against multiple revisions of BoringSSL at the same time. It is not
111*8fb009dcSAndroid Build Coastguard Worker // recommended to do so for longer than is necessary.
112*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_API_VERSION 32
113*8fb009dcSAndroid Build Coastguard Worker 
114*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_SHARED_LIBRARY)
115*8fb009dcSAndroid Build Coastguard Worker 
116*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_WINDOWS)
117*8fb009dcSAndroid Build Coastguard Worker 
118*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_IMPLEMENTATION)
119*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_EXPORT __declspec(dllexport)
120*8fb009dcSAndroid Build Coastguard Worker #else
121*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_EXPORT __declspec(dllimport)
122*8fb009dcSAndroid Build Coastguard Worker #endif
123*8fb009dcSAndroid Build Coastguard Worker 
124*8fb009dcSAndroid Build Coastguard Worker #else  // defined(OPENSSL_WINDOWS)
125*8fb009dcSAndroid Build Coastguard Worker 
126*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_IMPLEMENTATION)
127*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_EXPORT __attribute__((visibility("default")))
128*8fb009dcSAndroid Build Coastguard Worker #else
129*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_EXPORT
130*8fb009dcSAndroid Build Coastguard Worker #endif
131*8fb009dcSAndroid Build Coastguard Worker 
132*8fb009dcSAndroid Build Coastguard Worker #endif  // defined(OPENSSL_WINDOWS)
133*8fb009dcSAndroid Build Coastguard Worker 
134*8fb009dcSAndroid Build Coastguard Worker #else  // defined(BORINGSSL_SHARED_LIBRARY)
135*8fb009dcSAndroid Build Coastguard Worker 
136*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_EXPORT
137*8fb009dcSAndroid Build Coastguard Worker 
138*8fb009dcSAndroid Build Coastguard Worker #endif  // defined(BORINGSSL_SHARED_LIBRARY)
139*8fb009dcSAndroid Build Coastguard Worker 
140*8fb009dcSAndroid Build Coastguard Worker #if defined(_MSC_VER)
141*8fb009dcSAndroid Build Coastguard Worker 
142*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_DEPRECATED is used to mark a function as deprecated. Use
143*8fb009dcSAndroid Build Coastguard Worker // of any functions so marked in caller code will produce a warning.
144*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_BEGIN_ALLOW_DEPRECATED and OPENSSL_END_ALLOW_DEPRECATED
145*8fb009dcSAndroid Build Coastguard Worker // can be used to suppress the warning in regions of caller code.
146*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_DEPRECATED __declspec(deprecated)
147*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_BEGIN_ALLOW_DEPRECATED \
148*8fb009dcSAndroid Build Coastguard Worker   __pragma(warning(push)) __pragma(warning(disable : 4996))
149*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_END_ALLOW_DEPRECATED __pragma(warning(pop))
150*8fb009dcSAndroid Build Coastguard Worker 
151*8fb009dcSAndroid Build Coastguard Worker #elif defined(__GNUC__) || defined(__clang__)
152*8fb009dcSAndroid Build Coastguard Worker 
153*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_DEPRECATED __attribute__((__deprecated__))
154*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_BEGIN_ALLOW_DEPRECATED \
155*8fb009dcSAndroid Build Coastguard Worker   _Pragma("GCC diagnostic push")       \
156*8fb009dcSAndroid Build Coastguard Worker       _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
157*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_END_ALLOW_DEPRECATED _Pragma("GCC diagnostic pop")
158*8fb009dcSAndroid Build Coastguard Worker 
159*8fb009dcSAndroid Build Coastguard Worker #else
160*8fb009dcSAndroid Build Coastguard Worker 
161*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_DEPRECATED
162*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_BEGIN_ALLOW_DEPRECATED
163*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_END_ALLOW_DEPRECATED
164*8fb009dcSAndroid Build Coastguard Worker 
165*8fb009dcSAndroid Build Coastguard Worker #endif
166*8fb009dcSAndroid Build Coastguard Worker 
167*8fb009dcSAndroid Build Coastguard Worker 
168*8fb009dcSAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
169*8fb009dcSAndroid Build Coastguard Worker // MinGW has two different printf implementations. Ensure the format macro
170*8fb009dcSAndroid Build Coastguard Worker // matches the selected implementation. See
171*8fb009dcSAndroid Build Coastguard Worker // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
172*8fb009dcSAndroid Build Coastguard Worker #if defined(__MINGW_PRINTF_FORMAT)
173*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
174*8fb009dcSAndroid Build Coastguard Worker   __attribute__(                                                 \
175*8fb009dcSAndroid Build Coastguard Worker       (__format__(__MINGW_PRINTF_FORMAT, string_index, first_to_check)))
176*8fb009dcSAndroid Build Coastguard Worker #else
177*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
178*8fb009dcSAndroid Build Coastguard Worker   __attribute__((__format__(__printf__, string_index, first_to_check)))
179*8fb009dcSAndroid Build Coastguard Worker #endif
180*8fb009dcSAndroid Build Coastguard Worker #else
181*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check)
182*8fb009dcSAndroid Build Coastguard Worker #endif
183*8fb009dcSAndroid Build Coastguard Worker 
184*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_CLANG_PRAGMA emits a pragma on clang and nothing on other compilers.
185*8fb009dcSAndroid Build Coastguard Worker #if defined(__clang__)
186*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_CLANG_PRAGMA(arg) _Pragma(arg)
187*8fb009dcSAndroid Build Coastguard Worker #else
188*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_CLANG_PRAGMA(arg)
189*8fb009dcSAndroid Build Coastguard Worker #endif
190*8fb009dcSAndroid Build Coastguard Worker 
191*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_MSVC_PRAGMA emits a pragma on MSVC and nothing on other compilers.
192*8fb009dcSAndroid Build Coastguard Worker #if defined(_MSC_VER)
193*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MSVC_PRAGMA(arg) __pragma(arg)
194*8fb009dcSAndroid Build Coastguard Worker #else
195*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MSVC_PRAGMA(arg)
196*8fb009dcSAndroid Build Coastguard Worker #endif
197*8fb009dcSAndroid Build Coastguard Worker 
198*8fb009dcSAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
199*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_UNUSED __attribute__((unused))
200*8fb009dcSAndroid Build Coastguard Worker #else
201*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_UNUSED
202*8fb009dcSAndroid Build Coastguard Worker #endif
203*8fb009dcSAndroid Build Coastguard Worker 
204*8fb009dcSAndroid Build Coastguard Worker // C and C++ handle inline functions differently. In C++, an inline function is
205*8fb009dcSAndroid Build Coastguard Worker // defined in just the header file, potentially emitted in multiple compilation
206*8fb009dcSAndroid Build Coastguard Worker // units (in cases the compiler did not inline), but each copy must be identical
207*8fb009dcSAndroid Build Coastguard Worker // to satsify ODR. In C, a non-static inline must be manually emitted in exactly
208*8fb009dcSAndroid Build Coastguard Worker // one compilation unit with a separate extern inline declaration.
209*8fb009dcSAndroid Build Coastguard Worker //
210*8fb009dcSAndroid Build Coastguard Worker // In both languages, exported inline functions referencing file-local symbols
211*8fb009dcSAndroid Build Coastguard Worker // are problematic. C forbids this altogether (though GCC and Clang seem not to
212*8fb009dcSAndroid Build Coastguard Worker // enforce it). It works in C++, but ODR requires the definitions be identical,
213*8fb009dcSAndroid Build Coastguard Worker // including all names in the definitions resolving to the "same entity". In
214*8fb009dcSAndroid Build Coastguard Worker // practice, this is unlikely to be a problem, but an inline function that
215*8fb009dcSAndroid Build Coastguard Worker // returns a pointer to a file-local symbol
216*8fb009dcSAndroid Build Coastguard Worker // could compile oddly.
217*8fb009dcSAndroid Build Coastguard Worker //
218*8fb009dcSAndroid Build Coastguard Worker // Historically, we used static inline in headers. However, to satisfy ODR, use
219*8fb009dcSAndroid Build Coastguard Worker // plain inline in C++, to allow inline consumer functions to call our header
220*8fb009dcSAndroid Build Coastguard Worker // functions. Plain inline would also work better with C99 inline, but that is
221*8fb009dcSAndroid Build Coastguard Worker // not used much in practice, extern inline is tedious, and there are conflicts
222*8fb009dcSAndroid Build Coastguard Worker // with the old gnu89 model:
223*8fb009dcSAndroid Build Coastguard Worker // https://stackoverflow.com/questions/216510/extern-inline
224*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
225*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_INLINE inline
226*8fb009dcSAndroid Build Coastguard Worker #else
227*8fb009dcSAndroid Build Coastguard Worker // Add OPENSSL_UNUSED so that, should an inline function be emitted via macro
228*8fb009dcSAndroid Build Coastguard Worker // (e.g. a |STACK_OF(T)| implementation) in a source file without tripping
229*8fb009dcSAndroid Build Coastguard Worker // clang's -Wunused-function.
230*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_INLINE static inline OPENSSL_UNUSED
231*8fb009dcSAndroid Build Coastguard Worker #endif
232*8fb009dcSAndroid Build Coastguard Worker 
233*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
234*8fb009dcSAndroid Build Coastguard Worker // enums can be predeclared, but only in C++ and only if given an explicit type.
235*8fb009dcSAndroid Build Coastguard Worker // C doesn't support setting an explicit type for enums thus a #define is used
236*8fb009dcSAndroid Build Coastguard Worker // to do this only for C++. However, the ABI type between C and C++ need to have
237*8fb009dcSAndroid Build Coastguard Worker // equal sizes, which is confirmed in a unittest.
238*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_ENUM_INT : int
239*8fb009dcSAndroid Build Coastguard Worker enum ssl_early_data_reason_t BORINGSSL_ENUM_INT;
240*8fb009dcSAndroid Build Coastguard Worker enum ssl_encryption_level_t BORINGSSL_ENUM_INT;
241*8fb009dcSAndroid Build Coastguard Worker enum ssl_private_key_result_t BORINGSSL_ENUM_INT;
242*8fb009dcSAndroid Build Coastguard Worker enum ssl_renegotiate_mode_t BORINGSSL_ENUM_INT;
243*8fb009dcSAndroid Build Coastguard Worker enum ssl_select_cert_result_t BORINGSSL_ENUM_INT;
244*8fb009dcSAndroid Build Coastguard Worker enum ssl_select_cert_result_t BORINGSSL_ENUM_INT;
245*8fb009dcSAndroid Build Coastguard Worker enum ssl_ticket_aead_result_t BORINGSSL_ENUM_INT;
246*8fb009dcSAndroid Build Coastguard Worker enum ssl_verify_result_t BORINGSSL_ENUM_INT;
247*8fb009dcSAndroid Build Coastguard Worker #else
248*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_ENUM_INT
249*8fb009dcSAndroid Build Coastguard Worker #endif
250*8fb009dcSAndroid Build Coastguard Worker 
251*8fb009dcSAndroid Build Coastguard Worker // ossl_ssize_t is a signed type which is large enough to fit the size of any
252*8fb009dcSAndroid Build Coastguard Worker // valid memory allocation. We prefer using |size_t|, but sometimes we need a
253*8fb009dcSAndroid Build Coastguard Worker // signed type for OpenSSL API compatibility. This type can be used in such
254*8fb009dcSAndroid Build Coastguard Worker // cases to avoid overflow.
255*8fb009dcSAndroid Build Coastguard Worker //
256*8fb009dcSAndroid Build Coastguard Worker // Not all |size_t| values fit in |ossl_ssize_t|, but all |size_t| values that
257*8fb009dcSAndroid Build Coastguard Worker // are sizes of or indices into C objects, can be converted without overflow.
258*8fb009dcSAndroid Build Coastguard Worker typedef ptrdiff_t ossl_ssize_t;
259*8fb009dcSAndroid Build Coastguard Worker 
260*8fb009dcSAndroid Build Coastguard Worker // CBS_ASN1_TAG is the type used by |CBS| and |CBB| for ASN.1 tags. See that
261*8fb009dcSAndroid Build Coastguard Worker // header for details. This type is defined in base.h as a forward declaration.
262*8fb009dcSAndroid Build Coastguard Worker typedef uint32_t CBS_ASN1_TAG;
263*8fb009dcSAndroid Build Coastguard Worker 
264*8fb009dcSAndroid Build Coastguard Worker // CRYPTO_THREADID is a dummy value.
265*8fb009dcSAndroid Build Coastguard Worker typedef int CRYPTO_THREADID;
266*8fb009dcSAndroid Build Coastguard Worker 
267*8fb009dcSAndroid Build Coastguard Worker // An |ASN1_NULL| is an opaque type. asn1.h represents the ASN.1 NULL value as
268*8fb009dcSAndroid Build Coastguard Worker // an opaque, non-NULL |ASN1_NULL*| pointer.
269*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_null_st ASN1_NULL;
270*8fb009dcSAndroid Build Coastguard Worker 
271*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_BOOLEAN;
272*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_ITEM_st ASN1_ITEM;
273*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_object_st ASN1_OBJECT;
274*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_pctx_st ASN1_PCTX;
275*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_BIT_STRING;
276*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_BMPSTRING;
277*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_ENUMERATED;
278*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
279*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_GENERALSTRING;
280*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_IA5STRING;
281*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_INTEGER;
282*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_OCTET_STRING;
283*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_PRINTABLESTRING;
284*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_STRING;
285*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_T61STRING;
286*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_TIME;
287*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
288*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_UTCTIME;
289*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_UTF8STRING;
290*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_string_st ASN1_VISIBLESTRING;
291*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_type_st ASN1_TYPE;
292*8fb009dcSAndroid Build Coastguard Worker typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID;
293*8fb009dcSAndroid Build Coastguard Worker typedef struct BASIC_CONSTRAINTS_st BASIC_CONSTRAINTS;
294*8fb009dcSAndroid Build Coastguard Worker typedef struct DIST_POINT_st DIST_POINT;
295*8fb009dcSAndroid Build Coastguard Worker typedef struct DSA_SIG_st DSA_SIG;
296*8fb009dcSAndroid Build Coastguard Worker typedef struct GENERAL_NAME_st GENERAL_NAME;
297*8fb009dcSAndroid Build Coastguard Worker typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT;
298*8fb009dcSAndroid Build Coastguard Worker typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS;
299*8fb009dcSAndroid Build Coastguard Worker typedef struct Netscape_spkac_st NETSCAPE_SPKAC;
300*8fb009dcSAndroid Build Coastguard Worker typedef struct Netscape_spki_st NETSCAPE_SPKI;
301*8fb009dcSAndroid Build Coastguard Worker typedef struct RIPEMD160state_st RIPEMD160_CTX;
302*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM;
303*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_algor_st X509_ALGOR;
304*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_crl_st X509_CRL;
305*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_extension_st X509_EXTENSION;
306*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_info_st X509_INFO;
307*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_name_entry_st X509_NAME_ENTRY;
308*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_name_st X509_NAME;
309*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_pubkey_st X509_PUBKEY;
310*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_req_st X509_REQ;
311*8fb009dcSAndroid Build Coastguard Worker typedef struct X509_sig_st X509_SIG;
312*8fb009dcSAndroid Build Coastguard Worker typedef struct bignum_ctx BN_CTX;
313*8fb009dcSAndroid Build Coastguard Worker typedef struct bignum_st BIGNUM;
314*8fb009dcSAndroid Build Coastguard Worker typedef struct bio_method_st BIO_METHOD;
315*8fb009dcSAndroid Build Coastguard Worker typedef struct bio_st BIO;
316*8fb009dcSAndroid Build Coastguard Worker typedef struct blake2b_state_st BLAKE2B_CTX;
317*8fb009dcSAndroid Build Coastguard Worker typedef struct bn_gencb_st BN_GENCB;
318*8fb009dcSAndroid Build Coastguard Worker typedef struct bn_mont_ctx_st BN_MONT_CTX;
319*8fb009dcSAndroid Build Coastguard Worker typedef struct buf_mem_st BUF_MEM;
320*8fb009dcSAndroid Build Coastguard Worker typedef struct cbb_st CBB;
321*8fb009dcSAndroid Build Coastguard Worker typedef struct cbs_st CBS;
322*8fb009dcSAndroid Build Coastguard Worker typedef struct cmac_ctx_st CMAC_CTX;
323*8fb009dcSAndroid Build Coastguard Worker typedef struct conf_st CONF;
324*8fb009dcSAndroid Build Coastguard Worker typedef struct conf_value_st CONF_VALUE;
325*8fb009dcSAndroid Build Coastguard Worker typedef struct crypto_buffer_pool_st CRYPTO_BUFFER_POOL;
326*8fb009dcSAndroid Build Coastguard Worker typedef struct crypto_buffer_st CRYPTO_BUFFER;
327*8fb009dcSAndroid Build Coastguard Worker typedef struct ctr_drbg_state_st CTR_DRBG_STATE;
328*8fb009dcSAndroid Build Coastguard Worker typedef struct dh_st DH;
329*8fb009dcSAndroid Build Coastguard Worker typedef struct dsa_st DSA;
330*8fb009dcSAndroid Build Coastguard Worker typedef struct ec_group_st EC_GROUP;
331*8fb009dcSAndroid Build Coastguard Worker typedef struct ec_key_st EC_KEY;
332*8fb009dcSAndroid Build Coastguard Worker typedef struct ec_point_st EC_POINT;
333*8fb009dcSAndroid Build Coastguard Worker typedef struct ecdsa_method_st ECDSA_METHOD;
334*8fb009dcSAndroid Build Coastguard Worker typedef struct ecdsa_sig_st ECDSA_SIG;
335*8fb009dcSAndroid Build Coastguard Worker typedef struct engine_st ENGINE;
336*8fb009dcSAndroid Build Coastguard Worker typedef struct env_md_ctx_st EVP_MD_CTX;
337*8fb009dcSAndroid Build Coastguard Worker typedef struct env_md_st EVP_MD;
338*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_aead_st EVP_AEAD;
339*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_aead_ctx_st EVP_AEAD_CTX;
340*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
341*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_cipher_st EVP_CIPHER;
342*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_encode_ctx_st EVP_ENCODE_CTX;
343*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_hpke_aead_st EVP_HPKE_AEAD;
344*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_hpke_ctx_st EVP_HPKE_CTX;
345*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_hpke_kdf_st EVP_HPKE_KDF;
346*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_hpke_kem_st EVP_HPKE_KEM;
347*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_hpke_key_st EVP_HPKE_KEY;
348*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;
349*8fb009dcSAndroid Build Coastguard Worker typedef struct evp_pkey_st EVP_PKEY;
350*8fb009dcSAndroid Build Coastguard Worker typedef struct hmac_ctx_st HMAC_CTX;
351*8fb009dcSAndroid Build Coastguard Worker typedef struct md4_state_st MD4_CTX;
352*8fb009dcSAndroid Build Coastguard Worker typedef struct md5_state_st MD5_CTX;
353*8fb009dcSAndroid Build Coastguard Worker typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS;
354*8fb009dcSAndroid Build Coastguard Worker typedef struct pkcs12_st PKCS12;
355*8fb009dcSAndroid Build Coastguard Worker typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO;
356*8fb009dcSAndroid Build Coastguard Worker typedef struct private_key_st X509_PKEY;
357*8fb009dcSAndroid Build Coastguard Worker typedef struct rand_meth_st RAND_METHOD;
358*8fb009dcSAndroid Build Coastguard Worker typedef struct rc4_key_st RC4_KEY;
359*8fb009dcSAndroid Build Coastguard Worker typedef struct rsa_meth_st RSA_METHOD;
360*8fb009dcSAndroid Build Coastguard Worker typedef struct rsa_pss_params_st RSA_PSS_PARAMS;
361*8fb009dcSAndroid Build Coastguard Worker typedef struct rsa_st RSA;
362*8fb009dcSAndroid Build Coastguard Worker typedef struct sha256_state_st SHA256_CTX;
363*8fb009dcSAndroid Build Coastguard Worker typedef struct sha512_state_st SHA512_CTX;
364*8fb009dcSAndroid Build Coastguard Worker typedef struct sha_state_st SHA_CTX;
365*8fb009dcSAndroid Build Coastguard Worker typedef struct spake2_ctx_st SPAKE2_CTX;
366*8fb009dcSAndroid Build Coastguard Worker typedef struct srtp_protection_profile_st SRTP_PROTECTION_PROFILE;
367*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_cipher_st SSL_CIPHER;
368*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_credential_st SSL_CREDENTIAL;
369*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_ctx_st SSL_CTX;
370*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_early_callback_ctx SSL_CLIENT_HELLO;
371*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_ech_keys_st SSL_ECH_KEYS;
372*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_method_st SSL_METHOD;
373*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_private_key_method_st SSL_PRIVATE_KEY_METHOD;
374*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_quic_method_st SSL_QUIC_METHOD;
375*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_session_st SSL_SESSION;
376*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_st SSL;
377*8fb009dcSAndroid Build Coastguard Worker typedef struct ssl_ticket_aead_method_st SSL_TICKET_AEAD_METHOD;
378*8fb009dcSAndroid Build Coastguard Worker typedef struct st_ERR_FNS ERR_FNS;
379*8fb009dcSAndroid Build Coastguard Worker typedef struct trust_token_st TRUST_TOKEN;
380*8fb009dcSAndroid Build Coastguard Worker typedef struct trust_token_client_st TRUST_TOKEN_CLIENT;
381*8fb009dcSAndroid Build Coastguard Worker typedef struct trust_token_issuer_st TRUST_TOKEN_ISSUER;
382*8fb009dcSAndroid Build Coastguard Worker typedef struct trust_token_method_st TRUST_TOKEN_METHOD;
383*8fb009dcSAndroid Build Coastguard Worker typedef struct v3_ext_ctx X509V3_CTX;
384*8fb009dcSAndroid Build Coastguard Worker typedef struct v3_ext_method X509V3_EXT_METHOD;
385*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_attributes_st X509_ATTRIBUTE;
386*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_lookup_st X509_LOOKUP;
387*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_lookup_method_st X509_LOOKUP_METHOD;
388*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_object_st X509_OBJECT;
389*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_purpose_st X509_PURPOSE;
390*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_revoked_st X509_REVOKED;
391*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_st X509;
392*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_store_ctx_st X509_STORE_CTX;
393*8fb009dcSAndroid Build Coastguard Worker typedef struct x509_store_st X509_STORE;
394*8fb009dcSAndroid Build Coastguard Worker 
395*8fb009dcSAndroid Build Coastguard Worker typedef void *OPENSSL_BLOCK;
396*8fb009dcSAndroid Build Coastguard Worker 
397*8fb009dcSAndroid Build Coastguard Worker // BSSL_CHECK aborts if |condition| is not true.
398*8fb009dcSAndroid Build Coastguard Worker #define BSSL_CHECK(condition) \
399*8fb009dcSAndroid Build Coastguard Worker   do {                        \
400*8fb009dcSAndroid Build Coastguard Worker     if (!(condition)) {       \
401*8fb009dcSAndroid Build Coastguard Worker       abort();                \
402*8fb009dcSAndroid Build Coastguard Worker     }                         \
403*8fb009dcSAndroid Build Coastguard Worker   } while (0);
404*8fb009dcSAndroid Build Coastguard Worker 
405*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
406*8fb009dcSAndroid Build Coastguard Worker }  // extern C
407*8fb009dcSAndroid Build Coastguard Worker #elif !defined(BORINGSSL_NO_CXX)
408*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_NO_CXX
409*8fb009dcSAndroid Build Coastguard Worker #endif
410*8fb009dcSAndroid Build Coastguard Worker 
411*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_PREFIX)
412*8fb009dcSAndroid Build Coastguard Worker #define BSSL_NAMESPACE_BEGIN \
413*8fb009dcSAndroid Build Coastguard Worker   namespace bssl {           \
414*8fb009dcSAndroid Build Coastguard Worker   inline namespace BORINGSSL_PREFIX {
415*8fb009dcSAndroid Build Coastguard Worker #define BSSL_NAMESPACE_END \
416*8fb009dcSAndroid Build Coastguard Worker   }                        \
417*8fb009dcSAndroid Build Coastguard Worker   }
418*8fb009dcSAndroid Build Coastguard Worker #else
419*8fb009dcSAndroid Build Coastguard Worker #define BSSL_NAMESPACE_BEGIN namespace bssl {
420*8fb009dcSAndroid Build Coastguard Worker #define BSSL_NAMESPACE_END }
421*8fb009dcSAndroid Build Coastguard Worker #endif
422*8fb009dcSAndroid Build Coastguard Worker 
423*8fb009dcSAndroid Build Coastguard Worker // MSVC doesn't set __cplusplus to 201103 to indicate C++11 support (see
424*8fb009dcSAndroid Build Coastguard Worker // https://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l)
425*8fb009dcSAndroid Build Coastguard Worker // so MSVC is just assumed to support C++11.
426*8fb009dcSAndroid Build Coastguard Worker #if !defined(BORINGSSL_NO_CXX) && __cplusplus < 201103L && !defined(_MSC_VER)
427*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_NO_CXX
428*8fb009dcSAndroid Build Coastguard Worker #endif
429*8fb009dcSAndroid Build Coastguard Worker 
430*8fb009dcSAndroid Build Coastguard Worker #if !defined(BORINGSSL_NO_CXX)
431*8fb009dcSAndroid Build Coastguard Worker 
432*8fb009dcSAndroid Build Coastguard Worker extern "C++" {
433*8fb009dcSAndroid Build Coastguard Worker 
434*8fb009dcSAndroid Build Coastguard Worker #include <memory>
435*8fb009dcSAndroid Build Coastguard Worker 
436*8fb009dcSAndroid Build Coastguard Worker // STLPort, used by some Android consumers, not have std::unique_ptr.
437*8fb009dcSAndroid Build Coastguard Worker #if defined(_STLPORT_VERSION)
438*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_NO_CXX
439*8fb009dcSAndroid Build Coastguard Worker #endif
440*8fb009dcSAndroid Build Coastguard Worker 
441*8fb009dcSAndroid Build Coastguard Worker }  // extern C++
442*8fb009dcSAndroid Build Coastguard Worker #endif  // !BORINGSSL_NO_CXX
443*8fb009dcSAndroid Build Coastguard Worker 
444*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_NO_CXX)
445*8fb009dcSAndroid Build Coastguard Worker 
446*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_MAKE_DELETER(type, deleter)
447*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_MAKE_UP_REF(type, up_ref_func)
448*8fb009dcSAndroid Build Coastguard Worker 
449*8fb009dcSAndroid Build Coastguard Worker #else
450*8fb009dcSAndroid Build Coastguard Worker 
451*8fb009dcSAndroid Build Coastguard Worker extern "C++" {
452*8fb009dcSAndroid Build Coastguard Worker 
453*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_BEGIN
454*8fb009dcSAndroid Build Coastguard Worker 
455*8fb009dcSAndroid Build Coastguard Worker namespace internal {
456*8fb009dcSAndroid Build Coastguard Worker 
457*8fb009dcSAndroid Build Coastguard Worker // The Enable parameter is ignored and only exists so specializations can use
458*8fb009dcSAndroid Build Coastguard Worker // SFINAE.
459*8fb009dcSAndroid Build Coastguard Worker template <typename T, typename Enable = void>
460*8fb009dcSAndroid Build Coastguard Worker struct DeleterImpl {};
461*8fb009dcSAndroid Build Coastguard Worker 
462*8fb009dcSAndroid Build Coastguard Worker struct Deleter {
463*8fb009dcSAndroid Build Coastguard Worker   template <typename T>
operatorDeleter464*8fb009dcSAndroid Build Coastguard Worker   void operator()(T *ptr) {
465*8fb009dcSAndroid Build Coastguard Worker     // Rather than specialize Deleter for each type, we specialize
466*8fb009dcSAndroid Build Coastguard Worker     // DeleterImpl. This allows bssl::UniquePtr<T> to be used while only
467*8fb009dcSAndroid Build Coastguard Worker     // including base.h as long as the destructor is not emitted. This matches
468*8fb009dcSAndroid Build Coastguard Worker     // std::unique_ptr's behavior on forward-declared types.
469*8fb009dcSAndroid Build Coastguard Worker     //
470*8fb009dcSAndroid Build Coastguard Worker     // DeleterImpl itself is specialized in the corresponding module's header
471*8fb009dcSAndroid Build Coastguard Worker     // and must be included to release an object. If not included, the compiler
472*8fb009dcSAndroid Build Coastguard Worker     // will error that DeleterImpl<T> does not have a method Free.
473*8fb009dcSAndroid Build Coastguard Worker     DeleterImpl<T>::Free(ptr);
474*8fb009dcSAndroid Build Coastguard Worker   }
475*8fb009dcSAndroid Build Coastguard Worker };
476*8fb009dcSAndroid Build Coastguard Worker 
477*8fb009dcSAndroid Build Coastguard Worker template <typename T, typename CleanupRet, void (*init)(T *),
478*8fb009dcSAndroid Build Coastguard Worker           CleanupRet (*cleanup)(T *)>
479*8fb009dcSAndroid Build Coastguard Worker class StackAllocated {
480*8fb009dcSAndroid Build Coastguard Worker  public:
StackAllocated()481*8fb009dcSAndroid Build Coastguard Worker   StackAllocated() { init(&ctx_); }
~StackAllocated()482*8fb009dcSAndroid Build Coastguard Worker   ~StackAllocated() { cleanup(&ctx_); }
483*8fb009dcSAndroid Build Coastguard Worker 
484*8fb009dcSAndroid Build Coastguard Worker   StackAllocated(const StackAllocated &) = delete;
485*8fb009dcSAndroid Build Coastguard Worker   StackAllocated& operator=(const StackAllocated &) = delete;
486*8fb009dcSAndroid Build Coastguard Worker 
get()487*8fb009dcSAndroid Build Coastguard Worker   T *get() { return &ctx_; }
get()488*8fb009dcSAndroid Build Coastguard Worker   const T *get() const { return &ctx_; }
489*8fb009dcSAndroid Build Coastguard Worker 
490*8fb009dcSAndroid Build Coastguard Worker   T *operator->() { return &ctx_; }
491*8fb009dcSAndroid Build Coastguard Worker   const T *operator->() const { return &ctx_; }
492*8fb009dcSAndroid Build Coastguard Worker 
Reset()493*8fb009dcSAndroid Build Coastguard Worker   void Reset() {
494*8fb009dcSAndroid Build Coastguard Worker     cleanup(&ctx_);
495*8fb009dcSAndroid Build Coastguard Worker     init(&ctx_);
496*8fb009dcSAndroid Build Coastguard Worker   }
497*8fb009dcSAndroid Build Coastguard Worker 
498*8fb009dcSAndroid Build Coastguard Worker  private:
499*8fb009dcSAndroid Build Coastguard Worker   T ctx_;
500*8fb009dcSAndroid Build Coastguard Worker };
501*8fb009dcSAndroid Build Coastguard Worker 
502*8fb009dcSAndroid Build Coastguard Worker template <typename T, typename CleanupRet, void (*init)(T *),
503*8fb009dcSAndroid Build Coastguard Worker           CleanupRet (*cleanup)(T *), void (*move)(T *, T *)>
504*8fb009dcSAndroid Build Coastguard Worker class StackAllocatedMovable {
505*8fb009dcSAndroid Build Coastguard Worker  public:
StackAllocatedMovable()506*8fb009dcSAndroid Build Coastguard Worker   StackAllocatedMovable() { init(&ctx_); }
~StackAllocatedMovable()507*8fb009dcSAndroid Build Coastguard Worker   ~StackAllocatedMovable() { cleanup(&ctx_); }
508*8fb009dcSAndroid Build Coastguard Worker 
StackAllocatedMovable(StackAllocatedMovable && other)509*8fb009dcSAndroid Build Coastguard Worker   StackAllocatedMovable(StackAllocatedMovable &&other) {
510*8fb009dcSAndroid Build Coastguard Worker     init(&ctx_);
511*8fb009dcSAndroid Build Coastguard Worker     move(&ctx_, &other.ctx_);
512*8fb009dcSAndroid Build Coastguard Worker   }
513*8fb009dcSAndroid Build Coastguard Worker   StackAllocatedMovable &operator=(StackAllocatedMovable &&other) {
514*8fb009dcSAndroid Build Coastguard Worker     move(&ctx_, &other.ctx_);
515*8fb009dcSAndroid Build Coastguard Worker     return *this;
516*8fb009dcSAndroid Build Coastguard Worker   }
517*8fb009dcSAndroid Build Coastguard Worker 
get()518*8fb009dcSAndroid Build Coastguard Worker   T *get() { return &ctx_; }
get()519*8fb009dcSAndroid Build Coastguard Worker   const T *get() const { return &ctx_; }
520*8fb009dcSAndroid Build Coastguard Worker 
521*8fb009dcSAndroid Build Coastguard Worker   T *operator->() { return &ctx_; }
522*8fb009dcSAndroid Build Coastguard Worker   const T *operator->() const { return &ctx_; }
523*8fb009dcSAndroid Build Coastguard Worker 
Reset()524*8fb009dcSAndroid Build Coastguard Worker   void Reset() {
525*8fb009dcSAndroid Build Coastguard Worker     cleanup(&ctx_);
526*8fb009dcSAndroid Build Coastguard Worker     init(&ctx_);
527*8fb009dcSAndroid Build Coastguard Worker   }
528*8fb009dcSAndroid Build Coastguard Worker 
529*8fb009dcSAndroid Build Coastguard Worker  private:
530*8fb009dcSAndroid Build Coastguard Worker   T ctx_;
531*8fb009dcSAndroid Build Coastguard Worker };
532*8fb009dcSAndroid Build Coastguard Worker 
533*8fb009dcSAndroid Build Coastguard Worker }  // namespace internal
534*8fb009dcSAndroid Build Coastguard Worker 
535*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_MAKE_DELETER(type, deleter)     \
536*8fb009dcSAndroid Build Coastguard Worker   namespace internal {                            \
537*8fb009dcSAndroid Build Coastguard Worker   template <>                                     \
538*8fb009dcSAndroid Build Coastguard Worker   struct DeleterImpl<type> {                      \
539*8fb009dcSAndroid Build Coastguard Worker     static void Free(type *ptr) { deleter(ptr); } \
540*8fb009dcSAndroid Build Coastguard Worker   };                                              \
541*8fb009dcSAndroid Build Coastguard Worker   }
542*8fb009dcSAndroid Build Coastguard Worker 
543*8fb009dcSAndroid Build Coastguard Worker // Holds ownership of heap-allocated BoringSSL structures. Sample usage:
544*8fb009dcSAndroid Build Coastguard Worker //   bssl::UniquePtr<RSA> rsa(RSA_new());
545*8fb009dcSAndroid Build Coastguard Worker //   bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
546*8fb009dcSAndroid Build Coastguard Worker template <typename T>
547*8fb009dcSAndroid Build Coastguard Worker using UniquePtr = std::unique_ptr<T, internal::Deleter>;
548*8fb009dcSAndroid Build Coastguard Worker 
549*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_MAKE_UP_REF(type, up_ref_func)             \
550*8fb009dcSAndroid Build Coastguard Worker   inline UniquePtr<type> UpRef(type *v) {                    \
551*8fb009dcSAndroid Build Coastguard Worker     if (v != nullptr) {                                      \
552*8fb009dcSAndroid Build Coastguard Worker       up_ref_func(v);                                        \
553*8fb009dcSAndroid Build Coastguard Worker     }                                                        \
554*8fb009dcSAndroid Build Coastguard Worker     return UniquePtr<type>(v);                               \
555*8fb009dcSAndroid Build Coastguard Worker   }                                                          \
556*8fb009dcSAndroid Build Coastguard Worker                                                              \
557*8fb009dcSAndroid Build Coastguard Worker   inline UniquePtr<type> UpRef(const UniquePtr<type> &ptr) { \
558*8fb009dcSAndroid Build Coastguard Worker     return UpRef(ptr.get());                                 \
559*8fb009dcSAndroid Build Coastguard Worker   }
560*8fb009dcSAndroid Build Coastguard Worker 
561*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_END
562*8fb009dcSAndroid Build Coastguard Worker 
563*8fb009dcSAndroid Build Coastguard Worker }  // extern C++
564*8fb009dcSAndroid Build Coastguard Worker 
565*8fb009dcSAndroid Build Coastguard Worker #endif  // !BORINGSSL_NO_CXX
566*8fb009dcSAndroid Build Coastguard Worker 
567*8fb009dcSAndroid Build Coastguard Worker #endif  // OPENSSL_HEADER_BASE_H
568