Coverage Report

Created: 2026-10-27 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/boringssl/crypto/internal.h
Line
Count
Source
1
// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H
16
#define OPENSSL_HEADER_CRYPTO_INTERNAL_H
17
18
#include <openssl/base.h>
19
#include <openssl/crypto.h>
20
#include <openssl/ex_data.h>
21
#include <openssl/span.h>
22
#include <openssl/stack.h>
23
24
#include <assert.h>
25
#include <stdlib.h>
26
#include <string.h>
27
28
#include <type_traits>
29
30
#if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)
31
#include <valgrind/memcheck.h>
32
#endif
33
34
#if defined(BORINGSSL_FIPS_BREAK_TESTS)
35
#include <stdlib.h>
36
#endif
37
38
#if defined(OPENSSL_THREADS) && \
39
    (!defined(OPENSSL_WINDOWS) || defined(__MINGW32__))
40
#include <pthread.h>
41
#define OPENSSL_PTHREADS
42
#endif
43
44
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_PTHREADS) && \
45
    defined(OPENSSL_WINDOWS)
46
#define OPENSSL_WINDOWS_THREADS
47
#endif
48
49
#if defined(OPENSSL_THREADS)
50
#include <atomic>
51
#else
52
#include <utility>
53
#endif
54
55
#if defined(OPENSSL_WINDOWS_THREADS)
56
#include <windows.h>
57
#endif
58
59
#if defined(_M_X64) || defined(_M_IX86)
60
#include "intrin.h"
61
#endif
62
63
#if defined(BORINGSSL_PREFIX)
64
#include <openssl/prefix_symbols_internal_c.h>  // IWYU pragma: export
65
#endif
66
67
68
BSSL_NAMESPACE_BEGIN
69
70
#if !defined(OPENSSL_NO_ASM) &&                         \
71
    (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
72
     (!defined(OPENSSL_STATIC_ARMCAP) &&                \
73
      (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))))
74
// x86, x86_64, and the ARMs need to record the result of a cpuid/getauxval call
75
// for the asm to work correctly, unless compiled without asm code.
76
#define NEED_CPUID
77
78
// OPENSSL_cpuid_setup initializes the platform-specific feature cache. This
79
// function should not be called directly. Call `OPENSSL_init_cpuid` instead.
80
void OPENSSL_cpuid_setup();
81
82
// OPENSSL_init_cpuid initializes the platform-specific feature cache, if
83
// needed. This function is idempotent and may be called concurrently.
84
void OPENSSL_init_cpuid();
85
#else
86
inline void OPENSSL_init_cpuid() {}
87
#endif
88
89
#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
90
    !defined(OPENSSL_STATIC_ARMCAP)
91
// OPENSSL_get_armcap_pointer_for_test returns a pointer to
92
// `OPENSSL_armcap_P` for unit tests. Any modifications to the value must be
93
// made before any other function call in BoringSSL.
94
OPENSSL_EXPORT uint32_t *OPENSSL_get_armcap_pointer_for_test();
95
#endif
96
97
98
// On non-MSVC 64-bit targets, we expect __uint128_t support. This includes
99
// clang-cl, which defines both __clang__ and _MSC_VER.
100
#if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT)
101
#define BORINGSSL_HAS_UINT128
102
typedef __int128_t int128_t;
103
typedef __uint128_t uint128_t;
104
105
// __uint128_t division depends on intrinsics in the compiler runtime. Those
106
// intrinsics are missing in clang-cl (https://crbug.com/787617) and nanolibc.
107
// These may be bugs in the toolchain definition, but just disable it for now.
108
// EDK2's toolchain is missing __udivti3 (b/339380897) so cannot support
109
// 128-bit division currently.
110
#if !defined(_MSC_VER) && !defined(OPENSSL_NANOLIBC) && \
111
    !defined(__EDK2_BORINGSSL__)
112
#define BORINGSSL_CAN_DIVIDE_UINT128
113
#endif
114
#endif
115
116
// GCC-like compilers indicate SSE2 with `__SSE2__`. MSVC leaves the caller to
117
// know that x86_64 has SSE2, and uses _M_IX86_FP to indicate SSE2 on x86.
118
// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170
119
#if defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || \
120
    (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
121
#define OPENSSL_SSE2
122
#endif
123
124
#if defined(OPENSSL_X86) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SSE2)
125
#error \
126
    "x86 assembly requires SSE2. Build with -msse2 (recommended), or disable assembly optimizations with -DOPENSSL_NO_ASM."
127
#endif
128
129
// For convenience in testing the fallback code, we allow disabling SSE2
130
// intrinsics via `OPENSSL_NO_SSE2_FOR_TESTING`. We require SSE2 on x86 and
131
// x86_64, so we would otherwise need to test such code on a non-x86 platform.
132
//
133
// This does not remove the above requirement for SSE2 support with assembly
134
// optimizations. It only disables some intrinsics-based optimizations so that
135
// we can test the fallback code on CI.
136
#if defined(OPENSSL_SSE2) && defined(OPENSSL_NO_SSE2_FOR_TESTING)
137
#undef OPENSSL_SSE2
138
#endif
139
140
#if defined(__GNUC__) || defined(__clang__)
141
#define OPENSSL_ATTR_CONST __attribute__((const))
142
#else
143
#define OPENSSL_ATTR_CONST
144
#endif
145
146
// OPENSSL_ATTR_ALWAYS_INLINE tells the compiler to always attempt inlining the
147
// function. This has the beneficial side effects that it inherits attributes
148
// for code generation (e.g. the target attribute) from its callee.
149
#if defined(__GNUC__) || defined(__clang__)
150
#define OPENSSL_ATTR_ALWAYS_INLINE __attribute__((always_inline))
151
#else
152
#define OPENSSL_ATTR_ALWAYS_INLINE
153
#endif
154
155
#if defined(BORINGSSL_MALLOC_FAILURE_TESTING)
156
// OPENSSL_reset_malloc_counter_for_testing, when malloc testing is enabled,
157
// resets the internal malloc counter, to simulate further malloc failures. This
158
// should be called in between independent tests, at a point where failure from
159
// a previous test will not impact subsequent ones.
160
OPENSSL_EXPORT void OPENSSL_reset_malloc_counter_for_testing();
161
162
// OPENSSL_disable_malloc_failures_for_testing, when malloc testing is enabled,
163
// disables simulated malloc failures. Calls to `OPENSSL_malloc` will not
164
// increment the malloc counter or synthesize failures. This may be used to skip
165
// simulating malloc failures in some region of code.
166
OPENSSL_EXPORT void OPENSSL_disable_malloc_failures_for_testing();
167
168
// OPENSSL_enable_malloc_failures_for_testing, when malloc testing is enabled,
169
// re-enables simulated malloc failures.
170
OPENSSL_EXPORT void OPENSSL_enable_malloc_failures_for_testing();
171
#else
172
0
inline void OPENSSL_reset_malloc_counter_for_testing() {}
173
0
inline void OPENSSL_disable_malloc_failures_for_testing() {}
174
0
inline void OPENSSL_enable_malloc_failures_for_testing() {}
175
#endif
176
177
#if defined(__has_builtin)
178
#define OPENSSL_HAS_BUILTIN(x) __has_builtin(x)
179
#else
180
#define OPENSSL_HAS_BUILTIN(x) 0
181
#endif
182
183
184
// Pointer utility functions.
185
186
// buffers_alias returns one if `a` and `b` alias and zero otherwise.
187
inline int buffers_alias(const void *a, size_t a_bytes, const void *b,
188
114M
                         size_t b_bytes) {
189
  // Cast `a` and `b` to integers. In C, pointer comparisons between unrelated
190
  // objects are undefined whereas pointer to integer conversions are merely
191
  // implementation-defined. We assume the implementation defined it in a sane
192
  // way.
193
114M
  uintptr_t a_u = (uintptr_t)a;
194
114M
  uintptr_t b_u = (uintptr_t)b;
195
114M
  return a_u + a_bytes > b_u && b_u + b_bytes > a_u;
196
114M
}
197
198
// spans_alias returns one if `a` and `b` alias, and zero otherwise.
199
template <typename T>
200
3.30M
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
3.30M
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
3.30M
                       b.size() * sizeof(T));
203
3.30M
}
int bssl::spans_alias<unsigned char>(bssl::Span<unsigned char const, 18446744073709551615ul>, bssl::Span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
200
2.98M
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
2.98M
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
2.98M
                       b.size() * sizeof(T));
203
2.98M
}
int bssl::spans_alias<bool>(bssl::Span<bool const, 18446744073709551615ul>, bssl::Span<bool const, 18446744073709551615ul>)
Line
Count
Source
200
65.1k
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
65.1k
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
65.1k
                       b.size() * sizeof(T));
203
65.1k
}
int bssl::spans_alias<unsigned short>(bssl::Span<unsigned short const, 18446744073709551615ul>, bssl::Span<unsigned short const, 18446744073709551615ul>)
Line
Count
Source
200
195k
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
195k
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
195k
                       b.size() * sizeof(T));
203
195k
}
int bssl::spans_alias<unsigned int>(bssl::Span<unsigned int const, 18446744073709551615ul>, bssl::Span<unsigned int const, 18446744073709551615ul>)
Line
Count
Source
200
59.9k
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
59.9k
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
59.9k
                       b.size() * sizeof(T));
203
59.9k
}
int bssl::spans_alias<crypto_iovec_st>(bssl::Span<crypto_iovec_st const, 18446744073709551615ul>, bssl::Span<crypto_iovec_st const, 18446744073709551615ul>)
Line
Count
Source
200
4.34k
inline int spans_alias(Span<const T> a, Span<const T> b) {
201
4.34k
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
202
4.34k
                       b.size() * sizeof(T));
