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