Coverage Report

Created: 2023-06-07 07:11

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