You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Add PPC64LE assembly for AES-GCM. This change adds AES and GHASH assembly from upstream, with the aim of speeding up AES-GCM. The PPC64LE assembly matches the interface of the ARMv8 assembly so I've changed the prefix of both sets of asm functions to be the same ("aes_hw_"). Otherwise, the new assmebly files and Perlasm match exactly those from upstream's c536b6be1a (from their master branch). Before: Did 1879000 AES-128-GCM (16 bytes) seal operations in 1000428us (1878196.1 ops/sec): 30.1 MB/s Did 61000 AES-128-GCM (1350 bytes) seal operations in 1006660us (60596.4 ops/sec): 81.8 MB/s Did 11000 AES-128-GCM (8192 bytes) seal operations in 1072649us (10255.0 ops/sec): 84.0 MB/s Did 1665000 AES-256-GCM (16 bytes) seal operations in 1000591us (1664016.6 ops/sec): 26.6 MB/s Did 52000 AES-256-GCM (1350 bytes) seal operations in 1006971us (51640.0 ops/sec): 69.7 MB/s Did 8840 AES-256-GCM (8192 bytes) seal operations in 1013294us (8724.0 ops/sec): 71.5 MB/s After: Did 4994000 AES-128-GCM (16 bytes) seal operations in 1000017us (4993915.1 ops/sec): 79.9 MB/s Did 1389000 AES-128-GCM (1350 bytes) seal operations in 1000073us (1388898.6 ops/sec): 1875.0 MB/s Did 319000 AES-128-GCM (8192 bytes) seal operations in 1000101us (318967.8 ops/sec): 2613.0 MB/s Did 4668000 AES-256-GCM (16 bytes) seal operations in 1000149us (4667304.6 ops/sec): 74.7 MB/s Did 1202000 AES-256-GCM (1350 bytes) seal operations in 1000646us (1201224.0 ops/sec): 1621.7 MB/s Did 269000 AES-256-GCM (8192 bytes) seal operations in 1002804us (268247.8 ops/sec): 2197.5 MB/s Change-Id: Id848562bd4e1aa79a4683012501dfa5e6c08cfcc Reviewed-on: https://boringssl-review.googlesource.com/11262 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
8 年之前
Add PPC64LE assembly for AES-GCM. This change adds AES and GHASH assembly from upstream, with the aim of speeding up AES-GCM. The PPC64LE assembly matches the interface of the ARMv8 assembly so I've changed the prefix of both sets of asm functions to be the same ("aes_hw_"). Otherwise, the new assmebly files and Perlasm match exactly those from upstream's c536b6be1a (from their master branch). Before: Did 1879000 AES-128-GCM (16 bytes) seal operations in 1000428us (1878196.1 ops/sec): 30.1 MB/s Did 61000 AES-128-GCM (1350 bytes) seal operations in 1006660us (60596.4 ops/sec): 81.8 MB/s Did 11000 AES-128-GCM (8192 bytes) seal operations in 1072649us (10255.0 ops/sec): 84.0 MB/s Did 1665000 AES-256-GCM (16 bytes) seal operations in 1000591us (1664016.6 ops/sec): 26.6 MB/s Did 52000 AES-256-GCM (1350 bytes) seal operations in 1006971us (51640.0 ops/sec): 69.7 MB/s Did 8840 AES-256-GCM (8192 bytes) seal operations in 1013294us (8724.0 ops/sec): 71.5 MB/s After: Did 4994000 AES-128-GCM (16 bytes) seal operations in 1000017us (4993915.1 ops/sec): 79.9 MB/s Did 1389000 AES-128-GCM (1350 bytes) seal operations in 1000073us (1388898.6 ops/sec): 1875.0 MB/s Did 319000 AES-128-GCM (8192 bytes) seal operations in 1000101us (318967.8 ops/sec): 2613.0 MB/s Did 4668000 AES-256-GCM (16 bytes) seal operations in 1000149us (4667304.6 ops/sec): 74.7 MB/s Did 1202000 AES-256-GCM (1350 bytes) seal operations in 1000646us (1201224.0 ops/sec): 1621.7 MB/s Did 269000 AES-256-GCM (8192 bytes) seal operations in 1002804us (268247.8 ops/sec): 2197.5 MB/s Change-Id: Id848562bd4e1aa79a4683012501dfa5e6c08cfcc Reviewed-on: https://boringssl-review.googlesource.com/11262 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
8 年之前
Switch OPENSSL_VERSION_NUMBER to 1.1.0. Although we are derived from 1.0.2, we mimic 1.1.0 in some ways around our FOO_up_ref functions and opaque libssl types. This causes some difficulties when porting third-party code as any OPENSSL_VERSION_NUMBER checks for 1.1.0 APIs we have will be wrong. Moreover, adding accessors without changing OPENSSL_VERSION_NUMBER can break external projects. It is common to implement a compatibility version of an accessor under #ifdef as a static function. This then conflicts with our headers if we, unlike OpenSSL 1.0.2, have this function. This change switches OPENSSL_VERSION_NUMBER to 1.1.0 and atomically adds enough accessors for software with 1.1.0 support already. The hope is this will unblock hiding SSL_CTX and SSL_SESSION, which will be especially useful with C++-ficiation. The cost is we will hit some growing pains as more 1.1.0 consumers enter the ecosystem and we converge on the right set of APIs to import from upstream. It does not remove any 1.0.2 APIs, so we will not require that all projects support 1.1.0. The exception is APIs which changed in 1.1.0 but did not change the function signature. Those are breaking changes. Specifically: - SSL_CTX_sess_set_get_cb is now const-correct. - X509_get0_signature is now const-correct. For C++ consumers only, this change temporarily includes an overload hack for SSL_CTX_sess_set_get_cb that keeps the old callback working. This is a workaround for Node not yet supporting OpenSSL 1.1.0. The version number is set at (the as yet unreleased) 1.1.0g to denote that this change includes https://github.com/openssl/openssl/pull/4384. Bug: 91 Change-Id: I5eeb27448a6db4c25c244afac37f9604d9608a76 Reviewed-on: https://boringssl-review.googlesource.com/10340 Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
8 年之前
Switch OPENSSL_VERSION_NUMBER to 1.1.0. Although we are derived from 1.0.2, we mimic 1.1.0 in some ways around our FOO_up_ref functions and opaque libssl types. This causes some difficulties when porting third-party code as any OPENSSL_VERSION_NUMBER checks for 1.1.0 APIs we have will be wrong. Moreover, adding accessors without changing OPENSSL_VERSION_NUMBER can break external projects. It is common to implement a compatibility version of an accessor under #ifdef as a static function. This then conflicts with our headers if we, unlike OpenSSL 1.0.2, have this function. This change switches OPENSSL_VERSION_NUMBER to 1.1.0 and atomically adds enough accessors for software with 1.1.0 support already. The hope is this will unblock hiding SSL_CTX and SSL_SESSION, which will be especially useful with C++-ficiation. The cost is we will hit some growing pains as more 1.1.0 consumers enter the ecosystem and we converge on the right set of APIs to import from upstream. It does not remove any 1.0.2 APIs, so we will not require that all projects support 1.1.0. The exception is APIs which changed in 1.1.0 but did not change the function signature. Those are breaking changes. Specifically: - SSL_CTX_sess_set_get_cb is now const-correct. - X509_get0_signature is now const-correct. For C++ consumers only, this change temporarily includes an overload hack for SSL_CTX_sess_set_get_cb that keeps the old callback working. This is a workaround for Node not yet supporting OpenSSL 1.1.0. The version number is set at (the as yet unreleased) 1.1.0g to denote that this change includes https://github.com/openssl/openssl/pull/4384. Bug: 91 Change-Id: I5eeb27448a6db4c25c244afac37f9604d9608a76 Reviewed-on: https://boringssl-review.googlesource.com/10340 Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
8 年之前
Inline functions are apparently really complicated. C and C++ handle inline functions differently. In C++, an inline function is defined in just the header file, potentially emitted in multiple compilation units (in cases the compiler did not inline), but each copy must be identical to satsify ODR. In C, a non-static inline must be manually emitted in exactly one compilation unit with a separate extern inline declaration. In both languages, exported inline functions referencing file-local symbols are problematic. C forbids this altogether (though GCC and Clang seem not to enforce it). It works in C++, but ODR requires the definitions be identical, including all names in the definitions resolving to the "same entity". In practice, this is unlikely to be a problem, but an inline function that returns a pointer to a file-local symbol could compile oddly. Historically, we used static inline in headers. However, to satisfy ODR, use plain inline in C++, to allow inline consumer functions to call our header functions. Plain inline would also work better with C99 inline, but that is not used much in practice, extern inline is tedious, and there are conflicts with the old gnu89 model: https://stackoverflow.com/questions/216510/extern-inline For dual C/C++ code, use a macro to dispatch between these. For C++-only code, stop using static inline and just use plain inline. Update-Note: If you see weird C++ compile or link failures in header functions, this change is probably to blame. Though this change doesn't affect C and non-static inline is extremely common in C++, so I would expect this to be fine. Change-Id: Ibb0bf8ff57143fc14e10342854e467f85a5e4a82 Reviewed-on: https://boringssl-review.googlesource.com/32116 Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
6 年之前
Switch OPENSSL_VERSION_NUMBER to 1.1.0. Although we are derived from 1.0.2, we mimic 1.1.0 in some ways around our FOO_up_ref functions and opaque libssl types. This causes some difficulties when porting third-party code as any OPENSSL_VERSION_NUMBER checks for 1.1.0 APIs we have will be wrong. Moreover, adding accessors without changing OPENSSL_VERSION_NUMBER can break external projects. It is common to implement a compatibility version of an accessor under #ifdef as a static function. This then conflicts with our headers if we, unlike OpenSSL 1.0.2, have this function. This change switches OPENSSL_VERSION_NUMBER to 1.1.0 and atomically adds enough accessors for software with 1.1.0 support already. The hope is this will unblock hiding SSL_CTX and SSL_SESSION, which will be especially useful with C++-ficiation. The cost is we will hit some growing pains as more 1.1.0 consumers enter the ecosystem and we converge on the right set of APIs to import from upstream. It does not remove any 1.0.2 APIs, so we will not require that all projects support 1.1.0. The exception is APIs which changed in 1.1.0 but did not change the function signature. Those are breaking changes. Specifically: - SSL_CTX_sess_set_get_cb is now const-correct. - X509_get0_signature is now const-correct. For C++ consumers only, this change temporarily includes an overload hack for SSL_CTX_sess_set_get_cb that keeps the old callback working. This is a workaround for Node not yet supporting OpenSSL 1.1.0. The version number is set at (the as yet unreleased) 1.1.0g to denote that this change includes https://github.com/openssl/openssl/pull/4384. Bug: 91 Change-Id: I5eeb27448a6db4c25c244afac37f9604d9608a76 Reviewed-on: https://boringssl-review.googlesource.com/10340 Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
8 年之前
Inline functions are apparently really complicated. C and C++ handle inline functions differently. In C++, an inline function is defined in just the header file, potentially emitted in multiple compilation units (in cases the compiler did not inline), but each copy must be identical to satsify ODR. In C, a non-static inline must be manually emitted in exactly one compilation unit with a separate extern inline declaration. In both languages, exported inline functions referencing file-local symbols are problematic. C forbids this altogether (though GCC and Clang seem not to enforce it). It works in C++, but ODR requires the definitions be identical, including all names in the definitions resolving to the "same entity". In practice, this is unlikely to be a problem, but an inline function that returns a pointer to a file-local symbol could compile oddly. Historically, we used static inline in headers. However, to satisfy ODR, use plain inline in C++, to allow inline consumer functions to call our header functions. Plain inline would also work better with C99 inline, but that is not used much in practice, extern inline is tedious, and there are conflicts with the old gnu89 model: https://stackoverflow.com/questions/216510/extern-inline For dual C/C++ code, use a macro to dispatch between these. For C++-only code, stop using static inline and just use plain inline. Update-Note: If you see weird C++ compile or link failures in header functions, this change is probably to blame. Though this change doesn't affect C and non-static inline is extremely common in C++, so I would expect this to be fine. Change-Id: Ibb0bf8ff57143fc14e10342854e467f85a5e4a82 Reviewed-on: https://boringssl-review.googlesource.com/32116 Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
6 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. /* ====================================================================
  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
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  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. #ifndef OPENSSL_HEADER_BASE_H
  53. #define OPENSSL_HEADER_BASE_H
  54. // This file should be the first included by all BoringSSL headers.
  55. #include <stddef.h>
  56. #include <stdint.h>
  57. #include <sys/types.h>
  58. #if defined(__MINGW32__)
  59. // stdio.h is needed on MinGW for __MINGW_PRINTF_FORMAT.
  60. #include <stdio.h>
  61. #endif
  62. #if defined(__APPLE__)
  63. #include <TargetConditionals.h>
  64. #endif
  65. // Include a BoringSSL-only header so consumers including this header without
  66. // setting up include paths do not accidentally pick up the system
  67. // opensslconf.h.
  68. #include <openssl/is_boringssl.h>
  69. #include <openssl/opensslconf.h>
  70. #if defined(BORINGSSL_PREFIX)
  71. #include <boringssl_prefix_symbols.h>
  72. #endif
  73. #if defined(__cplusplus)
  74. extern "C" {
  75. #endif
  76. #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64)
  77. #define OPENSSL_64_BIT
  78. #define OPENSSL_X86_64
  79. #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86)
  80. #define OPENSSL_32_BIT
  81. #define OPENSSL_X86
  82. #elif defined(__aarch64__)
  83. #define OPENSSL_64_BIT
  84. #define OPENSSL_AARCH64
  85. #elif defined(__arm) || defined(__arm__) || defined(_M_ARM)
  86. #define OPENSSL_32_BIT
  87. #define OPENSSL_ARM
  88. #elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN)
  89. #define OPENSSL_64_BIT
  90. #define OPENSSL_PPC64LE
  91. #elif defined(__mips__) && !defined(__LP64__)
  92. #define OPENSSL_32_BIT
  93. #define OPENSSL_MIPS
  94. #elif defined(__mips__) && defined(__LP64__)
  95. #define OPENSSL_64_BIT
  96. #define OPENSSL_MIPS64
  97. #elif defined(__pnacl__)
  98. #define OPENSSL_32_BIT
  99. #define OPENSSL_PNACL
  100. #elif defined(__wasm__)
  101. #define OPENSSL_32_BIT
  102. #elif defined(__asmjs__)
  103. #define OPENSSL_32_BIT
  104. #elif defined(__myriad2__)
  105. #define OPENSSL_32_BIT
  106. #else
  107. // Note BoringSSL only supports standard 32-bit and 64-bit two's-complement,
  108. // little-endian architectures. Functions will not produce the correct answer
  109. // on other systems. Run the crypto_test binary, notably
  110. // crypto/compiler_test.cc, before adding a new architecture.
  111. #error "Unknown target CPU"
  112. #endif
  113. #if defined(__APPLE__)
  114. #define OPENSSL_APPLE
  115. #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
  116. #define OPENSSL_IOS
  117. #endif
  118. #endif
  119. #if defined(_WIN32)
  120. #define OPENSSL_WINDOWS
  121. #endif
  122. #if defined(__linux__)
  123. #define OPENSSL_LINUX
  124. #endif
  125. #if defined(__Fuchsia__)
  126. #define OPENSSL_FUCHSIA
  127. #endif
  128. #if defined(TRUSTY)
  129. #define OPENSSL_TRUSTY
  130. #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
  131. #endif
  132. #if defined(__ANDROID_API__)
  133. #define OPENSSL_ANDROID
  134. #endif
  135. // BoringSSL requires platform's locking APIs to make internal global state
  136. // thread-safe, including the PRNG. On some single-threaded embedded platforms,
  137. // locking APIs may not exist, so this dependency may be disabled with the
  138. // following build flag.
  139. //
  140. // IMPORTANT: Doing so means the consumer promises the library will never be
  141. // used in any multi-threaded context. It causes BoringSSL to be globally
  142. // thread-unsafe. Setting it inappropriately will subtly and unpredictably
  143. // corrupt memory and leak secret keys.
  144. //
  145. // Do not set this flag on any platform where threads are possible. BoringSSL
  146. // maintainers will not provide support for any consumers that do so. Changes
  147. // which break such unsupported configurations will not be reverted.
  148. #if !defined(OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED)
  149. #define OPENSSL_THREADS
  150. #endif
  151. #define OPENSSL_IS_BORINGSSL
  152. #define OPENSSL_VERSION_NUMBER 0x1010007f
  153. #define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
  154. // BORINGSSL_API_VERSION is a positive integer that increments as BoringSSL
  155. // changes over time. The value itself is not meaningful. It will be incremented
  156. // whenever is convenient to coordinate an API change with consumers. This will
  157. // not denote any special point in development.
  158. //
  159. // A consumer may use this symbol in the preprocessor to temporarily build
  160. // against multiple revisions of BoringSSL at the same time. It is not
  161. // recommended to do so for longer than is necessary.
  162. #define BORINGSSL_API_VERSION 9
  163. #if defined(BORINGSSL_SHARED_LIBRARY)
  164. #if defined(OPENSSL_WINDOWS)
  165. #if defined(BORINGSSL_IMPLEMENTATION)
  166. #define OPENSSL_EXPORT __declspec(dllexport)
  167. #else
  168. #define OPENSSL_EXPORT __declspec(dllimport)
  169. #endif
  170. #else // defined(OPENSSL_WINDOWS)
  171. #if defined(BORINGSSL_IMPLEMENTATION)
  172. #define OPENSSL_EXPORT __attribute__((visibility("default")))
  173. #else
  174. #define OPENSSL_EXPORT
  175. #endif
  176. #endif // defined(OPENSSL_WINDOWS)
  177. #else // defined(BORINGSSL_SHARED_LIBRARY)
  178. #define OPENSSL_EXPORT
  179. #endif // defined(BORINGSSL_SHARED_LIBRARY)
  180. #if defined(__GNUC__) || defined(__clang__)
  181. // MinGW has two different printf implementations. Ensure the format macro
  182. // matches the selected implementation. See
  183. // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
  184. #if defined(__MINGW_PRINTF_FORMAT)
  185. #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
  186. __attribute__( \
  187. (__format__(__MINGW_PRINTF_FORMAT, string_index, first_to_check)))
  188. #else
  189. #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check) \
  190. __attribute__((__format__(__printf__, string_index, first_to_check)))
  191. #endif
  192. #else
  193. #define OPENSSL_PRINTF_FORMAT_FUNC(string_index, first_to_check)
  194. #endif
  195. // OPENSSL_MSVC_PRAGMA emits a pragma on MSVC and nothing on other compilers.
  196. #if defined(_MSC_VER)
  197. #define OPENSSL_MSVC_PRAGMA(arg) __pragma(arg)
  198. #else
  199. #define OPENSSL_MSVC_PRAGMA(arg)
  200. #endif
  201. #if defined(__GNUC__) || defined(__clang__)
  202. #define OPENSSL_UNUSED __attribute__((unused))
  203. #else
  204. #define OPENSSL_UNUSED
  205. #endif
  206. // C and C++ handle inline functions differently. In C++, an inline function is
  207. // defined in just the header file, potentially emitted in multiple compilation
  208. // units (in cases the compiler did not inline), but each copy must be identical
  209. // to satsify ODR. In C, a non-static inline must be manually emitted in exactly
  210. // one compilation unit with a separate extern inline declaration.
  211. //
  212. // In both languages, exported inline functions referencing file-local symbols
  213. // are problematic. C forbids this altogether (though GCC and Clang seem not to
  214. // enforce it). It works in C++, but ODR requires the definitions be identical,
  215. // including all names in the definitions resolving to the "same entity". In
  216. // practice, this is unlikely to be a problem, but an inline function that
  217. // returns a pointer to a file-local symbol
  218. // could compile oddly.
  219. //
  220. // Historically, we used static inline in headers. However, to satisfy ODR, use
  221. // plain inline in C++, to allow inline consumer functions to call our header
  222. // functions. Plain inline would also work better with C99 inline, but that is
  223. // not used much in practice, extern inline is tedious, and there are conflicts
  224. // with the old gnu89 model:
  225. // https://stackoverflow.com/questions/216510/extern-inline
  226. #if defined(__cplusplus)
  227. #define OPENSSL_INLINE inline
  228. #else
  229. // Add OPENSSL_UNUSED so that, should an inline function be emitted via macro
  230. // (e.g. a |STACK_OF(T)| implementation) in a source file without tripping
  231. // clang's -Wunused-function.
  232. #define OPENSSL_INLINE static inline OPENSSL_UNUSED
  233. #endif
  234. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE) && \
  235. !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
  236. #define BORINGSSL_UNSAFE_DETERMINISTIC_MODE
  237. #endif
  238. #if defined(__has_feature)
  239. #if __has_feature(address_sanitizer)
  240. #define OPENSSL_ASAN
  241. #endif
  242. #if __has_feature(thread_sanitizer)
  243. #define OPENSSL_TSAN
  244. #endif
  245. #if __has_feature(memory_sanitizer)
  246. #define OPENSSL_MSAN
  247. #define OPENSSL_ASM_INCOMPATIBLE
  248. #endif
  249. #endif
  250. #if defined(OPENSSL_ASM_INCOMPATIBLE)
  251. #undef OPENSSL_ASM_INCOMPATIBLE
  252. #if !defined(OPENSSL_NO_ASM)
  253. #define OPENSSL_NO_ASM
  254. #endif
  255. #endif // OPENSSL_ASM_INCOMPATIBLE
  256. // CRYPTO_THREADID is a dummy value.
  257. typedef int CRYPTO_THREADID;
  258. typedef int ASN1_BOOLEAN;
  259. typedef int ASN1_NULL;
  260. typedef struct ASN1_ITEM_st ASN1_ITEM;
  261. typedef struct asn1_object_st ASN1_OBJECT;
  262. typedef struct asn1_pctx_st ASN1_PCTX;
  263. typedef struct asn1_string_st ASN1_BIT_STRING;
  264. typedef struct asn1_string_st ASN1_BMPSTRING;
  265. typedef struct asn1_string_st ASN1_ENUMERATED;
  266. typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
  267. typedef struct asn1_string_st ASN1_GENERALSTRING;
  268. typedef struct asn1_string_st ASN1_IA5STRING;
  269. typedef struct asn1_string_st ASN1_INTEGER;
  270. typedef struct asn1_string_st ASN1_OCTET_STRING;
  271. typedef struct asn1_string_st ASN1_PRINTABLESTRING;
  272. typedef struct asn1_string_st ASN1_STRING;
  273. typedef struct asn1_string_st ASN1_T61STRING;
  274. typedef struct asn1_string_st ASN1_TIME;
  275. typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
  276. typedef struct asn1_string_st ASN1_UTCTIME;
  277. typedef struct asn1_string_st ASN1_UTF8STRING;
  278. typedef struct asn1_string_st ASN1_VISIBLESTRING;
  279. typedef struct asn1_type_st ASN1_TYPE;
  280. typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID;
  281. typedef struct BASIC_CONSTRAINTS_st BASIC_CONSTRAINTS;
  282. typedef struct DIST_POINT_st DIST_POINT;
  283. typedef struct DSA_SIG_st DSA_SIG;
  284. typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT;
  285. typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS;
  286. typedef struct Netscape_spkac_st NETSCAPE_SPKAC;
  287. typedef struct Netscape_spki_st NETSCAPE_SPKI;
  288. typedef struct RIPEMD160state_st RIPEMD160_CTX;
  289. typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE;
  290. typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
  291. typedef struct X509_POLICY_NODE_st X509_POLICY_NODE;
  292. typedef struct X509_POLICY_TREE_st X509_POLICY_TREE;
  293. typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM;
  294. typedef struct X509_algor_st X509_ALGOR;
  295. typedef struct X509_crl_info_st X509_CRL_INFO;
  296. typedef struct X509_crl_st X509_CRL;
  297. typedef struct X509_extension_st X509_EXTENSION;
  298. typedef struct X509_info_st X509_INFO;
  299. typedef struct X509_name_entry_st X509_NAME_ENTRY;
  300. typedef struct X509_name_st X509_NAME;
  301. typedef struct X509_pubkey_st X509_PUBKEY;
  302. typedef struct X509_req_info_st X509_REQ_INFO;
  303. typedef struct X509_req_st X509_REQ;
  304. typedef struct X509_sig_st X509_SIG;
  305. typedef struct X509_val_st X509_VAL;
  306. typedef struct bignum_ctx BN_CTX;
  307. typedef struct bignum_st BIGNUM;
  308. typedef struct bio_method_st BIO_METHOD;
  309. typedef struct bio_st BIO;
  310. typedef struct bn_gencb_st BN_GENCB;
  311. typedef struct bn_mont_ctx_st BN_MONT_CTX;
  312. typedef struct buf_mem_st BUF_MEM;
  313. typedef struct cbb_st CBB;
  314. typedef struct cbs_st CBS;
  315. typedef struct cmac_ctx_st CMAC_CTX;
  316. typedef struct conf_st CONF;
  317. typedef struct conf_value_st CONF_VALUE;
  318. typedef struct crypto_buffer_pool_st CRYPTO_BUFFER_POOL;
  319. typedef struct crypto_buffer_st CRYPTO_BUFFER;
  320. typedef struct dh_st DH;
  321. typedef struct dsa_st DSA;
  322. typedef struct ec_group_st EC_GROUP;
  323. typedef struct ec_key_st EC_KEY;
  324. typedef struct ec_point_st EC_POINT;
  325. typedef struct ecdsa_method_st ECDSA_METHOD;
  326. typedef struct ecdsa_sig_st ECDSA_SIG;
  327. typedef struct engine_st ENGINE;
  328. typedef struct env_md_ctx_st EVP_MD_CTX;
  329. typedef struct env_md_st EVP_MD;
  330. typedef struct evp_aead_st EVP_AEAD;
  331. typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
  332. typedef struct evp_cipher_st EVP_CIPHER;
  333. typedef struct evp_encode_ctx_st EVP_ENCODE_CTX;
  334. typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD;
  335. typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;
  336. typedef struct evp_pkey_method_st EVP_PKEY_METHOD;
  337. typedef struct evp_pkey_st EVP_PKEY;
  338. typedef struct hmac_ctx_st HMAC_CTX;
  339. typedef struct md4_state_st MD4_CTX;
  340. typedef struct md5_state_st MD5_CTX;
  341. typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS;
  342. typedef struct pkcs12_st PKCS12;
  343. typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO;
  344. typedef struct private_key_st X509_PKEY;
  345. typedef struct rand_meth_st RAND_METHOD;
  346. typedef struct rc4_key_st RC4_KEY;
  347. typedef struct rsa_meth_st RSA_METHOD;
  348. typedef struct rsa_st RSA;
  349. typedef struct sha256_state_st SHA256_CTX;
  350. typedef struct sha512_state_st SHA512_CTX;
  351. typedef struct sha_state_st SHA_CTX;
  352. typedef struct spake2_ctx_st SPAKE2_CTX;
  353. typedef struct srtp_protection_profile_st SRTP_PROTECTION_PROFILE;
  354. typedef struct ssl_cipher_st SSL_CIPHER;
  355. typedef struct ssl_ctx_st SSL_CTX;
  356. typedef struct ssl_method_st SSL_METHOD;
  357. typedef struct ssl_private_key_method_st SSL_PRIVATE_KEY_METHOD;
  358. typedef struct ssl_quic_method_st SSL_QUIC_METHOD;
  359. typedef struct ssl_session_st SSL_SESSION;
  360. typedef struct ssl_st SSL;
  361. typedef struct ssl_ticket_aead_method_st SSL_TICKET_AEAD_METHOD;
  362. typedef struct st_ERR_FNS ERR_FNS;
  363. typedef struct v3_ext_ctx X509V3_CTX;
  364. typedef struct x509_attributes_st X509_ATTRIBUTE;
  365. typedef struct x509_cert_aux_st X509_CERT_AUX;
  366. typedef struct x509_cinf_st X509_CINF;
  367. typedef struct x509_crl_method_st X509_CRL_METHOD;
  368. typedef struct x509_lookup_st X509_LOOKUP;
  369. typedef struct x509_revoked_st X509_REVOKED;
  370. typedef struct x509_st X509;
  371. typedef struct x509_store_ctx_st X509_STORE_CTX;
  372. typedef struct x509_store_st X509_STORE;
  373. typedef struct x509_trust_st X509_TRUST;
  374. typedef void *OPENSSL_BLOCK;
  375. #if defined(__cplusplus)
  376. } // extern C
  377. #elif !defined(BORINGSSL_NO_CXX)
  378. #define BORINGSSL_NO_CXX
  379. #endif
  380. #if defined(BORINGSSL_PREFIX)
  381. #define BSSL_NAMESPACE_BEGIN \
  382. namespace bssl { \
  383. inline namespace BORINGSSL_PREFIX {
  384. #define BSSL_NAMESPACE_END \
  385. } \
  386. }
  387. #else
  388. #define BSSL_NAMESPACE_BEGIN namespace bssl {
  389. #define BSSL_NAMESPACE_END }
  390. #endif
  391. // MSVC doesn't set __cplusplus to 201103 to indicate C++11 support (see
  392. // https://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l)
  393. // so MSVC is just assumed to support C++11.
  394. #if !defined(BORINGSSL_NO_CXX) && __cplusplus < 201103L && !defined(_MSC_VER)
  395. #define BORINGSSL_NO_CXX
  396. #endif
  397. #if !defined(BORINGSSL_NO_CXX)
  398. extern "C++" {
  399. #include <memory>
  400. // STLPort, used by some Android consumers, not have std::unique_ptr.
  401. #if defined(_STLPORT_VERSION)
  402. #define BORINGSSL_NO_CXX
  403. #endif
  404. } // extern C++
  405. #endif // !BORINGSSL_NO_CXX
  406. #if defined(BORINGSSL_NO_CXX)
  407. #define BORINGSSL_MAKE_DELETER(type, deleter)
  408. #define BORINGSSL_MAKE_UP_REF(type, up_ref_func)
  409. #else
  410. extern "C++" {
  411. BSSL_NAMESPACE_BEGIN
  412. namespace internal {
  413. // The Enable parameter is ignored and only exists so specializations can use
  414. // SFINAE.
  415. template <typename T, typename Enable = void>
  416. struct DeleterImpl {};
  417. template <typename T>
  418. struct Deleter {
  419. void operator()(T *ptr) {
  420. // Rather than specialize Deleter for each type, we specialize
  421. // DeleterImpl. This allows bssl::UniquePtr<T> to be used while only
  422. // including base.h as long as the destructor is not emitted. This matches
  423. // std::unique_ptr's behavior on forward-declared types.
  424. //
  425. // DeleterImpl itself is specialized in the corresponding module's header
  426. // and must be included to release an object. If not included, the compiler
  427. // will error that DeleterImpl<T> does not have a method Free.
  428. DeleterImpl<T>::Free(ptr);
  429. }
  430. };
  431. template <typename T, typename CleanupRet, void (*init)(T *),
  432. CleanupRet (*cleanup)(T *)>
  433. class StackAllocated {
  434. public:
  435. StackAllocated() { init(&ctx_); }
  436. ~StackAllocated() { cleanup(&ctx_); }
  437. StackAllocated(const StackAllocated<T, CleanupRet, init, cleanup> &) = delete;
  438. T& operator=(const StackAllocated<T, CleanupRet, init, cleanup> &) = delete;
  439. T *get() { return &ctx_; }
  440. const T *get() const { return &ctx_; }
  441. T *operator->() { return &ctx_; }
  442. const T *operator->() const { return &ctx_; }
  443. void Reset() {
  444. cleanup(&ctx_);
  445. init(&ctx_);
  446. }
  447. private:
  448. T ctx_;
  449. };
  450. } // namespace internal
  451. #define BORINGSSL_MAKE_DELETER(type, deleter) \
  452. namespace internal { \
  453. template <> \
  454. struct DeleterImpl<type> { \
  455. static void Free(type *ptr) { deleter(ptr); } \
  456. }; \
  457. }
  458. // Holds ownership of heap-allocated BoringSSL structures. Sample usage:
  459. // bssl::UniquePtr<RSA> rsa(RSA_new());
  460. // bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
  461. template <typename T>
  462. using UniquePtr = std::unique_ptr<T, internal::Deleter<T>>;
  463. #define BORINGSSL_MAKE_UP_REF(type, up_ref_func) \
  464. inline UniquePtr<type> UpRef(type *v) { \
  465. if (v != nullptr) { \
  466. up_ref_func(v); \
  467. } \
  468. return UniquePtr<type>(v); \
  469. } \
  470. \
  471. inline UniquePtr<type> UpRef(const UniquePtr<type> &ptr) { \
  472. return UpRef(ptr.get()); \
  473. }
  474. BSSL_NAMESPACE_END
  475. } // extern C++
  476. #endif // !BORINGSSL_NO_CXX
  477. #endif // OPENSSL_HEADER_BASE_H