203
4.34k
}
204
205
// align_pointer returns `ptr`, advanced to `alignment`. `alignment` must be a
206
// power of two, and `ptr` must have at least `alignment - 1` bytes of scratch
207
// space.
208
67
inline void *align_pointer(void *ptr, size_t alignment) {
209
  // `alignment` must be a power of two.
210
67
  assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
211
  // Instead of aligning `ptr` as a `uintptr_t` and casting back, compute the
212
  // offset and advance in pointer space. C guarantees that casting from pointer
213
  // to `uintptr_t` and back gives the same pointer, but general
214
  // integer-to-pointer conversions are implementation-defined. GCC does define
215
  // it in the useful way, but this makes fewer assumptions.
216
67
  uintptr_t offset = (0u - (uintptr_t)ptr) & (alignment - 1);
217
67
  ptr = (char *)ptr + offset;
218
67
  assert(((uintptr_t)ptr & (alignment - 1)) == 0);
219
67
  return ptr;
220
67
}
221
222
223
// Constant-time utility functions.
224
//
225
// The following methods return a bitmask of all ones (0xff...f) for true and 0
226
// for false. This is useful for choosing a value based on the result of a
227
// conditional in constant time. For example,
228
//
229
// if (a < b) {
230
//   c = a;
231
// } else {
232
//   c = b;
233
// }
234
//
235
// can be written as
236
//
237
// crypto_word_t lt = constant_time_lt_w(a, b);
238
// c = constant_time_select_w(lt, a, b);
239
240
// crypto_word_t is the type that most constant-time functions use. Ideally we
241
// would like it to be `size_t`, but NaCl builds in 64-bit mode with 32-bit
242
// pointers, which means that `size_t` can be 32 bits when `BN_ULONG` is 64
243
// bits. Since we want to be able to do constant-time operations on a
244
// `BN_ULONG`, `crypto_word_t` is defined as an unsigned value with the native
245
// word length.
246
#if defined(OPENSSL_64_BIT)
247
typedef uint64_t crypto_word_t;
248
#elif defined(OPENSSL_32_BIT)
249
typedef uint32_t crypto_word_t;
250
#else
251
#error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT"
252
#endif
253
254
0
#define CONSTTIME_TRUE_W ~((crypto_word_t)0)
255
0
#define CONSTTIME_FALSE_W ((crypto_word_t)0)
256
#define CONSTTIME_TRUE_8 ((uint8_t)0xff)
257
#define CONSTTIME_FALSE_8 ((uint8_t)0)
258
259
// value_barrier_w returns `a`, but prevents GCC and Clang from reasoning about
260
// the returned value. This is used to mitigate compilers undoing constant-time
261
// code, until we can express our requirements directly in the language.
262
//
263
// Note the compiler is aware that `value_barrier_w` has no side effects and
264
// always has the same output for a given input. This allows it to eliminate
265
// dead code, move computations across loops, and vectorize.
266
3.06G
inline crypto_word_t value_barrier_w(crypto_word_t a) {
267
3.06G
#if defined(__GNUC__) || defined(__clang__)
268
3.06G
  __asm__("" : "+r"(a) : /* no inputs */);
269
3.06G
#endif
270
3.06G
  return a;
271
3.06G
}
272
273
// value_barrier_u32 behaves like `value_barrier_w` but takes a `uint32_t`.
274
804M
inline uint32_t value_barrier_u32(uint32_t a) {
275
804M
#if defined(__GNUC__) || defined(__clang__)
276
804M
  __asm__("" : "+r"(a) : /* no inputs */);
277
804M
#endif
278
804M
  return a;
279
804M
}
280
281
// value_barrier_u64 behaves like `value_barrier_w` but takes a `uint64_t`.
282
0
inline uint64_t value_barrier_u64(uint64_t a) {
283
0
#if defined(__GNUC__) || defined(__clang__)
284
0
  __asm__("" : "+r"(a) : /* no inputs */);
285
0
#endif
286
0
  return a;
287
0
}
288
289
// `value_barrier_u8` could be defined as above, but compilers other than
290
// clang seem to still materialize 0x00..00MM instead of reusing 0x??..??MM.
291
292
// constant_time_msb_w returns the given value with the MSB copied to all the
293
// other bits.
294
200M
inline crypto_word_t constant_time_msb_w(crypto_word_t a) {
295
200M
  return 0u - (a >> (sizeof(a) * 8 - 1));
296
200M
}
297
298
// constant_time_lt_w returns 0xff..f if a < b and 0 otherwise.
299
8.96M
inline crypto_word_t constant_time_lt_w(crypto_word_t a, crypto_word_t b) {
300
  // Consider the two cases of the problem:
301
  //   msb(a) == msb(b): a < b iff the MSB of a - b is set.
302
  //   msb(a) != msb(b): a < b iff the MSB of b is set.
303
  //
304
  // If msb(a) == msb(b) then the following evaluates as:
305
  //   msb(a^((a^b)|((a-b)^a))) ==
306
  //   msb(a^((a-b) ^ a))       ==   (because msb(a^b) == 0)
307
  //   msb(a^a^(a-b))           ==   (rearranging)
308
  //   msb(a-b)                      (because ∀x. x^x == 0)
309
  //
310
  // Else, if msb(a) != msb(b) then the following evaluates as:
311
  //   msb(a^((a^b)|((a-b)^a))) ==
312
  //   msb(a^(𝟙 | ((a-b)^a)))   ==   (because msb(a^b) == 1 and 𝟙
313
  //                                  represents a value s.t. msb(𝟙) = 1)
314
  //   msb(a^𝟙)                 ==   (because ORing with 1 results in 1)
315
  //   msb(b)
316
  //
317
  //
318
  // Here is an SMT-LIB verification of this formula:
319
  //
320
  // (define-fun lt ((a (_ BitVec 32)) (b (_ BitVec 32))) (_ BitVec 32)
321
  //   (bvxor a (bvor (bvxor a b) (bvxor (bvsub a b) a)))
322
  // )
323
  //
324
  // (declare-fun a () (_ BitVec 32))
325
  // (declare-fun b () (_ BitVec 32))
326
  //
327
  // (assert (not (= (= #x00000001 (bvlshr (lt a b) #x0000001f)) (bvult a b))))
328
  // (check-sat)
329
  // (get-model)
330
8.96M
  return constant_time_msb_w(a ^ ((a ^ b) | ((a - b) ^ a)));
331
8.96M
}
332
333
// constant_time_lt_8 acts like `constant_time_lt_w` but returns an 8-bit
334
// mask.
335
254k
inline uint8_t constant_time_lt_8(crypto_word_t a, crypto_word_t b) {
336
254k
  return (uint8_t)(constant_time_lt_w(a, b));
337
254k
}
338
339
// constant_time_ge_w returns 0xff..f if a >= b and 0 otherwise.
340
344k
inline crypto_word_t constant_time_ge_w(crypto_word_t a, crypto_word_t b) {
341
344k
  return ~constant_time_lt_w(a, b);
342
344k
}
343
344
// constant_time_ge_8 acts like `constant_time_ge_w` but returns an 8-bit
345
// mask.
346
339k
inline uint8_t constant_time_ge_8(crypto_word_t a, crypto_word_t b) {
347
339k
  return (uint8_t)(constant_time_ge_w(a, b));
348
339k
}
349
350
// constant_time_is_zero returns 0xff..f if a == 0 and 0 otherwise.
351
175M
inline crypto_word_t constant_time_is_zero_w(crypto_word_t a) {
352
  // Here is an SMT-LIB verification of this formula:
353
  //
354
  // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32)
355
  //   (bvand (bvnot a) (bvsub a #x00000001))
356
  // )
357
  //
358
  // (declare-fun a () (_ BitVec 32))
359
  //
360
  // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a
361
  // #x00000000)))) (check-sat) (get-model)
362
175M
  return constant_time_msb_w(~a & (a - 1));
363
175M
}
364
365
// constant_time_is_zero_8 acts like `constant_time_is_zero_w` but returns an
366
// 8-bit mask.
367
20.3k
inline uint8_t constant_time_is_zero_8(crypto_word_t a) {
368
20.3k
  return (uint8_t)(constant_time_is_zero_w(a));
369
20.3k
}
370
371
// constant_time_eq_w returns 0xff..f if a == b and 0 otherwise.
372
146M
inline crypto_word_t constant_time_eq_w(crypto_word_t a, crypto_word_t b) {
373
146M
  return constant_time_is_zero_w(a ^ b);
374
146M
}
375
376
// constant_time_eq_8 acts like `constant_time_eq_w` but returns an 8-bit
377
// mask.
378
5.96M
inline uint8_t constant_time_eq_8(crypto_word_t a, crypto_word_t b) {
379
5.96M
  return (uint8_t)(constant_time_eq_w(a, b));
380
5.96M
}
381
382
// constant_time_eq_int acts like `constant_time_eq_w` but works on int
383
// values.
384
878k
inline crypto_word_t constant_time_eq_int(int a, int b) {
385
878k
  return constant_time_eq_w((crypto_word_t)(a), (crypto_word_t)(b));
386
878k
}
387
388
// constant_time_eq_int_8 acts like `constant_time_eq_int` but returns an 8-bit
389
// mask.
390
221
inline uint8_t constant_time_eq_int_8(int a, int b) {
391
221
  return constant_time_eq_8((crypto_word_t)(a), (crypto_word_t)(b));
392
221
}
393
394
// constant_time_select_w returns (mask & a) | (~mask & b). When `mask` is all
395
// 1s or all 0s (as returned by the methods above), the select methods return
396
// either `a` (if `mask` is nonzero) or `b` (if `mask` is zero).
397
inline crypto_word_t constant_time_select_w(crypto_word_t mask, crypto_word_t a,
398
2.10G
                                            crypto_word_t b) {
399
  // Clang recognizes this pattern as a select. While it usually transforms it
400
  // to a cmov, it sometimes further transforms it into a branch, which we do
401
  // not want.
402
  //
403
  // Hiding the value of the mask from the compiler evades this transformation.
404
2.10G
  mask = value_barrier_w(mask);
405
2.10G
  return (mask & a) | (~mask & b);
406
2.10G
}
407
408
// constant_time_select_8 acts like `constant_time_select` but operates on
409
// 8-bit values.
410
inline uint8_t constant_time_select_8(crypto_word_t mask, uint8_t a,
411
952M
                                      uint8_t b) {
412
  // `mask` is a word instead of `uint8_t` to avoid materializing 0x000..0MM
413
  // Making both `mask` and its value barrier `uint8_t` would allow the compiler
414
  // to materialize 0x????..?MM instead, but only clang is that clever.
415
  // However, vectorization of bitwise operations seems to work better on
416
  // `uint8_t` than a mix of `uint64_t` and `uint8_t`, so `m` is cast to
417
  // `uint8_t` after the value barrier but before the bitwise operations.
418
952M
  uint8_t m = value_barrier_w(mask);
419
952M
  return (m & a) | (~m & b);
420
952M
}
421
422
// constant_time_select_int acts like `constant_time_select` but operates on
423
// ints.
424
13.4M
inline int constant_time_select_int(crypto_word_t mask, int a, int b) {
425
13.4M
  return static_cast<int>(constant_time_select_w(
426
13.4M
      mask, static_cast<crypto_word_t>(a), static_cast<crypto_word_t>(b)));
427
13.4M
}
428
429
// constant_time_select_32 acts like `constant_time_select` but operates on
430
// 32-bit values.
431
inline uint32_t constant_time_select_32(crypto_word_t mask, uint32_t a,
432
2.48M
                                        uint32_t b) {
433
2.48M
  return static_cast<uint32_t>(
434
2.48M
      constant_time_select_w(mask, crypto_word_t{a}, crypto_word_t{b}));
435
2.48M
}
436
437
// constant_time_conditional_memcpy copies `n` bytes from `src` to `dst` if
438
// `mask` is 0xff..ff and does nothing if `mask` is 0. The `n`-byte memory
439
// ranges at `dst` and `src` must not overlap, as when calling `memcpy`.
440
inline void constant_time_conditional_memcpy(void *dst, const void *src,
441
                                             const size_t n,
442
29.7M
                                             const crypto_word_t mask) {
443
29.7M
  assert(!buffers_alias(dst, n, src, n));
444
29.7M
  uint8_t *out = (uint8_t *)dst;
445
29.7M
  const uint8_t *in = (const uint8_t *)src;
446
982M
  for (size_t i = 0; i < n; i++) {
447
952M
    out[i] = constant_time_select_8(mask, in[i], out[i]);
448
952M
  }
449
29.7M
}
450
451
// constant_time_conditional_memxor xors `n` bytes from `src` to `dst` if
452
// `mask` is 0xff..ff and does nothing if `mask` is 0. The `n`-byte memory
453
// ranges at `dst` and `src` must not overlap, as when calling `memcpy`.
454
inline void constant_time_conditional_memxor(void *dst, const void *src,
455
                                             size_t n,
456
79.3M
                                             const crypto_word_t mask) {
457
79.3M
  assert(!buffers_alias(dst, n, src, n));
458
79.3M
  uint8_t *out = (uint8_t *)dst;
459
79.3M
  const uint8_t *in = (const uint8_t *)src;
460
79.3M
#if defined(__GNUC__) || defined(__clang__)
461
  // gcc 13.2.0 doesn't automatically vectorize this loop regardless of barrier
462
  // clang 16.0.6 vectorizes if alias analysis finds src and dst are disjoint,
463
  // but does not conclude that from the !buffers_alias assert.
464
79.3M
  typedef uint8_t v32u8 __attribute__((vector_size(32), aligned(1), may_alias));
465
79.3M
  size_t n_vec = n & ~(size_t)31;
466
79.3M
  v32u8 masks = ((uint8_t)mask - (v32u8){});  // broadcast
467
317M
  for (size_t i = 0; i < n_vec; i += 32) {
468
238M
    *(v32u8 *)&out[i] ^= masks & *(v32u8 *)&in[i];
469
238M
  }
470
79.3M
  in += n_vec;
471
79.3M
  out += n_vec;
472
79.3M
  n -= n_vec;
473
79.3M
#endif
474
79.3M
  for (size_t i = 0; i < n; i++) {
475
0
    out[i] ^= value_barrier_w(mask) & in[i];
476
0
  }
477
79.3M
}
478
479
#if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)
480
481
// CONSTTIME_SECRET takes a pointer and a number of bytes and marks that region
482
// of memory as secret. Secret data is tracked as it flows to registers and
483
// other parts of a memory. If secret data is used as a condition for a branch,
484
// or as a memory index, it will trigger warnings in valgrind.
485
#define CONSTTIME_SECRET(ptr, len) VALGRIND_MAKE_MEM_UNDEFINED(ptr, len)
486
487
// CONSTTIME_DECLASSIFY takes a pointer and a number of bytes and marks that
488
// region of memory as public. Public data is not subject to constant-time
489
// rules.
490
#define CONSTTIME_DECLASSIFY(ptr, len) VALGRIND_MAKE_MEM_DEFINED(ptr, len)
491
492
#else
493
494
// Just disable unused warnings for those.
495
#define CONSTTIME_SECRET(ptr, len) \
496
58.7k
  do {                             \
497
58.7k
    (void)(ptr);                   \
498
58.7k
    (void)(len);                   \
499
58.7k
  } while (false)
