/src/boringssl/crypto/internal.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
2 | | * All rights reserved. |
3 | | * |
4 | | * This package is an SSL implementation written |
5 | | * by Eric Young (eay@cryptsoft.com). |
6 | | * The implementation was written so as to conform with Netscapes SSL. |
7 | | * |
8 | | * This library is free for commercial and non-commercial use as long as |
9 | | * the following conditions are aheared to. The following conditions |
10 | | * apply to all code found in this distribution, be it the RC4, RSA, |
11 | | * lhash, DES, etc., code; not just the SSL code. The SSL documentation |
12 | | * included with this distribution is covered by the same copyright terms |
13 | | * except that the holder is Tim Hudson (tjh@cryptsoft.com). |
14 | | * |
15 | | * Copyright remains Eric Young's, and as such any Copyright notices in |
16 | | * the code are not to be removed. |
17 | | * If this package is used in a product, Eric Young should be given attribution |
18 | | * as the author of the parts of the library used. |
19 | | * This can be in the form of a textual message at program startup or |
20 | | * in documentation (online or textual) provided with the package. |
21 | | * |
22 | | * Redistribution and use in source and binary forms, with or without |
23 | | * modification, are permitted provided that the following conditions |
24 | | * are met: |
25 | | * 1. Redistributions of source code must retain the copyright |
26 | | * notice, this list of conditions and the following disclaimer. |
27 | | * 2. Redistributions in binary form must reproduce the above copyright |
28 | | * notice, this list of conditions and the following disclaimer in the |
29 | | * documentation and/or other materials provided with the distribution. |
30 | | * 3. All advertising materials mentioning features or use of this software |
31 | | * must display the following acknowledgement: |
32 | | * "This product includes cryptographic software written by |
33 | | * Eric Young (eay@cryptsoft.com)" |
34 | | * The word 'cryptographic' can be left out if the rouines from the library |
35 | | * being used are not cryptographic related :-). |
36 | | * 4. If you include any Windows specific code (or a derivative thereof) from |
37 | | * the apps directory (application code) you must include an acknowledgement: |
38 | | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" |
39 | | * |
40 | | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND |
41 | | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
42 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
43 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
44 | | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
45 | | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
46 | | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
47 | | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
48 | | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
49 | | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
50 | | * SUCH DAMAGE. |
51 | | * |
52 | | * The licence and distribution terms for any publically available version or |
53 | | * derivative of this code cannot be changed. i.e. this code cannot simply be |
54 | | * copied and put under another distribution licence |
55 | | * [including the GNU Public Licence.] |
56 | | */ |
57 | | /* ==================================================================== |
58 | | * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. |
59 | | * |
60 | | * Redistribution and use in source and binary forms, with or without |
61 | | * modification, are permitted provided that the following conditions |
62 | | * are met: |
63 | | * |
64 | | * 1. Redistributions of source code must retain the above copyright |
65 | | * notice, this list of conditions and the following disclaimer. |
66 | | * |
67 | | * 2. Redistributions in binary form must reproduce the above copyright |
68 | | * notice, this list of conditions and the following disclaimer in |
69 | | * the documentation and/or other materials provided with the |
70 | | * distribution. |
71 | | * |
72 | | * 3. All advertising materials mentioning features or use of this |
73 | | * software must display the following acknowledgment: |
74 | | * "This product includes software developed by the OpenSSL Project |
75 | | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
76 | | * |
77 | | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
78 | | * endorse or promote products derived from this software without |
79 | | * prior written permission. For written permission, please contact |
80 | | * openssl-core@openssl.org. |
81 | | * |
82 | | * 5. Products derived from this software may not be called "OpenSSL" |
83 | | * nor may "OpenSSL" appear in their names without prior written |
84 | | * permission of the OpenSSL Project. |
85 | | * |
86 | | * 6. Redistributions of any form whatsoever must retain the following |
87 | | * acknowledgment: |
88 | | * "This product includes software developed by the OpenSSL Project |
89 | | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
90 | | * |
91 | | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
92 | | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
93 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
94 | | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
95 | | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
96 | | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
97 | | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
98 | | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
99 | | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
100 | | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
101 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
102 | | * OF THE POSSIBILITY OF SUCH DAMAGE. |
103 | | * ==================================================================== |
104 | | * |
105 | | * This product includes cryptographic software written by Eric Young |
106 | | * (eay@cryptsoft.com). This product includes software written by Tim |
107 | | * Hudson (tjh@cryptsoft.com). */ |
108 | | |
109 | | #ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H |
110 | | #define OPENSSL_HEADER_CRYPTO_INTERNAL_H |
111 | | |
112 | | #include <openssl/crypto.h> |
113 | | #include <openssl/ex_data.h> |
114 | | #include <openssl/stack.h> |
115 | | #include <openssl/thread.h> |
116 | | |
117 | | #include <assert.h> |
118 | | #include <string.h> |
119 | | |
120 | | #if defined(BORINGSSL_CONSTANT_TIME_VALIDATION) |
121 | | #include <valgrind/memcheck.h> |
122 | | #endif |
123 | | |
124 | | #if defined(BORINGSSL_FIPS_BREAK_TESTS) |
125 | | #include <stdlib.h> |
126 | | #endif |
127 | | |
128 | | #if !defined(__cplusplus) |
129 | | #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L |
130 | | #include <stdalign.h> |
131 | | #elif defined(_MSC_VER) && !defined(__clang__) |
132 | | #define alignas(x) __declspec(align(x)) |
133 | | #define alignof __alignof |
134 | | #else |
135 | | // With the exception of MSVC, we require C11 to build the library. C11 is a |
136 | | // prerequisite for improved refcounting performance. All our supported C |
137 | | // compilers have long implemented C11 and made it default. The most likely |
138 | | // cause of pre-C11 modes is stale -std=c99 or -std=gnu99 flags in build |
139 | | // configuration. Such flags can be removed. |
140 | | // |
141 | | // TODO(davidben): In MSVC 2019 16.8 or higher (_MSC_VER >= 1928), |
142 | | // |__STDC_VERSION__| will be 201112 when passed /std:c11 and unset otherwise. |
143 | | // C11 alignas and alignof are only implemented in C11 mode. Can we mandate C11 |
144 | | // mode for those versions? |
145 | | #error "BoringSSL must be built in C11 mode or higher." |
146 | | #endif |
147 | | #endif |
148 | | |
149 | | #if defined(OPENSSL_THREADS) && \ |
150 | | (!defined(OPENSSL_WINDOWS) || defined(__MINGW32__)) |
151 | | #include <pthread.h> |
152 | | #define OPENSSL_PTHREADS |
153 | | #endif |
154 | | |
155 | | #if defined(OPENSSL_THREADS) && !defined(OPENSSL_PTHREADS) && \ |
156 | | defined(OPENSSL_WINDOWS) |
157 | | #define OPENSSL_WINDOWS_THREADS |
158 | | #endif |
159 | | |
160 | | // Determine the atomics implementation to use with C. |
161 | | #if !defined(__cplusplus) |
162 | | #if !defined(OPENSSL_C11_ATOMIC) && defined(OPENSSL_THREADS) && \ |
163 | | !defined(__STDC_NO_ATOMICS__) && defined(__STDC_VERSION__) && \ |
164 | | __STDC_VERSION__ >= 201112L |
165 | | #define OPENSSL_C11_ATOMIC |
166 | | #endif |
167 | | |
168 | | #if defined(OPENSSL_C11_ATOMIC) |
169 | | #include <stdatomic.h> |
170 | | #endif |
171 | | |
172 | | // Older MSVC does not support C11 atomics, so we fallback to the Windows APIs. |
173 | | // When both are available (e.g. clang-cl), we prefer the C11 ones. The Windows |
174 | | // APIs don't allow some operations to be implemented as efficiently. This can |
175 | | // be removed once we can rely on |
176 | | // https://devblogs.microsoft.com/cppblog/c11-atomics-in-visual-studio-2022-version-17-5-preview-2/ |
177 | | #if !defined(OPENSSL_C11_ATOMIC) && defined(OPENSSL_THREADS) && \ |
178 | | defined(OPENSSL_WINDOWS) |
179 | | #define OPENSSL_WINDOWS_ATOMIC |
180 | | #endif |
181 | | #endif // !__cplusplus |
182 | | |
183 | | #if defined(OPENSSL_WINDOWS_THREADS) || defined(OPENSSL_WINDOWS_ATOMIC) |
184 | | OPENSSL_MSVC_PRAGMA(warning(push, 3)) |
185 | | #include <windows.h> |
186 | | OPENSSL_MSVC_PRAGMA(warning(pop)) |
187 | | #endif |
188 | | |
189 | | #if defined(__cplusplus) |
190 | | extern "C" { |
191 | | #endif |
192 | | |
193 | | |
194 | | #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || defined(OPENSSL_ARM) || \ |
195 | | defined(OPENSSL_AARCH64) |
196 | | // OPENSSL_cpuid_setup initializes the platform-specific feature cache. |
197 | | void OPENSSL_cpuid_setup(void); |
198 | | #endif |
199 | | |
200 | | #if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \ |
201 | | !defined(OPENSSL_STATIC_ARMCAP) |
202 | | // OPENSSL_get_armcap_pointer_for_test returns a pointer to |OPENSSL_armcap_P| |
203 | | // for unit tests. Any modifications to the value must be made after |
204 | | // |CRYPTO_library_init| but before any other function call in BoringSSL. |
205 | | OPENSSL_EXPORT uint32_t *OPENSSL_get_armcap_pointer_for_test(void); |
206 | | #endif |
207 | | |
208 | | |
209 | | // On non-MSVC 64-bit targets, we expect __uint128_t support. This includes |
210 | | // clang-cl, which defines both __clang__ and _MSC_VER. |
211 | | #if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT) |
212 | | #define BORINGSSL_HAS_UINT128 |
213 | | typedef __int128_t int128_t; |
214 | | typedef __uint128_t uint128_t; |
215 | | |
216 | | // __uint128_t division depends on intrinsics in the compiler runtime. Those |
217 | | // intrinsics are missing in clang-cl (https://crbug.com/787617) and nanolibc. |
218 | | // These may be bugs in the toolchain definition, but just disable it for now. |
219 | | #if !defined(_MSC_VER) && !defined(OPENSSL_NANOLIBC) |
220 | | #define BORINGSSL_CAN_DIVIDE_UINT128 |
221 | | #endif |
222 | | #endif |
223 | | |
224 | 0 | #define OPENSSL_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) |
225 | | |
226 | | // Have a generic fall-through for different versions of C/C++. |
227 | | #if defined(__cplusplus) && __cplusplus >= 201703L |
228 | | #define OPENSSL_FALLTHROUGH [[fallthrough]] |
229 | | #elif defined(__cplusplus) && __cplusplus >= 201103L && defined(__clang__) |
230 | | #define OPENSSL_FALLTHROUGH [[clang::fallthrough]] |
231 | | #elif defined(__cplusplus) && __cplusplus >= 201103L && defined(__GNUC__) && \ |
232 | | __GNUC__ >= 7 |
233 | | #define OPENSSL_FALLTHROUGH [[gnu::fallthrough]] |
234 | | #elif defined(__GNUC__) && __GNUC__ >= 7 // gcc 7 |
235 | | #define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough)) |
236 | | #elif defined(__clang__) |
237 | | #if __has_attribute(fallthrough) && __clang_major__ >= 5 |
238 | | // Clang 3.5, at least, complains about "error: declaration does not declare |
239 | | // anything", possibily because we put a semicolon after this macro in |
240 | | // practice. Thus limit it to >= Clang 5, which does work. |
241 | 0 | #define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough)) |
242 | | #else // clang versions that do not support fallthrough. |
243 | | #define OPENSSL_FALLTHROUGH |
244 | | #endif |
245 | | #else // C++11 on gcc 6, and all other cases |
246 | | #define OPENSSL_FALLTHROUGH |
247 | | #endif |
248 | | |
249 | | // For convenience in testing 64-bit generic code, we allow disabling SSE2 |
250 | | // intrinsics via |OPENSSL_NO_SSE2_FOR_TESTING|. x86_64 always has SSE2 |
251 | | // available, so we would otherwise need to test such code on a non-x86_64 |
252 | | // platform. |
253 | | #if defined(__SSE2__) && !defined(OPENSSL_NO_SSE2_FOR_TESTING) |
254 | | #define OPENSSL_SSE2 |
255 | | #endif |
256 | | |
257 | | #if defined(BORINGSSL_MALLOC_FAILURE_TESTING) |
258 | | // OPENSSL_reset_malloc_counter_for_testing, when malloc testing is enabled, |
259 | | // resets the internal malloc counter, to simulate further malloc failures. This |
260 | | // should be called in between independent tests, at a point where failure from |
261 | | // a previous test will not impact subsequent ones. |
262 | | OPENSSL_EXPORT void OPENSSL_reset_malloc_counter_for_testing(void); |
263 | | #else |
264 | 0 | OPENSSL_INLINE void OPENSSL_reset_malloc_counter_for_testing(void) {}Unexecuted instantiation: bcm.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: cbb.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: cbs.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: crypto.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: err.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: engine.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: evp.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: evp_ctx.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_ec.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_hkdf.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_rsa.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: ex_data.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: mem.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: deterministic.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: forkunsafe.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: refcount.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: rsa_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: rsa_crypt.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: stack.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: thread_pthread.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: convert.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: asn1_compat.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: chacha.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: cpu_intel.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: curve25519.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: dsa.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: dsa_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: ecdh_extra.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: ec_asn1.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: bio.c:OPENSSL_reset_malloc_counter_for_testing Unexecuted instantiation: file.c:OPENSSL_reset_malloc_counter_for_testing |
265 | | #endif |
266 | | |
267 | | |
268 | | // Pointer utility functions. |
269 | | |
270 | | // buffers_alias returns one if |a| and |b| alias and zero otherwise. |
271 | | static inline int buffers_alias(const void *a, size_t a_bytes, |
272 | 0 | const void *b, size_t b_bytes) { |
273 | | // Cast |a| and |b| to integers. In C, pointer comparisons between unrelated |
274 | | // objects are undefined whereas pointer to integer conversions are merely |
275 | | // implementation-defined. We assume the implementation defined it in a sane |
276 | | // way. |
277 | 0 | uintptr_t a_u = (uintptr_t)a; |
278 | 0 | uintptr_t b_u = (uintptr_t)b; |
279 | 0 | return a_u + a_bytes > b_u && b_u + b_bytes > a_u; |
280 | 0 | } Unexecuted instantiation: bcm.c:buffers_alias Unexecuted instantiation: cbb.c:buffers_alias Unexecuted instantiation: cbs.c:buffers_alias Unexecuted instantiation: crypto.c:buffers_alias Unexecuted instantiation: err.c:buffers_alias Unexecuted instantiation: engine.c:buffers_alias Unexecuted instantiation: evp.c:buffers_alias Unexecuted instantiation: evp_ctx.c:buffers_alias Unexecuted instantiation: p_dsa_asn1.c:buffers_alias Unexecuted instantiation: p_ec.c:buffers_alias Unexecuted instantiation: p_ed25519_asn1.c:buffers_alias Unexecuted instantiation: p_hkdf.c:buffers_alias Unexecuted instantiation: p_rsa.c:buffers_alias Unexecuted instantiation: p_rsa_asn1.c:buffers_alias Unexecuted instantiation: p_x25519_asn1.c:buffers_alias Unexecuted instantiation: ex_data.c:buffers_alias Unexecuted instantiation: mem.c:buffers_alias Unexecuted instantiation: deterministic.c:buffers_alias Unexecuted instantiation: forkunsafe.c:buffers_alias Unexecuted instantiation: refcount.c:buffers_alias Unexecuted instantiation: rsa_asn1.c:buffers_alias Unexecuted instantiation: rsa_crypt.c:buffers_alias Unexecuted instantiation: stack.c:buffers_alias Unexecuted instantiation: thread_pthread.c:buffers_alias Unexecuted instantiation: convert.c:buffers_alias Unexecuted instantiation: asn1_compat.c:buffers_alias Unexecuted instantiation: chacha.c:buffers_alias Unexecuted instantiation: cpu_intel.c:buffers_alias Unexecuted instantiation: curve25519.c:buffers_alias Unexecuted instantiation: curve25519_64_adx.c:buffers_alias Unexecuted instantiation: dsa.c:buffers_alias Unexecuted instantiation: dsa_asn1.c:buffers_alias Unexecuted instantiation: ecdh_extra.c:buffers_alias Unexecuted instantiation: ecdsa_asn1.c:buffers_alias Unexecuted instantiation: ec_asn1.c:buffers_alias Unexecuted instantiation: bio.c:buffers_alias Unexecuted instantiation: file.c:buffers_alias |
281 | | |
282 | | // align_pointer returns |ptr|, advanced to |alignment|. |alignment| must be a |
283 | | // power of two, and |ptr| must have at least |alignment - 1| bytes of scratch |
284 | | // space. |
285 | 0 | static inline void *align_pointer(void *ptr, size_t alignment) { |
286 | | // |alignment| must be a power of two. |
287 | 0 | assert(alignment != 0 && (alignment & (alignment - 1)) == 0); |
288 | | // Instead of aligning |ptr| as a |uintptr_t| and casting back, compute the |
289 | | // offset and advance in pointer space. C guarantees that casting from pointer |
290 | | // to |uintptr_t| and back gives the same pointer, but general |
291 | | // integer-to-pointer conversions are implementation-defined. GCC does define |
292 | | // it in the useful way, but this makes fewer assumptions. |
293 | 0 | uintptr_t offset = (0u - (uintptr_t)ptr) & (alignment - 1); |
294 | 0 | ptr = (char *)ptr + offset; |
295 | 0 | assert(((uintptr_t)ptr & (alignment - 1)) == 0); |
296 | 0 | return ptr; |
297 | 0 | } Unexecuted instantiation: bcm.c:align_pointer Unexecuted instantiation: cbb.c:align_pointer Unexecuted instantiation: cbs.c:align_pointer Unexecuted instantiation: crypto.c:align_pointer Unexecuted instantiation: err.c:align_pointer Unexecuted instantiation: engine.c:align_pointer Unexecuted instantiation: evp.c:align_pointer Unexecuted instantiation: evp_ctx.c:align_pointer Unexecuted instantiation: p_dsa_asn1.c:align_pointer Unexecuted instantiation: p_ec.c:align_pointer Unexecuted instantiation: p_ed25519_asn1.c:align_pointer Unexecuted instantiation: p_hkdf.c:align_pointer Unexecuted instantiation: p_rsa.c:align_pointer Unexecuted instantiation: p_rsa_asn1.c:align_pointer Unexecuted instantiation: p_x25519_asn1.c:align_pointer Unexecuted instantiation: ex_data.c:align_pointer Unexecuted instantiation: mem.c:align_pointer Unexecuted instantiation: deterministic.c:align_pointer Unexecuted instantiation: forkunsafe.c:align_pointer Unexecuted instantiation: refcount.c:align_pointer Unexecuted instantiation: rsa_asn1.c:align_pointer Unexecuted instantiation: rsa_crypt.c:align_pointer Unexecuted instantiation: stack.c:align_pointer Unexecuted instantiation: thread_pthread.c:align_pointer Unexecuted instantiation: convert.c:align_pointer Unexecuted instantiation: asn1_compat.c:align_pointer Unexecuted instantiation: chacha.c:align_pointer Unexecuted instantiation: cpu_intel.c:align_pointer Unexecuted instantiation: curve25519.c:align_pointer Unexecuted instantiation: curve25519_64_adx.c:align_pointer Unexecuted instantiation: dsa.c:align_pointer Unexecuted instantiation: dsa_asn1.c:align_pointer Unexecuted instantiation: ecdh_extra.c:align_pointer Unexecuted instantiation: ecdsa_asn1.c:align_pointer Unexecuted instantiation: ec_asn1.c:align_pointer Unexecuted instantiation: bio.c:align_pointer Unexecuted instantiation: file.c:align_pointer |
298 | | |
299 | | |
300 | | // Constant-time utility functions. |
301 | | // |
302 | | // The following methods return a bitmask of all ones (0xff...f) for true and 0 |
303 | | // for false. This is useful for choosing a value based on the result of a |
304 | | // conditional in constant time. For example, |
305 | | // |
306 | | // if (a < b) { |
307 | | // c = a; |
308 | | // } else { |
309 | | // c = b; |
310 | | // } |
311 | | // |
312 | | // can be written as |
313 | | // |
314 | | // crypto_word_t lt = constant_time_lt_w(a, b); |
315 | | // c = constant_time_select_w(lt, a, b); |
316 | | |
317 | | // crypto_word_t is the type that most constant-time functions use. Ideally we |
318 | | // would like it to be |size_t|, but NaCl builds in 64-bit mode with 32-bit |
319 | | // pointers, which means that |size_t| can be 32 bits when |BN_ULONG| is 64 |
320 | | // bits. Since we want to be able to do constant-time operations on a |
321 | | // |BN_ULONG|, |crypto_word_t| is defined as an unsigned value with the native |
322 | | // word length. |
323 | | #if defined(OPENSSL_64_BIT) |
324 | | typedef uint64_t crypto_word_t; |
325 | | #elif defined(OPENSSL_32_BIT) |
326 | | typedef uint32_t crypto_word_t; |
327 | | #else |
328 | | #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" |
329 | | #endif |
330 | | |
331 | 0 | #define CONSTTIME_TRUE_W ~((crypto_word_t)0) |
332 | 0 | #define CONSTTIME_FALSE_W ((crypto_word_t)0) |
333 | | #define CONSTTIME_TRUE_8 ((uint8_t)0xff) |
334 | | #define CONSTTIME_FALSE_8 ((uint8_t)0) |
335 | | |
336 | | // value_barrier_w returns |a|, but prevents GCC and Clang from reasoning about |
337 | | // the returned value. This is used to mitigate compilers undoing constant-time |
338 | | // code, until we can express our requirements directly in the language. |
339 | | // |
340 | | // Note the compiler is aware that |value_barrier_w| has no side effects and |
341 | | // always has the same output for a given input. This allows it to eliminate |
342 | | // dead code, move computations across loops, and vectorize. |
343 | 18.7M | static inline crypto_word_t value_barrier_w(crypto_word_t a) { |
344 | 18.7M | #if defined(__GNUC__) || defined(__clang__) |
345 | 18.7M | __asm__("" : "+r"(a) : /* no inputs */); |
346 | 18.7M | #endif |
347 | 18.7M | return a; |
348 | 18.7M | } Line | Count | Source | 343 | 18.7M | static inline crypto_word_t value_barrier_w(crypto_word_t a) { | 344 | 18.7M | #if defined(__GNUC__) || defined(__clang__) | 345 | 18.7M | __asm__("" : "+r"(a) : /* no inputs */); | 346 | 18.7M | #endif | 347 | 18.7M | return a; | 348 | 18.7M | } |
Unexecuted instantiation: cbb.c:value_barrier_w Unexecuted instantiation: cbs.c:value_barrier_w Unexecuted instantiation: crypto.c:value_barrier_w Unexecuted instantiation: err.c:value_barrier_w Unexecuted instantiation: engine.c:value_barrier_w Unexecuted instantiation: evp.c:value_barrier_w Unexecuted instantiation: evp_ctx.c:value_barrier_w Unexecuted instantiation: p_dsa_asn1.c:value_barrier_w Unexecuted instantiation: p_ec.c:value_barrier_w Unexecuted instantiation: p_ed25519_asn1.c:value_barrier_w Unexecuted instantiation: p_hkdf.c:value_barrier_w Unexecuted instantiation: p_rsa.c:value_barrier_w Unexecuted instantiation: p_rsa_asn1.c:value_barrier_w Unexecuted instantiation: p_x25519_asn1.c:value_barrier_w Unexecuted instantiation: ex_data.c:value_barrier_w Unexecuted instantiation: mem.c:value_barrier_w Unexecuted instantiation: deterministic.c:value_barrier_w Unexecuted instantiation: forkunsafe.c:value_barrier_w Unexecuted instantiation: refcount.c:value_barrier_w Unexecuted instantiation: rsa_asn1.c:value_barrier_w Unexecuted instantiation: rsa_crypt.c:value_barrier_w Unexecuted instantiation: stack.c:value_barrier_w Unexecuted instantiation: thread_pthread.c:value_barrier_w Unexecuted instantiation: convert.c:value_barrier_w Unexecuted instantiation: asn1_compat.c:value_barrier_w Unexecuted instantiation: chacha.c:value_barrier_w Unexecuted instantiation: cpu_intel.c:value_barrier_w Unexecuted instantiation: curve25519.c:value_barrier_w Unexecuted instantiation: curve25519_64_adx.c:value_barrier_w Unexecuted instantiation: dsa.c:value_barrier_w Unexecuted instantiation: dsa_asn1.c:value_barrier_w Unexecuted instantiation: ecdh_extra.c:value_barrier_w Unexecuted instantiation: ecdsa_asn1.c:value_barrier_w Unexecuted instantiation: ec_asn1.c:value_barrier_w Unexecuted instantiation: bio.c:value_barrier_w Unexecuted instantiation: file.c:value_barrier_w |
349 | | |
350 | | // value_barrier_u32 behaves like |value_barrier_w| but takes a |uint32_t|. |
351 | 0 | static inline uint32_t value_barrier_u32(uint32_t a) { |
352 | 0 | #if defined(__GNUC__) || defined(__clang__) |
353 | 0 | __asm__("" : "+r"(a) : /* no inputs */); |
354 | 0 | #endif |
355 | 0 | return a; |
356 | 0 | } Unexecuted instantiation: bcm.c:value_barrier_u32 Unexecuted instantiation: cbb.c:value_barrier_u32 Unexecuted instantiation: cbs.c:value_barrier_u32 Unexecuted instantiation: crypto.c:value_barrier_u32 Unexecuted instantiation: err.c:value_barrier_u32 Unexecuted instantiation: engine.c:value_barrier_u32 Unexecuted instantiation: evp.c:value_barrier_u32 Unexecuted instantiation: evp_ctx.c:value_barrier_u32 Unexecuted instantiation: p_dsa_asn1.c:value_barrier_u32 Unexecuted instantiation: p_ec.c:value_barrier_u32 Unexecuted instantiation: p_ed25519_asn1.c:value_barrier_u32 Unexecuted instantiation: p_hkdf.c:value_barrier_u32 Unexecuted instantiation: p_rsa.c:value_barrier_u32 Unexecuted instantiation: p_rsa_asn1.c:value_barrier_u32 Unexecuted instantiation: p_x25519_asn1.c:value_barrier_u32 Unexecuted instantiation: ex_data.c:value_barrier_u32 Unexecuted instantiation: mem.c:value_barrier_u32 Unexecuted instantiation: deterministic.c:value_barrier_u32 Unexecuted instantiation: forkunsafe.c:value_barrier_u32 Unexecuted instantiation: refcount.c:value_barrier_u32 Unexecuted instantiation: rsa_asn1.c:value_barrier_u32 Unexecuted instantiation: rsa_crypt.c:value_barrier_u32 Unexecuted instantiation: stack.c:value_barrier_u32 Unexecuted instantiation: thread_pthread.c:value_barrier_u32 Unexecuted instantiation: convert.c:value_barrier_u32 Unexecuted instantiation: asn1_compat.c:value_barrier_u32 Unexecuted instantiation: chacha.c:value_barrier_u32 Unexecuted instantiation: cpu_intel.c:value_barrier_u32 Unexecuted instantiation: curve25519.c:value_barrier_u32 Unexecuted instantiation: curve25519_64_adx.c:value_barrier_u32 Unexecuted instantiation: dsa.c:value_barrier_u32 Unexecuted instantiation: dsa_asn1.c:value_barrier_u32 Unexecuted instantiation: ecdh_extra.c:value_barrier_u32 Unexecuted instantiation: ecdsa_asn1.c:value_barrier_u32 Unexecuted instantiation: ec_asn1.c:value_barrier_u32 Unexecuted instantiation: bio.c:value_barrier_u32 Unexecuted instantiation: file.c:value_barrier_u32 |
357 | | |
358 | | // value_barrier_u64 behaves like |value_barrier_w| but takes a |uint64_t|. |
359 | 0 | static inline uint64_t value_barrier_u64(uint64_t a) { |
360 | 0 | #if defined(__GNUC__) || defined(__clang__) |
361 | 0 | __asm__("" : "+r"(a) : /* no inputs */); |
362 | 0 | #endif |
363 | 0 | return a; |
364 | 0 | } Unexecuted instantiation: bcm.c:value_barrier_u64 Unexecuted instantiation: cbb.c:value_barrier_u64 Unexecuted instantiation: cbs.c:value_barrier_u64 Unexecuted instantiation: crypto.c:value_barrier_u64 Unexecuted instantiation: err.c:value_barrier_u64 Unexecuted instantiation: engine.c:value_barrier_u64 Unexecuted instantiation: evp.c:value_barrier_u64 Unexecuted instantiation: evp_ctx.c:value_barrier_u64 Unexecuted instantiation: p_dsa_asn1.c:value_barrier_u64 Unexecuted instantiation: p_ec.c:value_barrier_u64 Unexecuted instantiation: p_ed25519_asn1.c:value_barrier_u64 Unexecuted instantiation: p_hkdf.c:value_barrier_u64 Unexecuted instantiation: p_rsa.c:value_barrier_u64 Unexecuted instantiation: p_rsa_asn1.c:value_barrier_u64 Unexecuted instantiation: p_x25519_asn1.c:value_barrier_u64 Unexecuted instantiation: ex_data.c:value_barrier_u64 Unexecuted instantiation: mem.c:value_barrier_u64 Unexecuted instantiation: deterministic.c:value_barrier_u64 Unexecuted instantiation: forkunsafe.c:value_barrier_u64 Unexecuted instantiation: refcount.c:value_barrier_u64 Unexecuted instantiation: rsa_asn1.c:value_barrier_u64 Unexecuted instantiation: rsa_crypt.c:value_barrier_u64 Unexecuted instantiation: stack.c:value_barrier_u64 Unexecuted instantiation: thread_pthread.c:value_barrier_u64 Unexecuted instantiation: convert.c:value_barrier_u64 Unexecuted instantiation: asn1_compat.c:value_barrier_u64 Unexecuted instantiation: chacha.c:value_barrier_u64 Unexecuted instantiation: cpu_intel.c:value_barrier_u64 Unexecuted instantiation: curve25519.c:value_barrier_u64 Unexecuted instantiation: curve25519_64_adx.c:value_barrier_u64 Unexecuted instantiation: dsa.c:value_barrier_u64 Unexecuted instantiation: dsa_asn1.c:value_barrier_u64 Unexecuted instantiation: ecdh_extra.c:value_barrier_u64 Unexecuted instantiation: ecdsa_asn1.c:value_barrier_u64 Unexecuted instantiation: ec_asn1.c:value_barrier_u64 Unexecuted instantiation: bio.c:value_barrier_u64 Unexecuted instantiation: file.c:value_barrier_u64 |
365 | | |
366 | | // |value_barrier_u8| could be defined as above, but compilers other than |
367 | | // clang seem to still materialize 0x00..00MM instead of reusing 0x??..??MM. |
368 | | |
369 | | // constant_time_msb_w returns the given value with the MSB copied to all the |
370 | | // other bits. |
371 | 1.69M | static inline crypto_word_t constant_time_msb_w(crypto_word_t a) { |
372 | 1.69M | return 0u - (a >> (sizeof(a) * 8 - 1)); |
373 | 1.69M | } bcm.c:constant_time_msb_w Line | Count | Source | 371 | 1.69M | static inline crypto_word_t constant_time_msb_w(crypto_word_t a) { | 372 | 1.69M | return 0u - (a >> (sizeof(a) * 8 - 1)); | 373 | 1.69M | } |
Unexecuted instantiation: cbb.c:constant_time_msb_w Unexecuted instantiation: cbs.c:constant_time_msb_w Unexecuted instantiation: crypto.c:constant_time_msb_w Unexecuted instantiation: err.c:constant_time_msb_w Unexecuted instantiation: engine.c:constant_time_msb_w Unexecuted instantiation: evp.c:constant_time_msb_w Unexecuted instantiation: evp_ctx.c:constant_time_msb_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_msb_w Unexecuted instantiation: p_ec.c:constant_time_msb_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_msb_w Unexecuted instantiation: p_hkdf.c:constant_time_msb_w Unexecuted instantiation: p_rsa.c:constant_time_msb_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_msb_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_msb_w Unexecuted instantiation: ex_data.c:constant_time_msb_w Unexecuted instantiation: mem.c:constant_time_msb_w Unexecuted instantiation: deterministic.c:constant_time_msb_w Unexecuted instantiation: forkunsafe.c:constant_time_msb_w Unexecuted instantiation: refcount.c:constant_time_msb_w Unexecuted instantiation: rsa_asn1.c:constant_time_msb_w Unexecuted instantiation: rsa_crypt.c:constant_time_msb_w Unexecuted instantiation: stack.c:constant_time_msb_w Unexecuted instantiation: thread_pthread.c:constant_time_msb_w Unexecuted instantiation: convert.c:constant_time_msb_w Unexecuted instantiation: asn1_compat.c:constant_time_msb_w Unexecuted instantiation: chacha.c:constant_time_msb_w Unexecuted instantiation: cpu_intel.c:constant_time_msb_w Unexecuted instantiation: curve25519.c:constant_time_msb_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_msb_w Unexecuted instantiation: dsa.c:constant_time_msb_w Unexecuted instantiation: dsa_asn1.c:constant_time_msb_w Unexecuted instantiation: ecdh_extra.c:constant_time_msb_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_msb_w Unexecuted instantiation: ec_asn1.c:constant_time_msb_w Unexecuted instantiation: bio.c:constant_time_msb_w Unexecuted instantiation: file.c:constant_time_msb_w |
374 | | |
375 | | // constant_time_lt_w returns 0xff..f if a < b and 0 otherwise. |
376 | | static inline crypto_word_t constant_time_lt_w(crypto_word_t a, |
377 | 846k | crypto_word_t b) { |
378 | | // Consider the two cases of the problem: |
379 | | // msb(a) == msb(b): a < b iff the MSB of a - b is set. |
380 | | // msb(a) != msb(b): a < b iff the MSB of b is set. |
381 | | // |
382 | | // If msb(a) == msb(b) then the following evaluates as: |
383 | | // msb(a^((a^b)|((a-b)^a))) == |
384 | | // msb(a^((a-b) ^ a)) == (because msb(a^b) == 0) |
385 | | // msb(a^a^(a-b)) == (rearranging) |
386 | | // msb(a-b) (because ∀x. x^x == 0) |
387 | | // |
388 | | // Else, if msb(a) != msb(b) then the following evaluates as: |
389 | | // msb(a^((a^b)|((a-b)^a))) == |
390 | | // msb(a^(𝟙 | ((a-b)^a))) == (because msb(a^b) == 1 and 𝟙 |
391 | | // represents a value s.t. msb(𝟙) = 1) |
392 | | // msb(a^𝟙) == (because ORing with 1 results in 1) |
393 | | // msb(b) |
394 | | // |
395 | | // |
396 | | // Here is an SMT-LIB verification of this formula: |
397 | | // |
398 | | // (define-fun lt ((a (_ BitVec 32)) (b (_ BitVec 32))) (_ BitVec 32) |
399 | | // (bvxor a (bvor (bvxor a b) (bvxor (bvsub a b) a))) |
400 | | // ) |
401 | | // |
402 | | // (declare-fun a () (_ BitVec 32)) |
403 | | // (declare-fun b () (_ BitVec 32)) |
404 | | // |
405 | | // (assert (not (= (= #x00000001 (bvlshr (lt a b) #x0000001f)) (bvult a b)))) |
406 | | // (check-sat) |
407 | | // (get-model) |
408 | 846k | return constant_time_msb_w(a^((a^b)|((a-b)^a))); |
409 | 846k | } Line | Count | Source | 377 | 846k | crypto_word_t b) { | 378 | | // Consider the two cases of the problem: | 379 | | // msb(a) == msb(b): a < b iff the MSB of a - b is set. | 380 | | // msb(a) != msb(b): a < b iff the MSB of b is set. | 381 | | // | 382 | | // If msb(a) == msb(b) then the following evaluates as: | 383 | | // msb(a^((a^b)|((a-b)^a))) == | 384 | | // msb(a^((a-b) ^ a)) == (because msb(a^b) == 0) | 385 | | // msb(a^a^(a-b)) == (rearranging) | 386 | | // msb(a-b) (because ∀x. x^x == 0) | 387 | | // | 388 | | // Else, if msb(a) != msb(b) then the following evaluates as: | 389 | | // msb(a^((a^b)|((a-b)^a))) == | 390 | | // msb(a^(𝟙 | ((a-b)^a))) == (because msb(a^b) == 1 and 𝟙 | 391 | | // represents a value s.t. msb(𝟙) = 1) | 392 | | // msb(a^𝟙) == (because ORing with 1 results in 1) | 393 | | // msb(b) | 394 | | // | 395 | | // | 396 | | // Here is an SMT-LIB verification of this formula: | 397 | | // | 398 | | // (define-fun lt ((a (_ BitVec 32)) (b (_ BitVec 32))) (_ BitVec 32) | 399 | | // (bvxor a (bvor (bvxor a b) (bvxor (bvsub a b) a))) | 400 | | // ) | 401 | | // | 402 | | // (declare-fun a () (_ BitVec 32)) | 403 | | // (declare-fun b () (_ BitVec 32)) | 404 | | // | 405 | | // (assert (not (= (= #x00000001 (bvlshr (lt a b) #x0000001f)) (bvult a b)))) | 406 | | // (check-sat) | 407 | | // (get-model) | 408 | 846k | return constant_time_msb_w(a^((a^b)|((a-b)^a))); | 409 | 846k | } |
Unexecuted instantiation: cbb.c:constant_time_lt_w Unexecuted instantiation: cbs.c:constant_time_lt_w Unexecuted instantiation: crypto.c:constant_time_lt_w Unexecuted instantiation: err.c:constant_time_lt_w Unexecuted instantiation: engine.c:constant_time_lt_w Unexecuted instantiation: evp.c:constant_time_lt_w Unexecuted instantiation: evp_ctx.c:constant_time_lt_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_lt_w Unexecuted instantiation: p_ec.c:constant_time_lt_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_lt_w Unexecuted instantiation: p_hkdf.c:constant_time_lt_w Unexecuted instantiation: p_rsa.c:constant_time_lt_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_lt_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_lt_w Unexecuted instantiation: ex_data.c:constant_time_lt_w Unexecuted instantiation: mem.c:constant_time_lt_w Unexecuted instantiation: deterministic.c:constant_time_lt_w Unexecuted instantiation: forkunsafe.c:constant_time_lt_w Unexecuted instantiation: refcount.c:constant_time_lt_w Unexecuted instantiation: rsa_asn1.c:constant_time_lt_w Unexecuted instantiation: rsa_crypt.c:constant_time_lt_w Unexecuted instantiation: stack.c:constant_time_lt_w Unexecuted instantiation: thread_pthread.c:constant_time_lt_w Unexecuted instantiation: convert.c:constant_time_lt_w Unexecuted instantiation: asn1_compat.c:constant_time_lt_w Unexecuted instantiation: chacha.c:constant_time_lt_w Unexecuted instantiation: cpu_intel.c:constant_time_lt_w Unexecuted instantiation: curve25519.c:constant_time_lt_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_lt_w Unexecuted instantiation: dsa.c:constant_time_lt_w Unexecuted instantiation: dsa_asn1.c:constant_time_lt_w Unexecuted instantiation: ecdh_extra.c:constant_time_lt_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_lt_w Unexecuted instantiation: ec_asn1.c:constant_time_lt_w Unexecuted instantiation: bio.c:constant_time_lt_w Unexecuted instantiation: file.c:constant_time_lt_w |
410 | | |
411 | | // constant_time_lt_8 acts like |constant_time_lt_w| but returns an 8-bit |
412 | | // mask. |
413 | 0 | static inline uint8_t constant_time_lt_8(crypto_word_t a, crypto_word_t b) { |
414 | 0 | return (uint8_t)(constant_time_lt_w(a, b)); |
415 | 0 | } Unexecuted instantiation: bcm.c:constant_time_lt_8 Unexecuted instantiation: cbb.c:constant_time_lt_8 Unexecuted instantiation: cbs.c:constant_time_lt_8 Unexecuted instantiation: crypto.c:constant_time_lt_8 Unexecuted instantiation: err.c:constant_time_lt_8 Unexecuted instantiation: engine.c:constant_time_lt_8 Unexecuted instantiation: evp.c:constant_time_lt_8 Unexecuted instantiation: evp_ctx.c:constant_time_lt_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_lt_8 Unexecuted instantiation: p_ec.c:constant_time_lt_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_lt_8 Unexecuted instantiation: p_hkdf.c:constant_time_lt_8 Unexecuted instantiation: p_rsa.c:constant_time_lt_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_lt_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_lt_8 Unexecuted instantiation: ex_data.c:constant_time_lt_8 Unexecuted instantiation: mem.c:constant_time_lt_8 Unexecuted instantiation: deterministic.c:constant_time_lt_8 Unexecuted instantiation: forkunsafe.c:constant_time_lt_8 Unexecuted instantiation: refcount.c:constant_time_lt_8 Unexecuted instantiation: rsa_asn1.c:constant_time_lt_8 Unexecuted instantiation: rsa_crypt.c:constant_time_lt_8 Unexecuted instantiation: stack.c:constant_time_lt_8 Unexecuted instantiation: thread_pthread.c:constant_time_lt_8 Unexecuted instantiation: convert.c:constant_time_lt_8 Unexecuted instantiation: asn1_compat.c:constant_time_lt_8 Unexecuted instantiation: chacha.c:constant_time_lt_8 Unexecuted instantiation: cpu_intel.c:constant_time_lt_8 Unexecuted instantiation: curve25519.c:constant_time_lt_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_lt_8 Unexecuted instantiation: dsa.c:constant_time_lt_8 Unexecuted instantiation: dsa_asn1.c:constant_time_lt_8 Unexecuted instantiation: ecdh_extra.c:constant_time_lt_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_lt_8 Unexecuted instantiation: ec_asn1.c:constant_time_lt_8 Unexecuted instantiation: bio.c:constant_time_lt_8 Unexecuted instantiation: file.c:constant_time_lt_8 |
416 | | |
417 | | // constant_time_ge_w returns 0xff..f if a >= b and 0 otherwise. |
418 | | static inline crypto_word_t constant_time_ge_w(crypto_word_t a, |
419 | 0 | crypto_word_t b) { |
420 | 0 | return ~constant_time_lt_w(a, b); |
421 | 0 | } Unexecuted instantiation: bcm.c:constant_time_ge_w Unexecuted instantiation: cbb.c:constant_time_ge_w Unexecuted instantiation: cbs.c:constant_time_ge_w Unexecuted instantiation: crypto.c:constant_time_ge_w Unexecuted instantiation: err.c:constant_time_ge_w Unexecuted instantiation: engine.c:constant_time_ge_w Unexecuted instantiation: evp.c:constant_time_ge_w Unexecuted instantiation: evp_ctx.c:constant_time_ge_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_ge_w Unexecuted instantiation: p_ec.c:constant_time_ge_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_ge_w Unexecuted instantiation: p_hkdf.c:constant_time_ge_w Unexecuted instantiation: p_rsa.c:constant_time_ge_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_ge_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_ge_w Unexecuted instantiation: ex_data.c:constant_time_ge_w Unexecuted instantiation: mem.c:constant_time_ge_w Unexecuted instantiation: deterministic.c:constant_time_ge_w Unexecuted instantiation: forkunsafe.c:constant_time_ge_w Unexecuted instantiation: refcount.c:constant_time_ge_w Unexecuted instantiation: rsa_asn1.c:constant_time_ge_w Unexecuted instantiation: rsa_crypt.c:constant_time_ge_w Unexecuted instantiation: stack.c:constant_time_ge_w Unexecuted instantiation: thread_pthread.c:constant_time_ge_w Unexecuted instantiation: convert.c:constant_time_ge_w Unexecuted instantiation: asn1_compat.c:constant_time_ge_w Unexecuted instantiation: chacha.c:constant_time_ge_w Unexecuted instantiation: cpu_intel.c:constant_time_ge_w Unexecuted instantiation: curve25519.c:constant_time_ge_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_ge_w Unexecuted instantiation: dsa.c:constant_time_ge_w Unexecuted instantiation: dsa_asn1.c:constant_time_ge_w Unexecuted instantiation: ecdh_extra.c:constant_time_ge_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_ge_w Unexecuted instantiation: ec_asn1.c:constant_time_ge_w Unexecuted instantiation: bio.c:constant_time_ge_w Unexecuted instantiation: file.c:constant_time_ge_w |
422 | | |
423 | | // constant_time_ge_8 acts like |constant_time_ge_w| but returns an 8-bit |
424 | | // mask. |
425 | 0 | static inline uint8_t constant_time_ge_8(crypto_word_t a, crypto_word_t b) { |
426 | 0 | return (uint8_t)(constant_time_ge_w(a, b)); |
427 | 0 | } Unexecuted instantiation: bcm.c:constant_time_ge_8 Unexecuted instantiation: cbb.c:constant_time_ge_8 Unexecuted instantiation: cbs.c:constant_time_ge_8 Unexecuted instantiation: crypto.c:constant_time_ge_8 Unexecuted instantiation: err.c:constant_time_ge_8 Unexecuted instantiation: engine.c:constant_time_ge_8 Unexecuted instantiation: evp.c:constant_time_ge_8 Unexecuted instantiation: evp_ctx.c:constant_time_ge_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_ge_8 Unexecuted instantiation: p_ec.c:constant_time_ge_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_ge_8 Unexecuted instantiation: p_hkdf.c:constant_time_ge_8 Unexecuted instantiation: p_rsa.c:constant_time_ge_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_ge_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_ge_8 Unexecuted instantiation: ex_data.c:constant_time_ge_8 Unexecuted instantiation: mem.c:constant_time_ge_8 Unexecuted instantiation: deterministic.c:constant_time_ge_8 Unexecuted instantiation: forkunsafe.c:constant_time_ge_8 Unexecuted instantiation: refcount.c:constant_time_ge_8 Unexecuted instantiation: rsa_asn1.c:constant_time_ge_8 Unexecuted instantiation: rsa_crypt.c:constant_time_ge_8 Unexecuted instantiation: stack.c:constant_time_ge_8 Unexecuted instantiation: thread_pthread.c:constant_time_ge_8 Unexecuted instantiation: convert.c:constant_time_ge_8 Unexecuted instantiation: asn1_compat.c:constant_time_ge_8 Unexecuted instantiation: chacha.c:constant_time_ge_8 Unexecuted instantiation: cpu_intel.c:constant_time_ge_8 Unexecuted instantiation: curve25519.c:constant_time_ge_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_ge_8 Unexecuted instantiation: dsa.c:constant_time_ge_8 Unexecuted instantiation: dsa_asn1.c:constant_time_ge_8 Unexecuted instantiation: ecdh_extra.c:constant_time_ge_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_ge_8 Unexecuted instantiation: ec_asn1.c:constant_time_ge_8 Unexecuted instantiation: bio.c:constant_time_ge_8 Unexecuted instantiation: file.c:constant_time_ge_8 |
428 | | |
429 | | // constant_time_is_zero returns 0xff..f if a == 0 and 0 otherwise. |
430 | 847k | static inline crypto_word_t constant_time_is_zero_w(crypto_word_t a) { |
431 | | // Here is an SMT-LIB verification of this formula: |
432 | | // |
433 | | // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32) |
434 | | // (bvand (bvnot a) (bvsub a #x00000001)) |
435 | | // ) |
436 | | // |
437 | | // (declare-fun a () (_ BitVec 32)) |
438 | | // |
439 | | // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a #x00000000)))) |
440 | | // (check-sat) |
441 | | // (get-model) |
442 | 847k | return constant_time_msb_w(~a & (a - 1)); |
443 | 847k | } bcm.c:constant_time_is_zero_w Line | Count | Source | 430 | 847k | static inline crypto_word_t constant_time_is_zero_w(crypto_word_t a) { | 431 | | // Here is an SMT-LIB verification of this formula: | 432 | | // | 433 | | // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32) | 434 | | // (bvand (bvnot a) (bvsub a #x00000001)) | 435 | | // ) | 436 | | // | 437 | | // (declare-fun a () (_ BitVec 32)) | 438 | | // | 439 | | // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a #x00000000)))) | 440 | | // (check-sat) | 441 | | // (get-model) | 442 | 847k | return constant_time_msb_w(~a & (a - 1)); | 443 | 847k | } |
Unexecuted instantiation: cbb.c:constant_time_is_zero_w Unexecuted instantiation: cbs.c:constant_time_is_zero_w Unexecuted instantiation: crypto.c:constant_time_is_zero_w Unexecuted instantiation: err.c:constant_time_is_zero_w Unexecuted instantiation: engine.c:constant_time_is_zero_w Unexecuted instantiation: evp.c:constant_time_is_zero_w Unexecuted instantiation: evp_ctx.c:constant_time_is_zero_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_is_zero_w Unexecuted instantiation: p_ec.c:constant_time_is_zero_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_is_zero_w Unexecuted instantiation: p_hkdf.c:constant_time_is_zero_w Unexecuted instantiation: p_rsa.c:constant_time_is_zero_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_is_zero_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_is_zero_w Unexecuted instantiation: ex_data.c:constant_time_is_zero_w Unexecuted instantiation: mem.c:constant_time_is_zero_w Unexecuted instantiation: deterministic.c:constant_time_is_zero_w Unexecuted instantiation: forkunsafe.c:constant_time_is_zero_w Unexecuted instantiation: refcount.c:constant_time_is_zero_w Unexecuted instantiation: rsa_asn1.c:constant_time_is_zero_w Unexecuted instantiation: rsa_crypt.c:constant_time_is_zero_w Unexecuted instantiation: stack.c:constant_time_is_zero_w Unexecuted instantiation: thread_pthread.c:constant_time_is_zero_w Unexecuted instantiation: convert.c:constant_time_is_zero_w Unexecuted instantiation: asn1_compat.c:constant_time_is_zero_w Unexecuted instantiation: chacha.c:constant_time_is_zero_w Unexecuted instantiation: cpu_intel.c:constant_time_is_zero_w Unexecuted instantiation: curve25519.c:constant_time_is_zero_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_is_zero_w Unexecuted instantiation: dsa.c:constant_time_is_zero_w Unexecuted instantiation: dsa_asn1.c:constant_time_is_zero_w Unexecuted instantiation: ecdh_extra.c:constant_time_is_zero_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_is_zero_w Unexecuted instantiation: ec_asn1.c:constant_time_is_zero_w Unexecuted instantiation: bio.c:constant_time_is_zero_w Unexecuted instantiation: file.c:constant_time_is_zero_w |
444 | | |
445 | | // constant_time_is_zero_8 acts like |constant_time_is_zero_w| but returns an |
446 | | // 8-bit mask. |
447 | 0 | static inline uint8_t constant_time_is_zero_8(crypto_word_t a) { |
448 | 0 | return (uint8_t)(constant_time_is_zero_w(a)); |
449 | 0 | } Unexecuted instantiation: bcm.c:constant_time_is_zero_8 Unexecuted instantiation: cbb.c:constant_time_is_zero_8 Unexecuted instantiation: cbs.c:constant_time_is_zero_8 Unexecuted instantiation: crypto.c:constant_time_is_zero_8 Unexecuted instantiation: err.c:constant_time_is_zero_8 Unexecuted instantiation: engine.c:constant_time_is_zero_8 Unexecuted instantiation: evp.c:constant_time_is_zero_8 Unexecuted instantiation: evp_ctx.c:constant_time_is_zero_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: p_ec.c:constant_time_is_zero_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: p_hkdf.c:constant_time_is_zero_8 Unexecuted instantiation: p_rsa.c:constant_time_is_zero_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: ex_data.c:constant_time_is_zero_8 Unexecuted instantiation: mem.c:constant_time_is_zero_8 Unexecuted instantiation: deterministic.c:constant_time_is_zero_8 Unexecuted instantiation: forkunsafe.c:constant_time_is_zero_8 Unexecuted instantiation: refcount.c:constant_time_is_zero_8 Unexecuted instantiation: rsa_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: rsa_crypt.c:constant_time_is_zero_8 Unexecuted instantiation: stack.c:constant_time_is_zero_8 Unexecuted instantiation: thread_pthread.c:constant_time_is_zero_8 Unexecuted instantiation: convert.c:constant_time_is_zero_8 Unexecuted instantiation: asn1_compat.c:constant_time_is_zero_8 Unexecuted instantiation: chacha.c:constant_time_is_zero_8 Unexecuted instantiation: cpu_intel.c:constant_time_is_zero_8 Unexecuted instantiation: curve25519.c:constant_time_is_zero_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_is_zero_8 Unexecuted instantiation: dsa.c:constant_time_is_zero_8 Unexecuted instantiation: dsa_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: ecdh_extra.c:constant_time_is_zero_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: ec_asn1.c:constant_time_is_zero_8 Unexecuted instantiation: bio.c:constant_time_is_zero_8 Unexecuted instantiation: file.c:constant_time_is_zero_8 |
450 | | |
451 | | // constant_time_eq_w returns 0xff..f if a == b and 0 otherwise. |
452 | | static inline crypto_word_t constant_time_eq_w(crypto_word_t a, |
453 | 846k | crypto_word_t b) { |
454 | 846k | return constant_time_is_zero_w(a ^ b); |
455 | 846k | } Line | Count | Source | 453 | 846k | crypto_word_t b) { | 454 | 846k | return constant_time_is_zero_w(a ^ b); | 455 | 846k | } |
Unexecuted instantiation: cbb.c:constant_time_eq_w Unexecuted instantiation: cbs.c:constant_time_eq_w Unexecuted instantiation: crypto.c:constant_time_eq_w Unexecuted instantiation: err.c:constant_time_eq_w Unexecuted instantiation: engine.c:constant_time_eq_w Unexecuted instantiation: evp.c:constant_time_eq_w Unexecuted instantiation: evp_ctx.c:constant_time_eq_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_eq_w Unexecuted instantiation: p_ec.c:constant_time_eq_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_eq_w Unexecuted instantiation: p_hkdf.c:constant_time_eq_w Unexecuted instantiation: p_rsa.c:constant_time_eq_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_eq_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_eq_w Unexecuted instantiation: ex_data.c:constant_time_eq_w Unexecuted instantiation: mem.c:constant_time_eq_w Unexecuted instantiation: deterministic.c:constant_time_eq_w Unexecuted instantiation: forkunsafe.c:constant_time_eq_w Unexecuted instantiation: refcount.c:constant_time_eq_w Unexecuted instantiation: rsa_asn1.c:constant_time_eq_w Unexecuted instantiation: rsa_crypt.c:constant_time_eq_w Unexecuted instantiation: stack.c:constant_time_eq_w Unexecuted instantiation: thread_pthread.c:constant_time_eq_w Unexecuted instantiation: convert.c:constant_time_eq_w Unexecuted instantiation: asn1_compat.c:constant_time_eq_w Unexecuted instantiation: chacha.c:constant_time_eq_w Unexecuted instantiation: cpu_intel.c:constant_time_eq_w Unexecuted instantiation: curve25519.c:constant_time_eq_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_eq_w Unexecuted instantiation: dsa.c:constant_time_eq_w Unexecuted instantiation: dsa_asn1.c:constant_time_eq_w Unexecuted instantiation: ecdh_extra.c:constant_time_eq_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_eq_w Unexecuted instantiation: ec_asn1.c:constant_time_eq_w Unexecuted instantiation: bio.c:constant_time_eq_w Unexecuted instantiation: file.c:constant_time_eq_w |
456 | | |
457 | | // constant_time_eq_8 acts like |constant_time_eq_w| but returns an 8-bit |
458 | | // mask. |
459 | 0 | static inline uint8_t constant_time_eq_8(crypto_word_t a, crypto_word_t b) { |
460 | 0 | return (uint8_t)(constant_time_eq_w(a, b)); |
461 | 0 | } Unexecuted instantiation: bcm.c:constant_time_eq_8 Unexecuted instantiation: cbb.c:constant_time_eq_8 Unexecuted instantiation: cbs.c:constant_time_eq_8 Unexecuted instantiation: crypto.c:constant_time_eq_8 Unexecuted instantiation: err.c:constant_time_eq_8 Unexecuted instantiation: engine.c:constant_time_eq_8 Unexecuted instantiation: evp.c:constant_time_eq_8 Unexecuted instantiation: evp_ctx.c:constant_time_eq_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_eq_8 Unexecuted instantiation: p_ec.c:constant_time_eq_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_eq_8 Unexecuted instantiation: p_hkdf.c:constant_time_eq_8 Unexecuted instantiation: p_rsa.c:constant_time_eq_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_eq_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_eq_8 Unexecuted instantiation: ex_data.c:constant_time_eq_8 Unexecuted instantiation: mem.c:constant_time_eq_8 Unexecuted instantiation: deterministic.c:constant_time_eq_8 Unexecuted instantiation: forkunsafe.c:constant_time_eq_8 Unexecuted instantiation: refcount.c:constant_time_eq_8 Unexecuted instantiation: rsa_asn1.c:constant_time_eq_8 Unexecuted instantiation: rsa_crypt.c:constant_time_eq_8 Unexecuted instantiation: stack.c:constant_time_eq_8 Unexecuted instantiation: thread_pthread.c:constant_time_eq_8 Unexecuted instantiation: convert.c:constant_time_eq_8 Unexecuted instantiation: asn1_compat.c:constant_time_eq_8 Unexecuted instantiation: chacha.c:constant_time_eq_8 Unexecuted instantiation: cpu_intel.c:constant_time_eq_8 Unexecuted instantiation: curve25519.c:constant_time_eq_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_eq_8 Unexecuted instantiation: dsa.c:constant_time_eq_8 Unexecuted instantiation: dsa_asn1.c:constant_time_eq_8 Unexecuted instantiation: ecdh_extra.c:constant_time_eq_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_eq_8 Unexecuted instantiation: ec_asn1.c:constant_time_eq_8 Unexecuted instantiation: bio.c:constant_time_eq_8 Unexecuted instantiation: file.c:constant_time_eq_8 |
462 | | |
463 | | // constant_time_eq_int acts like |constant_time_eq_w| but works on int |
464 | | // values. |
465 | 0 | static inline crypto_word_t constant_time_eq_int(int a, int b) { |
466 | 0 | return constant_time_eq_w((crypto_word_t)(a), (crypto_word_t)(b)); |
467 | 0 | } Unexecuted instantiation: bcm.c:constant_time_eq_int Unexecuted instantiation: cbb.c:constant_time_eq_int Unexecuted instantiation: cbs.c:constant_time_eq_int Unexecuted instantiation: crypto.c:constant_time_eq_int Unexecuted instantiation: err.c:constant_time_eq_int Unexecuted instantiation: engine.c:constant_time_eq_int Unexecuted instantiation: evp.c:constant_time_eq_int Unexecuted instantiation: evp_ctx.c:constant_time_eq_int Unexecuted instantiation: p_dsa_asn1.c:constant_time_eq_int Unexecuted instantiation: p_ec.c:constant_time_eq_int Unexecuted instantiation: p_ed25519_asn1.c:constant_time_eq_int Unexecuted instantiation: p_hkdf.c:constant_time_eq_int Unexecuted instantiation: p_rsa.c:constant_time_eq_int Unexecuted instantiation: p_rsa_asn1.c:constant_time_eq_int Unexecuted instantiation: p_x25519_asn1.c:constant_time_eq_int Unexecuted instantiation: ex_data.c:constant_time_eq_int Unexecuted instantiation: mem.c:constant_time_eq_int Unexecuted instantiation: deterministic.c:constant_time_eq_int Unexecuted instantiation: forkunsafe.c:constant_time_eq_int Unexecuted instantiation: refcount.c:constant_time_eq_int Unexecuted instantiation: rsa_asn1.c:constant_time_eq_int Unexecuted instantiation: rsa_crypt.c:constant_time_eq_int Unexecuted instantiation: stack.c:constant_time_eq_int Unexecuted instantiation: thread_pthread.c:constant_time_eq_int Unexecuted instantiation: convert.c:constant_time_eq_int Unexecuted instantiation: asn1_compat.c:constant_time_eq_int Unexecuted instantiation: chacha.c:constant_time_eq_int Unexecuted instantiation: cpu_intel.c:constant_time_eq_int Unexecuted instantiation: curve25519.c:constant_time_eq_int Unexecuted instantiation: curve25519_64_adx.c:constant_time_eq_int Unexecuted instantiation: dsa.c:constant_time_eq_int Unexecuted instantiation: dsa_asn1.c:constant_time_eq_int Unexecuted instantiation: ecdh_extra.c:constant_time_eq_int Unexecuted instantiation: ecdsa_asn1.c:constant_time_eq_int Unexecuted instantiation: ec_asn1.c:constant_time_eq_int Unexecuted instantiation: bio.c:constant_time_eq_int Unexecuted instantiation: file.c:constant_time_eq_int |
468 | | |
469 | | // constant_time_eq_int_8 acts like |constant_time_eq_int| but returns an 8-bit |
470 | | // mask. |
471 | 0 | static inline uint8_t constant_time_eq_int_8(int a, int b) { |
472 | 0 | return constant_time_eq_8((crypto_word_t)(a), (crypto_word_t)(b)); |
473 | 0 | } Unexecuted instantiation: bcm.c:constant_time_eq_int_8 Unexecuted instantiation: cbb.c:constant_time_eq_int_8 Unexecuted instantiation: cbs.c:constant_time_eq_int_8 Unexecuted instantiation: crypto.c:constant_time_eq_int_8 Unexecuted instantiation: err.c:constant_time_eq_int_8 Unexecuted instantiation: engine.c:constant_time_eq_int_8 Unexecuted instantiation: evp.c:constant_time_eq_int_8 Unexecuted instantiation: evp_ctx.c:constant_time_eq_int_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: p_ec.c:constant_time_eq_int_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: p_hkdf.c:constant_time_eq_int_8 Unexecuted instantiation: p_rsa.c:constant_time_eq_int_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: ex_data.c:constant_time_eq_int_8 Unexecuted instantiation: mem.c:constant_time_eq_int_8 Unexecuted instantiation: deterministic.c:constant_time_eq_int_8 Unexecuted instantiation: forkunsafe.c:constant_time_eq_int_8 Unexecuted instantiation: refcount.c:constant_time_eq_int_8 Unexecuted instantiation: rsa_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: rsa_crypt.c:constant_time_eq_int_8 Unexecuted instantiation: stack.c:constant_time_eq_int_8 Unexecuted instantiation: thread_pthread.c:constant_time_eq_int_8 Unexecuted instantiation: convert.c:constant_time_eq_int_8 Unexecuted instantiation: asn1_compat.c:constant_time_eq_int_8 Unexecuted instantiation: chacha.c:constant_time_eq_int_8 Unexecuted instantiation: cpu_intel.c:constant_time_eq_int_8 Unexecuted instantiation: curve25519.c:constant_time_eq_int_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_eq_int_8 Unexecuted instantiation: dsa.c:constant_time_eq_int_8 Unexecuted instantiation: dsa_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: ecdh_extra.c:constant_time_eq_int_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: ec_asn1.c:constant_time_eq_int_8 Unexecuted instantiation: bio.c:constant_time_eq_int_8 Unexecuted instantiation: file.c:constant_time_eq_int_8 |
474 | | |
475 | | // constant_time_select_w returns (mask & a) | (~mask & b). When |mask| is all |
476 | | // 1s or all 0s (as returned by the methods above), the select methods return |
477 | | // either |a| (if |mask| is nonzero) or |b| (if |mask| is zero). |
478 | | static inline crypto_word_t constant_time_select_w(crypto_word_t mask, |
479 | | crypto_word_t a, |
480 | 18.7M | crypto_word_t b) { |
481 | | // Clang recognizes this pattern as a select. While it usually transforms it |
482 | | // to a cmov, it sometimes further transforms it into a branch, which we do |
483 | | // not want. |
484 | | // |
485 | | // Hiding the value of the mask from the compiler evades this transformation. |
486 | 18.7M | mask = value_barrier_w(mask); |
487 | 18.7M | return (mask & a) | (~mask & b); |
488 | 18.7M | } bcm.c:constant_time_select_w Line | Count | Source | 480 | 18.7M | crypto_word_t b) { | 481 | | // Clang recognizes this pattern as a select. While it usually transforms it | 482 | | // to a cmov, it sometimes further transforms it into a branch, which we do | 483 | | // not want. | 484 | | // | 485 | | // Hiding the value of the mask from the compiler evades this transformation. | 486 | 18.7M | mask = value_barrier_w(mask); | 487 | 18.7M | return (mask & a) | (~mask & b); | 488 | 18.7M | } |
Unexecuted instantiation: cbb.c:constant_time_select_w Unexecuted instantiation: cbs.c:constant_time_select_w Unexecuted instantiation: crypto.c:constant_time_select_w Unexecuted instantiation: err.c:constant_time_select_w Unexecuted instantiation: engine.c:constant_time_select_w Unexecuted instantiation: evp.c:constant_time_select_w Unexecuted instantiation: evp_ctx.c:constant_time_select_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_select_w Unexecuted instantiation: p_ec.c:constant_time_select_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_select_w Unexecuted instantiation: p_hkdf.c:constant_time_select_w Unexecuted instantiation: p_rsa.c:constant_time_select_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_select_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_select_w Unexecuted instantiation: ex_data.c:constant_time_select_w Unexecuted instantiation: mem.c:constant_time_select_w Unexecuted instantiation: deterministic.c:constant_time_select_w Unexecuted instantiation: forkunsafe.c:constant_time_select_w Unexecuted instantiation: refcount.c:constant_time_select_w Unexecuted instantiation: rsa_asn1.c:constant_time_select_w Unexecuted instantiation: rsa_crypt.c:constant_time_select_w Unexecuted instantiation: stack.c:constant_time_select_w Unexecuted instantiation: thread_pthread.c:constant_time_select_w Unexecuted instantiation: convert.c:constant_time_select_w Unexecuted instantiation: asn1_compat.c:constant_time_select_w Unexecuted instantiation: chacha.c:constant_time_select_w Unexecuted instantiation: cpu_intel.c:constant_time_select_w Unexecuted instantiation: curve25519.c:constant_time_select_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_select_w Unexecuted instantiation: dsa.c:constant_time_select_w Unexecuted instantiation: dsa_asn1.c:constant_time_select_w Unexecuted instantiation: ecdh_extra.c:constant_time_select_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_select_w Unexecuted instantiation: ec_asn1.c:constant_time_select_w Unexecuted instantiation: bio.c:constant_time_select_w Unexecuted instantiation: file.c:constant_time_select_w |
489 | | |
490 | | // constant_time_select_8 acts like |constant_time_select| but operates on |
491 | | // 8-bit values. |
492 | | static inline uint8_t constant_time_select_8(crypto_word_t mask, uint8_t a, |
493 | 0 | uint8_t b) { |
494 | | // |mask| is a word instead of |uint8_t| to avoid materializing 0x000..0MM |
495 | | // Making both |mask| and its value barrier |uint8_t| would allow the compiler |
496 | | // to materialize 0x????..?MM instead, but only clang is that clever. |
497 | | // However, vectorization of bitwise operations seems to work better on |
498 | | // |uint8_t| than a mix of |uint64_t| and |uint8_t|, so |m| is cast to |
499 | | // |uint8_t| after the value barrier but before the bitwise operations. |
500 | 0 | uint8_t m = value_barrier_w(mask); |
501 | 0 | return (m & a) | (~m & b); |
502 | 0 | } Unexecuted instantiation: bcm.c:constant_time_select_8 Unexecuted instantiation: cbb.c:constant_time_select_8 Unexecuted instantiation: cbs.c:constant_time_select_8 Unexecuted instantiation: crypto.c:constant_time_select_8 Unexecuted instantiation: err.c:constant_time_select_8 Unexecuted instantiation: engine.c:constant_time_select_8 Unexecuted instantiation: evp.c:constant_time_select_8 Unexecuted instantiation: evp_ctx.c:constant_time_select_8 Unexecuted instantiation: p_dsa_asn1.c:constant_time_select_8 Unexecuted instantiation: p_ec.c:constant_time_select_8 Unexecuted instantiation: p_ed25519_asn1.c:constant_time_select_8 Unexecuted instantiation: p_hkdf.c:constant_time_select_8 Unexecuted instantiation: p_rsa.c:constant_time_select_8 Unexecuted instantiation: p_rsa_asn1.c:constant_time_select_8 Unexecuted instantiation: p_x25519_asn1.c:constant_time_select_8 Unexecuted instantiation: ex_data.c:constant_time_select_8 Unexecuted instantiation: mem.c:constant_time_select_8 Unexecuted instantiation: deterministic.c:constant_time_select_8 Unexecuted instantiation: forkunsafe.c:constant_time_select_8 Unexecuted instantiation: refcount.c:constant_time_select_8 Unexecuted instantiation: rsa_asn1.c:constant_time_select_8 Unexecuted instantiation: rsa_crypt.c:constant_time_select_8 Unexecuted instantiation: stack.c:constant_time_select_8 Unexecuted instantiation: thread_pthread.c:constant_time_select_8 Unexecuted instantiation: convert.c:constant_time_select_8 Unexecuted instantiation: asn1_compat.c:constant_time_select_8 Unexecuted instantiation: chacha.c:constant_time_select_8 Unexecuted instantiation: cpu_intel.c:constant_time_select_8 Unexecuted instantiation: curve25519.c:constant_time_select_8 Unexecuted instantiation: curve25519_64_adx.c:constant_time_select_8 Unexecuted instantiation: dsa.c:constant_time_select_8 Unexecuted instantiation: dsa_asn1.c:constant_time_select_8 Unexecuted instantiation: ecdh_extra.c:constant_time_select_8 Unexecuted instantiation: ecdsa_asn1.c:constant_time_select_8 Unexecuted instantiation: ec_asn1.c:constant_time_select_8 Unexecuted instantiation: bio.c:constant_time_select_8 Unexecuted instantiation: file.c:constant_time_select_8 |
503 | | |
504 | | // constant_time_select_int acts like |constant_time_select| but operates on |
505 | | // ints. |
506 | 1.69M | static inline int constant_time_select_int(crypto_word_t mask, int a, int b) { |
507 | 1.69M | return (int)(constant_time_select_w(mask, (crypto_word_t)(a), |
508 | 1.69M | (crypto_word_t)(b))); |
509 | 1.69M | } bcm.c:constant_time_select_int Line | Count | Source | 506 | 1.69M | static inline int constant_time_select_int(crypto_word_t mask, int a, int b) { | 507 | 1.69M | return (int)(constant_time_select_w(mask, (crypto_word_t)(a), | 508 | 1.69M | (crypto_word_t)(b))); | 509 | 1.69M | } |
Unexecuted instantiation: cbb.c:constant_time_select_int Unexecuted instantiation: cbs.c:constant_time_select_int Unexecuted instantiation: crypto.c:constant_time_select_int Unexecuted instantiation: err.c:constant_time_select_int Unexecuted instantiation: engine.c:constant_time_select_int Unexecuted instantiation: evp.c:constant_time_select_int Unexecuted instantiation: evp_ctx.c:constant_time_select_int Unexecuted instantiation: p_dsa_asn1.c:constant_time_select_int Unexecuted instantiation: p_ec.c:constant_time_select_int Unexecuted instantiation: p_ed25519_asn1.c:constant_time_select_int Unexecuted instantiation: p_hkdf.c:constant_time_select_int Unexecuted instantiation: p_rsa.c:constant_time_select_int Unexecuted instantiation: p_rsa_asn1.c:constant_time_select_int Unexecuted instantiation: p_x25519_asn1.c:constant_time_select_int Unexecuted instantiation: ex_data.c:constant_time_select_int Unexecuted instantiation: mem.c:constant_time_select_int Unexecuted instantiation: deterministic.c:constant_time_select_int Unexecuted instantiation: forkunsafe.c:constant_time_select_int Unexecuted instantiation: refcount.c:constant_time_select_int Unexecuted instantiation: rsa_asn1.c:constant_time_select_int Unexecuted instantiation: rsa_crypt.c:constant_time_select_int Unexecuted instantiation: stack.c:constant_time_select_int Unexecuted instantiation: thread_pthread.c:constant_time_select_int Unexecuted instantiation: convert.c:constant_time_select_int Unexecuted instantiation: asn1_compat.c:constant_time_select_int Unexecuted instantiation: chacha.c:constant_time_select_int Unexecuted instantiation: cpu_intel.c:constant_time_select_int Unexecuted instantiation: curve25519.c:constant_time_select_int Unexecuted instantiation: curve25519_64_adx.c:constant_time_select_int Unexecuted instantiation: dsa.c:constant_time_select_int Unexecuted instantiation: dsa_asn1.c:constant_time_select_int Unexecuted instantiation: ecdh_extra.c:constant_time_select_int Unexecuted instantiation: ecdsa_asn1.c:constant_time_select_int Unexecuted instantiation: ec_asn1.c:constant_time_select_int Unexecuted instantiation: bio.c:constant_time_select_int Unexecuted instantiation: file.c:constant_time_select_int |
510 | | |
511 | | // constant_time_conditional_memcpy copies |n| bytes from |src| to |dst| if |
512 | | // |mask| is 0xff..ff and does nothing if |mask| is 0. The |n|-byte memory |
513 | | // ranges at |dst| and |src| must not overlap, as when calling |memcpy|. |
514 | | static inline void constant_time_conditional_memcpy(void *dst, const void *src, |
515 | | const size_t n, |
516 | 0 | const crypto_word_t mask) { |
517 | 0 | assert(!buffers_alias(dst, n, src, n)); |
518 | 0 | uint8_t *out = (uint8_t *)dst; |
519 | 0 | const uint8_t *in = (const uint8_t *)src; |
520 | 0 | for (size_t i = 0; i < n; i++) { |
521 | 0 | out[i] = constant_time_select_8(mask, in[i], out[i]); |
522 | 0 | } |
523 | 0 | } Unexecuted instantiation: bcm.c:constant_time_conditional_memcpy Unexecuted instantiation: cbb.c:constant_time_conditional_memcpy Unexecuted instantiation: cbs.c:constant_time_conditional_memcpy Unexecuted instantiation: crypto.c:constant_time_conditional_memcpy Unexecuted instantiation: err.c:constant_time_conditional_memcpy Unexecuted instantiation: engine.c:constant_time_conditional_memcpy Unexecuted instantiation: evp.c:constant_time_conditional_memcpy Unexecuted instantiation: evp_ctx.c:constant_time_conditional_memcpy Unexecuted instantiation: p_dsa_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: p_ec.c:constant_time_conditional_memcpy Unexecuted instantiation: p_ed25519_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: p_hkdf.c:constant_time_conditional_memcpy Unexecuted instantiation: p_rsa.c:constant_time_conditional_memcpy Unexecuted instantiation: p_rsa_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: p_x25519_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: ex_data.c:constant_time_conditional_memcpy Unexecuted instantiation: mem.c:constant_time_conditional_memcpy Unexecuted instantiation: deterministic.c:constant_time_conditional_memcpy Unexecuted instantiation: forkunsafe.c:constant_time_conditional_memcpy Unexecuted instantiation: refcount.c:constant_time_conditional_memcpy Unexecuted instantiation: rsa_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: rsa_crypt.c:constant_time_conditional_memcpy Unexecuted instantiation: stack.c:constant_time_conditional_memcpy Unexecuted instantiation: thread_pthread.c:constant_time_conditional_memcpy Unexecuted instantiation: convert.c:constant_time_conditional_memcpy Unexecuted instantiation: asn1_compat.c:constant_time_conditional_memcpy Unexecuted instantiation: chacha.c:constant_time_conditional_memcpy Unexecuted instantiation: cpu_intel.c:constant_time_conditional_memcpy Unexecuted instantiation: curve25519.c:constant_time_conditional_memcpy Unexecuted instantiation: curve25519_64_adx.c:constant_time_conditional_memcpy Unexecuted instantiation: dsa.c:constant_time_conditional_memcpy Unexecuted instantiation: dsa_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: ecdh_extra.c:constant_time_conditional_memcpy Unexecuted instantiation: ecdsa_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: ec_asn1.c:constant_time_conditional_memcpy Unexecuted instantiation: bio.c:constant_time_conditional_memcpy Unexecuted instantiation: file.c:constant_time_conditional_memcpy |
524 | | |
525 | | // constant_time_conditional_memxor xors |n| bytes from |src| to |dst| if |
526 | | // |mask| is 0xff..ff and does nothing if |mask| is 0. The |n|-byte memory |
527 | | // ranges at |dst| and |src| must not overlap, as when calling |memcpy|. |
528 | | static inline void constant_time_conditional_memxor(void *dst, const void *src, |
529 | | const size_t n, |
530 | 0 | const crypto_word_t mask) { |
531 | 0 | assert(!buffers_alias(dst, n, src, n)); |
532 | 0 | uint8_t *out = (uint8_t *)dst; |
533 | 0 | const uint8_t *in = (const uint8_t *)src; |
534 | 0 | for (size_t i = 0; i < n; i++) { |
535 | 0 | out[i] ^= value_barrier_w(mask) & in[i]; |
536 | 0 | } |
537 | 0 | } Unexecuted instantiation: bcm.c:constant_time_conditional_memxor Unexecuted instantiation: cbb.c:constant_time_conditional_memxor Unexecuted instantiation: cbs.c:constant_time_conditional_memxor Unexecuted instantiation: crypto.c:constant_time_conditional_memxor Unexecuted instantiation: err.c:constant_time_conditional_memxor Unexecuted instantiation: engine.c:constant_time_conditional_memxor Unexecuted instantiation: evp.c:constant_time_conditional_memxor Unexecuted instantiation: evp_ctx.c:constant_time_conditional_memxor Unexecuted instantiation: p_dsa_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: p_ec.c:constant_time_conditional_memxor Unexecuted instantiation: p_ed25519_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: p_hkdf.c:constant_time_conditional_memxor Unexecuted instantiation: p_rsa.c:constant_time_conditional_memxor Unexecuted instantiation: p_rsa_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: p_x25519_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: ex_data.c:constant_time_conditional_memxor Unexecuted instantiation: mem.c:constant_time_conditional_memxor Unexecuted instantiation: deterministic.c:constant_time_conditional_memxor Unexecuted instantiation: forkunsafe.c:constant_time_conditional_memxor Unexecuted instantiation: refcount.c:constant_time_conditional_memxor Unexecuted instantiation: rsa_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: rsa_crypt.c:constant_time_conditional_memxor Unexecuted instantiation: stack.c:constant_time_conditional_memxor Unexecuted instantiation: thread_pthread.c:constant_time_conditional_memxor Unexecuted instantiation: convert.c:constant_time_conditional_memxor Unexecuted instantiation: asn1_compat.c:constant_time_conditional_memxor Unexecuted instantiation: chacha.c:constant_time_conditional_memxor Unexecuted instantiation: cpu_intel.c:constant_time_conditional_memxor Unexecuted instantiation: curve25519.c:constant_time_conditional_memxor Unexecuted instantiation: curve25519_64_adx.c:constant_time_conditional_memxor Unexecuted instantiation: dsa.c:constant_time_conditional_memxor Unexecuted instantiation: dsa_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: ecdh_extra.c:constant_time_conditional_memxor Unexecuted instantiation: ecdsa_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: ec_asn1.c:constant_time_conditional_memxor Unexecuted instantiation: bio.c:constant_time_conditional_memxor Unexecuted instantiation: file.c:constant_time_conditional_memxor |
538 | | |
539 | | #if defined(BORINGSSL_CONSTANT_TIME_VALIDATION) |
540 | | |
541 | | // CONSTTIME_SECRET takes a pointer and a number of bytes and marks that region |
542 | | // of memory as secret. Secret data is tracked as it flows to registers and |
543 | | // other parts of a memory. If secret data is used as a condition for a branch, |
544 | | // or as a memory index, it will trigger warnings in valgrind. |
545 | | #define CONSTTIME_SECRET(ptr, len) VALGRIND_MAKE_MEM_UNDEFINED(ptr, len) |
546 | | |
547 | | // CONSTTIME_DECLASSIFY takes a pointer and a number of bytes and marks that |
548 | | // region of memory as public. Public data is not subject to constant-time |
549 | | // rules. |
550 | | #define CONSTTIME_DECLASSIFY(ptr, len) VALGRIND_MAKE_MEM_DEFINED(ptr, len) |
551 | | |
552 | | #else |
553 | | |
554 | | #define CONSTTIME_SECRET(ptr, len) |
555 | | #define CONSTTIME_DECLASSIFY(ptr, len) |
556 | | |
557 | | #endif // BORINGSSL_CONSTANT_TIME_VALIDATION |
558 | | |
559 | 0 | static inline crypto_word_t constant_time_declassify_w(crypto_word_t v) { |
560 | | // Return |v| through a value barrier to be safe. Valgrind-based constant-time |
561 | | // validation is partly to check the compiler has not undone any constant-time |
562 | | // work. Any place |BORINGSSL_CONSTANT_TIME_VALIDATION| influences |
563 | | // optimizations, this validation is inaccurate. |
564 | | // |
565 | | // However, by sending pointers through valgrind, we likely inhibit escape |
566 | | // analysis. On local variables, particularly booleans, we likely |
567 | | // significantly impact optimizations. |
568 | | // |
569 | | // Thus, to be safe, stick a value barrier, in hopes of comparably inhibiting |
570 | | // compiler analysis. |
571 | 0 | CONSTTIME_DECLASSIFY(&v, sizeof(v)); |
572 | 0 | return value_barrier_w(v); |
573 | 0 | } Unexecuted instantiation: bcm.c:constant_time_declassify_w Unexecuted instantiation: cbb.c:constant_time_declassify_w Unexecuted instantiation: cbs.c:constant_time_declassify_w Unexecuted instantiation: crypto.c:constant_time_declassify_w Unexecuted instantiation: err.c:constant_time_declassify_w Unexecuted instantiation: engine.c:constant_time_declassify_w Unexecuted instantiation: evp.c:constant_time_declassify_w Unexecuted instantiation: evp_ctx.c:constant_time_declassify_w Unexecuted instantiation: p_dsa_asn1.c:constant_time_declassify_w Unexecuted instantiation: p_ec.c:constant_time_declassify_w Unexecuted instantiation: p_ed25519_asn1.c:constant_time_declassify_w Unexecuted instantiation: p_hkdf.c:constant_time_declassify_w Unexecuted instantiation: p_rsa.c:constant_time_declassify_w Unexecuted instantiation: p_rsa_asn1.c:constant_time_declassify_w Unexecuted instantiation: p_x25519_asn1.c:constant_time_declassify_w Unexecuted instantiation: ex_data.c:constant_time_declassify_w Unexecuted instantiation: mem.c:constant_time_declassify_w Unexecuted instantiation: deterministic.c:constant_time_declassify_w Unexecuted instantiation: forkunsafe.c:constant_time_declassify_w Unexecuted instantiation: refcount.c:constant_time_declassify_w Unexecuted instantiation: rsa_asn1.c:constant_time_declassify_w Unexecuted instantiation: rsa_crypt.c:constant_time_declassify_w Unexecuted instantiation: stack.c:constant_time_declassify_w Unexecuted instantiation: thread_pthread.c:constant_time_declassify_w Unexecuted instantiation: convert.c:constant_time_declassify_w Unexecuted instantiation: asn1_compat.c:constant_time_declassify_w Unexecuted instantiation: chacha.c:constant_time_declassify_w Unexecuted instantiation: cpu_intel.c:constant_time_declassify_w Unexecuted instantiation: curve25519.c:constant_time_declassify_w Unexecuted instantiation: curve25519_64_adx.c:constant_time_declassify_w Unexecuted instantiation: dsa.c:constant_time_declassify_w Unexecuted instantiation: dsa_asn1.c:constant_time_declassify_w Unexecuted instantiation: ecdh_extra.c:constant_time_declassify_w Unexecuted instantiation: ecdsa_asn1.c:constant_time_declassify_w Unexecuted instantiation: ec_asn1.c:constant_time_declassify_w Unexecuted instantiation: bio.c:constant_time_declassify_w Unexecuted instantiation: file.c:constant_time_declassify_w |
574 | | |
575 | 0 | static inline int constant_time_declassify_int(int v) { |
576 | 0 | static_assert(sizeof(uint32_t) == sizeof(int), |
577 | 0 | "int is not the same size as uint32_t"); |
578 | | // See comment above. |
579 | 0 | CONSTTIME_DECLASSIFY(&v, sizeof(v)); |
580 | 0 | return value_barrier_u32(v); |
581 | 0 | } Unexecuted instantiation: bcm.c:constant_time_declassify_int Unexecuted instantiation: cbb.c:constant_time_declassify_int Unexecuted instantiation: cbs.c:constant_time_declassify_int Unexecuted instantiation: crypto.c:constant_time_declassify_int Unexecuted instantiation: err.c:constant_time_declassify_int Unexecuted instantiation: engine.c:constant_time_declassify_int Unexecuted instantiation: evp.c:constant_time_declassify_int Unexecuted instantiation: evp_ctx.c:constant_time_declassify_int Unexecuted instantiation: p_dsa_asn1.c:constant_time_declassify_int Unexecuted instantiation: p_ec.c:constant_time_declassify_int Unexecuted instantiation: p_ed25519_asn1.c:constant_time_declassify_int Unexecuted instantiation: p_hkdf.c:constant_time_declassify_int Unexecuted instantiation: p_rsa.c:constant_time_declassify_int Unexecuted instantiation: p_rsa_asn1.c:constant_time_declassify_int Unexecuted instantiation: p_x25519_asn1.c:constant_time_declassify_int Unexecuted instantiation: ex_data.c:constant_time_declassify_int Unexecuted instantiation: mem.c:constant_time_declassify_int Unexecuted instantiation: deterministic.c:constant_time_declassify_int Unexecuted instantiation: forkunsafe.c:constant_time_declassify_int Unexecuted instantiation: refcount.c:constant_time_declassify_int Unexecuted instantiation: rsa_asn1.c:constant_time_declassify_int Unexecuted instantiation: rsa_crypt.c:constant_time_declassify_int Unexecuted instantiation: stack.c:constant_time_declassify_int Unexecuted instantiation: thread_pthread.c:constant_time_declassify_int Unexecuted instantiation: convert.c:constant_time_declassify_int Unexecuted instantiation: asn1_compat.c:constant_time_declassify_int Unexecuted instantiation: chacha.c:constant_time_declassify_int Unexecuted instantiation: cpu_intel.c:constant_time_declassify_int Unexecuted instantiation: curve25519.c:constant_time_declassify_int Unexecuted instantiation: curve25519_64_adx.c:constant_time_declassify_int Unexecuted instantiation: dsa.c:constant_time_declassify_int Unexecuted instantiation: dsa_asn1.c:constant_time_declassify_int Unexecuted instantiation: ecdh_extra.c:constant_time_declassify_int Unexecuted instantiation: ecdsa_asn1.c:constant_time_declassify_int Unexecuted instantiation: ec_asn1.c:constant_time_declassify_int Unexecuted instantiation: bio.c:constant_time_declassify_int Unexecuted instantiation: file.c:constant_time_declassify_int |
582 | | |
583 | | |
584 | | // Thread-safe initialisation. |
585 | | |
586 | | #if !defined(OPENSSL_THREADS) |
587 | | typedef uint32_t CRYPTO_once_t; |
588 | | #define CRYPTO_ONCE_INIT 0 |
589 | | #elif defined(OPENSSL_WINDOWS_THREADS) |
590 | | typedef INIT_ONCE CRYPTO_once_t; |
591 | | #define CRYPTO_ONCE_INIT INIT_ONCE_STATIC_INIT |
592 | | #elif defined(OPENSSL_PTHREADS) |
593 | | typedef pthread_once_t CRYPTO_once_t; |
594 | | #define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT |
595 | | #else |
596 | | #error "Unknown threading library" |
597 | | #endif |
598 | | |
599 | | // CRYPTO_once calls |init| exactly once per process. This is thread-safe: if |
600 | | // concurrent threads call |CRYPTO_once| with the same |CRYPTO_once_t| argument |
601 | | // then they will block until |init| completes, but |init| will have only been |
602 | | // called once. |
603 | | // |
604 | | // The |once| argument must be a |CRYPTO_once_t| that has been initialised with |
605 | | // the value |CRYPTO_ONCE_INIT|. |
606 | | OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void (*init)(void)); |
607 | | |
608 | | |
609 | | // Atomics. |
610 | | // |
611 | | // The following functions provide an API analogous to <stdatomic.h> from C11 |
612 | | // and abstract between a few variations on atomics we need to support. |
613 | | |
614 | | #if defined(__cplusplus) |
615 | | |
616 | | // In C++, we can't easily detect whether C will use |OPENSSL_C11_ATOMIC| or |
617 | | // |OPENSSL_WINDOWS_ATOMIC|. Instead, we define a layout-compatible type without |
618 | | // the corresponding functions. When we can rely on C11 atomics in MSVC, that |
619 | | // will no longer be a concern. |
620 | | typedef uint32_t CRYPTO_atomic_u32; |
621 | | |
622 | | #elif defined(OPENSSL_C11_ATOMIC) |
623 | | |
624 | | typedef _Atomic uint32_t CRYPTO_atomic_u32; |
625 | | |
626 | | // This should be const, but the |OPENSSL_WINDOWS_ATOMIC| implementation is not |
627 | | // const due to Windows limitations. When we can rely on C11 atomics, make this |
628 | | // const-correct. |
629 | 0 | OPENSSL_INLINE uint32_t CRYPTO_atomic_load_u32(CRYPTO_atomic_u32 *val) { |
630 | 0 | return atomic_load(val); |
631 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: cbb.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: cbs.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: crypto.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: err.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: engine.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: evp.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: evp_ctx.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_ec.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_hkdf.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_rsa.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: ex_data.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: mem.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: deterministic.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: forkunsafe.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: refcount.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: rsa_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: rsa_crypt.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: stack.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: thread_pthread.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: convert.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: asn1_compat.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: chacha.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: cpu_intel.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: curve25519.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: dsa.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: dsa_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: ecdh_extra.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: ec_asn1.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: bio.c:CRYPTO_atomic_load_u32 Unexecuted instantiation: file.c:CRYPTO_atomic_load_u32 |
632 | | |
633 | | OPENSSL_INLINE int CRYPTO_atomic_compare_exchange_weak_u32( |
634 | 0 | CRYPTO_atomic_u32 *val, uint32_t *expected, uint32_t desired) { |
635 | 0 | return atomic_compare_exchange_weak(val, expected, desired); |
636 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: cbb.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: cbs.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: crypto.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: err.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: engine.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: evp.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: evp_ctx.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_ec.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_hkdf.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_rsa.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: ex_data.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: mem.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: deterministic.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: forkunsafe.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: refcount.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: rsa_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: rsa_crypt.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: stack.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: thread_pthread.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: convert.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: asn1_compat.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: chacha.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: cpu_intel.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: curve25519.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: dsa.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: dsa_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: ecdh_extra.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: ec_asn1.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: bio.c:CRYPTO_atomic_compare_exchange_weak_u32 Unexecuted instantiation: file.c:CRYPTO_atomic_compare_exchange_weak_u32 |
637 | | |
638 | | OPENSSL_INLINE void CRYPTO_atomic_store_u32(CRYPTO_atomic_u32 *val, |
639 | 0 | uint32_t desired) { |
640 | 0 | atomic_store(val, desired); |
641 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: cbb.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: cbs.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: crypto.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: err.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: engine.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: evp.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: evp_ctx.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_ec.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_hkdf.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_rsa.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: ex_data.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: mem.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: deterministic.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: forkunsafe.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: refcount.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: rsa_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: rsa_crypt.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: stack.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: thread_pthread.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: convert.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: asn1_compat.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: chacha.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: cpu_intel.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: curve25519.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: dsa.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: dsa_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: ecdh_extra.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: ec_asn1.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: bio.c:CRYPTO_atomic_store_u32 Unexecuted instantiation: file.c:CRYPTO_atomic_store_u32 |
642 | | |
643 | | #elif defined(OPENSSL_WINDOWS_ATOMIC) |
644 | | |
645 | | typedef LONG CRYPTO_atomic_u32; |
646 | | |
647 | | OPENSSL_INLINE uint32_t CRYPTO_atomic_load_u32(volatile CRYPTO_atomic_u32 *val) { |
648 | | // This is not ideal because it still writes to a cacheline. MSVC is not able |
649 | | // to optimize this to a true atomic read, and Windows does not provide an |
650 | | // InterlockedLoad function. |
651 | | // |
652 | | // The Windows documentation [1] does say "Simple reads and writes to |
653 | | // properly-aligned 32-bit variables are atomic operations", but this is not |
654 | | // phrased in terms of the C11 and C++11 memory models, and indeed a read or |
655 | | // write seems to produce slightly different code on MSVC than a sequentially |
656 | | // consistent std::atomic::load in C++. Moreover, it is unclear if non-MSVC |
657 | | // compilers on Windows provide the same guarantees. Thus we avoid relying on |
658 | | // this and instead still use an interlocked function. This is still |
659 | | // preferable a global mutex, and eventually this code will be replaced by |
660 | | // [2]. Additionally, on clang-cl, we'll use the |OPENSSL_C11_ATOMIC| path. |
661 | | // |
662 | | // [1] https://learn.microsoft.com/en-us/windows/win32/sync/interlocked-variable-access |
663 | | // [2] https://devblogs.microsoft.com/cppblog/c11-atomics-in-visual-studio-2022-version-17-5-preview-2/ |
664 | | return (uint32_t)InterlockedCompareExchange(val, 0, 0); |
665 | | } |
666 | | |
667 | | OPENSSL_INLINE int CRYPTO_atomic_compare_exchange_weak_u32( |
668 | | volatile CRYPTO_atomic_u32 *val, uint32_t *expected32, uint32_t desired) { |
669 | | LONG expected = (LONG)*expected32; |
670 | | LONG actual = InterlockedCompareExchange(val, (LONG)desired, expected); |
671 | | *expected32 = (uint32_t)actual; |
672 | | return actual == expected; |
673 | | } |
674 | | |
675 | | OPENSSL_INLINE void CRYPTO_atomic_store_u32(volatile CRYPTO_atomic_u32 *val, |
676 | | uint32_t desired) { |
677 | | InterlockedExchange(val, (LONG)desired); |
678 | | } |
679 | | |
680 | | #elif !defined(OPENSSL_THREADS) |
681 | | |
682 | | typedef uint32_t CRYPTO_atomic_u32; |
683 | | |
684 | | OPENSSL_INLINE uint32_t CRYPTO_atomic_load_u32(CRYPTO_atomic_u32 *val) { |
685 | | return *val; |
686 | | } |
687 | | |
688 | | OPENSSL_INLINE int CRYPTO_atomic_compare_exchange_weak_u32( |
689 | | CRYPTO_atomic_u32 *val, uint32_t *expected, uint32_t desired) { |
690 | | if (*val != *expected) { |
691 | | *expected = *val; |
692 | | return 0; |
693 | | } |
694 | | *val = desired; |
695 | | return 1; |
696 | | } |
697 | | |
698 | | OPENSSL_INLINE void CRYPTO_atomic_store_u32(CRYPTO_atomic_u32 *val, |
699 | | uint32_t desired) { |
700 | | *val = desired; |
701 | | } |
702 | | |
703 | | #else |
704 | | |
705 | | // Require some atomics implementation. Contact BoringSSL maintainers if you |
706 | | // have a platform with fails this check. |
707 | | #error "Thread-compatible configurations require atomics" |
708 | | |
709 | | #endif |
710 | | |
711 | | // See the comment in the |__cplusplus| section above. |
712 | | static_assert(sizeof(CRYPTO_atomic_u32) == sizeof(uint32_t), |
713 | | "CRYPTO_atomic_u32 does not match uint32_t size"); |
714 | | static_assert(alignof(CRYPTO_atomic_u32) == alignof(uint32_t), |
715 | | "CRYPTO_atomic_u32 does not match uint32_t alignment"); |
716 | | |
717 | | |
718 | | // Reference counting. |
719 | | |
720 | | // CRYPTO_REFCOUNT_MAX is the value at which the reference count saturates. |
721 | 0 | #define CRYPTO_REFCOUNT_MAX 0xffffffff |
722 | | |
723 | | // CRYPTO_refcount_inc atomically increments the value at |*count| unless the |
724 | | // value would overflow. It's safe for multiple threads to concurrently call |
725 | | // this or |CRYPTO_refcount_dec_and_test_zero| on the same |
726 | | // |CRYPTO_refcount_t|. |
727 | | OPENSSL_EXPORT void CRYPTO_refcount_inc(CRYPTO_refcount_t *count); |
728 | | |
729 | | // CRYPTO_refcount_dec_and_test_zero tests the value at |*count|: |
730 | | // if it's zero, it crashes the address space. |
731 | | // if it's the maximum value, it returns zero. |
732 | | // otherwise, it atomically decrements it and returns one iff the resulting |
733 | | // value is zero. |
734 | | // |
735 | | // It's safe for multiple threads to concurrently call this or |
736 | | // |CRYPTO_refcount_inc| on the same |CRYPTO_refcount_t|. |
737 | | OPENSSL_EXPORT int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count); |
738 | | |
739 | | |
740 | | // Locks. |
741 | | |
742 | | #if !defined(OPENSSL_THREADS) |
743 | | typedef struct crypto_mutex_st { |
744 | | char padding; // Empty structs have different sizes in C and C++. |
745 | | } CRYPTO_MUTEX; |
746 | | #define CRYPTO_MUTEX_INIT { 0 } |
747 | | #elif defined(OPENSSL_WINDOWS_THREADS) |
748 | | typedef SRWLOCK CRYPTO_MUTEX; |
749 | | #define CRYPTO_MUTEX_INIT SRWLOCK_INIT |
750 | | #elif defined(OPENSSL_PTHREADS) |
751 | | typedef pthread_rwlock_t CRYPTO_MUTEX; |
752 | | #define CRYPTO_MUTEX_INIT PTHREAD_RWLOCK_INITIALIZER |
753 | | #else |
754 | | #error "Unknown threading library" |
755 | | #endif |
756 | | |
757 | | // CRYPTO_MUTEX_init initialises |lock|. If |lock| is a static variable, use a |
758 | | // |CRYPTO_MUTEX_INIT|. |
759 | | OPENSSL_EXPORT void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock); |
760 | | |
761 | | // CRYPTO_MUTEX_lock_read locks |lock| such that other threads may also have a |
762 | | // read lock, but none may have a write lock. |
763 | | OPENSSL_EXPORT void CRYPTO_MUTEX_lock_read(CRYPTO_MUTEX *lock); |
764 | | |
765 | | // CRYPTO_MUTEX_lock_write locks |lock| such that no other thread has any type |
766 | | // of lock on it. |
767 | | OPENSSL_EXPORT void CRYPTO_MUTEX_lock_write(CRYPTO_MUTEX *lock); |
768 | | |
769 | | // CRYPTO_MUTEX_unlock_read unlocks |lock| for reading. |
770 | | OPENSSL_EXPORT void CRYPTO_MUTEX_unlock_read(CRYPTO_MUTEX *lock); |
771 | | |
772 | | // CRYPTO_MUTEX_unlock_write unlocks |lock| for writing. |
773 | | OPENSSL_EXPORT void CRYPTO_MUTEX_unlock_write(CRYPTO_MUTEX *lock); |
774 | | |
775 | | // CRYPTO_MUTEX_cleanup releases all resources held by |lock|. |
776 | | OPENSSL_EXPORT void CRYPTO_MUTEX_cleanup(CRYPTO_MUTEX *lock); |
777 | | |
778 | | #if defined(__cplusplus) |
779 | | extern "C++" { |
780 | | |
781 | | BSSL_NAMESPACE_BEGIN |
782 | | |
783 | | namespace internal { |
784 | | |
785 | | // MutexLockBase is a RAII helper for CRYPTO_MUTEX locking. |
786 | | template <void (*LockFunc)(CRYPTO_MUTEX *), void (*ReleaseFunc)(CRYPTO_MUTEX *)> |
787 | | class MutexLockBase { |
788 | | public: |
789 | | explicit MutexLockBase(CRYPTO_MUTEX *mu) : mu_(mu) { |
790 | | assert(mu_ != nullptr); |
791 | | LockFunc(mu_); |
792 | | } |
793 | | ~MutexLockBase() { ReleaseFunc(mu_); } |
794 | | MutexLockBase(const MutexLockBase<LockFunc, ReleaseFunc> &) = delete; |
795 | | MutexLockBase &operator=(const MutexLockBase<LockFunc, ReleaseFunc> &) = |
796 | | delete; |
797 | | |
798 | | private: |
799 | | CRYPTO_MUTEX *const mu_; |
800 | | }; |
801 | | |
802 | | } // namespace internal |
803 | | |
804 | | using MutexWriteLock = |
805 | | internal::MutexLockBase<CRYPTO_MUTEX_lock_write, CRYPTO_MUTEX_unlock_write>; |
806 | | using MutexReadLock = |
807 | | internal::MutexLockBase<CRYPTO_MUTEX_lock_read, CRYPTO_MUTEX_unlock_read>; |
808 | | |
809 | | BSSL_NAMESPACE_END |
810 | | |
811 | | } // extern "C++" |
812 | | #endif // defined(__cplusplus) |
813 | | |
814 | | |
815 | | // Thread local storage. |
816 | | |
817 | | // thread_local_data_t enumerates the types of thread-local data that can be |
818 | | // stored. |
819 | | typedef enum { |
820 | | OPENSSL_THREAD_LOCAL_ERR = 0, |
821 | | OPENSSL_THREAD_LOCAL_RAND, |
822 | | OPENSSL_THREAD_LOCAL_FIPS_COUNTERS, |
823 | | OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE, |
824 | | OPENSSL_THREAD_LOCAL_TEST, |
825 | | NUM_OPENSSL_THREAD_LOCALS, |
826 | | } thread_local_data_t; |
827 | | |
828 | | // thread_local_destructor_t is the type of a destructor function that will be |
829 | | // called when a thread exits and its thread-local storage needs to be freed. |
830 | | typedef void (*thread_local_destructor_t)(void *); |
831 | | |
832 | | // CRYPTO_get_thread_local gets the pointer value that is stored for the |
833 | | // current thread for the given index, or NULL if none has been set. |
834 | | OPENSSL_EXPORT void *CRYPTO_get_thread_local(thread_local_data_t value); |
835 | | |
836 | | // CRYPTO_set_thread_local sets a pointer value for the current thread at the |
837 | | // given index. This function should only be called once per thread for a given |
838 | | // |index|: rather than update the pointer value itself, update the data that |
839 | | // is pointed to. |
840 | | // |
841 | | // The destructor function will be called when a thread exits to free this |
842 | | // thread-local data. All calls to |CRYPTO_set_thread_local| with the same |
843 | | // |index| should have the same |destructor| argument. The destructor may be |
844 | | // called with a NULL argument if a thread that never set a thread-local |
845 | | // pointer for |index|, exits. The destructor may be called concurrently with |
846 | | // different arguments. |
847 | | // |
848 | | // This function returns one on success or zero on error. If it returns zero |
849 | | // then |destructor| has been called with |value| already. |
850 | | OPENSSL_EXPORT int CRYPTO_set_thread_local( |
851 | | thread_local_data_t index, void *value, |
852 | | thread_local_destructor_t destructor); |
853 | | |
854 | | |
855 | | // ex_data |
856 | | |
857 | | typedef struct crypto_ex_data_func_st CRYPTO_EX_DATA_FUNCS; |
858 | | |
859 | | // CRYPTO_EX_DATA_CLASS tracks the ex_indices registered for a type which |
860 | | // supports ex_data. It should defined as a static global within the module |
861 | | // which defines that type. |
862 | | typedef struct { |
863 | | CRYPTO_MUTEX lock; |
864 | | // funcs is a linked list of |CRYPTO_EX_DATA_FUNCS| structures. It may be |
865 | | // traversed without serialization only up to |num_funcs|. last points to the |
866 | | // final entry of |funcs|, or NULL if empty. |
867 | | CRYPTO_EX_DATA_FUNCS *funcs, *last; |
868 | | // num_funcs is the number of entries in |funcs|. |
869 | | CRYPTO_atomic_u32 num_funcs; |
870 | | // num_reserved is one if the ex_data index zero is reserved for legacy |
871 | | // |TYPE_get_app_data| functions. |
872 | | uint8_t num_reserved; |
873 | | } CRYPTO_EX_DATA_CLASS; |
874 | | |
875 | | #define CRYPTO_EX_DATA_CLASS_INIT {CRYPTO_MUTEX_INIT, NULL, NULL, 0, 0} |
876 | | #define CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA \ |
877 | | {CRYPTO_MUTEX_INIT, NULL, NULL, 0, 1} |
878 | | |
879 | | // CRYPTO_get_ex_new_index allocates a new index for |ex_data_class| and writes |
880 | | // it to |*out_index|. Each class of object should provide a wrapper function |
881 | | // that uses the correct |CRYPTO_EX_DATA_CLASS|. It returns one on success and |
882 | | // zero otherwise. |
883 | | OPENSSL_EXPORT int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, |
884 | | int *out_index, long argl, |
885 | | void *argp, |
886 | | CRYPTO_EX_free *free_func); |
887 | | |
888 | | // CRYPTO_set_ex_data sets an extra data pointer on a given object. Each class |
889 | | // of object should provide a wrapper function. |
890 | | OPENSSL_EXPORT int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val); |
891 | | |
892 | | // CRYPTO_get_ex_data returns an extra data pointer for a given object, or NULL |
893 | | // if no such index exists. Each class of object should provide a wrapper |
894 | | // function. |
895 | | OPENSSL_EXPORT void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int index); |
896 | | |
897 | | // CRYPTO_new_ex_data initialises a newly allocated |CRYPTO_EX_DATA|. |
898 | | OPENSSL_EXPORT void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad); |
899 | | |
900 | | // CRYPTO_free_ex_data frees |ad|, which is embedded inside |obj|, which is an |
901 | | // object of the given class. |
902 | | OPENSSL_EXPORT void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, |
903 | | void *obj, CRYPTO_EX_DATA *ad); |
904 | | |
905 | | |
906 | | // Endianness conversions. |
907 | | |
908 | | #if defined(__GNUC__) && __GNUC__ >= 2 |
909 | 0 | static inline uint16_t CRYPTO_bswap2(uint16_t x) { |
910 | 0 | return __builtin_bswap16(x); |
911 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_bswap2 Unexecuted instantiation: cbb.c:CRYPTO_bswap2 Unexecuted instantiation: cbs.c:CRYPTO_bswap2 Unexecuted instantiation: crypto.c:CRYPTO_bswap2 Unexecuted instantiation: err.c:CRYPTO_bswap2 Unexecuted instantiation: engine.c:CRYPTO_bswap2 Unexecuted instantiation: evp.c:CRYPTO_bswap2 Unexecuted instantiation: evp_ctx.c:CRYPTO_bswap2 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: p_ec.c:CRYPTO_bswap2 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: p_hkdf.c:CRYPTO_bswap2 Unexecuted instantiation: p_rsa.c:CRYPTO_bswap2 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: ex_data.c:CRYPTO_bswap2 Unexecuted instantiation: mem.c:CRYPTO_bswap2 Unexecuted instantiation: deterministic.c:CRYPTO_bswap2 Unexecuted instantiation: forkunsafe.c:CRYPTO_bswap2 Unexecuted instantiation: refcount.c:CRYPTO_bswap2 Unexecuted instantiation: rsa_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: rsa_crypt.c:CRYPTO_bswap2 Unexecuted instantiation: stack.c:CRYPTO_bswap2 Unexecuted instantiation: thread_pthread.c:CRYPTO_bswap2 Unexecuted instantiation: convert.c:CRYPTO_bswap2 Unexecuted instantiation: asn1_compat.c:CRYPTO_bswap2 Unexecuted instantiation: chacha.c:CRYPTO_bswap2 Unexecuted instantiation: cpu_intel.c:CRYPTO_bswap2 Unexecuted instantiation: curve25519.c:CRYPTO_bswap2 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_bswap2 Unexecuted instantiation: dsa.c:CRYPTO_bswap2 Unexecuted instantiation: dsa_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: ecdh_extra.c:CRYPTO_bswap2 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: ec_asn1.c:CRYPTO_bswap2 Unexecuted instantiation: bio.c:CRYPTO_bswap2 Unexecuted instantiation: file.c:CRYPTO_bswap2 |
912 | | |
913 | 0 | static inline uint32_t CRYPTO_bswap4(uint32_t x) { |
914 | 0 | return __builtin_bswap32(x); |
915 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_bswap4 Unexecuted instantiation: cbb.c:CRYPTO_bswap4 Unexecuted instantiation: cbs.c:CRYPTO_bswap4 Unexecuted instantiation: crypto.c:CRYPTO_bswap4 Unexecuted instantiation: err.c:CRYPTO_bswap4 Unexecuted instantiation: engine.c:CRYPTO_bswap4 Unexecuted instantiation: evp.c:CRYPTO_bswap4 Unexecuted instantiation: evp_ctx.c:CRYPTO_bswap4 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: p_ec.c:CRYPTO_bswap4 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: p_hkdf.c:CRYPTO_bswap4 Unexecuted instantiation: p_rsa.c:CRYPTO_bswap4 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: ex_data.c:CRYPTO_bswap4 Unexecuted instantiation: mem.c:CRYPTO_bswap4 Unexecuted instantiation: deterministic.c:CRYPTO_bswap4 Unexecuted instantiation: forkunsafe.c:CRYPTO_bswap4 Unexecuted instantiation: refcount.c:CRYPTO_bswap4 Unexecuted instantiation: rsa_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: rsa_crypt.c:CRYPTO_bswap4 Unexecuted instantiation: stack.c:CRYPTO_bswap4 Unexecuted instantiation: thread_pthread.c:CRYPTO_bswap4 Unexecuted instantiation: convert.c:CRYPTO_bswap4 Unexecuted instantiation: asn1_compat.c:CRYPTO_bswap4 Unexecuted instantiation: chacha.c:CRYPTO_bswap4 Unexecuted instantiation: cpu_intel.c:CRYPTO_bswap4 Unexecuted instantiation: curve25519.c:CRYPTO_bswap4 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_bswap4 Unexecuted instantiation: dsa.c:CRYPTO_bswap4 Unexecuted instantiation: dsa_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: ecdh_extra.c:CRYPTO_bswap4 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: ec_asn1.c:CRYPTO_bswap4 Unexecuted instantiation: bio.c:CRYPTO_bswap4 Unexecuted instantiation: file.c:CRYPTO_bswap4 |
916 | | |
917 | 1.04M | static inline uint64_t CRYPTO_bswap8(uint64_t x) { |
918 | 1.04M | return __builtin_bswap64(x); |
919 | 1.04M | } Line | Count | Source | 917 | 1.04M | static inline uint64_t CRYPTO_bswap8(uint64_t x) { | 918 | 1.04M | return __builtin_bswap64(x); | 919 | 1.04M | } |
Unexecuted instantiation: cbb.c:CRYPTO_bswap8 Unexecuted instantiation: cbs.c:CRYPTO_bswap8 Unexecuted instantiation: crypto.c:CRYPTO_bswap8 Unexecuted instantiation: err.c:CRYPTO_bswap8 Unexecuted instantiation: engine.c:CRYPTO_bswap8 Unexecuted instantiation: evp.c:CRYPTO_bswap8 Unexecuted instantiation: evp_ctx.c:CRYPTO_bswap8 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: p_ec.c:CRYPTO_bswap8 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: p_hkdf.c:CRYPTO_bswap8 Unexecuted instantiation: p_rsa.c:CRYPTO_bswap8 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: ex_data.c:CRYPTO_bswap8 Unexecuted instantiation: mem.c:CRYPTO_bswap8 Unexecuted instantiation: deterministic.c:CRYPTO_bswap8 Unexecuted instantiation: forkunsafe.c:CRYPTO_bswap8 Unexecuted instantiation: refcount.c:CRYPTO_bswap8 Unexecuted instantiation: rsa_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: rsa_crypt.c:CRYPTO_bswap8 Unexecuted instantiation: stack.c:CRYPTO_bswap8 Unexecuted instantiation: thread_pthread.c:CRYPTO_bswap8 Unexecuted instantiation: convert.c:CRYPTO_bswap8 Unexecuted instantiation: asn1_compat.c:CRYPTO_bswap8 Unexecuted instantiation: chacha.c:CRYPTO_bswap8 Unexecuted instantiation: cpu_intel.c:CRYPTO_bswap8 Unexecuted instantiation: curve25519.c:CRYPTO_bswap8 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_bswap8 Unexecuted instantiation: dsa.c:CRYPTO_bswap8 Unexecuted instantiation: dsa_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: ecdh_extra.c:CRYPTO_bswap8 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: ec_asn1.c:CRYPTO_bswap8 Unexecuted instantiation: bio.c:CRYPTO_bswap8 Unexecuted instantiation: file.c:CRYPTO_bswap8 |
920 | | #elif defined(_MSC_VER) |
921 | | OPENSSL_MSVC_PRAGMA(warning(push, 3)) |
922 | | #include <stdlib.h> |
923 | | OPENSSL_MSVC_PRAGMA(warning(pop)) |
924 | | #pragma intrinsic(_byteswap_uint64, _byteswap_ulong, _byteswap_ushort) |
925 | | static inline uint16_t CRYPTO_bswap2(uint16_t x) { |
926 | | return _byteswap_ushort(x); |
927 | | } |
928 | | |
929 | | static inline uint32_t CRYPTO_bswap4(uint32_t x) { |
930 | | return _byteswap_ulong(x); |
931 | | } |
932 | | |
933 | | static inline uint64_t CRYPTO_bswap8(uint64_t x) { |
934 | | return _byteswap_uint64(x); |
935 | | } |
936 | | #else |
937 | | static inline uint16_t CRYPTO_bswap2(uint16_t x) { |
938 | | return (x >> 8) | (x << 8); |
939 | | } |
940 | | |
941 | | static inline uint32_t CRYPTO_bswap4(uint32_t x) { |
942 | | x = (x >> 16) | (x << 16); |
943 | | x = ((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8); |
944 | | return x; |
945 | | } |
946 | | |
947 | | static inline uint64_t CRYPTO_bswap8(uint64_t x) { |
948 | | return CRYPTO_bswap4(x >> 32) | (((uint64_t)CRYPTO_bswap4(x)) << 32); |
949 | | } |
950 | | #endif |
951 | | |
952 | | |
953 | | // Language bug workarounds. |
954 | | // |
955 | | // Most C standard library functions are undefined if passed NULL, even when the |
956 | | // corresponding length is zero. This gives them (and, in turn, all functions |
957 | | // which call them) surprising behavior on empty arrays. Some compilers will |
958 | | // miscompile code due to this rule. See also |
959 | | // https://www.imperialviolet.org/2016/06/26/nonnull.html |
960 | | // |
961 | | // These wrapper functions behave the same as the corresponding C standard |
962 | | // functions, but behave as expected when passed NULL if the length is zero. |
963 | | // |
964 | | // Note |OPENSSL_memcmp| is a different function from |CRYPTO_memcmp|. |
965 | | |
966 | | // C++ defines |memchr| as a const-correct overload. |
967 | | #if defined(__cplusplus) |
968 | | extern "C++" { |
969 | | |
970 | | static inline const void *OPENSSL_memchr(const void *s, int c, size_t n) { |
971 | | if (n == 0) { |
972 | | return NULL; |
973 | | } |
974 | | |
975 | | return memchr(s, c, n); |
976 | | } |
977 | | |
978 | | static inline void *OPENSSL_memchr(void *s, int c, size_t n) { |
979 | | if (n == 0) { |
980 | | return NULL; |
981 | | } |
982 | | |
983 | | return memchr(s, c, n); |
984 | | } |
985 | | |
986 | | } // extern "C++" |
987 | | #else // __cplusplus |
988 | | |
989 | 0 | static inline void *OPENSSL_memchr(const void *s, int c, size_t n) { |
990 | 0 | if (n == 0) { |
991 | 0 | return NULL; |
992 | 0 | } |
993 | | |
994 | 0 | return memchr(s, c, n); |
995 | 0 | } Unexecuted instantiation: bcm.c:OPENSSL_memchr Unexecuted instantiation: cbb.c:OPENSSL_memchr Unexecuted instantiation: cbs.c:OPENSSL_memchr Unexecuted instantiation: crypto.c:OPENSSL_memchr Unexecuted instantiation: err.c:OPENSSL_memchr Unexecuted instantiation: engine.c:OPENSSL_memchr Unexecuted instantiation: evp.c:OPENSSL_memchr Unexecuted instantiation: evp_ctx.c:OPENSSL_memchr Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_memchr Unexecuted instantiation: p_ec.c:OPENSSL_memchr Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_memchr Unexecuted instantiation: p_hkdf.c:OPENSSL_memchr Unexecuted instantiation: p_rsa.c:OPENSSL_memchr Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_memchr Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_memchr Unexecuted instantiation: ex_data.c:OPENSSL_memchr Unexecuted instantiation: mem.c:OPENSSL_memchr Unexecuted instantiation: deterministic.c:OPENSSL_memchr Unexecuted instantiation: forkunsafe.c:OPENSSL_memchr Unexecuted instantiation: refcount.c:OPENSSL_memchr Unexecuted instantiation: rsa_asn1.c:OPENSSL_memchr Unexecuted instantiation: rsa_crypt.c:OPENSSL_memchr Unexecuted instantiation: stack.c:OPENSSL_memchr Unexecuted instantiation: thread_pthread.c:OPENSSL_memchr Unexecuted instantiation: convert.c:OPENSSL_memchr Unexecuted instantiation: asn1_compat.c:OPENSSL_memchr Unexecuted instantiation: chacha.c:OPENSSL_memchr Unexecuted instantiation: cpu_intel.c:OPENSSL_memchr Unexecuted instantiation: curve25519.c:OPENSSL_memchr Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_memchr Unexecuted instantiation: dsa.c:OPENSSL_memchr Unexecuted instantiation: dsa_asn1.c:OPENSSL_memchr Unexecuted instantiation: ecdh_extra.c:OPENSSL_memchr Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_memchr Unexecuted instantiation: ec_asn1.c:OPENSSL_memchr Unexecuted instantiation: bio.c:OPENSSL_memchr Unexecuted instantiation: file.c:OPENSSL_memchr |
996 | | |
997 | | #endif // __cplusplus |
998 | | |
999 | 0 | static inline int OPENSSL_memcmp(const void *s1, const void *s2, size_t n) { |
1000 | 0 | if (n == 0) { |
1001 | 0 | return 0; |
1002 | 0 | } |
1003 | | |
1004 | 0 | return memcmp(s1, s2, n); |
1005 | 0 | } Unexecuted instantiation: bcm.c:OPENSSL_memcmp Unexecuted instantiation: cbb.c:OPENSSL_memcmp Unexecuted instantiation: cbs.c:OPENSSL_memcmp Unexecuted instantiation: crypto.c:OPENSSL_memcmp Unexecuted instantiation: err.c:OPENSSL_memcmp Unexecuted instantiation: engine.c:OPENSSL_memcmp Unexecuted instantiation: evp.c:OPENSSL_memcmp Unexecuted instantiation: evp_ctx.c:OPENSSL_memcmp Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_memcmp Unexecuted instantiation: p_ec.c:OPENSSL_memcmp Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_memcmp Unexecuted instantiation: p_hkdf.c:OPENSSL_memcmp Unexecuted instantiation: p_rsa.c:OPENSSL_memcmp Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_memcmp Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_memcmp Unexecuted instantiation: ex_data.c:OPENSSL_memcmp Unexecuted instantiation: mem.c:OPENSSL_memcmp Unexecuted instantiation: deterministic.c:OPENSSL_memcmp Unexecuted instantiation: forkunsafe.c:OPENSSL_memcmp Unexecuted instantiation: refcount.c:OPENSSL_memcmp Unexecuted instantiation: rsa_asn1.c:OPENSSL_memcmp Unexecuted instantiation: rsa_crypt.c:OPENSSL_memcmp Unexecuted instantiation: stack.c:OPENSSL_memcmp Unexecuted instantiation: thread_pthread.c:OPENSSL_memcmp Unexecuted instantiation: convert.c:OPENSSL_memcmp Unexecuted instantiation: asn1_compat.c:OPENSSL_memcmp Unexecuted instantiation: chacha.c:OPENSSL_memcmp Unexecuted instantiation: cpu_intel.c:OPENSSL_memcmp Unexecuted instantiation: curve25519.c:OPENSSL_memcmp Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_memcmp Unexecuted instantiation: dsa.c:OPENSSL_memcmp Unexecuted instantiation: dsa_asn1.c:OPENSSL_memcmp Unexecuted instantiation: ecdh_extra.c:OPENSSL_memcmp Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_memcmp Unexecuted instantiation: ec_asn1.c:OPENSSL_memcmp Unexecuted instantiation: bio.c:OPENSSL_memcmp Unexecuted instantiation: file.c:OPENSSL_memcmp |
1006 | | |
1007 | 1.06M | static inline void *OPENSSL_memcpy(void *dst, const void *src, size_t n) { |
1008 | 1.06M | if (n == 0) { |
1009 | 13.6k | return dst; |
1010 | 13.6k | } |
1011 | | |
1012 | 1.04M | return memcpy(dst, src, n); |
1013 | 1.06M | } Line | Count | Source | 1007 | 1.06M | static inline void *OPENSSL_memcpy(void *dst, const void *src, size_t n) { | 1008 | 1.06M | if (n == 0) { | 1009 | 13.6k | return dst; | 1010 | 13.6k | } | 1011 | | | 1012 | 1.04M | return memcpy(dst, src, n); | 1013 | 1.06M | } |
Unexecuted instantiation: cbb.c:OPENSSL_memcpy Unexecuted instantiation: cbs.c:OPENSSL_memcpy Unexecuted instantiation: crypto.c:OPENSSL_memcpy Unexecuted instantiation: err.c:OPENSSL_memcpy Unexecuted instantiation: engine.c:OPENSSL_memcpy Unexecuted instantiation: evp.c:OPENSSL_memcpy Unexecuted instantiation: evp_ctx.c:OPENSSL_memcpy Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_memcpy Unexecuted instantiation: p_ec.c:OPENSSL_memcpy Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_memcpy Unexecuted instantiation: p_hkdf.c:OPENSSL_memcpy Unexecuted instantiation: p_rsa.c:OPENSSL_memcpy Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_memcpy Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_memcpy Unexecuted instantiation: ex_data.c:OPENSSL_memcpy Unexecuted instantiation: mem.c:OPENSSL_memcpy Unexecuted instantiation: deterministic.c:OPENSSL_memcpy Unexecuted instantiation: forkunsafe.c:OPENSSL_memcpy Unexecuted instantiation: refcount.c:OPENSSL_memcpy Unexecuted instantiation: rsa_asn1.c:OPENSSL_memcpy Unexecuted instantiation: rsa_crypt.c:OPENSSL_memcpy Unexecuted instantiation: stack.c:OPENSSL_memcpy Unexecuted instantiation: thread_pthread.c:OPENSSL_memcpy Unexecuted instantiation: convert.c:OPENSSL_memcpy Unexecuted instantiation: asn1_compat.c:OPENSSL_memcpy Unexecuted instantiation: chacha.c:OPENSSL_memcpy Unexecuted instantiation: cpu_intel.c:OPENSSL_memcpy Unexecuted instantiation: curve25519.c:OPENSSL_memcpy Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_memcpy Unexecuted instantiation: dsa.c:OPENSSL_memcpy Unexecuted instantiation: dsa_asn1.c:OPENSSL_memcpy Unexecuted instantiation: ecdh_extra.c:OPENSSL_memcpy Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_memcpy Unexecuted instantiation: ec_asn1.c:OPENSSL_memcpy Unexecuted instantiation: bio.c:OPENSSL_memcpy Unexecuted instantiation: file.c:OPENSSL_memcpy |
1014 | | |
1015 | 298 | static inline void *OPENSSL_memmove(void *dst, const void *src, size_t n) { |
1016 | 298 | if (n == 0) { |
1017 | 0 | return dst; |
1018 | 0 | } |
1019 | | |
1020 | 298 | return memmove(dst, src, n); |
1021 | 298 | } Line | Count | Source | 1015 | 298 | static inline void *OPENSSL_memmove(void *dst, const void *src, size_t n) { | 1016 | 298 | if (n == 0) { | 1017 | 0 | return dst; | 1018 | 0 | } | 1019 | | | 1020 | 298 | return memmove(dst, src, n); | 1021 | 298 | } |
Unexecuted instantiation: cbb.c:OPENSSL_memmove Unexecuted instantiation: cbs.c:OPENSSL_memmove Unexecuted instantiation: crypto.c:OPENSSL_memmove Unexecuted instantiation: err.c:OPENSSL_memmove Unexecuted instantiation: engine.c:OPENSSL_memmove Unexecuted instantiation: evp.c:OPENSSL_memmove Unexecuted instantiation: evp_ctx.c:OPENSSL_memmove Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_memmove Unexecuted instantiation: p_ec.c:OPENSSL_memmove Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_memmove Unexecuted instantiation: p_hkdf.c:OPENSSL_memmove Unexecuted instantiation: p_rsa.c:OPENSSL_memmove Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_memmove Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_memmove Unexecuted instantiation: ex_data.c:OPENSSL_memmove Unexecuted instantiation: mem.c:OPENSSL_memmove Unexecuted instantiation: deterministic.c:OPENSSL_memmove Unexecuted instantiation: forkunsafe.c:OPENSSL_memmove Unexecuted instantiation: refcount.c:OPENSSL_memmove Unexecuted instantiation: rsa_asn1.c:OPENSSL_memmove Unexecuted instantiation: rsa_crypt.c:OPENSSL_memmove Unexecuted instantiation: stack.c:OPENSSL_memmove Unexecuted instantiation: thread_pthread.c:OPENSSL_memmove Unexecuted instantiation: convert.c:OPENSSL_memmove Unexecuted instantiation: asn1_compat.c:OPENSSL_memmove Unexecuted instantiation: chacha.c:OPENSSL_memmove Unexecuted instantiation: cpu_intel.c:OPENSSL_memmove Unexecuted instantiation: curve25519.c:OPENSSL_memmove Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_memmove Unexecuted instantiation: dsa.c:OPENSSL_memmove Unexecuted instantiation: dsa_asn1.c:OPENSSL_memmove Unexecuted instantiation: ecdh_extra.c:OPENSSL_memmove Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_memmove Unexecuted instantiation: ec_asn1.c:OPENSSL_memmove Unexecuted instantiation: bio.c:OPENSSL_memmove Unexecuted instantiation: file.c:OPENSSL_memmove |
1022 | | |
1023 | 61.4k | static inline void *OPENSSL_memset(void *dst, int c, size_t n) { |
1024 | 61.4k | if (n == 0) { |
1025 | 5.16k | return dst; |
1026 | 5.16k | } |
1027 | | |
1028 | 56.2k | return memset(dst, c, n); |
1029 | 61.4k | } Line | Count | Source | 1023 | 22.2k | static inline void *OPENSSL_memset(void *dst, int c, size_t n) { | 1024 | 22.2k | if (n == 0) { | 1025 | 5.16k | return dst; | 1026 | 5.16k | } | 1027 | | | 1028 | 17.1k | return memset(dst, c, n); | 1029 | 22.2k | } |
Unexecuted instantiation: cbb.c:OPENSSL_memset Unexecuted instantiation: cbs.c:OPENSSL_memset Unexecuted instantiation: crypto.c:OPENSSL_memset Unexecuted instantiation: err.c:OPENSSL_memset Unexecuted instantiation: engine.c:OPENSSL_memset Unexecuted instantiation: evp.c:OPENSSL_memset Unexecuted instantiation: evp_ctx.c:OPENSSL_memset Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_memset Unexecuted instantiation: p_ec.c:OPENSSL_memset Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_memset Unexecuted instantiation: p_hkdf.c:OPENSSL_memset Unexecuted instantiation: p_rsa.c:OPENSSL_memset Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_memset Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_memset Unexecuted instantiation: ex_data.c:OPENSSL_memset Line | Count | Source | 1023 | 35.5k | static inline void *OPENSSL_memset(void *dst, int c, size_t n) { | 1024 | 35.5k | if (n == 0) { | 1025 | 0 | return dst; | 1026 | 0 | } | 1027 | | | 1028 | 35.5k | return memset(dst, c, n); | 1029 | 35.5k | } |
Unexecuted instantiation: deterministic.c:OPENSSL_memset Unexecuted instantiation: forkunsafe.c:OPENSSL_memset Unexecuted instantiation: refcount.c:OPENSSL_memset Unexecuted instantiation: rsa_asn1.c:OPENSSL_memset Unexecuted instantiation: rsa_crypt.c:OPENSSL_memset Line | Count | Source | 1023 | 3.66k | static inline void *OPENSSL_memset(void *dst, int c, size_t n) { | 1024 | 3.66k | if (n == 0) { | 1025 | 0 | return dst; | 1026 | 0 | } | 1027 | | | 1028 | 3.66k | return memset(dst, c, n); | 1029 | 3.66k | } |
Unexecuted instantiation: thread_pthread.c:OPENSSL_memset Unexecuted instantiation: convert.c:OPENSSL_memset Unexecuted instantiation: asn1_compat.c:OPENSSL_memset Unexecuted instantiation: chacha.c:OPENSSL_memset Unexecuted instantiation: cpu_intel.c:OPENSSL_memset Unexecuted instantiation: curve25519.c:OPENSSL_memset Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_memset Unexecuted instantiation: dsa.c:OPENSSL_memset Unexecuted instantiation: dsa_asn1.c:OPENSSL_memset Unexecuted instantiation: ecdh_extra.c:OPENSSL_memset Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_memset Unexecuted instantiation: ec_asn1.c:OPENSSL_memset Unexecuted instantiation: bio.c:OPENSSL_memset Unexecuted instantiation: file.c:OPENSSL_memset |
1030 | | |
1031 | | |
1032 | | // Loads and stores. |
1033 | | // |
1034 | | // The following functions load and store sized integers with the specified |
1035 | | // endianness. They use |memcpy|, and so avoid alignment or strict aliasing |
1036 | | // requirements on the input and output pointers. |
1037 | | |
1038 | 0 | static inline uint32_t CRYPTO_load_u32_le(const void *in) { |
1039 | 0 | uint32_t v; |
1040 | 0 | OPENSSL_memcpy(&v, in, sizeof(v)); |
1041 | 0 | return v; |
1042 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_load_u32_le Unexecuted instantiation: cbb.c:CRYPTO_load_u32_le Unexecuted instantiation: cbs.c:CRYPTO_load_u32_le Unexecuted instantiation: crypto.c:CRYPTO_load_u32_le Unexecuted instantiation: err.c:CRYPTO_load_u32_le Unexecuted instantiation: engine.c:CRYPTO_load_u32_le Unexecuted instantiation: evp.c:CRYPTO_load_u32_le Unexecuted instantiation: evp_ctx.c:CRYPTO_load_u32_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: p_ec.c:CRYPTO_load_u32_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: p_hkdf.c:CRYPTO_load_u32_le Unexecuted instantiation: p_rsa.c:CRYPTO_load_u32_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: ex_data.c:CRYPTO_load_u32_le Unexecuted instantiation: mem.c:CRYPTO_load_u32_le Unexecuted instantiation: deterministic.c:CRYPTO_load_u32_le Unexecuted instantiation: forkunsafe.c:CRYPTO_load_u32_le Unexecuted instantiation: refcount.c:CRYPTO_load_u32_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_u32_le Unexecuted instantiation: stack.c:CRYPTO_load_u32_le Unexecuted instantiation: thread_pthread.c:CRYPTO_load_u32_le Unexecuted instantiation: convert.c:CRYPTO_load_u32_le Unexecuted instantiation: asn1_compat.c:CRYPTO_load_u32_le Unexecuted instantiation: chacha.c:CRYPTO_load_u32_le Unexecuted instantiation: cpu_intel.c:CRYPTO_load_u32_le Unexecuted instantiation: curve25519.c:CRYPTO_load_u32_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_u32_le Unexecuted instantiation: dsa.c:CRYPTO_load_u32_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_u32_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: ec_asn1.c:CRYPTO_load_u32_le Unexecuted instantiation: bio.c:CRYPTO_load_u32_le Unexecuted instantiation: file.c:CRYPTO_load_u32_le |
1043 | | |
1044 | 0 | static inline void CRYPTO_store_u32_le(void *out, uint32_t v) { |
1045 | 0 | OPENSSL_memcpy(out, &v, sizeof(v)); |
1046 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_store_u32_le Unexecuted instantiation: cbb.c:CRYPTO_store_u32_le Unexecuted instantiation: cbs.c:CRYPTO_store_u32_le Unexecuted instantiation: crypto.c:CRYPTO_store_u32_le Unexecuted instantiation: err.c:CRYPTO_store_u32_le Unexecuted instantiation: engine.c:CRYPTO_store_u32_le Unexecuted instantiation: evp.c:CRYPTO_store_u32_le Unexecuted instantiation: evp_ctx.c:CRYPTO_store_u32_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: p_ec.c:CRYPTO_store_u32_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: p_hkdf.c:CRYPTO_store_u32_le Unexecuted instantiation: p_rsa.c:CRYPTO_store_u32_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: ex_data.c:CRYPTO_store_u32_le Unexecuted instantiation: mem.c:CRYPTO_store_u32_le Unexecuted instantiation: deterministic.c:CRYPTO_store_u32_le Unexecuted instantiation: forkunsafe.c:CRYPTO_store_u32_le Unexecuted instantiation: refcount.c:CRYPTO_store_u32_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_store_u32_le Unexecuted instantiation: stack.c:CRYPTO_store_u32_le Unexecuted instantiation: thread_pthread.c:CRYPTO_store_u32_le Unexecuted instantiation: convert.c:CRYPTO_store_u32_le Unexecuted instantiation: asn1_compat.c:CRYPTO_store_u32_le Unexecuted instantiation: chacha.c:CRYPTO_store_u32_le Unexecuted instantiation: cpu_intel.c:CRYPTO_store_u32_le Unexecuted instantiation: curve25519.c:CRYPTO_store_u32_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_store_u32_le Unexecuted instantiation: dsa.c:CRYPTO_store_u32_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_store_u32_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: ec_asn1.c:CRYPTO_store_u32_le Unexecuted instantiation: bio.c:CRYPTO_store_u32_le Unexecuted instantiation: file.c:CRYPTO_store_u32_le |
1047 | | |
1048 | 0 | static inline uint32_t CRYPTO_load_u32_be(const void *in) { |
1049 | 0 | uint32_t v; |
1050 | 0 | OPENSSL_memcpy(&v, in, sizeof(v)); |
1051 | 0 | return CRYPTO_bswap4(v); |
1052 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_load_u32_be Unexecuted instantiation: cbb.c:CRYPTO_load_u32_be Unexecuted instantiation: cbs.c:CRYPTO_load_u32_be Unexecuted instantiation: crypto.c:CRYPTO_load_u32_be Unexecuted instantiation: err.c:CRYPTO_load_u32_be Unexecuted instantiation: engine.c:CRYPTO_load_u32_be Unexecuted instantiation: evp.c:CRYPTO_load_u32_be Unexecuted instantiation: evp_ctx.c:CRYPTO_load_u32_be Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: p_ec.c:CRYPTO_load_u32_be Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: p_hkdf.c:CRYPTO_load_u32_be Unexecuted instantiation: p_rsa.c:CRYPTO_load_u32_be Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: ex_data.c:CRYPTO_load_u32_be Unexecuted instantiation: mem.c:CRYPTO_load_u32_be Unexecuted instantiation: deterministic.c:CRYPTO_load_u32_be Unexecuted instantiation: forkunsafe.c:CRYPTO_load_u32_be Unexecuted instantiation: refcount.c:CRYPTO_load_u32_be Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_u32_be Unexecuted instantiation: stack.c:CRYPTO_load_u32_be Unexecuted instantiation: thread_pthread.c:CRYPTO_load_u32_be Unexecuted instantiation: convert.c:CRYPTO_load_u32_be Unexecuted instantiation: asn1_compat.c:CRYPTO_load_u32_be Unexecuted instantiation: chacha.c:CRYPTO_load_u32_be Unexecuted instantiation: cpu_intel.c:CRYPTO_load_u32_be Unexecuted instantiation: curve25519.c:CRYPTO_load_u32_be Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_u32_be Unexecuted instantiation: dsa.c:CRYPTO_load_u32_be Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_u32_be Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: ec_asn1.c:CRYPTO_load_u32_be Unexecuted instantiation: bio.c:CRYPTO_load_u32_be Unexecuted instantiation: file.c:CRYPTO_load_u32_be |
1053 | | |
1054 | 0 | static inline void CRYPTO_store_u32_be(void *out, uint32_t v) { |
1055 | 0 | v = CRYPTO_bswap4(v); |
1056 | 0 | OPENSSL_memcpy(out, &v, sizeof(v)); |
1057 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_store_u32_be Unexecuted instantiation: cbb.c:CRYPTO_store_u32_be Unexecuted instantiation: cbs.c:CRYPTO_store_u32_be Unexecuted instantiation: crypto.c:CRYPTO_store_u32_be Unexecuted instantiation: err.c:CRYPTO_store_u32_be Unexecuted instantiation: engine.c:CRYPTO_store_u32_be Unexecuted instantiation: evp.c:CRYPTO_store_u32_be Unexecuted instantiation: evp_ctx.c:CRYPTO_store_u32_be Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: p_ec.c:CRYPTO_store_u32_be Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: p_hkdf.c:CRYPTO_store_u32_be Unexecuted instantiation: p_rsa.c:CRYPTO_store_u32_be Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: ex_data.c:CRYPTO_store_u32_be Unexecuted instantiation: mem.c:CRYPTO_store_u32_be Unexecuted instantiation: deterministic.c:CRYPTO_store_u32_be Unexecuted instantiation: forkunsafe.c:CRYPTO_store_u32_be Unexecuted instantiation: refcount.c:CRYPTO_store_u32_be Unexecuted instantiation: rsa_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: rsa_crypt.c:CRYPTO_store_u32_be Unexecuted instantiation: stack.c:CRYPTO_store_u32_be Unexecuted instantiation: thread_pthread.c:CRYPTO_store_u32_be Unexecuted instantiation: convert.c:CRYPTO_store_u32_be Unexecuted instantiation: asn1_compat.c:CRYPTO_store_u32_be Unexecuted instantiation: chacha.c:CRYPTO_store_u32_be Unexecuted instantiation: cpu_intel.c:CRYPTO_store_u32_be Unexecuted instantiation: curve25519.c:CRYPTO_store_u32_be Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_store_u32_be Unexecuted instantiation: dsa.c:CRYPTO_store_u32_be Unexecuted instantiation: dsa_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: ecdh_extra.c:CRYPTO_store_u32_be Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: ec_asn1.c:CRYPTO_store_u32_be Unexecuted instantiation: bio.c:CRYPTO_store_u32_be Unexecuted instantiation: file.c:CRYPTO_store_u32_be |
1058 | | |
1059 | 0 | static inline uint64_t CRYPTO_load_u64_le(const void *in) { |
1060 | 0 | uint64_t v; |
1061 | 0 | OPENSSL_memcpy(&v, in, sizeof(v)); |
1062 | 0 | return v; |
1063 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_load_u64_le Unexecuted instantiation: cbb.c:CRYPTO_load_u64_le Unexecuted instantiation: cbs.c:CRYPTO_load_u64_le Unexecuted instantiation: crypto.c:CRYPTO_load_u64_le Unexecuted instantiation: err.c:CRYPTO_load_u64_le Unexecuted instantiation: engine.c:CRYPTO_load_u64_le Unexecuted instantiation: evp.c:CRYPTO_load_u64_le Unexecuted instantiation: evp_ctx.c:CRYPTO_load_u64_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: p_ec.c:CRYPTO_load_u64_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: p_hkdf.c:CRYPTO_load_u64_le Unexecuted instantiation: p_rsa.c:CRYPTO_load_u64_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: ex_data.c:CRYPTO_load_u64_le Unexecuted instantiation: mem.c:CRYPTO_load_u64_le Unexecuted instantiation: deterministic.c:CRYPTO_load_u64_le Unexecuted instantiation: forkunsafe.c:CRYPTO_load_u64_le Unexecuted instantiation: refcount.c:CRYPTO_load_u64_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_u64_le Unexecuted instantiation: stack.c:CRYPTO_load_u64_le Unexecuted instantiation: thread_pthread.c:CRYPTO_load_u64_le Unexecuted instantiation: convert.c:CRYPTO_load_u64_le Unexecuted instantiation: asn1_compat.c:CRYPTO_load_u64_le Unexecuted instantiation: chacha.c:CRYPTO_load_u64_le Unexecuted instantiation: cpu_intel.c:CRYPTO_load_u64_le Unexecuted instantiation: curve25519.c:CRYPTO_load_u64_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_u64_le Unexecuted instantiation: dsa.c:CRYPTO_load_u64_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_u64_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: ec_asn1.c:CRYPTO_load_u64_le Unexecuted instantiation: bio.c:CRYPTO_load_u64_le Unexecuted instantiation: file.c:CRYPTO_load_u64_le |
1064 | | |
1065 | 0 | static inline void CRYPTO_store_u64_le(void *out, uint64_t v) { |
1066 | 0 | OPENSSL_memcpy(out, &v, sizeof(v)); |
1067 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_store_u64_le Unexecuted instantiation: cbb.c:CRYPTO_store_u64_le Unexecuted instantiation: cbs.c:CRYPTO_store_u64_le Unexecuted instantiation: crypto.c:CRYPTO_store_u64_le Unexecuted instantiation: err.c:CRYPTO_store_u64_le Unexecuted instantiation: engine.c:CRYPTO_store_u64_le Unexecuted instantiation: evp.c:CRYPTO_store_u64_le Unexecuted instantiation: evp_ctx.c:CRYPTO_store_u64_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: p_ec.c:CRYPTO_store_u64_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: p_hkdf.c:CRYPTO_store_u64_le Unexecuted instantiation: p_rsa.c:CRYPTO_store_u64_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: ex_data.c:CRYPTO_store_u64_le Unexecuted instantiation: mem.c:CRYPTO_store_u64_le Unexecuted instantiation: deterministic.c:CRYPTO_store_u64_le Unexecuted instantiation: forkunsafe.c:CRYPTO_store_u64_le Unexecuted instantiation: refcount.c:CRYPTO_store_u64_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_store_u64_le Unexecuted instantiation: stack.c:CRYPTO_store_u64_le Unexecuted instantiation: thread_pthread.c:CRYPTO_store_u64_le Unexecuted instantiation: convert.c:CRYPTO_store_u64_le Unexecuted instantiation: asn1_compat.c:CRYPTO_store_u64_le Unexecuted instantiation: chacha.c:CRYPTO_store_u64_le Unexecuted instantiation: cpu_intel.c:CRYPTO_store_u64_le Unexecuted instantiation: curve25519.c:CRYPTO_store_u64_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_store_u64_le Unexecuted instantiation: dsa.c:CRYPTO_store_u64_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_store_u64_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: ec_asn1.c:CRYPTO_store_u64_le Unexecuted instantiation: bio.c:CRYPTO_store_u64_le Unexecuted instantiation: file.c:CRYPTO_store_u64_le |
1068 | | |
1069 | 0 | static inline uint64_t CRYPTO_load_u64_be(const void *ptr) { |
1070 | 0 | uint64_t ret; |
1071 | 0 | OPENSSL_memcpy(&ret, ptr, sizeof(ret)); |
1072 | 0 | return CRYPTO_bswap8(ret); |
1073 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_load_u64_be Unexecuted instantiation: cbb.c:CRYPTO_load_u64_be Unexecuted instantiation: cbs.c:CRYPTO_load_u64_be Unexecuted instantiation: crypto.c:CRYPTO_load_u64_be Unexecuted instantiation: err.c:CRYPTO_load_u64_be Unexecuted instantiation: engine.c:CRYPTO_load_u64_be Unexecuted instantiation: evp.c:CRYPTO_load_u64_be Unexecuted instantiation: evp_ctx.c:CRYPTO_load_u64_be Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: p_ec.c:CRYPTO_load_u64_be Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: p_hkdf.c:CRYPTO_load_u64_be Unexecuted instantiation: p_rsa.c:CRYPTO_load_u64_be Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: ex_data.c:CRYPTO_load_u64_be Unexecuted instantiation: mem.c:CRYPTO_load_u64_be Unexecuted instantiation: deterministic.c:CRYPTO_load_u64_be Unexecuted instantiation: forkunsafe.c:CRYPTO_load_u64_be Unexecuted instantiation: refcount.c:CRYPTO_load_u64_be Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_u64_be Unexecuted instantiation: stack.c:CRYPTO_load_u64_be Unexecuted instantiation: thread_pthread.c:CRYPTO_load_u64_be Unexecuted instantiation: convert.c:CRYPTO_load_u64_be Unexecuted instantiation: asn1_compat.c:CRYPTO_load_u64_be Unexecuted instantiation: chacha.c:CRYPTO_load_u64_be Unexecuted instantiation: cpu_intel.c:CRYPTO_load_u64_be Unexecuted instantiation: curve25519.c:CRYPTO_load_u64_be Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_u64_be Unexecuted instantiation: dsa.c:CRYPTO_load_u64_be Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_u64_be Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: ec_asn1.c:CRYPTO_load_u64_be Unexecuted instantiation: bio.c:CRYPTO_load_u64_be Unexecuted instantiation: file.c:CRYPTO_load_u64_be |
1074 | | |
1075 | 0 | static inline void CRYPTO_store_u64_be(void *out, uint64_t v) { |
1076 | 0 | v = CRYPTO_bswap8(v); |
1077 | 0 | OPENSSL_memcpy(out, &v, sizeof(v)); |
1078 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_store_u64_be Unexecuted instantiation: cbb.c:CRYPTO_store_u64_be Unexecuted instantiation: cbs.c:CRYPTO_store_u64_be Unexecuted instantiation: crypto.c:CRYPTO_store_u64_be Unexecuted instantiation: err.c:CRYPTO_store_u64_be Unexecuted instantiation: engine.c:CRYPTO_store_u64_be Unexecuted instantiation: evp.c:CRYPTO_store_u64_be Unexecuted instantiation: evp_ctx.c:CRYPTO_store_u64_be Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: p_ec.c:CRYPTO_store_u64_be Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: p_hkdf.c:CRYPTO_store_u64_be Unexecuted instantiation: p_rsa.c:CRYPTO_store_u64_be Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: ex_data.c:CRYPTO_store_u64_be Unexecuted instantiation: mem.c:CRYPTO_store_u64_be Unexecuted instantiation: deterministic.c:CRYPTO_store_u64_be Unexecuted instantiation: forkunsafe.c:CRYPTO_store_u64_be Unexecuted instantiation: refcount.c:CRYPTO_store_u64_be Unexecuted instantiation: rsa_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: rsa_crypt.c:CRYPTO_store_u64_be Unexecuted instantiation: stack.c:CRYPTO_store_u64_be Unexecuted instantiation: thread_pthread.c:CRYPTO_store_u64_be Unexecuted instantiation: convert.c:CRYPTO_store_u64_be Unexecuted instantiation: asn1_compat.c:CRYPTO_store_u64_be Unexecuted instantiation: chacha.c:CRYPTO_store_u64_be Unexecuted instantiation: cpu_intel.c:CRYPTO_store_u64_be Unexecuted instantiation: curve25519.c:CRYPTO_store_u64_be Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_store_u64_be Unexecuted instantiation: dsa.c:CRYPTO_store_u64_be Unexecuted instantiation: dsa_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: ecdh_extra.c:CRYPTO_store_u64_be Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: ec_asn1.c:CRYPTO_store_u64_be Unexecuted instantiation: bio.c:CRYPTO_store_u64_be Unexecuted instantiation: file.c:CRYPTO_store_u64_be |
1079 | | |
1080 | 0 | static inline crypto_word_t CRYPTO_load_word_le(const void *in) { |
1081 | 0 | crypto_word_t v; |
1082 | 0 | OPENSSL_memcpy(&v, in, sizeof(v)); |
1083 | 0 | return v; |
1084 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_load_word_le Unexecuted instantiation: cbb.c:CRYPTO_load_word_le Unexecuted instantiation: cbs.c:CRYPTO_load_word_le Unexecuted instantiation: crypto.c:CRYPTO_load_word_le Unexecuted instantiation: err.c:CRYPTO_load_word_le Unexecuted instantiation: engine.c:CRYPTO_load_word_le Unexecuted instantiation: evp.c:CRYPTO_load_word_le Unexecuted instantiation: evp_ctx.c:CRYPTO_load_word_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: p_ec.c:CRYPTO_load_word_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: p_hkdf.c:CRYPTO_load_word_le Unexecuted instantiation: p_rsa.c:CRYPTO_load_word_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: ex_data.c:CRYPTO_load_word_le Unexecuted instantiation: mem.c:CRYPTO_load_word_le Unexecuted instantiation: deterministic.c:CRYPTO_load_word_le Unexecuted instantiation: forkunsafe.c:CRYPTO_load_word_le Unexecuted instantiation: refcount.c:CRYPTO_load_word_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_word_le Unexecuted instantiation: stack.c:CRYPTO_load_word_le Unexecuted instantiation: thread_pthread.c:CRYPTO_load_word_le Unexecuted instantiation: convert.c:CRYPTO_load_word_le Unexecuted instantiation: asn1_compat.c:CRYPTO_load_word_le Unexecuted instantiation: chacha.c:CRYPTO_load_word_le Unexecuted instantiation: cpu_intel.c:CRYPTO_load_word_le Unexecuted instantiation: curve25519.c:CRYPTO_load_word_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_word_le Unexecuted instantiation: dsa.c:CRYPTO_load_word_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_word_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: ec_asn1.c:CRYPTO_load_word_le Unexecuted instantiation: bio.c:CRYPTO_load_word_le Unexecuted instantiation: file.c:CRYPTO_load_word_le |
1085 | | |
1086 | 0 | static inline void CRYPTO_store_word_le(void *out, crypto_word_t v) { |
1087 | 0 | OPENSSL_memcpy(out, &v, sizeof(v)); |
1088 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_store_word_le Unexecuted instantiation: cbb.c:CRYPTO_store_word_le Unexecuted instantiation: cbs.c:CRYPTO_store_word_le Unexecuted instantiation: crypto.c:CRYPTO_store_word_le Unexecuted instantiation: err.c:CRYPTO_store_word_le Unexecuted instantiation: engine.c:CRYPTO_store_word_le Unexecuted instantiation: evp.c:CRYPTO_store_word_le Unexecuted instantiation: evp_ctx.c:CRYPTO_store_word_le Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: p_ec.c:CRYPTO_store_word_le Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: p_hkdf.c:CRYPTO_store_word_le Unexecuted instantiation: p_rsa.c:CRYPTO_store_word_le Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: ex_data.c:CRYPTO_store_word_le Unexecuted instantiation: mem.c:CRYPTO_store_word_le Unexecuted instantiation: deterministic.c:CRYPTO_store_word_le Unexecuted instantiation: forkunsafe.c:CRYPTO_store_word_le Unexecuted instantiation: refcount.c:CRYPTO_store_word_le Unexecuted instantiation: rsa_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: rsa_crypt.c:CRYPTO_store_word_le Unexecuted instantiation: stack.c:CRYPTO_store_word_le Unexecuted instantiation: thread_pthread.c:CRYPTO_store_word_le Unexecuted instantiation: convert.c:CRYPTO_store_word_le Unexecuted instantiation: asn1_compat.c:CRYPTO_store_word_le Unexecuted instantiation: chacha.c:CRYPTO_store_word_le Unexecuted instantiation: cpu_intel.c:CRYPTO_store_word_le Unexecuted instantiation: curve25519.c:CRYPTO_store_word_le Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_store_word_le Unexecuted instantiation: dsa.c:CRYPTO_store_word_le Unexecuted instantiation: dsa_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: ecdh_extra.c:CRYPTO_store_word_le Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: ec_asn1.c:CRYPTO_store_word_le Unexecuted instantiation: bio.c:CRYPTO_store_word_le Unexecuted instantiation: file.c:CRYPTO_store_word_le |
1089 | | |
1090 | 1.04M | static inline crypto_word_t CRYPTO_load_word_be(const void *in) { |
1091 | 1.04M | crypto_word_t v; |
1092 | 1.04M | OPENSSL_memcpy(&v, in, sizeof(v)); |
1093 | 1.04M | #if defined(OPENSSL_64_BIT) |
1094 | 1.04M | static_assert(sizeof(v) == 8, "crypto_word_t has unexpected size"); |
1095 | 1.04M | return CRYPTO_bswap8(v); |
1096 | | #else |
1097 | | static_assert(sizeof(v) == 4, "crypto_word_t has unexpected size"); |
1098 | | return CRYPTO_bswap4(v); |
1099 | | #endif |
1100 | 1.04M | } bcm.c:CRYPTO_load_word_be Line | Count | Source | 1090 | 1.04M | static inline crypto_word_t CRYPTO_load_word_be(const void *in) { | 1091 | 1.04M | crypto_word_t v; | 1092 | 1.04M | OPENSSL_memcpy(&v, in, sizeof(v)); | 1093 | 1.04M | #if defined(OPENSSL_64_BIT) | 1094 | 1.04M | static_assert(sizeof(v) == 8, "crypto_word_t has unexpected size"); | 1095 | 1.04M | return CRYPTO_bswap8(v); | 1096 | | #else | 1097 | | static_assert(sizeof(v) == 4, "crypto_word_t has unexpected size"); | 1098 | | return CRYPTO_bswap4(v); | 1099 | | #endif | 1100 | 1.04M | } |
Unexecuted instantiation: cbb.c:CRYPTO_load_word_be Unexecuted instantiation: cbs.c:CRYPTO_load_word_be Unexecuted instantiation: crypto.c:CRYPTO_load_word_be Unexecuted instantiation: err.c:CRYPTO_load_word_be Unexecuted instantiation: engine.c:CRYPTO_load_word_be Unexecuted instantiation: evp.c:CRYPTO_load_word_be Unexecuted instantiation: evp_ctx.c:CRYPTO_load_word_be Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: p_ec.c:CRYPTO_load_word_be Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: p_hkdf.c:CRYPTO_load_word_be Unexecuted instantiation: p_rsa.c:CRYPTO_load_word_be Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: ex_data.c:CRYPTO_load_word_be Unexecuted instantiation: mem.c:CRYPTO_load_word_be Unexecuted instantiation: deterministic.c:CRYPTO_load_word_be Unexecuted instantiation: forkunsafe.c:CRYPTO_load_word_be Unexecuted instantiation: refcount.c:CRYPTO_load_word_be Unexecuted instantiation: rsa_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: rsa_crypt.c:CRYPTO_load_word_be Unexecuted instantiation: stack.c:CRYPTO_load_word_be Unexecuted instantiation: thread_pthread.c:CRYPTO_load_word_be Unexecuted instantiation: convert.c:CRYPTO_load_word_be Unexecuted instantiation: asn1_compat.c:CRYPTO_load_word_be Unexecuted instantiation: chacha.c:CRYPTO_load_word_be Unexecuted instantiation: cpu_intel.c:CRYPTO_load_word_be Unexecuted instantiation: curve25519.c:CRYPTO_load_word_be Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_load_word_be Unexecuted instantiation: dsa.c:CRYPTO_load_word_be Unexecuted instantiation: dsa_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: ecdh_extra.c:CRYPTO_load_word_be Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: ec_asn1.c:CRYPTO_load_word_be Unexecuted instantiation: bio.c:CRYPTO_load_word_be Unexecuted instantiation: file.c:CRYPTO_load_word_be |
1101 | | |
1102 | | |
1103 | | // Bit rotation functions. |
1104 | | // |
1105 | | // Note these functions use |(-shift) & 31|, etc., because shifting by the bit |
1106 | | // width is undefined. Both Clang and GCC recognize this pattern as a rotation, |
1107 | | // but MSVC does not. Instead, we call MSVC's built-in functions. |
1108 | | |
1109 | 0 | static inline uint32_t CRYPTO_rotl_u32(uint32_t value, int shift) { |
1110 | | #if defined(_MSC_VER) |
1111 | | return _rotl(value, shift); |
1112 | | #else |
1113 | 0 | return (value << shift) | (value >> ((-shift) & 31)); |
1114 | 0 | #endif |
1115 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_rotl_u32 Unexecuted instantiation: cbb.c:CRYPTO_rotl_u32 Unexecuted instantiation: cbs.c:CRYPTO_rotl_u32 Unexecuted instantiation: crypto.c:CRYPTO_rotl_u32 Unexecuted instantiation: err.c:CRYPTO_rotl_u32 Unexecuted instantiation: engine.c:CRYPTO_rotl_u32 Unexecuted instantiation: evp.c:CRYPTO_rotl_u32 Unexecuted instantiation: evp_ctx.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_ec.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_hkdf.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_rsa.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: ex_data.c:CRYPTO_rotl_u32 Unexecuted instantiation: mem.c:CRYPTO_rotl_u32 Unexecuted instantiation: deterministic.c:CRYPTO_rotl_u32 Unexecuted instantiation: forkunsafe.c:CRYPTO_rotl_u32 Unexecuted instantiation: refcount.c:CRYPTO_rotl_u32 Unexecuted instantiation: rsa_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: rsa_crypt.c:CRYPTO_rotl_u32 Unexecuted instantiation: stack.c:CRYPTO_rotl_u32 Unexecuted instantiation: thread_pthread.c:CRYPTO_rotl_u32 Unexecuted instantiation: convert.c:CRYPTO_rotl_u32 Unexecuted instantiation: asn1_compat.c:CRYPTO_rotl_u32 Unexecuted instantiation: chacha.c:CRYPTO_rotl_u32 Unexecuted instantiation: cpu_intel.c:CRYPTO_rotl_u32 Unexecuted instantiation: curve25519.c:CRYPTO_rotl_u32 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_rotl_u32 Unexecuted instantiation: dsa.c:CRYPTO_rotl_u32 Unexecuted instantiation: dsa_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: ecdh_extra.c:CRYPTO_rotl_u32 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: ec_asn1.c:CRYPTO_rotl_u32 Unexecuted instantiation: bio.c:CRYPTO_rotl_u32 Unexecuted instantiation: file.c:CRYPTO_rotl_u32 |
1116 | | |
1117 | 0 | static inline uint32_t CRYPTO_rotr_u32(uint32_t value, int shift) { |
1118 | 0 | #if defined(_MSC_VER) |
1119 | 0 | return _rotr(value, shift); |
1120 | 0 | #else |
1121 | 0 | return (value >> shift) | (value << ((-shift) & 31)); |
1122 | 0 | #endif |
1123 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_rotr_u32 Unexecuted instantiation: cbb.c:CRYPTO_rotr_u32 Unexecuted instantiation: cbs.c:CRYPTO_rotr_u32 Unexecuted instantiation: crypto.c:CRYPTO_rotr_u32 Unexecuted instantiation: err.c:CRYPTO_rotr_u32 Unexecuted instantiation: engine.c:CRYPTO_rotr_u32 Unexecuted instantiation: evp.c:CRYPTO_rotr_u32 Unexecuted instantiation: evp_ctx.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_ec.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_hkdf.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_rsa.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: ex_data.c:CRYPTO_rotr_u32 Unexecuted instantiation: mem.c:CRYPTO_rotr_u32 Unexecuted instantiation: deterministic.c:CRYPTO_rotr_u32 Unexecuted instantiation: forkunsafe.c:CRYPTO_rotr_u32 Unexecuted instantiation: refcount.c:CRYPTO_rotr_u32 Unexecuted instantiation: rsa_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: rsa_crypt.c:CRYPTO_rotr_u32 Unexecuted instantiation: stack.c:CRYPTO_rotr_u32 Unexecuted instantiation: thread_pthread.c:CRYPTO_rotr_u32 Unexecuted instantiation: convert.c:CRYPTO_rotr_u32 Unexecuted instantiation: asn1_compat.c:CRYPTO_rotr_u32 Unexecuted instantiation: chacha.c:CRYPTO_rotr_u32 Unexecuted instantiation: cpu_intel.c:CRYPTO_rotr_u32 Unexecuted instantiation: curve25519.c:CRYPTO_rotr_u32 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_rotr_u32 Unexecuted instantiation: dsa.c:CRYPTO_rotr_u32 Unexecuted instantiation: dsa_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: ecdh_extra.c:CRYPTO_rotr_u32 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: ec_asn1.c:CRYPTO_rotr_u32 Unexecuted instantiation: bio.c:CRYPTO_rotr_u32 Unexecuted instantiation: file.c:CRYPTO_rotr_u32 |
1124 | | |
1125 | 0 | static inline uint64_t CRYPTO_rotl_u64(uint64_t value, int shift) { |
1126 | 0 | #if defined(_MSC_VER) |
1127 | 0 | return _rotl64(value, shift); |
1128 | 0 | #else |
1129 | 0 | return (value << shift) | (value >> ((-shift) & 63)); |
1130 | 0 | #endif |
1131 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_rotl_u64 Unexecuted instantiation: cbb.c:CRYPTO_rotl_u64 Unexecuted instantiation: cbs.c:CRYPTO_rotl_u64 Unexecuted instantiation: crypto.c:CRYPTO_rotl_u64 Unexecuted instantiation: err.c:CRYPTO_rotl_u64 Unexecuted instantiation: engine.c:CRYPTO_rotl_u64 Unexecuted instantiation: evp.c:CRYPTO_rotl_u64 Unexecuted instantiation: evp_ctx.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_ec.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_hkdf.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_rsa.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: ex_data.c:CRYPTO_rotl_u64 Unexecuted instantiation: mem.c:CRYPTO_rotl_u64 Unexecuted instantiation: deterministic.c:CRYPTO_rotl_u64 Unexecuted instantiation: forkunsafe.c:CRYPTO_rotl_u64 Unexecuted instantiation: refcount.c:CRYPTO_rotl_u64 Unexecuted instantiation: rsa_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: rsa_crypt.c:CRYPTO_rotl_u64 Unexecuted instantiation: stack.c:CRYPTO_rotl_u64 Unexecuted instantiation: thread_pthread.c:CRYPTO_rotl_u64 Unexecuted instantiation: convert.c:CRYPTO_rotl_u64 Unexecuted instantiation: asn1_compat.c:CRYPTO_rotl_u64 Unexecuted instantiation: chacha.c:CRYPTO_rotl_u64 Unexecuted instantiation: cpu_intel.c:CRYPTO_rotl_u64 Unexecuted instantiation: curve25519.c:CRYPTO_rotl_u64 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_rotl_u64 Unexecuted instantiation: dsa.c:CRYPTO_rotl_u64 Unexecuted instantiation: dsa_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: ecdh_extra.c:CRYPTO_rotl_u64 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: ec_asn1.c:CRYPTO_rotl_u64 Unexecuted instantiation: bio.c:CRYPTO_rotl_u64 Unexecuted instantiation: file.c:CRYPTO_rotl_u64 |
1132 | | |
1133 | 0 | static inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) { |
1134 | 0 | #if defined(_MSC_VER) |
1135 | 0 | return _rotr64(value, shift); |
1136 | 0 | #else |
1137 | 0 | return (value >> shift) | (value << ((-shift) & 63)); |
1138 | 0 | #endif |
1139 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_rotr_u64 Unexecuted instantiation: cbb.c:CRYPTO_rotr_u64 Unexecuted instantiation: cbs.c:CRYPTO_rotr_u64 Unexecuted instantiation: crypto.c:CRYPTO_rotr_u64 Unexecuted instantiation: err.c:CRYPTO_rotr_u64 Unexecuted instantiation: engine.c:CRYPTO_rotr_u64 Unexecuted instantiation: evp.c:CRYPTO_rotr_u64 Unexecuted instantiation: evp_ctx.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_ec.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_hkdf.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_rsa.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: ex_data.c:CRYPTO_rotr_u64 Unexecuted instantiation: mem.c:CRYPTO_rotr_u64 Unexecuted instantiation: deterministic.c:CRYPTO_rotr_u64 Unexecuted instantiation: forkunsafe.c:CRYPTO_rotr_u64 Unexecuted instantiation: refcount.c:CRYPTO_rotr_u64 Unexecuted instantiation: rsa_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: rsa_crypt.c:CRYPTO_rotr_u64 Unexecuted instantiation: stack.c:CRYPTO_rotr_u64 Unexecuted instantiation: thread_pthread.c:CRYPTO_rotr_u64 Unexecuted instantiation: convert.c:CRYPTO_rotr_u64 Unexecuted instantiation: asn1_compat.c:CRYPTO_rotr_u64 Unexecuted instantiation: chacha.c:CRYPTO_rotr_u64 Unexecuted instantiation: cpu_intel.c:CRYPTO_rotr_u64 Unexecuted instantiation: curve25519.c:CRYPTO_rotr_u64 Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_rotr_u64 Unexecuted instantiation: dsa.c:CRYPTO_rotr_u64 Unexecuted instantiation: dsa_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: ecdh_extra.c:CRYPTO_rotr_u64 Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: ec_asn1.c:CRYPTO_rotr_u64 Unexecuted instantiation: bio.c:CRYPTO_rotr_u64 Unexecuted instantiation: file.c:CRYPTO_rotr_u64 |
1140 | | |
1141 | | |
1142 | | // FIPS functions. |
1143 | | |
1144 | | #if defined(BORINGSSL_FIPS) |
1145 | | |
1146 | | // BORINGSSL_FIPS_abort is called when a FIPS power-on or continuous test |
1147 | | // fails. It prevents any further cryptographic operations by the current |
1148 | | // process. |
1149 | | void BORINGSSL_FIPS_abort(void) __attribute__((noreturn)); |
1150 | | |
1151 | | // boringssl_self_test_startup runs all startup self tests and returns one on |
1152 | | // success or zero on error. Startup self tests do not include lazy tests. |
1153 | | // Call |BORINGSSL_self_test| to run every self test. |
1154 | | int boringssl_self_test_startup(void); |
1155 | | |
1156 | | // boringssl_ensure_rsa_self_test checks whether the RSA self-test has been run |
1157 | | // in this address space. If not, it runs it and crashes the address space if |
1158 | | // unsuccessful. |
1159 | | void boringssl_ensure_rsa_self_test(void); |
1160 | | |
1161 | | // boringssl_ensure_ecc_self_test checks whether the ECDSA and ECDH self-test |
1162 | | // has been run in this address space. If not, it runs it and crashes the |
1163 | | // address space if unsuccessful. |
1164 | | void boringssl_ensure_ecc_self_test(void); |
1165 | | |
1166 | | // boringssl_ensure_ffdh_self_test checks whether the FFDH self-test has been |
1167 | | // run in this address space. If not, it runs it and crashes the address space |
1168 | | // if unsuccessful. |
1169 | | void boringssl_ensure_ffdh_self_test(void); |
1170 | | |
1171 | | #else |
1172 | | |
1173 | | // Outside of FIPS mode, the lazy tests are no-ops. |
1174 | | |
1175 | 0 | OPENSSL_INLINE void boringssl_ensure_rsa_self_test(void) {}Unexecuted instantiation: bcm.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: cbb.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: cbs.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: crypto.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: err.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: engine.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: evp.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: evp_ctx.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_dsa_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_ec.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_ed25519_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_hkdf.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_rsa.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_rsa_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: p_x25519_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: ex_data.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: mem.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: deterministic.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: forkunsafe.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: refcount.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: rsa_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: rsa_crypt.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: stack.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: thread_pthread.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: convert.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: asn1_compat.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: chacha.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: cpu_intel.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: curve25519.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: curve25519_64_adx.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: dsa.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: dsa_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: ecdh_extra.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: ecdsa_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: ec_asn1.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: bio.c:boringssl_ensure_rsa_self_test Unexecuted instantiation: file.c:boringssl_ensure_rsa_self_test |
1176 | 0 | OPENSSL_INLINE void boringssl_ensure_ecc_self_test(void) {}Unexecuted instantiation: bcm.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: cbb.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: cbs.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: crypto.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: err.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: engine.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: evp.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: evp_ctx.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_dsa_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_ec.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_ed25519_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_hkdf.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_rsa.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_rsa_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: p_x25519_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: ex_data.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: mem.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: deterministic.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: forkunsafe.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: refcount.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: rsa_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: rsa_crypt.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: stack.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: thread_pthread.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: convert.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: asn1_compat.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: chacha.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: cpu_intel.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: curve25519.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: curve25519_64_adx.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: dsa.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: dsa_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: ecdh_extra.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: ecdsa_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: ec_asn1.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: bio.c:boringssl_ensure_ecc_self_test Unexecuted instantiation: file.c:boringssl_ensure_ecc_self_test |
1177 | 0 | OPENSSL_INLINE void boringssl_ensure_ffdh_self_test(void) {}Unexecuted instantiation: bcm.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: cbb.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: cbs.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: crypto.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: err.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: engine.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: evp.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: evp_ctx.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_dsa_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_ec.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_ed25519_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_hkdf.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_rsa.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_rsa_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: p_x25519_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: ex_data.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: mem.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: deterministic.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: forkunsafe.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: refcount.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: rsa_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: rsa_crypt.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: stack.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: thread_pthread.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: convert.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: asn1_compat.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: chacha.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: cpu_intel.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: curve25519.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: curve25519_64_adx.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: dsa.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: dsa_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: ecdh_extra.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: ecdsa_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: ec_asn1.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: bio.c:boringssl_ensure_ffdh_self_test Unexecuted instantiation: file.c:boringssl_ensure_ffdh_self_test |
1178 | | |
1179 | | #endif // FIPS |
1180 | | |
1181 | | // boringssl_self_test_sha256 performs a SHA-256 KAT. |
1182 | | int boringssl_self_test_sha256(void); |
1183 | | |
1184 | | // boringssl_self_test_sha512 performs a SHA-512 KAT. |
1185 | | int boringssl_self_test_sha512(void); |
1186 | | |
1187 | | // boringssl_self_test_hmac_sha256 performs an HMAC-SHA-256 KAT. |
1188 | | int boringssl_self_test_hmac_sha256(void); |
1189 | | |
1190 | | #if defined(BORINGSSL_FIPS_COUNTERS) |
1191 | | void boringssl_fips_inc_counter(enum fips_counter_t counter); |
1192 | | #else |
1193 | 0 | OPENSSL_INLINE void boringssl_fips_inc_counter(enum fips_counter_t counter) {}Unexecuted instantiation: bcm.c:boringssl_fips_inc_counter Unexecuted instantiation: cbb.c:boringssl_fips_inc_counter Unexecuted instantiation: cbs.c:boringssl_fips_inc_counter Unexecuted instantiation: crypto.c:boringssl_fips_inc_counter Unexecuted instantiation: err.c:boringssl_fips_inc_counter Unexecuted instantiation: engine.c:boringssl_fips_inc_counter Unexecuted instantiation: evp.c:boringssl_fips_inc_counter Unexecuted instantiation: evp_ctx.c:boringssl_fips_inc_counter Unexecuted instantiation: p_dsa_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: p_ec.c:boringssl_fips_inc_counter Unexecuted instantiation: p_ed25519_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: p_hkdf.c:boringssl_fips_inc_counter Unexecuted instantiation: p_rsa.c:boringssl_fips_inc_counter Unexecuted instantiation: p_rsa_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: p_x25519_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: ex_data.c:boringssl_fips_inc_counter Unexecuted instantiation: mem.c:boringssl_fips_inc_counter Unexecuted instantiation: deterministic.c:boringssl_fips_inc_counter Unexecuted instantiation: forkunsafe.c:boringssl_fips_inc_counter Unexecuted instantiation: refcount.c:boringssl_fips_inc_counter Unexecuted instantiation: rsa_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: rsa_crypt.c:boringssl_fips_inc_counter Unexecuted instantiation: stack.c:boringssl_fips_inc_counter Unexecuted instantiation: thread_pthread.c:boringssl_fips_inc_counter Unexecuted instantiation: convert.c:boringssl_fips_inc_counter Unexecuted instantiation: asn1_compat.c:boringssl_fips_inc_counter Unexecuted instantiation: chacha.c:boringssl_fips_inc_counter Unexecuted instantiation: cpu_intel.c:boringssl_fips_inc_counter Unexecuted instantiation: curve25519.c:boringssl_fips_inc_counter Unexecuted instantiation: curve25519_64_adx.c:boringssl_fips_inc_counter Unexecuted instantiation: dsa.c:boringssl_fips_inc_counter Unexecuted instantiation: dsa_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: ecdh_extra.c:boringssl_fips_inc_counter Unexecuted instantiation: ecdsa_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: ec_asn1.c:boringssl_fips_inc_counter Unexecuted instantiation: bio.c:boringssl_fips_inc_counter Unexecuted instantiation: file.c:boringssl_fips_inc_counter |
1194 | | #endif |
1195 | | |
1196 | | #if defined(BORINGSSL_FIPS_BREAK_TESTS) |
1197 | | OPENSSL_INLINE int boringssl_fips_break_test(const char *test) { |
1198 | | const char *const value = getenv("BORINGSSL_FIPS_BREAK_TEST"); |
1199 | | return value != NULL && strcmp(value, test) == 0; |
1200 | | } |
1201 | | #else |
1202 | 0 | OPENSSL_INLINE int boringssl_fips_break_test(const char *test) { |
1203 | 0 | return 0; |
1204 | 0 | } Unexecuted instantiation: bcm.c:boringssl_fips_break_test Unexecuted instantiation: cbb.c:boringssl_fips_break_test Unexecuted instantiation: cbs.c:boringssl_fips_break_test Unexecuted instantiation: crypto.c:boringssl_fips_break_test Unexecuted instantiation: err.c:boringssl_fips_break_test Unexecuted instantiation: engine.c:boringssl_fips_break_test Unexecuted instantiation: evp.c:boringssl_fips_break_test Unexecuted instantiation: evp_ctx.c:boringssl_fips_break_test Unexecuted instantiation: p_dsa_asn1.c:boringssl_fips_break_test Unexecuted instantiation: p_ec.c:boringssl_fips_break_test Unexecuted instantiation: p_ed25519_asn1.c:boringssl_fips_break_test Unexecuted instantiation: p_hkdf.c:boringssl_fips_break_test Unexecuted instantiation: p_rsa.c:boringssl_fips_break_test Unexecuted instantiation: p_rsa_asn1.c:boringssl_fips_break_test Unexecuted instantiation: p_x25519_asn1.c:boringssl_fips_break_test Unexecuted instantiation: ex_data.c:boringssl_fips_break_test Unexecuted instantiation: mem.c:boringssl_fips_break_test Unexecuted instantiation: deterministic.c:boringssl_fips_break_test Unexecuted instantiation: forkunsafe.c:boringssl_fips_break_test Unexecuted instantiation: refcount.c:boringssl_fips_break_test Unexecuted instantiation: rsa_asn1.c:boringssl_fips_break_test Unexecuted instantiation: rsa_crypt.c:boringssl_fips_break_test Unexecuted instantiation: stack.c:boringssl_fips_break_test Unexecuted instantiation: thread_pthread.c:boringssl_fips_break_test Unexecuted instantiation: convert.c:boringssl_fips_break_test Unexecuted instantiation: asn1_compat.c:boringssl_fips_break_test Unexecuted instantiation: chacha.c:boringssl_fips_break_test Unexecuted instantiation: cpu_intel.c:boringssl_fips_break_test Unexecuted instantiation: curve25519.c:boringssl_fips_break_test Unexecuted instantiation: curve25519_64_adx.c:boringssl_fips_break_test Unexecuted instantiation: dsa.c:boringssl_fips_break_test Unexecuted instantiation: dsa_asn1.c:boringssl_fips_break_test Unexecuted instantiation: ecdh_extra.c:boringssl_fips_break_test Unexecuted instantiation: ecdsa_asn1.c:boringssl_fips_break_test Unexecuted instantiation: ec_asn1.c:boringssl_fips_break_test Unexecuted instantiation: bio.c:boringssl_fips_break_test Unexecuted instantiation: file.c:boringssl_fips_break_test |
1205 | | #endif // BORINGSSL_FIPS_BREAK_TESTS |
1206 | | |
1207 | | |
1208 | | // Runtime CPU feature support |
1209 | | |
1210 | | #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) |
1211 | | // OPENSSL_ia32cap_P contains the Intel CPUID bits when running on an x86 or |
1212 | | // x86-64 system. |
1213 | | // |
1214 | | // Index 0: |
1215 | | // EDX for CPUID where EAX = 1 |
1216 | | // Bit 20 is always zero |
1217 | | // Bit 28 is adjusted to reflect whether the data cache is shared between |
1218 | | // multiple logical cores |
1219 | | // Bit 30 is used to indicate an Intel CPU |
1220 | | // Index 1: |
1221 | | // ECX for CPUID where EAX = 1 |
1222 | | // Bit 11 is used to indicate AMD XOP support, not SDBG |
1223 | | // Index 2: |
1224 | | // EBX for CPUID where EAX = 7 |
1225 | | // Index 3: |
1226 | | // ECX for CPUID where EAX = 7 |
1227 | | // |
1228 | | // Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM |
1229 | | // bits in XCR0, so it is not necessary to check those. |
1230 | | extern uint32_t OPENSSL_ia32cap_P[4]; |
1231 | | |
1232 | | #if defined(BORINGSSL_FIPS) && !defined(BORINGSSL_SHARED_LIBRARY) |
1233 | | // The FIPS module, as a static library, requires an out-of-line version of |
1234 | | // |OPENSSL_ia32cap_get| so accesses can be rewritten by delocate. Mark the |
1235 | | // function const so multiple accesses can be optimized together. |
1236 | | const uint32_t *OPENSSL_ia32cap_get(void) __attribute__((const)); |
1237 | | #else |
1238 | 0 | OPENSSL_INLINE const uint32_t *OPENSSL_ia32cap_get(void) { |
1239 | 0 | return OPENSSL_ia32cap_P; |
1240 | 0 | } Unexecuted instantiation: bcm.c:OPENSSL_ia32cap_get Unexecuted instantiation: cbb.c:OPENSSL_ia32cap_get Unexecuted instantiation: cbs.c:OPENSSL_ia32cap_get Unexecuted instantiation: crypto.c:OPENSSL_ia32cap_get Unexecuted instantiation: err.c:OPENSSL_ia32cap_get Unexecuted instantiation: engine.c:OPENSSL_ia32cap_get Unexecuted instantiation: evp.c:OPENSSL_ia32cap_get Unexecuted instantiation: evp_ctx.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_dsa_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_ec.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_ed25519_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_hkdf.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_rsa.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_rsa_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: p_x25519_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: ex_data.c:OPENSSL_ia32cap_get Unexecuted instantiation: mem.c:OPENSSL_ia32cap_get Unexecuted instantiation: deterministic.c:OPENSSL_ia32cap_get Unexecuted instantiation: forkunsafe.c:OPENSSL_ia32cap_get Unexecuted instantiation: refcount.c:OPENSSL_ia32cap_get Unexecuted instantiation: rsa_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: rsa_crypt.c:OPENSSL_ia32cap_get Unexecuted instantiation: stack.c:OPENSSL_ia32cap_get Unexecuted instantiation: thread_pthread.c:OPENSSL_ia32cap_get Unexecuted instantiation: convert.c:OPENSSL_ia32cap_get Unexecuted instantiation: asn1_compat.c:OPENSSL_ia32cap_get Unexecuted instantiation: chacha.c:OPENSSL_ia32cap_get Unexecuted instantiation: cpu_intel.c:OPENSSL_ia32cap_get Unexecuted instantiation: curve25519.c:OPENSSL_ia32cap_get Unexecuted instantiation: curve25519_64_adx.c:OPENSSL_ia32cap_get Unexecuted instantiation: dsa.c:OPENSSL_ia32cap_get Unexecuted instantiation: dsa_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: ecdh_extra.c:OPENSSL_ia32cap_get Unexecuted instantiation: ecdsa_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: ec_asn1.c:OPENSSL_ia32cap_get Unexecuted instantiation: bio.c:OPENSSL_ia32cap_get Unexecuted instantiation: file.c:OPENSSL_ia32cap_get |
1241 | | #endif |
1242 | | |
1243 | | // See Intel manual, volume 2A, table 3-11. |
1244 | | |
1245 | 0 | OPENSSL_INLINE int CRYPTO_is_FXSR_capable(void) { |
1246 | 0 | #if defined(__FXSR__) |
1247 | 0 | return 1; |
1248 | | #else |
1249 | | return (OPENSSL_ia32cap_get()[0] & (1 << 24)) != 0; |
1250 | | #endif |
1251 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: cbb.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: cbs.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: crypto.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: err.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: engine.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: evp.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: mem.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: refcount.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: stack.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: convert.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: chacha.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: dsa.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: bio.c:CRYPTO_is_FXSR_capable Unexecuted instantiation: file.c:CRYPTO_is_FXSR_capable |
1252 | | |
1253 | 0 | OPENSSL_INLINE int CRYPTO_is_intel_cpu(void) { |
1254 | | // The reserved bit 30 is used to indicate an Intel CPU. |
1255 | 0 | return (OPENSSL_ia32cap_get()[0] & (1 << 30)) != 0; |
1256 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_intel_cpu Unexecuted instantiation: cbb.c:CRYPTO_is_intel_cpu Unexecuted instantiation: cbs.c:CRYPTO_is_intel_cpu Unexecuted instantiation: crypto.c:CRYPTO_is_intel_cpu Unexecuted instantiation: err.c:CRYPTO_is_intel_cpu Unexecuted instantiation: engine.c:CRYPTO_is_intel_cpu Unexecuted instantiation: evp.c:CRYPTO_is_intel_cpu Unexecuted instantiation: evp_ctx.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_ec.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_hkdf.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_rsa.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: ex_data.c:CRYPTO_is_intel_cpu Unexecuted instantiation: mem.c:CRYPTO_is_intel_cpu Unexecuted instantiation: deterministic.c:CRYPTO_is_intel_cpu Unexecuted instantiation: forkunsafe.c:CRYPTO_is_intel_cpu Unexecuted instantiation: refcount.c:CRYPTO_is_intel_cpu Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_intel_cpu Unexecuted instantiation: stack.c:CRYPTO_is_intel_cpu Unexecuted instantiation: thread_pthread.c:CRYPTO_is_intel_cpu Unexecuted instantiation: convert.c:CRYPTO_is_intel_cpu Unexecuted instantiation: asn1_compat.c:CRYPTO_is_intel_cpu Unexecuted instantiation: chacha.c:CRYPTO_is_intel_cpu Unexecuted instantiation: cpu_intel.c:CRYPTO_is_intel_cpu Unexecuted instantiation: curve25519.c:CRYPTO_is_intel_cpu Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_intel_cpu Unexecuted instantiation: dsa.c:CRYPTO_is_intel_cpu Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_intel_cpu Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: ec_asn1.c:CRYPTO_is_intel_cpu Unexecuted instantiation: bio.c:CRYPTO_is_intel_cpu Unexecuted instantiation: file.c:CRYPTO_is_intel_cpu |
1257 | | |
1258 | | // See Intel manual, volume 2A, table 3-10. |
1259 | | |
1260 | 0 | OPENSSL_INLINE int CRYPTO_is_PCLMUL_capable(void) { |
1261 | | #if defined(__PCLMUL__) |
1262 | | return 1; |
1263 | | #else |
1264 | 0 | return (OPENSSL_ia32cap_get()[1] & (1 << 1)) != 0; |
1265 | 0 | #endif |
1266 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: cbb.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: cbs.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: crypto.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: err.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: engine.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: evp.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: mem.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: refcount.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: stack.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: convert.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: chacha.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: dsa.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: bio.c:CRYPTO_is_PCLMUL_capable Unexecuted instantiation: file.c:CRYPTO_is_PCLMUL_capable |
1267 | | |
1268 | 0 | OPENSSL_INLINE int CRYPTO_is_SSSE3_capable(void) { |
1269 | | #if defined(__SSSE3__) |
1270 | | return 1; |
1271 | | #else |
1272 | 0 | return (OPENSSL_ia32cap_get()[1] & (1 << 9)) != 0; |
1273 | 0 | #endif |
1274 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: cbb.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: cbs.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: crypto.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: err.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: engine.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: evp.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: mem.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: refcount.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: stack.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: convert.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: chacha.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: dsa.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: bio.c:CRYPTO_is_SSSE3_capable Unexecuted instantiation: file.c:CRYPTO_is_SSSE3_capable |
1275 | | |
1276 | 0 | OPENSSL_INLINE int CRYPTO_is_SSE4_1_capable(void) { |
1277 | 0 | #if defined(__SSE4_1__) |
1278 | 0 | return 1; |
1279 | 0 | #else |
1280 | 0 | return (OPENSSL_ia32cap_P[1] & (1 << 19)) != 0; |
1281 | 0 | #endif |
1282 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: cbb.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: cbs.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: crypto.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: err.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: engine.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: evp.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: mem.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: refcount.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: stack.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: convert.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: chacha.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: dsa.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: bio.c:CRYPTO_is_SSE4_1_capable Unexecuted instantiation: file.c:CRYPTO_is_SSE4_1_capable |
1283 | | |
1284 | 0 | OPENSSL_INLINE int CRYPTO_is_MOVBE_capable(void) { |
1285 | | #if defined(__MOVBE__) |
1286 | | return 1; |
1287 | | #else |
1288 | 0 | return (OPENSSL_ia32cap_get()[1] & (1 << 22)) != 0; |
1289 | 0 | #endif |
1290 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: cbb.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: cbs.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: crypto.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: err.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: engine.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: evp.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: mem.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: refcount.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: stack.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: convert.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: chacha.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: dsa.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: bio.c:CRYPTO_is_MOVBE_capable Unexecuted instantiation: file.c:CRYPTO_is_MOVBE_capable |
1291 | | |
1292 | 0 | OPENSSL_INLINE int CRYPTO_is_AESNI_capable(void) { |
1293 | | #if defined(__AES__) |
1294 | | return 1; |
1295 | | #else |
1296 | 0 | return (OPENSSL_ia32cap_get()[1] & (1 << 25)) != 0; |
1297 | 0 | #endif |
1298 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: cbb.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: cbs.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: crypto.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: err.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: engine.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: evp.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: mem.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: refcount.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: stack.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: convert.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: chacha.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: dsa.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: bio.c:CRYPTO_is_AESNI_capable Unexecuted instantiation: file.c:CRYPTO_is_AESNI_capable |
1299 | | |
1300 | 0 | OPENSSL_INLINE int CRYPTO_is_AVX_capable(void) { |
1301 | | #if defined(__AVX__) |
1302 | | return 1; |
1303 | | #else |
1304 | 0 | return (OPENSSL_ia32cap_get()[1] & (1 << 28)) != 0; |
1305 | 0 | #endif |
1306 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_AVX_capable Unexecuted instantiation: cbb.c:CRYPTO_is_AVX_capable Unexecuted instantiation: cbs.c:CRYPTO_is_AVX_capable Unexecuted instantiation: crypto.c:CRYPTO_is_AVX_capable Unexecuted instantiation: err.c:CRYPTO_is_AVX_capable Unexecuted instantiation: engine.c:CRYPTO_is_AVX_capable Unexecuted instantiation: evp.c:CRYPTO_is_AVX_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_AVX_capable Unexecuted instantiation: mem.c:CRYPTO_is_AVX_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_AVX_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_AVX_capable Unexecuted instantiation: refcount.c:CRYPTO_is_AVX_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_AVX_capable Unexecuted instantiation: stack.c:CRYPTO_is_AVX_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_AVX_capable Unexecuted instantiation: convert.c:CRYPTO_is_AVX_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_AVX_capable Unexecuted instantiation: chacha.c:CRYPTO_is_AVX_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_AVX_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_AVX_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_AVX_capable Unexecuted instantiation: dsa.c:CRYPTO_is_AVX_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_AVX_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_AVX_capable Unexecuted instantiation: bio.c:CRYPTO_is_AVX_capable Unexecuted instantiation: file.c:CRYPTO_is_AVX_capable |
1307 | | |
1308 | 0 | OPENSSL_INLINE int CRYPTO_is_RDRAND_capable(void) { |
1309 | | // The GCC/Clang feature name and preprocessor symbol for RDRAND are "rdrnd" |
1310 | | // and |__RDRND__|, respectively. |
1311 | | #if defined(__RDRND__) |
1312 | | return 1; |
1313 | | #else |
1314 | 0 | return (OPENSSL_ia32cap_get()[1] & (1u << 30)) != 0; |
1315 | 0 | #endif |
1316 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: cbb.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: cbs.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: crypto.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: err.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: engine.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: evp.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: mem.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: refcount.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: stack.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: convert.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: chacha.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: dsa.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: bio.c:CRYPTO_is_RDRAND_capable Unexecuted instantiation: file.c:CRYPTO_is_RDRAND_capable |
1317 | | |
1318 | | // See Intel manual, volume 2A, table 3-8. |
1319 | | |
1320 | 0 | OPENSSL_INLINE int CRYPTO_is_BMI1_capable(void) { |
1321 | | #if defined(__BMI1__) |
1322 | | return 1; |
1323 | | #else |
1324 | 0 | return (OPENSSL_ia32cap_get()[2] & (1 << 3)) != 0; |
1325 | 0 | #endif |
1326 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: cbb.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: cbs.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: crypto.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: err.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: engine.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: evp.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: mem.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: refcount.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: stack.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: convert.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: chacha.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: dsa.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: bio.c:CRYPTO_is_BMI1_capable Unexecuted instantiation: file.c:CRYPTO_is_BMI1_capable |
1327 | | |
1328 | 0 | OPENSSL_INLINE int CRYPTO_is_AVX2_capable(void) { |
1329 | | #if defined(__AVX2__) |
1330 | | return 1; |
1331 | | #else |
1332 | 0 | return (OPENSSL_ia32cap_get()[2] & (1 << 5)) != 0; |
1333 | 0 | #endif |
1334 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: cbb.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: cbs.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: crypto.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: err.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: engine.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: evp.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: mem.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: refcount.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: stack.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: convert.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: chacha.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: dsa.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: bio.c:CRYPTO_is_AVX2_capable Unexecuted instantiation: file.c:CRYPTO_is_AVX2_capable |
1335 | | |
1336 | 0 | OPENSSL_INLINE int CRYPTO_is_BMI2_capable(void) { |
1337 | | #if defined(__BMI2__) |
1338 | | return 1; |
1339 | | #else |
1340 | 0 | return (OPENSSL_ia32cap_get()[2] & (1 << 8)) != 0; |
1341 | 0 | #endif |
1342 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: cbb.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: cbs.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: crypto.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: err.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: engine.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: evp.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: mem.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: refcount.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: stack.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: convert.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: chacha.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: dsa.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: bio.c:CRYPTO_is_BMI2_capable Unexecuted instantiation: file.c:CRYPTO_is_BMI2_capable |
1343 | | |
1344 | 0 | OPENSSL_INLINE int CRYPTO_is_ADX_capable(void) { |
1345 | | #if defined(__ADX__) |
1346 | | return 1; |
1347 | | #else |
1348 | 0 | return (OPENSSL_ia32cap_get()[2] & (1 << 19)) != 0; |
1349 | 0 | #endif |
1350 | 0 | } Unexecuted instantiation: bcm.c:CRYPTO_is_ADX_capable Unexecuted instantiation: cbb.c:CRYPTO_is_ADX_capable Unexecuted instantiation: cbs.c:CRYPTO_is_ADX_capable Unexecuted instantiation: crypto.c:CRYPTO_is_ADX_capable Unexecuted instantiation: err.c:CRYPTO_is_ADX_capable Unexecuted instantiation: engine.c:CRYPTO_is_ADX_capable Unexecuted instantiation: evp.c:CRYPTO_is_ADX_capable Unexecuted instantiation: evp_ctx.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_dsa_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_ec.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_ed25519_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_hkdf.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_rsa.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_rsa_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: p_x25519_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: ex_data.c:CRYPTO_is_ADX_capable Unexecuted instantiation: mem.c:CRYPTO_is_ADX_capable Unexecuted instantiation: deterministic.c:CRYPTO_is_ADX_capable Unexecuted instantiation: forkunsafe.c:CRYPTO_is_ADX_capable Unexecuted instantiation: refcount.c:CRYPTO_is_ADX_capable Unexecuted instantiation: rsa_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: rsa_crypt.c:CRYPTO_is_ADX_capable Unexecuted instantiation: stack.c:CRYPTO_is_ADX_capable Unexecuted instantiation: thread_pthread.c:CRYPTO_is_ADX_capable Unexecuted instantiation: convert.c:CRYPTO_is_ADX_capable Unexecuted instantiation: asn1_compat.c:CRYPTO_is_ADX_capable Unexecuted instantiation: chacha.c:CRYPTO_is_ADX_capable Unexecuted instantiation: cpu_intel.c:CRYPTO_is_ADX_capable Unexecuted instantiation: curve25519.c:CRYPTO_is_ADX_capable Unexecuted instantiation: curve25519_64_adx.c:CRYPTO_is_ADX_capable Unexecuted instantiation: dsa.c:CRYPTO_is_ADX_capable Unexecuted instantiation: dsa_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: ecdh_extra.c:CRYPTO_is_ADX_capable Unexecuted instantiation: ecdsa_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: ec_asn1.c:CRYPTO_is_ADX_capable Unexecuted instantiation: bio.c:CRYPTO_is_ADX_capable Unexecuted instantiation: file.c:CRYPTO_is_ADX_capable |
1351 | | |
1352 | | #endif // OPENSSL_X86 || OPENSSL_X86_64 |
1353 | | |
1354 | | #if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) |
1355 | | |
1356 | | #if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM) |
1357 | | // We do not detect any features at runtime for Apple's 32-bit ARM platforms. On |
1358 | | // 64-bit ARM, we detect some post-ARMv8.0 features. |
1359 | | #define OPENSSL_STATIC_ARMCAP |
1360 | | #endif |
1361 | | |
1362 | | // Normalize some older feature flags to their modern ACLE values. |
1363 | | // https://developer.arm.com/architectures/system-architectures/software-standards/acle |
1364 | | #if defined(__ARM_NEON__) && !defined(__ARM_NEON) |
1365 | | #define __ARM_NEON 1 |
1366 | | #endif |
1367 | | #if defined(__ARM_FEATURE_CRYPTO) |
1368 | | #if !defined(__ARM_FEATURE_AES) |
1369 | | #define __ARM_FEATURE_AES 1 |
1370 | | #endif |
1371 | | #if !defined(__ARM_FEATURE_SHA2) |
1372 | | #define __ARM_FEATURE_SHA2 1 |
1373 | | #endif |
1374 | | #endif |
1375 | | |
1376 | | #if !defined(OPENSSL_STATIC_ARMCAP) |
1377 | | // CRYPTO_is_NEON_capable_at_runtime returns true if the current CPU has a NEON |
1378 | | // unit. Note that |OPENSSL_armcap_P| also exists and contains the same |
1379 | | // information in a form that's easier for assembly to use. |
1380 | | OPENSSL_EXPORT int CRYPTO_is_NEON_capable_at_runtime(void); |
1381 | | |
1382 | | // CRYPTO_is_ARMv8_AES_capable_at_runtime returns true if the current CPU |
1383 | | // supports the ARMv8 AES instruction. |
1384 | | int CRYPTO_is_ARMv8_AES_capable_at_runtime(void); |
1385 | | |
1386 | | // CRYPTO_is_ARMv8_PMULL_capable_at_runtime returns true if the current CPU |
1387 | | // supports the ARMv8 PMULL instruction. |
1388 | | int CRYPTO_is_ARMv8_PMULL_capable_at_runtime(void); |
1389 | | #endif // !OPENSSL_STATIC_ARMCAP |
1390 | | |
1391 | | // CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If |
1392 | | // this is known statically, it is a constant inline function. |
1393 | | OPENSSL_INLINE int CRYPTO_is_NEON_capable(void) { |
1394 | | #if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON) |
1395 | | return 1; |
1396 | | #elif defined(OPENSSL_STATIC_ARMCAP) |
1397 | | return 0; |
1398 | | #else |
1399 | | return CRYPTO_is_NEON_capable_at_runtime(); |
1400 | | #endif |
1401 | | } |
1402 | | |
1403 | | OPENSSL_INLINE int CRYPTO_is_ARMv8_AES_capable(void) { |
1404 | | #if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_AES) |
1405 | | return 1; |
1406 | | #elif defined(OPENSSL_STATIC_ARMCAP) |
1407 | | return 0; |
1408 | | #else |
1409 | | return CRYPTO_is_ARMv8_AES_capable_at_runtime(); |
1410 | | #endif |
1411 | | } |
1412 | | |
1413 | | OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) { |
1414 | | #if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_AES) |
1415 | | return 1; |
1416 | | #elif defined(OPENSSL_STATIC_ARMCAP) |
1417 | | return 0; |
1418 | | #else |
1419 | | return CRYPTO_is_ARMv8_PMULL_capable_at_runtime(); |
1420 | | #endif |
1421 | | } |
1422 | | |
1423 | | #endif // OPENSSL_ARM || OPENSSL_AARCH64 |
1424 | | |
1425 | | #if defined(BORINGSSL_DISPATCH_TEST) |
1426 | | // Runtime CPU dispatch testing support |
1427 | | |
1428 | | // BORINGSSL_function_hit is an array of flags. The following functions will |
1429 | | // set these flags if BORINGSSL_DISPATCH_TEST is defined. |
1430 | | // 0: aes_hw_ctr32_encrypt_blocks |
1431 | | // 1: aes_hw_encrypt |
1432 | | // 2: aesni_gcm_encrypt |
1433 | | // 3: aes_hw_set_encrypt_key |
1434 | | // 4: vpaes_encrypt |
1435 | | // 5: vpaes_set_encrypt_key |
1436 | | extern uint8_t BORINGSSL_function_hit[7]; |
1437 | | #endif // BORINGSSL_DISPATCH_TEST |
1438 | | |
1439 | | // OPENSSL_vasprintf_internal is just like |vasprintf(3)|. If |system_malloc| is |
1440 | | // 0, memory will be allocated with |OPENSSL_malloc| and must be freed with |
1441 | | // |OPENSSL_free|. Otherwise the system |malloc| function is used and the memory |
1442 | | // must be freed with the system |free| function. |
1443 | | OPENSSL_EXPORT int OPENSSL_vasprintf_internal(char **str, const char *format, |
1444 | | va_list args, int system_malloc) |
1445 | | OPENSSL_PRINTF_FORMAT_FUNC(2, 0); |
1446 | | |
1447 | | #if defined(__cplusplus) |
1448 | | } // extern C |
1449 | | #endif |
1450 | | |
1451 | | #endif // OPENSSL_HEADER_CRYPTO_INTERNAL_H |