500
#define CONSTTIME_DECLASSIFY(ptr, len) \
501
804M
  do {                                 \
502
804M
    (void)(ptr);                       \
503
804M
    (void)(len);                       \
504
804M
  } while (false)
505
506
#endif  // BORINGSSL_CONSTANT_TIME_VALIDATION
507
508
2.23M
inline crypto_word_t constant_time_declassify_w(crypto_word_t v) {
509
  // Return `v` through a value barrier to be safe. Valgrind-based constant-time
510
  // validation is partly to check the compiler has not undone any constant-time
511
  // work. Any place `BORINGSSL_CONSTANT_TIME_VALIDATION` influences
512
  // optimizations, this validation is inaccurate.
513
  //
514
  // However, by sending pointers through valgrind, we likely inhibit escape
515
  // analysis. On local variables, particularly booleans, we likely
516
  // significantly impact optimizations.
517
  //
518
  // Thus, to be safe, stick a value barrier, in hopes of comparably inhibiting
519
  // compiler analysis.
520
2.23M
  CONSTTIME_DECLASSIFY(&v, sizeof(v));
521
2.23M
  return value_barrier_w(v);
522
2.23M
}
523
524
801M
inline int constant_time_declassify_int(int v) {
525
801M
  static_assert(sizeof(uint32_t) == sizeof(int),
526
801M
                "int is not the same size as uint32_t");
527
  // See comment above.
528
801M
  CONSTTIME_DECLASSIFY(&v, sizeof(v));
529
801M
  return value_barrier_u32(v);
530
801M
}
531
532
// declassify_assert behaves like `assert` but declassifies the result of
533
// evaluating `expr`. This allows the assertion to branch on the (presumably
534
// public) result, but still ensures that values leading up to the computation
535
// were secret.
536
797M
#define declassify_assert(expr) assert(constant_time_declassify_int(expr))
537
538
539
// Thread-safe initialisation.
540
541
#if !defined(OPENSSL_THREADS)
542
typedef uint32_t CRYPTO_once_t;
543
#define CRYPTO_ONCE_INIT 0
544
#elif defined(OPENSSL_WINDOWS_THREADS)
545
typedef INIT_ONCE CRYPTO_once_t;
546
#define CRYPTO_ONCE_INIT INIT_ONCE_STATIC_INIT
547
#elif defined(OPENSSL_PTHREADS)
548
typedef pthread_once_t CRYPTO_once_t;
549
#define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT
550
#else
551
#error "Unknown threading library"
552
#endif
553
554
// CRYPTO_once calls `init` exactly once per process. This is thread-safe: if
555
// concurrent threads call `CRYPTO_once` with the same `CRYPTO_once_t` argument
556
// then they will block until `init` completes, but `init` will have only been
557
// called once.
558
//
559
// The `once` argument must be a `CRYPTO_once_t` that has been initialised with
560
// the value `CRYPTO_ONCE_INIT`.
561
OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void (*init)());
562
563
564
// Atomics.
565
//
566
// This is a thin wrapper over std::atomic because some embedded platforms do
567
// not support threads and don't provide a trivial std::atomic implementation.
568
// For now, this does not wrap std::memory_order. If we ever use non-default
569
// std::memory_order, we will need to wrap these too, or fix the embedded
570
// platforms to provide a no-op std::atomic. See https://crbug.com/442112336.
571
572
#if defined(OPENSSL_THREADS)
573
template <typename T>
574
using Atomic = std::atomic<T>;
575
#else
576
template <typename T>
577
class Atomic {
578
 public:
579
  static_assert(std::is_integral_v<T> || std::is_pointer_v<T>);
580
581
  Atomic() = default;
582
  constexpr Atomic(T value) : value_(value) {}
583
  Atomic(const Atomic &) = delete;
584
  Atomic &operator=(const Atomic &) = delete;
585
  T operator=(T value) {
586
    value_ = value;
587
    return value_;
588
  }
589
590
  T load() const { return value_; }
591
  void store(T desired) { value_ = desired; }
592
593
  bool compare_exchange_strong(T &expected, T desired) {
594
    if (value_ != expected) {
595
      expected = value_;
596
      return false;
597
    }
598
    value_ = desired;
599
    return true;
600
  }
601
  bool compare_exchange_weak(T &expected, T desired) {
602
    return compare_exchange_strong(expected, desired);
603
  }
604
605
  T exchange(T desired) { return std::exchange(value_, desired); }
606
607
 private:
608
  T value_;
609
};
610
#endif
611
612
613
// Reference counting.
614
615
// CRYPTO_REFCOUNT_MAX is the value at which the reference count saturates.
616
4.01M
#define CRYPTO_REFCOUNT_MAX 0xffffffff
617
618
using CRYPTO_refcount_t = Atomic<uint32_t>;
619
620
// CRYPTO_refcount_inc atomically increments the value at `*count` unless the
621
// value would overflow. It's safe for multiple threads to concurrently call
622
// this or `CRYPTO_refcount_dec_and_test_zero` on the same
623
// `CRYPTO_refcount_t`.
624
OPENSSL_EXPORT void CRYPTO_refcount_inc(CRYPTO_refcount_t *count);
625
626
// CRYPTO_refcount_dec_and_test_zero tests the value at `*count`:
627
//   if it's zero, it crashes the address space.
628
//   if it's the maximum value, it returns zero.
629
//   otherwise, it atomically decrements it and returns one iff the resulting
630
//       value is zero.
631
//
632
// It's safe for multiple threads to concurrently call this or
633
// `CRYPTO_refcount_inc` on the same `CRYPTO_refcount_t`.
634
OPENSSL_EXPORT int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count);
635
636
637
// Locks.
638
639
// A Mutex is a read/write lock. It can be constant-initialized, but has a
640
// destructor. To allocate a global one, use StaticMutex, which skips the
641
// destructor.
642
class OPENSSL_EXPORT StaticMutex {
643
 public:
644
367k
  constexpr StaticMutex() = default;
645
  StaticMutex(const StaticMutex &) = delete;
646
  StaticMutex &operator=(const StaticMutex &) = delete;
647
648
  // LockRead locks the mutex such that other threads may also have a read lock,
649
  // but none may have a write lock.
650
  void LockRead();
651
  // UnlockRead releases a read lock.
652
  void UnlockRead();
653
654
  // LockWrite locks the mutex such that no other thread has any type of lock on
655
  // it.
656
  void LockWrite();
657
  // UnlockWrite releases a write lock.
658
  void UnlockWrite();
659
660
 protected:
661
#if !defined(OPENSSL_THREADS)
662
  // Nothing.
663
#elif defined(OPENSSL_WINDOWS_THREADS)
664
  SRWLOCK lock_ = SRWLOCK_INIT;
665
#elif defined(OPENSSL_PTHREADS)
666
  pthread_rwlock_t lock_ = PTHREAD_RWLOCK_INITIALIZER;
667
#else
668
#error "Unknown threading library"
669
#endif
670
};
671
672
class OPENSSL_EXPORT Mutex : public StaticMutex {
673
 public:
674
367k
  constexpr Mutex() = default;
675
  ~Mutex();
676
};
677
678
namespace internal {
679
680
// MutexLockBase is a RAII helper for Mutex locking.
681
template <void (StaticMutex::*LockMethod)(),
682
          void (StaticMutex::*ReleaseMethod)()>
683
class MutexLockBase {
684
 public:
685
648k
  explicit MutexLockBase(StaticMutex *mu) : mu_(mu) {
686
648k
    assert(mu_ != nullptr);
687
648k
    (mu_->*LockMethod)();
688
648k
  }
bssl::internal::MutexLockBase<&bssl::StaticMutex::LockWrite, &bssl::StaticMutex::UnlockWrite>::MutexLockBase(bssl::StaticMutex*)
Line
Count
Source
685
173k
  explicit MutexLockBase(StaticMutex *mu) : mu_(mu) {
686
173k
    assert(mu_ != nullptr);
687
173k
    (mu_->*LockMethod)();
688
173k
  }
bssl::internal::MutexLockBase<&bssl::StaticMutex::LockRead, &bssl::StaticMutex::UnlockRead>::MutexLockBase(bssl::StaticMutex*)
Line
Count
Source
685
474k
  explicit MutexLockBase(StaticMutex *mu) : mu_(mu) {
686
474k
    assert(mu_ != nullptr);
687
474k
    (mu_->*LockMethod)();
688
474k
  }
689
648k
  ~MutexLockBase() { (mu_->*ReleaseMethod)(); }
bssl::internal::MutexLockBase<&bssl::StaticMutex::LockWrite, &bssl::StaticMutex::UnlockWrite>::~MutexLockBase()
Line
Count
Source
689
173k
  ~MutexLockBase() { (mu_->*ReleaseMethod)(); }
bssl::internal::MutexLockBase<&bssl::StaticMutex::LockRead, &bssl::StaticMutex::UnlockRead>::~MutexLockBase()
Line
Count
Source
689
474k
  ~MutexLockBase() { (mu_->*ReleaseMethod)(); }
690
  MutexLockBase(const MutexLockBase &) = delete;
691
  MutexLockBase &operator=(const MutexLockBase &) = delete;
692
693
 private:
694
  StaticMutex *const mu_;
695
};
696
697
}  // namespace internal
698
699
using MutexWriteLock =
700
    internal::MutexLockBase<&StaticMutex::LockWrite, &StaticMutex::UnlockWrite>;
701
using MutexReadLock =
702
    internal::MutexLockBase<&StaticMutex::LockRead, &StaticMutex::UnlockRead>;
703
using MutexWriteUnlock =
704
    internal::MutexLockBase<&StaticMutex::UnlockWrite, &StaticMutex::LockWrite>;
705
using MutexReadUnlock =
706
    internal::MutexLockBase<&StaticMutex::UnlockRead, &StaticMutex::LockRead>;
707
708
709
// Thread local storage.
710
711
// thread_local_data_t enumerates the types of thread-local data that can be
712
// stored.
713
typedef enum {
714
  OPENSSL_THREAD_LOCAL_ERR = 0,
715
  OPENSSL_THREAD_LOCAL_RAND,
716
  OPENSSL_THREAD_LOCAL_FIPS_COUNTERS,
717
  OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE,
718
  OPENSSL_THREAD_LOCAL_TEST,
719
  NUM_OPENSSL_THREAD_LOCALS,
720
} thread_local_data_t;
721
722
// thread_local_destructor_t is the type of a destructor function that will be
723
// called when a thread exits and its thread-local storage needs to be freed.
724
typedef void (*thread_local_destructor_t)(void *);
725
726
// CRYPTO_get_thread_local gets the pointer value that is stored for the
727
// current thread for the given index, or NULL if none has been set.
728
OPENSSL_EXPORT void *CRYPTO_get_thread_local(thread_local_data_t value);
729
730
// CRYPTO_set_thread_local sets a pointer value for the current thread at the
731
// given index. This function should only be called once per thread for a given
732
// `index`: rather than update the pointer value itself, update the data that
733
// is pointed to.
734
//
735
// The destructor function will be called when a thread exits to free this
736
// thread-local data. All calls to `CRYPTO_set_thread_local` with the same
737
// `index` should have the same `destructor` argument. The destructor may be
738
// called with a NULL argument if a thread that never set a thread-local
739
// pointer for `index`, exits. The destructor may be called concurrently with
740
// different arguments.
741
//
742
// This function returns one on success or zero on error. If it returns zero
743
// then `destructor` has been called with `value` already.
744
OPENSSL_EXPORT int CRYPTO_set_thread_local(
745
    thread_local_data_t index, void *value,
746
    thread_local_destructor_t destructor);
747
748
749
// ex_data
750
751
BSSL_NAMESPACE_END
752
753
struct crypto_ex_data_st {
754
  STACK_OF(void) *sk;
755
} /* CRYPTO_EX_DATA */;
756
757
BSSL_NAMESPACE_BEGIN
758
759
struct ExDataFuncs;
760
761
// ExDataClass tracks the ex_indices registered for a type which
762
// supports ex_data. It should defined as a static global within the module
763
// which defines that type.
764
struct ExDataClass {
765
  explicit constexpr ExDataClass(bool with_app_data = false)
766
0
      : num_reserved(with_app_data ? 1 : 0) {}
767
768
  StaticMutex lock;
769
  // funcs is a linked list of `ExDataFuncs` structures. It may be traversed
770
  // without serialization only up to `num_funcs`. last points to the final
771
  // entry of `funcs`, or nullptr if empty.
772
  ExDataFuncs *funcs = nullptr, *last = nullptr;
773
  // num_funcs is the number of entries in `funcs`.
774
  Atomic<uint32_t> num_funcs = 0;
775
  // num_reserved is one if the ex_data index zero is reserved for legacy
776
  // `TYPE_get_app_data` functions.
777
  uint8_t num_reserved = 0;
778
};
779
780
// CRYPTO_get_ex_new_index_ex allocates a new index for `ex_data_class`. Each
781
// class of object should provide a wrapper function that uses the correct
782
// `ExDataClass`. It returns the new index on success and -1 on error.
783
OPENSSL_EXPORT int CRYPTO_get_ex_new_index_ex(ExDataClass *ex_data_class,
784
                                              long argl, void *argp,
785
                                              CRYPTO_EX_free *free_func);
786
787
// CRYPTO_set_ex_data sets an extra data pointer on a given object. Each class
788
// of object should provide a wrapper function.
789
OPENSSL_EXPORT int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val);
790
791
// CRYPTO_get_ex_data returns an extra data pointer for a given object, or NULL
792
// if no such index exists. Each class of object should provide a wrapper
793
// function.
794
OPENSSL_EXPORT void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int index);
795
796
// CRYPTO_new_ex_data initialises a newly allocated `CRYPTO_EX_DATA`.
797
OPENSSL_EXPORT void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad);
798
799
// CRYPTO_free_ex_data frees `ad`, which is an object of the given class.
800
OPENSSL_EXPORT void CRYPTO_free_ex_data(ExDataClass *ex_data_class,
801
                                        CRYPTO_EX_DATA *ad);
802
803
804
// Endianness conversions.
805
806
#if defined(__GNUC__) && __GNUC__ >= 2
807
83.3k
inline uint16_t CRYPTO_bswap2(uint16_t x) { return __builtin_bswap16(x); }
808
809
25.4M
inline uint32_t CRYPTO_bswap4(uint32_t x) { return __builtin_bswap32(x); }
810
811
13.1M
inline uint64_t CRYPTO_bswap8(uint64_t x) { return __builtin_bswap64(x); }
812
#elif defined(_MSC_VER)
813
#pragma intrinsic(_byteswap_uint64, _byteswap_ulong, _byteswap_ushort)
814
inline uint16_t CRYPTO_bswap2(uint16_t x) { return _byteswap_ushort(x); }
815
816
inline uint32_t CRYPTO_bswap4(uint32_t x) { return _byteswap_ulong(x); }
817
818
inline uint64_t CRYPTO_bswap8(uint64_t x) { return _byteswap_uint64(x); }
819
#else
820
inline uint16_t CRYPTO_bswap2(uint16_t x) { return (x >> 8) | (x << 8); }
821
822
inline uint32_t CRYPTO_bswap4(uint32_t x) {
823
  x = (x >> 16) | (x << 16);
824
  x = ((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8);
825
  return x;
826
}
827
828
inline uint64_t CRYPTO_bswap8(uint64_t x) {
829
  return CRYPTO_bswap4(x >> 32) | (((uint64_t)CRYPTO_bswap4(x)) << 32);
830
}
831
#endif
832
833
834
// Language bug workarounds.
835
//
836
// Most C standard library functions are undefined if passed NULL, even when the
837
// corresponding length is zero. This gives them (and, in turn, all functions
838
// which call them) surprising behavior on empty arrays. Some compilers will
839
// miscompile code due to this rule. See also
840
// https://www.imperialviolet.org/2016/06/26/nonnull.html
841
//
842
// These wrapper functions behave the same as the corresponding C standard
843
// functions, but behave as expected when passed NULL if the length is zero.
844
//
845
// Note `OPENSSL_memcmp` is a different function from `CRYPTO_memcmp`.
846
847
// C++ defines `memchr` as a const-correct overload.
848
539k
inline const void *OPENSSL_memchr(const void *s, int c, size_t n) {
849
539k
  if (n == 0) {
850
6.12k
    return nullptr;
851
6.12k
  }
852
853
532k
  return memchr(s, c, n);
854
539k
}
855
856
473k
inline void *OPENSSL_memchr(void *s, int c, size_t n) {
857
473k
  if (n == 0) {
858
25.4k
    return nullptr;
859
25.4k
  }
860
861
448k
  return memchr(s, c, n);
862
473k
}
863
864
19.3M
inline int OPENSSL_memcmp(const void *s1, const void *s2, size_t n) {
865
19.3M
  if (n == 0) {
866
38
    return 0;
867
38
  }
868
869
19.3M
  return memcmp(s1, s2, n);
870
19.3M
}
871
872
166M
inline void *OPENSSL_memcpy(void *dst, const void *src, size_t n) {
873
166M
  if (n == 0) {
874
2.14M
    return dst;
875
2.14M
  }
876
877
164M
  return memcpy(dst, src, n);
878
166M
}
879
880
4.61M
inline void *OPENSSL_memmove(void *dst, const void *src, size_t n) {
881
4.61M
  if (n == 0) {
882
1.46M
    return dst;
883
1.46M
  }
884
885
3.15M
  return memmove(dst, src, n);
886
4.61M
}
887
888
128M
inline void *OPENSSL_memset(void *dst, int c, size_t n) {
889
128M
  if (n == 0) {
890
19.7M
    return dst;
891
19.7M
  }
892
893
109M
  return memset(dst, c, n);
894
128M
}
895
896
897
// Loads and stores.
898
//
899
// The following functions load and store sized integers with the specified
900
// endianness. They use `memcpy`, and so avoid alignment or strict aliasing
901
// requirements on the input and output pointers.
902
903
0
inline uint16_t CRYPTO_load_u16_le(const void *in) {
904
0
  uint16_t v;
905
0
  OPENSSL_memcpy(&v, in, sizeof(v));
906
0
  return v;
907
0
}
908
909
0
inline void CRYPTO_store_u16_le(void *out, uint16_t v) {
910
0
  OPENSSL_memcpy(out, &v, sizeof(v));
911
0
}
912
913
0
inline uint16_t CRYPTO_load_u16_be(const void *in) {
914
0
  uint16_t v;
915
0
  OPENSSL_memcpy(&v, in, sizeof(v));
916
0
  return CRYPTO_bswap2(v);
917
0
}
918
919
83.3k
inline void CRYPTO_store_u16_be(void *out, uint16_t v) {
920
83.3k
  v = CRYPTO_bswap2(v);
921
83.3k
  OPENSSL_memcpy(out, &v, sizeof(v));
922
83.3k
}
923
924
1.18M
inline uint32_t CRYPTO_load_u32_le(const void *in) {
925
1.18M
  uint32_t v;
926
1.18M
  OPENSSL_memcpy(&v, in, sizeof(v));
927
1.18M
  return v;
928
1.18M
}
929
930
1.20M
inline void CRYPTO_store_u32_le(void *out, uint32_t v) {
931
1.20M
  OPENSSL_memcpy(out, &v, sizeof(v));
932
1.20M
}
933
934
3.50M
inline uint32_t CRYPTO_load_u32_be(const void *in) {
935
3.50M
  uint32_t v;
936
3.50M
  OPENSSL_memcpy(&v, in, sizeof(v));
937
3.50M
  return CRYPTO_bswap4(v);
938
3.50M
}
939
940
21.9M
inline void CRYPTO_store_u32_be(void *out, uint32_t v) {
941
21.9M
  v = CRYPTO_bswap4(v);
942
21.9M
  OPENSSL_memcpy(out, &v, sizeof(v));
943
21.9M
}
944
945
7.57M
inline uint64_t CRYPTO_load_u64_le(const void *in) {
946
7.57M
  uint64_t v;
947
7.57M
  OPENSSL_memcpy(&v, in, sizeof(v));
948
7.57M
  return v;
949
7.57M
}
950
951
0
inline void CRYPTO_store_u64_le(void *out, uint64_t v) {
952
0
  OPENSSL_memcpy(out, &v, sizeof(v));
953
0
}
954
955
189k
inline uint64_t CRYPTO_load_u64_be(const void *ptr) {
956
189k
  uint64_t ret;
957
189k
  OPENSSL_memcpy(&ret, ptr, sizeof(ret));
958
189k
  return CRYPTO_bswap8(ret);
959
189k
}
960
961
3.80M
inline void CRYPTO_store_u64_be(void *out, uint64_t v) {
962
3.80M
  v = CRYPTO_bswap8(v);
963
3.80M
  OPENSSL_memcpy(out, &v, sizeof(v));
964
3.80M
}
965
966
21.5M
inline crypto_word_t CRYPTO_load_word_le(const void *in) {
967
21.5M
  crypto_word_t v;
968
21.5M
  OPENSSL_memcpy(&v, in, sizeof(v));
969
21.5M
  return v;
970
21.5M
}
971
972
10.7M
inline void CRYPTO_store_word_le(void *out, crypto_word_t v) {
973
10.7M
  OPENSSL_memcpy(out, &v, sizeof(v));
974
10.7M
}
975
976
9.13M
inline crypto_word_t CRYPTO_load_word_be(const void *in) {
977
9.13M
  crypto_word_t v;
978
9.13M
  OPENSSL_memcpy(&v, in, sizeof(v));
979
9.13M
#if defined(OPENSSL_64_BIT)
980
9.13M
  static_assert(sizeof(v) == 8, "crypto_word_t has unexpected size");
981
9.13M
  return CRYPTO_bswap8(v);
982
#else
983
  static_assert(sizeof(v) == 4, "crypto_word_t has unexpected size");
984
  return CRYPTO_bswap4(v);
985
#endif
986
9.13M
}
987
988
989
// Bit rotation functions.
990
//
991
// Note these functions use `(-shift) & 31`, etc., because shifting by the bit
992
// width is undefined. Both Clang and GCC recognize this pattern as a rotation,
993
// but MSVC does not. Instead, we call MSVC's built-in functions.
994
995
3.54M
inline uint32_t CRYPTO_rotl_u32(uint32_t value, int shift) {
996
#if defined(_MSC_VER)
997
  return _rotl(value, shift);
998
#else
999
3.54M
  return (value << shift) | (value >> ((-shift) & 31));
1000
3.54M
#endif
1001
3.54M
}
1002
1003
3.00M
inline uint32_t CRYPTO_rotr_u32(uint32_t value, int shift) {
1004
#if defined(_MSC_VER)
1005
  return _rotr(value, shift);
1006
#else
1007
3.00M
  return (value >> shift) | (value << ((-shift) & 31));
1008
3.00M
#endif
1009
3.00M
}
1010
1011
575M
inline uint64_t CRYPTO_rotl_u64(uint64_t value, int shift) {
1012
#if defined(_MSC_VER)
1013
  return _rotl64(value, shift);
1014
#else
1015
575M
  return (value << shift) | (value >> ((-shift) & 63));
1016
575M
#endif
1017
575M
}
1018
1019
0
inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) {
1020
#if defined(_MSC_VER)
1021
  return _rotr64(value, shift);
1022
#else
1023
0
  return (value >> shift) | (value << ((-shift) & 63));
1024
0
#endif
1025
0
}
1026
1027
1028
// Bit math functions.
1029
//
1030
// Polyfills for C++20.
1031
1032
// CRYPTO_bit_width returns the smallest number of bits needed to represent `n`.
1033
// It returns zero if `n` is zero.
1034
0
inline constexpr int CRYPTO_bit_width(uint64_t n) {
1035
0
#if OPENSSL_HAS_BUILTIN(__builtin_clzll)
1036
0
  static_assert(sizeof(unsigned long long) >= sizeof(uint64_t));
1037
0
  return n ? (sizeof(unsigned long long) * 8 - __builtin_clzll(n)) : 0;
1038
0
#else
1039
0
  int width = 0;
1040
0
  while (n > 0) {
1041
0
    ++width;
1042
0
    n >>= 1;
1043
0
  }
1044
0
  return width;
1045
0
#endif
1046
0
}
1047
1048
// CRYPTO_popcount returns the number of set bits in `n`'s binary
1049
// representation.
1050
0
inline int CRYPTO_popcount(uint64_t n) {
1051
0
#if OPENSSL_HAS_BUILTIN(__builtin_popcountll)
1052
0
  static_assert(sizeof(unsigned long long) >= sizeof(uint64_t));
1053
0
  return __builtin_popcountll(n);
1054
0
#else
1055
0
  int count = 0;
1056
0
  while (n > 0) {
1057
0
    n &= (n - 1);  // Clears the least significant bit that is set.
1058
0
    ++count;
1059
0
  }
1060
0
  return count;
1061
0
#endif
1062
0
}
1063
1064
// CRYPTO_bit_ceil returns the smallest power of 2 that is greater than or equal
1065
// to `n`.
1066
0
inline uint64_t CRYPTO_bit_ceil(uint64_t n) {
1067
0
  return n ? uint64_t{1} << CRYPTO_bit_width(n - 1) : uint64_t{1};
1068
0
}
1069
1070
// CRYPTO_bit_floor returns the largest power of 2 that is less than or equal to
1071
// `n`. It returns zero if `n` is zero.
1072
0
inline uint64_t CRYPTO_bit_floor(uint64_t n) {
1073
0
  return n ? (uint64_t{1} << (CRYPTO_bit_width(n) - 1)) : uint64_t{0};
1074
0
}
1075
1076
// CRYPTO_has_single_bit returns whether `n` is an integral power of 2.
1077
0
inline bool CRYPTO_has_single_bit(uint64_t n) {
1078
0
  return CRYPTO_popcount(n) == 1;
1079
0
}
1080
1081
1082
// FIPS functions.
1083
1084
#if defined(BORINGSSL_FIPS)
1085
1086
// BORINGSSL_FIPS_abort is called when a FIPS power-on or continuous test
1087
// fails. It prevents any further cryptographic operations by the current
1088
// process.
1089
void BORINGSSL_FIPS_abort() __attribute__((noreturn));
1090
1091
// boringssl_self_test_startup runs all startup self tests and returns one on
1092
// success or zero on error. Startup self tests do not include lazy tests.
1093
// Call `BORINGSSL_self_test` to run every self test.
1094
int boringssl_self_test_startup();
1095
1096
// boringssl_ensure_rsa_sign_self_test checks whether the RSA signing self-test
1097
// has been run in this address space. If not, it runs it and crashes the
1098
// address space if unsuccessful.
1099
void boringssl_ensure_rsa_sign_self_test();
1100
1101
// boringssl_ensure_rsa_verify_self_test checks whether the RSA verification
1102
// self-test has been run in this address space. If not, it runs it and crashes
1103
// the address space if unsuccessful.
1104
void boringssl_ensure_rsa_verify_self_test();
1105
1106
// boringssl_ensure_ecc_self_test checks whether the ECDSA and ECDH self-test
1107
// has been run in this address space. If not, it runs it and crashes the
1108
// address space if unsuccessful.
1109
void boringssl_ensure_ecc_self_test();
1110
1111
// boringssl_ensure_ffdh_self_test checks whether the FFDH self-test has been
1112
// run in this address space. If not, it runs it and crashes the address space
1113
// if unsuccessful.
1114
void boringssl_ensure_ffdh_self_test();
1115
1116
#else
1117
1118
// Outside of FIPS mode, the lazy tests are no-ops.
1119
1120
17.8k
inline void boringssl_ensure_rsa_sign_self_test() {}
1121
23.8k
inline void boringssl_ensure_rsa_verify_self_test() {}
1122
39.8k
inline void boringssl_ensure_ecc_self_test() {}
1123
0
inline void boringssl_ensure_ffdh_self_test() {}
1124
1125
#endif  // FIPS
1126
1127
// BORINGSSL_check_test checks that `expected` and `actual` are equal. It
1128
// returns 1 on success and, on failure, it prints an error message that
1129
// includes the hexdumps the two values and returns 0.
1130
int BORINGSSL_check_test(Span<const uint8_t> expected,
1131
                         Span<const uint8_t> actual, const char *name);
1132
1133
// boringssl_self_test_sha256 performs a SHA-256 KAT.
1134
int boringssl_self_test_sha256();
1135
1136
// boringssl_self_test_sha512 performs a SHA-512 KAT.
1137
int boringssl_self_test_sha512();
1138
1139
// boringssl_self_test_hmac_sha256 performs an HMAC-SHA-256 KAT.
1140
int boringssl_self_test_hmac_sha256();
1141
1142
// boringssl_self_test_mlkem performs the ML-KEM KATs.
1143
OPENSSL_EXPORT int boringssl_self_test_mlkem();
1144
1145
// boringssl_self_test_mldsa performs the ML-DSA KATs.
1146
OPENSSL_EXPORT int boringssl_self_test_mldsa();
1147
1148
// boringssl_self_test_slhdsa performs the SLH-DSA KATs.
1149
OPENSSL_EXPORT int boringssl_self_test_slhdsa();
1150
1151
#if defined(BORINGSSL_FIPS_COUNTERS)
1152
void boringssl_fips_inc_counter(enum fips_counter_t counter);
1153
#else
1154
93.4k
inline void boringssl_fips_inc_counter(enum fips_counter_t counter) {}
1155
#endif
1156
1157
#if defined(BORINGSSL_FIPS_BREAK_TESTS)
1158
inline int boringssl_fips_break_test(const char *test) {
1159
  const char *const value = getenv("BORINGSSL_FIPS_BREAK_TEST");
1160
  return value != nullptr && strcmp(value, test) == 0;
1161
}
1162
#else
1163
0
inline int boringssl_fips_break_test(const char *test) { return 0; }
1164
#endif  // BORINGSSL_FIPS_BREAK_TESTS
1165
1166
1167
// Runtime CPU feature support
1168
1169
#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
1170
// OPENSSL_ia32cap_P contains the Intel CPUID bits when running on an x86 or
1171
// x86-64 system.
1172
//
1173
//   Index 0:
1174
//     EDX for CPUID where EAX = 1
1175
//     Bit 30 is used to indicate an Intel CPU
1176
//   Index 1:
1177
//     ECX for CPUID where EAX = 1
1178
//   Index 2:
1179
//     EBX for CPUID where EAX = 7, ECX = 0
1180
//     Bit 14 (for removed feature MPX) is used to indicate a preference for ymm
1181
//       registers over zmm even when zmm registers are supported
1182
//   Index 3:
1183
//     ECX for CPUID where EAX = 7, ECX = 0
1184
//
1185
// Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the XMM, YMM,
1186
// and AVX512 bits in XCR0, so it is not necessary to check those. (WARNING: See
1187
// caveats in cpu_intel.c.)
1188
//
1189
// This symbol should only be accessed with `OPENSSL_get_ia32cap`.
1190
extern uint32_t OPENSSL_ia32cap_P[4];
1191
1192
// OPENSSL_get_ia32cap initializes the library if needed and returns the `idx`th
1193
// entry of `OPENSSL_ia32cap_P`. It is marked as a const function so duplicate
1194
// calls can be merged by the compiler, at least when indices match.
1195
OPENSSL_ATTR_CONST uint32_t OPENSSL_get_ia32cap(int idx);
1196
1197
// OPENSSL_adjust_ia32cap adjusts `cap`, which should contain
1198
// `OPENSSL_ia32cap_P`, based on the environment variable value in `env`. This
1199
// function is exposed for unit tests.
1200
void OPENSSL_adjust_ia32cap(uint32_t cap[4], const char *env);
1201
1202
// See Intel manual, volume 2A, table 3-11.
1203
1204
4.08M
inline int CRYPTO_is_intel_cpu() {
1205
  // The reserved bit 30 is used to indicate an Intel CPU.
1206
4.08M
  return (OPENSSL_get_ia32cap(0) & (1u << 30)) != 0;
1207
4.08M
}
1208
1209
// See Intel manual, volume 2A, table 3-10.
1210
1211
136k
inline int CRYPTO_is_PCLMUL_capable() {
1212
#if defined(__PCLMUL__)
1213
  return 1;
1214
#else
1215
136k
  return (OPENSSL_get_ia32cap(1) & (1u << 1)) != 0;
1216
136k
#endif
1217
136k
}
1218
1219
136k
inline int CRYPTO_is_SSSE3_capable() {
1220
#if defined(__SSSE3__)
1221
  return 1;
1222
#else
1223
136k
  return (OPENSSL_get_ia32cap(1) & (1u << 9)) != 0;
1224
136k
#endif
1225
136k
}
1226
1227
1.55k
inline int CRYPTO_is_SSE4_1_capable() {
1228
#if defined(__SSE4_1__)
1229
  return 1;
1230
#else
1231
1.55k
  return (OPENSSL_get_ia32cap(1) & (1u << 19)) != 0;
1232
1.55k
#endif
1233
1.55k
}
1234
1235
93.4k
inline int CRYPTO_is_MOVBE_capable() {
1236
#if defined(__MOVBE__)
1237
  return 1;
1238
#else
1239
93.4k
  return (OPENSSL_get_ia32cap(1) & (1u << 22)) != 0;
1240
93.4k
#endif
1241
93.4k
}
1242
1243
10.6M
inline int CRYPTO_is_AESNI_capable() {
1244
#if defined(__AES__)
1245
  return 1;
1246
#else
1247
10.6M
  return (OPENSSL_get_ia32cap(1) & (1u << 25)) != 0;
1248
10.6M
#endif
1249
10.6M
}
1250
1251
// We intentionally avoid defining a `CRYPTO_is_XSAVE_capable` function. See
1252
// `CRYPTO_cpu_perf_is_like_silvermont`.
1253
1254
5.65M
inline int CRYPTO_is_AVX_capable() {
1255
#if defined(__AVX__)
1256
  return 1;
1257
#else
1258
5.65M
  return (OPENSSL_get_ia32cap(1) & (1u << 28)) != 0;
1259
5.65M
#endif
1260
5.65M
}
1261
1262
449k
inline int CRYPTO_is_RDRAND_capable() {
1263
  // We intentionally do not check `__RDRND__` here. On some AMD processors, we
1264
  // will act as if the hardware is RDRAND-incapable, even it actually supports
1265
  // it. See cpu_intel.c.
1266
449k
  return (OPENSSL_get_ia32cap(1) & (1u << 30)) != 0;
1267
449k
}
1268
1269
// See Intel manual, volume 2A, table 3-8.
1270
1271
8.50M
inline int CRYPTO_is_BMI1_capable() {
1272
#if defined(__BMI__)
1273
  return 1;
1274
#else
1275
8.50M
  return (OPENSSL_get_ia32cap(2) & (1u << 3)) != 0;
1276
8.50M
#endif
1277
8.50M
}
1278
1279
1.50M
inline int CRYPTO_is_AVX2_capable() {
1280
#if defined(__AVX2__)
1281
  return 1;
1282
#else
1283
1.50M
  return (OPENSSL_get_ia32cap(2) & (1u << 5)) != 0;
1284
1.50M
#endif
1285
1.50M
}
1286
1287
17.3M
inline int CRYPTO_is_BMI2_capable() {
1288
#if defined(__BMI2__)
1289
  return 1;
1290
#else
1291
17.3M
  return (OPENSSL_get_ia32cap(2) & (1u << 8)) != 0;
1292
17.3M
#endif
1293
17.3M
}
1294
1295
16.9M
inline int CRYPTO_is_ADX_capable() {
1296
#if defined(__ADX__)
1297
  return 1;
1298
#else
1299
16.9M
  return (OPENSSL_get_ia32cap(2) & (1u << 19)) != 0;
1300
16.9M
#endif
1301
16.9M
}
1302
1303
// SHA-1 and SHA-256 are defined as a single extension.
1304
3.26M
inline int CRYPTO_is_x86_SHA_capable() {
1305
#if defined(__SHA__)
1306
  return 1;
1307
#else
1308
3.26M
  return (OPENSSL_get_ia32cap(2) & (1u << 29)) != 0;
1309
3.26M
#endif
1310
3.26M
}
1311
1312
// CRYPTO_cpu_perf_is_like_silvermont returns one if, based on a heuristic, the
1313
// CPU has Silvermont-like performance characteristics. It is often faster to
1314
// run different codepaths on these CPUs than the available instructions would
1315
// otherwise select. See chacha-x86_64.pl.
1316
//
1317
// Bonnell, Silvermont's predecessor in the Atom lineup, will also be matched by
1318
// this. Goldmont (Silvermont's successor in the Atom lineup) added XSAVE so it
1319
// isn't matched by this. Various sources indicate AMD first implemented MOVBE
1320
// and XSAVE at the same time in Jaguar, so it seems like AMD chips will not be
1321
// matched by this. That seems to be the case for other x86(-64) CPUs.
1322
374
inline int CRYPTO_cpu_perf_is_like_silvermont() {
1323
  // WARNING: This MUST NOT be used to guard the execution of the XSAVE
1324
  // instruction. This is the "hardware supports XSAVE" bit, not the OSXSAVE bit
1325
  // that indicates whether we can safely execute XSAVE. This bit may be set
1326
  // even when XSAVE is disabled (by the operating system). See how the users of
1327
  // this bit use it.
1328
  //
1329
  // Historically, the XSAVE bit was artificially cleared on Knights Landing
1330
  // and Knights Mill chips, but as Intel has removed all support from GCC,
1331
  // LLVM, and SDE, we assume they are no longer worth special-casing.
1332
374
  int hardware_supports_xsave = (OPENSSL_get_ia32cap(1) & (1u << 26)) != 0;
1333
374
  return !hardware_supports_xsave && CRYPTO_is_MOVBE_capable();
1334
374
}
1335
1336
0
inline int CRYPTO_is_AVX512BW_capable() {
1337
#if defined(__AVX512BW__)
1338
  return 1;
1339
#else
1340
0
  return (OPENSSL_get_ia32cap(2) & (1u << 30)) != 0;
1341
0
#endif
1342
0
}
1343
1344
0
inline int CRYPTO_is_AVX512VL_capable() {
1345
#if defined(__AVX512VL__)
1346
  return 1;
1347
#else
1348
0
  return (OPENSSL_get_ia32cap(2) & (1u << 31)) != 0;
1349
0
#endif
1350
0
}
1351
1352
// CRYPTO_cpu_avoid_zmm_registers returns 1 if zmm registers (512-bit vectors)
1353
// should not be used even if the CPU supports them.
1354
//
1355
// Note that this reuses the bit for the removed MPX feature.
1356
0
inline int CRYPTO_cpu_avoid_zmm_registers() {
1357
0
  return (OPENSSL_get_ia32cap(2) & (1u << 14)) != 0;
1358
0
}
1359
1360
0
inline int CRYPTO_is_VAES_capable() {
1361
#if defined(__VAES__)
1362
  return 1;
1363
#else
1364
0
  return (OPENSSL_get_ia32cap(3) & (1u << 9)) != 0;
1365
0
#endif
1366
0
}
1367
1368
93.4k
inline int CRYPTO_is_VPCLMULQDQ_capable() {
1369
#if defined(__VPCLMULQDQ__)
1370
  return 1;
1371
#else
1372
93.4k
  return (OPENSSL_get_ia32cap(3) & (1u << 10)) != 0;
1373
93.4k
#endif
1374
93.4k
}
1375
1376
#endif  // OPENSSL_X86 || OPENSSL_X86_64
1377
1378
#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
1379
1380
// ARMV7_NEON indicates support for NEON.
1381
#define ARMV7_NEON (1 << 0)
1382
1383
// ARMV8_AES indicates support for hardware AES instructions.
1384
#define ARMV8_AES (1 << 2)
1385
1386
// ARMV8_SHA1 indicates support for hardware SHA-1 instructions.
1387
#define ARMV8_SHA1 (1 << 3)
1388
1389
// ARMV8_SHA256 indicates support for hardware SHA-256 instructions.
1390
#define ARMV8_SHA256 (1 << 4)
1391
1392
// ARMV8_PMULL indicates support for carryless multiplication.
1393
#define ARMV8_PMULL (1 << 5)
1394
1395
// ARMV8_SHA512 indicates support for hardware SHA-512 instructions.
1396
#define ARMV8_SHA512 (1 << 6)
1397
1398
// ARMV8_SHA3 indicates support for eor3 instructions.
1399
#define ARMV8_SHA3 (1 << 7)
1400
1401
#if defined(OPENSSL_STATIC_ARMCAP)
1402
// We assume `CRYPTO_is_*_capable` already checked static capabilities.
1403
inline uint32_t OPENSSL_get_armcap() { return 0; }
1404
#else
1405
// OPENSSL_armcap_P contains ARM CPU capabilities as a bitmask of the above
1406
// constants. This should only be accessed with `OPENSSL_get_armcap`.
1407
extern uint32_t OPENSSL_armcap_P;
1408
1409
// OPENSSL_get_armcap initializes the library if needed and returns ARM CPU
1410
// capabilities. It is marked as a const function so duplicate calls can be
1411
// merged by the compiler.
1412
OPENSSL_ATTR_CONST uint32_t OPENSSL_get_armcap();
1413
#endif  // OPENSSL_STATIC_ARMCAP
1414
1415
// Normalize some older feature flags to their modern ACLE values.
1416
// https://developer.arm.com/architectures/system-architectures/software-standards/acle
1417
#if defined(__ARM_NEON__) && !defined(__ARM_NEON)
1418
#define __ARM_NEON 1
1419
#endif
1420
#if defined(__ARM_FEATURE_CRYPTO)
1421
#if !defined(__ARM_FEATURE_AES)
1422
#define __ARM_FEATURE_AES 1
1423
#endif
1424
#if !defined(__ARM_FEATURE_SHA2)
1425
#define __ARM_FEATURE_SHA2 1
1426
#endif
1427
#endif
1428
1429
// CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If
1430
// this is known statically, it is a constant inline function.
1431
inline int CRYPTO_is_NEON_capable() {
1432
#if (defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON)) && \
1433
    !defined(OPENSSL_NO_STATIC_NEON_FOR_TESTING)
1434
  return 1;
1435
#else
1436
  return (OPENSSL_get_armcap() & ARMV7_NEON) != 0;
1437
#endif
1438
}
1439
1440
inline int CRYPTO_is_ARMv8_AES_capable() {
1441
#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_AES)
1442
  return 1;
1443
#else
1444
  return (OPENSSL_get_armcap() & ARMV8_AES) != 0;
1445
#endif
1446
}
1447
1448
inline int CRYPTO_is_ARMv8_PMULL_capable() {
1449
#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_AES)
1450
  return 1;
1451
#else
1452
  return (OPENSSL_get_armcap() & ARMV8_PMULL) != 0;
1453
#endif
1454
}
1455
1456
inline int CRYPTO_is_ARMv8_SHA1_capable() {
1457
  // SHA-1 and SHA-2 (only) share `__ARM_FEATURE_SHA2` but otherwise
1458
  // are dealt with independently.
1459
#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_SHA2)
1460
  return 1;
1461
#else
1462
  return (OPENSSL_get_armcap() & ARMV8_SHA1) != 0;
1463
#endif
1464
}
1465
1466
inline int CRYPTO_is_ARMv8_SHA256_capable() {
1467
  // SHA-1 and SHA-2 (only) share `__ARM_FEATURE_SHA2` but otherwise
1468
  // are dealt with independently.
1469
#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_SHA2)
1470
  return 1;
1471
#else
1472
  return (OPENSSL_get_armcap() & ARMV8_SHA256) != 0;
1473
#endif
1474
}
1475
1476
inline int CRYPTO_is_ARMv8_SHA512_capable() {
1477
  // There is no `OPENSSL_STATIC_ARMCAP_SHA512`.
1478
#if defined(__ARM_FEATURE_SHA512)
1479
  return 1;
1480
#else
1481
  return (OPENSSL_get_armcap() & ARMV8_SHA512) != 0;
1482
#endif
1483
}
1484
1485
inline int CRYPTO_is_ARMv8_SHA3_capable() {
1486
  // There is no `OPENSSL_STATIC_ARMCAP_SHA3`.
1487
#if defined(__ARM_FEATURE_SHA3)
1488
  return 1;
1489
#else
1490
  return (OPENSSL_get_armcap() & ARMV8_SHA3) != 0;
1491
#endif
1492
}
1493
1494
#endif  // OPENSSL_ARM || OPENSSL_AARCH64
1495
1496
1497
#if defined(BORINGSSL_DISPATCH_TEST)
1498
// Runtime CPU dispatch testing support
1499
1500
// BORINGSSL_function_hit is an array of flags. The following functions will
1501
// set these flags if BORINGSSL_DISPATCH_TEST is defined.
1502
//   0: aes_hw_ctr32_encrypt_blocks
1503
//   1: aes_hw_encrypt
1504
//   2: aesni_gcm_encrypt
1505
//   3: aes_hw_set_encrypt_key
1506
//   4: vpaes_encrypt
1507
//   5: vpaes_set_encrypt_key
1508
//   6: aes_gcm_enc_update_vaes_avx2
1509
//   7: aes_gcm_enc_update_vaes_avx512
1510
extern "C" uint8_t BORINGSSL_function_hit[8];
1511
#endif  // BORINGSSL_DISPATCH_TEST
1512
1513
1514
// OPENSSL_vasprintf_internal is just like `vasprintf(3)`. If `system_malloc` is
1515
// 0, memory will be allocated with `OPENSSL_malloc` and must be freed with
1516
// `OPENSSL_free`. Otherwise the system `malloc` function is used and the memory
1517
// must be freed with the system `free` function.
1518
OPENSSL_EXPORT int OPENSSL_vasprintf_internal(char **str, const char *format,
1519
                                              va_list args, int system_malloc)
1520
    OPENSSL_PRINTF_FORMAT_FUNC(2, 0);
1521
1522
1523
// Fuzzer mode.
1524
1525
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
1526
// CRYPTO_fuzzer_mode_enabled returns whether fuzzer mode is enabled. See
1527
// `CRYPTO_set_fuzzer_mode`. In non-fuzzer builds, this function statically
1528
// returns zero so the codepaths will be deleted by the optimizer.
1529
int CRYPTO_fuzzer_mode_enabled();
1530
#else
1531
inline int CRYPTO_fuzzer_mode_enabled() { return 0; }
1532
#endif
1533
1534
1535
// Arithmetic functions.
1536
1537
// CRYPTO_addc_* returns `x + y + carry`, and sets `*out_carry` to the carry
1538
// bit. `carry` must be zero or one.
1539
1540
// NOTE: Unoptimized GCC builds may compile these builtins to non-constant-time
1541
// code. For correct constant-time behavior, ensure builds are optimized.
1542
#if OPENSSL_HAS_BUILTIN(__builtin_addc)
1543
1544
inline unsigned int CRYPTO_addc_impl(unsigned int x, unsigned int y,
1545
                                     unsigned int carry,
1546
0
                                     unsigned int *out_carry) {
1547
0
  return __builtin_addc(x, y, carry, out_carry);
1548
0
}
1549
1550
inline unsigned long CRYPTO_addc_impl(unsigned long x, unsigned long y,
1551
                                      unsigned long carry,
1552
3.62M
                                      unsigned long *out_carry) {
1553
3.62M
  return __builtin_addcl(x, y, carry, out_carry);
1554
3.62M
}
1555
1556
inline unsigned long long CRYPTO_addc_impl(unsigned long long x,
1557
                                           unsigned long long y,
1558
                                           unsigned long long carry,
1559
0
                                           unsigned long long *out_carry) {
1560
0
  return __builtin_addcll(x, y, carry, out_carry);
1561
0
}
1562
1563
inline uint32_t CRYPTO_addc_u32(uint32_t x, uint32_t y, uint32_t carry,
1564
0
                                uint32_t *out_carry) {
1565
0
  return CRYPTO_addc_impl(x, y, carry, out_carry);
1566
0
}
1567
1568
inline uint64_t CRYPTO_addc_u64(uint64_t x, uint64_t y, uint64_t carry,
1569
3.62M
                                uint64_t *out_carry) {
1570
3.62M
  return CRYPTO_addc_impl(x, y, carry, out_carry);
1571
3.62M
}
1572
1573
#else
1574
1575
inline uint32_t CRYPTO_addc_u32(uint32_t x, uint32_t y, uint32_t carry,
1576
                                uint32_t *out_carry) {
1577
  declassify_assert(carry <= 1);
1578
#if defined(_M_IX86)
1579
  uint32_t sum = 0;
1580
  *out_carry = _addcarry_u32(carry, x, y, &sum);
1581
  return sum;
1582
#else
1583
  uint64_t ret = carry;
1584
  ret += (uint64_t)x + y;
1585
  *out_carry = (uint32_t)(ret >> 32);
1586
  return (uint32_t)ret;
1587
#endif
1588
}
1589
1590
inline uint64_t CRYPTO_addc_u64(uint64_t x, uint64_t y, uint64_t carry,
1591
                                uint64_t *out_carry) {
1592
  declassify_assert(carry <= 1);
1593
#if defined(_M_X64)
1594
  uint64_t sum = 0;
1595
  *out_carry = _addcarry_u64(carry, x, y, &sum);
1596
  return sum;
1597
#elif defined(BORINGSSL_HAS_UINT128)
1598
  uint128_t ret = carry;
1599
  ret += (uint128_t)x + y;
1600
  *out_carry = (uint64_t)(ret >> 64);
1601
  return (uint64_t)ret;
1602
#else
1603
  x += carry;
1604
  carry = x < carry;
1605
  uint64_t ret = x + y;
1606
  carry += ret < x;
1607
  *out_carry = carry;
1608
  return ret;
1609
#endif
1610
}
1611
#endif
1612
1613
1614
// CRYPTO_subc_* returns `x - y - borrow`, and sets `*out_borrow` to the borrow
1615
// bit. `borrow` must be zero or one.
1616
#if OPENSSL_HAS_BUILTIN(__builtin_subc)
1617
1618
inline unsigned int CRYPTO_subc_impl(unsigned int x, unsigned int y,
1619
                                     unsigned int borrow,
1620
0
                                     unsigned int *out_borrow) {
1621
0
  return __builtin_subc(x, y, borrow, out_borrow);
1622
0
}
1623
1624
inline unsigned long CRYPTO_subc_impl(unsigned long x, unsigned long y,
1625
                                      unsigned long borrow,
1626
86.8k
                                      unsigned long *out_borrow) {
1627
86.8k
  return __builtin_subcl(x, y, borrow, out_borrow);
1628
86.8k
}
1629
1630
inline unsigned long long CRYPTO_subc_impl(unsigned long long x,
1631
                                           unsigned long long y,
1632
                                           unsigned long long borrow,
1633
0
                                           unsigned long long *out_borrow) {
1634
0
  return __builtin_subcll(x, y, borrow, out_borrow);
1635
0
}
1636
1637
inline uint32_t CRYPTO_subc_u32(uint32_t x, uint32_t y, uint32_t borrow,
1638
0
                                uint32_t *out_borrow) {
1639
0
  return CRYPTO_subc_impl(x, y, borrow, out_borrow);
1640
0
}
1641
1642
inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow,
1643
86.8k
                                uint64_t *out_borrow) {
1644
86.8k
  return CRYPTO_subc_impl(x, y, borrow, out_borrow);
1645
86.8k
}
1646
1647
#else
1648
1649
inline uint32_t CRYPTO_subc_u32(uint32_t x, uint32_t y, uint32_t borrow,
1650
                                uint32_t *out_borrow) {
1651
  declassify_assert(borrow <= 1);
1652
#if defined(_M_IX86)
1653
  uint32_t diff = 0;
1654
  *out_borrow = _subborrow_u32(borrow, x, y, &diff);
1655
  return diff;
1656
#else
1657
  uint32_t ret = x - y - borrow;
1658
  *out_borrow = (x < y) | ((x == y) & borrow);
1659
  return ret;
1660
#endif
1661
}
1662
1663
inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow,
1664
                                uint64_t *out_borrow) {
1665
  declassify_assert(borrow <= 1);
1666
#if defined(_M_X64)
1667
  uint64_t diff = 0;
1668
  *out_borrow = _subborrow_u64(borrow, x, y, &diff);
1669
  return diff;
1670
#else
1671
  uint64_t ret = x - y - borrow;
1672
  *out_borrow = (x < y) | ((x == y) & borrow);
1673
  return ret;
1674
#endif
1675
}
1676
#endif
1677
1678
#if defined(OPENSSL_64_BIT)
1679
3.62M
#define CRYPTO_addc_w CRYPTO_addc_u64
1680
86.8k
#define CRYPTO_subc_w CRYPTO_subc_u64
1681
#else
1682
#define CRYPTO_addc_w CRYPTO_addc_u32
1683
#define CRYPTO_subc_w CRYPTO_subc_u32
1684
#endif
1685
1686
1687
// Cleanup implements a custom scope guard, when the cleanup logic does not fit
1688
// in a destructor. Usage:
1689
//
1690
//     bssl::Cleanup cleanup = [&] { SomeCleanupWork(local_var); };
1691
template <typename F>
1692
class Cleanup {
1693
 public:
1694
  static_assert(std::is_invocable_v<F>);
1695
  static_assert(std::is_same_v<std::invoke_result_t<F>, void>);
1696
1697
19.5k
  Cleanup(F func) : func_(func) {}
Unexecuted instantiation: bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_seal::$_0>::Cleanup(EVP_AEAD_CTX_seal::$_0)
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_seal_scatter::$_0>::Cleanup(EVP_AEAD_CTX_seal_scatter::$_0)
Line
Count
Source
1697
2.32k
  Cleanup(F func) : func_(func) {}
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_sealv::$_0>::Cleanup(EVP_AEAD_CTX_sealv::$_0)
Line
Count
Source
1697
2.32k
  Cleanup(F func) : func_(func) {}
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_open::$_0>::Cleanup(EVP_AEAD_CTX_open::$_0)
Line
Count
Source
1697
7.45k
  Cleanup(F func) : func_(func) {}
Unexecuted instantiation: bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_open_gather::$_0>::Cleanup(EVP_AEAD_CTX_open_gather::$_0)
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_openv::$_0>::Cleanup(EVP_AEAD_CTX_openv::$_0)
Line
Count
Source
1697
4.46k
  Cleanup(F func) : func_(func) {}
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_openv_detached::$_0>::Cleanup(EVP_AEAD_CTX_openv_detached::$_0)
Line
Count
Source
1697
2.98k
  Cleanup(F func) : func_(func) {}
Unexecuted instantiation: x509_vfy.cc:bssl::Cleanup<X509_verify_cert::$_0>::Cleanup(X509_verify_cert::$_0)
Unexecuted instantiation: x509_vfy.cc:bssl::Cleanup<X509_verify_cert::$_1>::Cleanup(X509_verify_cert::$_1)
Unexecuted instantiation: x_all.cc:bssl::Cleanup<X509_sign_ctx::$_0>::Cleanup(X509_sign_ctx::$_0)
Unexecuted instantiation: a_sign.cc:bssl::Cleanup<ASN1_item_sign_ctx::$_0>::Cleanup(ASN1_item_sign_ctx::$_0)
Unexecuted instantiation: policy.cc:bssl::Cleanup<bssl::X509_policy_check(stack_st_X509 const*, stack_st_ASN1_OBJECT const*, unsigned long, int*)::$_0>::Cleanup(bssl::X509_policy_check(stack_st_X509 const*, stack_st_ASN1_OBJECT const*, unsigned long, int*)::$_0)
1698
  Cleanup(const Cleanup &) = delete;
1699
  Cleanup &operator=(const Cleanup &) = delete;
1700
19.5k
  ~Cleanup() { func_(); }
Unexecuted instantiation: bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_seal::$_0>::~Cleanup()
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_seal_scatter::$_0>::~Cleanup()
Line
Count
Source
1700
2.32k
  ~Cleanup() { func_(); }
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_sealv::$_0>::~Cleanup()
Line
Count
Source
1700
2.32k
  ~Cleanup() { func_(); }
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_open::$_0>::~Cleanup()
Line
Count
Source
1700
7.45k
  ~Cleanup() { func_(); }
Unexecuted instantiation: bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_open_gather::$_0>::~Cleanup()
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_openv::$_0>::~Cleanup()
Line
Count
Source
1700
4.46k
  ~Cleanup() { func_(); }
bcm.cc:bssl::Cleanup<EVP_AEAD_CTX_openv_detached::$_0>::~Cleanup()
Line
Count
Source
1700
2.98k
  ~Cleanup() { func_(); }
Unexecuted instantiation: x509_vfy.cc:bssl::Cleanup<X509_verify_cert::$_0>::~Cleanup()
Unexecuted instantiation: x509_vfy.cc:bssl::Cleanup<X509_verify_cert::$_1>::~Cleanup()
Unexecuted instantiation: x_all.cc:bssl::Cleanup<X509_sign_ctx::$_0>::~Cleanup()
Unexecuted instantiation: a_sign.cc:bssl::Cleanup<ASN1_item_sign_ctx::$_0>::~Cleanup()
Unexecuted instantiation: policy.cc:bssl::Cleanup<bssl::X509_policy_check(stack_st_X509 const*, stack_st_ASN1_OBJECT const*, unsigned long, int*)::$_0>::~Cleanup()
1701
1702
 private:
1703
  F func_;
1704
};
1705
template <typename F>
1706
Cleanup(F func) -> Cleanup<F>;
1707
1708
// DECLARE_OPAQUE_STRUCT defines a public struct `public_name` with an
1709
// implementation struct `impl_name`.
1710
//
1711
// To prevent accidents, the `public_name` struct will be neither constructable,
1712
// nor copyable/movable, nor deletable.
1713
//
1714
// It must be used from inside the `bssl` namespace; however, `public_name` will
1715
// be defined outside.
1716
//
1717
// Usage:
1718
//
1719
// DECLARE_OPAQUE_STRUCT(public_st, PublicImpl)
1720
//
1721
// BSSL_NAMESPACE_BEGIN
1722
//
1723
// class PublicImpl : public public_st {
1724
//  public:
1725
//   PublicImpl();
1726
//   ~PublicImpl();
1727
//   void foo();
1728
// };
1729
//
1730
// BSSL_NAMESPACE_END
1731
//
1732
// The implementation struct can be converted to the public struct implicitly;
1733
// to convert the public struct to the implementation struct, call
1734
// `FromOpaque` on it. It is explicitly allowed to call `FromOpaque` on a
1735
// `nullptr`.
1736
#define DECLARE_OPAQUE_STRUCT(public_name, impl_name)                  \
1737
  BSSL_NAMESPACE_BEGIN                                                 \
1738
  class impl_name;                                                     \
1739
  BSSL_NAMESPACE_END                                                   \
1740
                                                                       \
1741
  /* This is unnamespaced but assumed to not create linker symbols. */ \
1742
  struct public_name {                                                 \
1743
    using ImplType = bssl::impl_name;                                  \
1744
                                                                       \
1745
   private:                                                            \
1746
    public_name() = default;                                           \
1747
    ~public_name() = default;                                          \
1748
    public_name(const public_name &) = delete;                         \
1749
    public_name &operator=(const public_name &) = delete;              \
1750
                                                                       \
1751
    friend class bssl::impl_name;                                      \
1752
  };
1753
1754
template <typename Public>
1755
88.0M
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
88.0M
  return static_cast<typename Public::ImplType *>(p);
1757
88.0M
}
ssl_st::ImplType* bssl::FromOpaque<ssl_st>(ssl_st*)
Line
Count
Source
1755
577k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
577k
  return static_cast<typename Public::ImplType *>(p);
1757
577k
}
ssl_ech_keys_st::ImplType* bssl::FromOpaque<ssl_ech_keys_st>(ssl_ech_keys_st*)
Line
Count
Source
1755
15.0k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
15.0k
  return static_cast<typename Public::ImplType *>(p);
1757
15.0k
}
ssl_ctx_st::ImplType* bssl::FromOpaque<ssl_ctx_st>(ssl_ctx_st*)
Line
Count
Source
1755
704k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
704k
  return static_cast<typename Public::ImplType *>(p);
1757
704k
}
ssl_session_st::ImplType* bssl::FromOpaque<ssl_session_st>(ssl_session_st*)
Line
Count
Source
1755
298k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
298k
  return static_cast<typename Public::ImplType *>(p);
1757
298k
}
ssl_credential_st::ImplType* bssl::FromOpaque<ssl_credential_st>(ssl_credential_st*)
Line
Count
Source
1755
38.9k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
38.9k
  return static_cast<typename Public::ImplType *>(p);
1757
38.9k
}
bignum_ctx::ImplType* bssl::FromOpaque<bignum_ctx>(bignum_ctx*)
Line
Count
Source
1755
68.9M
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
68.9M
  return static_cast<typename Public::ImplType *>(p);
1757
68.9M
}
Unexecuted instantiation: dh_st::ImplType* bssl::FromOpaque<dh_st>(dh_st*)
evp_pkey_ctx_st::ImplType* bssl::FromOpaque<evp_pkey_ctx_st>(evp_pkey_ctx_st*)
Line
Count
Source
1755
673k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
673k
  return static_cast<typename Public::ImplType *>(p);
1757
673k
}
ec_key_st::ImplType* bssl::FromOpaque<ec_key_st>(ec_key_st*)
Line
Count
Source
1755
247k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
247k
  return static_cast<typename Public::ImplType *>(p);
1757
247k
}
rsa_st::ImplType* bssl::FromOpaque<rsa_st>(rsa_st*)
Line
Count
Source
1755
368k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
368k
  return static_cast<typename Public::ImplType *>(p);
1757
368k
}
bio_st::ImplType* bssl::FromOpaque<bio_st>(bio_st*)
Line
Count
Source
1755
9.45M
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
9.45M
  return static_cast<typename Public::ImplType *>(p);
1757
9.45M
}
evp_pkey_st::ImplType* bssl::FromOpaque<evp_pkey_st>(evp_pkey_st*)
Line
Count
Source
1755
762k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
762k
  return static_cast<typename Public::ImplType *>(p);
1757
762k
}
dsa_st::ImplType* bssl::FromOpaque<dsa_st>(dsa_st*)
Line
Count
Source
1755
13.9k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
13.9k
  return static_cast<typename Public::ImplType *>(p);
1757
13.9k
}
crypto_buffer_pool_st::ImplType* bssl::FromOpaque<crypto_buffer_pool_st>(crypto_buffer_pool_st*)
Line
Count
Source
1755
355k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
355k
  return static_cast<typename Public::ImplType *>(p);
1757
355k
}
crypto_buffer_st::ImplType* bssl::FromOpaque<crypto_buffer_st>(crypto_buffer_st*)
Line
Count
Source
1755
1.23M
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
1.23M
  return static_cast<typename Public::ImplType *>(p);
1757
1.23M
}
x509_st::ImplType* bssl::FromOpaque<x509_st>(x509_st*)
Line
Count
Source
1755
660k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
660k
  return static_cast<typename Public::ImplType *>(p);
1757
660k
}
x509_store_st::ImplType* bssl::FromOpaque<x509_store_st>(x509_store_st*)
Line
Count
Source
1755
13.4k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
13.4k
  return static_cast<typename Public::ImplType *>(p);
1757
13.4k
}
X509_name_st::ImplType* bssl::FromOpaque<X509_name_st>(X509_name_st*)
Line
Count
Source
1755
799k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
799k
  return static_cast<typename Public::ImplType *>(p);
1757
799k
}
X509_name_entry_st::ImplType* bssl::FromOpaque<X509_name_entry_st>(X509_name_entry_st*)
Line
Count
Source
1755
2.71M
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
2.71M
  return static_cast<typename Public::ImplType *>(p);
1757
2.71M
}
X509_pubkey_st::ImplType* bssl::FromOpaque<X509_pubkey_st>(X509_pubkey_st*)
Line
Count
Source
1755
182k
inline typename Public::ImplType *FromOpaque(Public *p) {
1756
182k
  return static_cast<typename Public::ImplType *>(p);
1757
182k
}
1758
1759
template <typename Public>
1760
25.8M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
25.8M
  return static_cast<const typename Public::ImplType *>(p);
1762
25.8M
}
ssl_st::ImplType const* bssl::FromOpaque<ssl_st>(ssl_st const*)
Line
Count
Source
1760
14.7M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
14.7M
  return static_cast<const typename Public::ImplType *>(p);
1762
14.7M
}
ssl_ech_keys_st::ImplType const* bssl::FromOpaque<ssl_ech_keys_st>(ssl_ech_keys_st const*)
Line
Count
Source
1760
12
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
12
  return static_cast<const typename Public::ImplType *>(p);
1762
12
}
ssl_session_st::ImplType const* bssl::FromOpaque<ssl_session_st>(ssl_session_st const*)
Line
Count
Source
1760
779k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
779k
  return static_cast<const typename Public::ImplType *>(p);
1762
779k
}
ssl_ctx_st::ImplType const* bssl::FromOpaque<ssl_ctx_st>(ssl_ctx_st const*)
Line
Count
Source
1760
348k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
348k
  return static_cast<const typename Public::ImplType *>(p);
1762
348k
}
Unexecuted instantiation: ssl_credential_st::ImplType const* bssl::FromOpaque<ssl_credential_st>(ssl_credential_st const*)
Unexecuted instantiation: dh_st::ImplType const* bssl::FromOpaque<dh_st>(dh_st const*)
ec_key_st::ImplType const* bssl::FromOpaque<ec_key_st>(ec_key_st const*)
Line
Count
Source
1760
98.4k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
98.4k
  return static_cast<const typename Public::ImplType *>(p);
1762
98.4k
}
rsa_st::ImplType const* bssl::FromOpaque<rsa_st>(rsa_st const*)
Line
Count
Source
1760
517k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
517k
  return static_cast<const typename Public::ImplType *>(p);
1762
517k
}
bio_st::ImplType const* bssl::FromOpaque<bio_st>(bio_st const*)
Line
Count
Source
1760
1.52M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
1.52M
  return static_cast<const typename Public::ImplType *>(p);
1762
1.52M
}
evp_pkey_st::ImplType const* bssl::FromOpaque<evp_pkey_st>(evp_pkey_st const*)
Line
Count
Source
1760
1.00M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
1.00M
  return static_cast<const typename Public::ImplType *>(p);
1762
1.00M
}
Unexecuted instantiation: evp_pkey_ctx_st::ImplType const* bssl::FromOpaque<evp_pkey_ctx_st>(evp_pkey_ctx_st const*)
Unexecuted instantiation: crypto_buffer_pool_st::ImplType const* bssl::FromOpaque<crypto_buffer_pool_st>(crypto_buffer_pool_st const*)
crypto_buffer_st::ImplType const* bssl::FromOpaque<crypto_buffer_st>(crypto_buffer_st const*)
Line
Count
Source
1760
510k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
510k
  return static_cast<const typename Public::ImplType *>(p);
1762
510k
}
x509_st::ImplType const* bssl::FromOpaque<x509_st>(x509_st const*)
Line
Count
Source
1760
470k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
470k
  return static_cast<const typename Public::ImplType *>(p);
1762
470k
}
Unexecuted instantiation: x509_store_st::ImplType const* bssl::FromOpaque<x509_store_st>(x509_store_st const*)
X509_name_st::ImplType const* bssl::FromOpaque<X509_name_st>(X509_name_st const*)
Line
Count
Source
1760
1.15M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
1.15M
  return static_cast<const typename Public::ImplType *>(p);
1762
1.15M
}
X509_name_entry_st::ImplType const* bssl::FromOpaque<X509_name_entry_st>(X509_name_entry_st const*)
Line
Count
Source
1760
4.54M
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
4.54M
  return static_cast<const typename Public::ImplType *>(p);
1762
4.54M
}
X509_pubkey_st::ImplType const* bssl::FromOpaque<X509_pubkey_st>(X509_pubkey_st const*)
Line
Count
Source
1760
192k
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
192k
  return static_cast<const typename Public::ImplType *>(p);
1762
192k
}
dsa_st::ImplType const* bssl::FromOpaque<dsa_st>(dsa_st const*)
Line
Count
Source
1760
882
inline const typename Public::ImplType *FromOpaque(const Public *p) {
1761
882
  return static_cast<const typename Public::ImplType *>(p);
1762
882
}
1763
1764
BSSL_NAMESPACE_END
1765
1766
1767
#endif  // OPENSSL_HEADER_CRYPTO_INTERNAL_H