// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H
#define OPENSSL_HEADER_CRYPTO_INTERNAL_H

#include <openssl/base.h>
#include <openssl/crypto.h>
#include <openssl/ex_data.h>
#include <openssl/span.h>
#include <openssl/stack.h>

#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include <type_traits>

#if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)
#include <valgrind/memcheck.h>
#endif

#if defined(BORINGSSL_FIPS_BREAK_TESTS)
#include <stdlib.h>
#endif

#if defined(OPENSSL_THREADS) && \
    (!defined(OPENSSL_WINDOWS) || defined(__MINGW32__))
#include <pthread.h>
#define OPENSSL_PTHREADS
#endif

#if defined(OPENSSL_THREADS) && !defined(OPENSSL_PTHREADS) && \
    defined(OPENSSL_WINDOWS)
#define OPENSSL_WINDOWS_THREADS
#endif

#if defined(OPENSSL_THREADS)
#include <atomic>
#else
#include <utility>
#endif

#if defined(OPENSSL_WINDOWS_THREADS)
#include <windows.h>
#endif

#if defined(_M_X64) || defined(_M_IX86)
#include "intrin.h"
#endif

#if defined(BORINGSSL_PREFIX)
#include <openssl/prefix_symbols_internal_c.h>  // IWYU pragma: export
#endif


BSSL_NAMESPACE_BEGIN

#if !defined(OPENSSL_NO_ASM) &&                         \
    (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
     (!defined(OPENSSL_STATIC_ARMCAP) &&                \
      (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))))
// x86, x86_64, and the ARMs need to record the result of a cpuid/getauxval call
// for the asm to work correctly, unless compiled without asm code.
#define NEED_CPUID

// OPENSSL_cpuid_setup initializes the platform-specific feature cache. This
// function should not be called directly. Call `OPENSSL_init_cpuid` instead.
void OPENSSL_cpuid_setup();

// OPENSSL_init_cpuid initializes the platform-specific feature cache, if
// needed. This function is idempotent and may be called concurrently.
void OPENSSL_init_cpuid();
#else
inline void OPENSSL_init_cpuid() {}
#endif

#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
    !defined(OPENSSL_STATIC_ARMCAP)
// OPENSSL_get_armcap_pointer_for_test returns a pointer to
// `OPENSSL_armcap_P` for unit tests. Any modifications to the value must be
// made before any other function call in BoringSSL.
OPENSSL_EXPORT uint32_t *OPENSSL_get_armcap_pointer_for_test();
#endif


// On non-MSVC 64-bit targets, we expect __uint128_t support. This includes
// clang-cl, which defines both __clang__ and _MSC_VER.
#if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT)
#define BORINGSSL_HAS_UINT128
typedef __int128_t int128_t;
typedef __uint128_t uint128_t;

// __uint128_t division depends on intrinsics in the compiler runtime. Those
// intrinsics are missing in clang-cl (https://crbug.com/787617) and nanolibc.
// These may be bugs in the toolchain definition, but just disable it for now.
// EDK2's toolchain is missing __udivti3 (b/339380897) so cannot support
// 128-bit division currently.
#if !defined(_MSC_VER) && !defined(OPENSSL_NANOLIBC) && \
    !defined(__EDK2_BORINGSSL__)
#define BORINGSSL_CAN_DIVIDE_UINT128
#endif
#endif

// GCC-like compilers indicate SSE2 with `__SSE2__`. MSVC leaves the caller to
// know that x86_64 has SSE2, and uses _M_IX86_FP to indicate SSE2 on x86.
// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170
#if defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || \
    (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
#define OPENSSL_SSE2
#endif

#if defined(OPENSSL_X86) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SSE2)
#error \
    "x86 assembly requires SSE2. Build with -msse2 (recommended), or disable assembly optimizations with -DOPENSSL_NO_ASM."
#endif

// For convenience in testing the fallback code, we allow disabling SSE2
// intrinsics via `OPENSSL_NO_SSE2_FOR_TESTING`. We require SSE2 on x86 and
// x86_64, so we would otherwise need to test such code on a non-x86 platform.
//
// This does not remove the above requirement for SSE2 support with assembly
// optimizations. It only disables some intrinsics-based optimizations so that
// we can test the fallback code on CI.
#if defined(OPENSSL_SSE2) && defined(OPENSSL_NO_SSE2_FOR_TESTING)
#undef OPENSSL_SSE2
#endif

#if defined(__GNUC__) || defined(__clang__)
#define OPENSSL_ATTR_CONST __attribute__((const))
#else
#define OPENSSL_ATTR_CONST
#endif

#if defined(BORINGSSL_MALLOC_FAILURE_TESTING)
// OPENSSL_reset_malloc_counter_for_testing, when malloc testing is enabled,
// resets the internal malloc counter, to simulate further malloc failures. This
// should be called in between independent tests, at a point where failure from
// a previous test will not impact subsequent ones.
OPENSSL_EXPORT void OPENSSL_reset_malloc_counter_for_testing();

// OPENSSL_disable_malloc_failures_for_testing, when malloc testing is enabled,
// disables simulated malloc failures. Calls to `OPENSSL_malloc` will not
// increment the malloc counter or synthesize failures. This may be used to skip
// simulating malloc failures in some region of code.
OPENSSL_EXPORT void OPENSSL_disable_malloc_failures_for_testing();

// OPENSSL_enable_malloc_failures_for_testing, when malloc testing is enabled,
// re-enables simulated malloc failures.
OPENSSL_EXPORT void OPENSSL_enable_malloc_failures_for_testing();
#else
inline void OPENSSL_reset_malloc_counter_for_testing() {}
inline void OPENSSL_disable_malloc_failures_for_testing() {}
inline void OPENSSL_enable_malloc_failures_for_testing() {}
#endif

#if defined(__has_builtin)
#define OPENSSL_HAS_BUILTIN(x) __has_builtin(x)
#else
#define OPENSSL_HAS_BUILTIN(x) 0
#endif


// Pointer utility functions.

// buffers_alias returns one if `a` and `b` alias and zero otherwise.
inline int buffers_alias(const void *a, size_t a_bytes, const void *b,
                         size_t b_bytes) {
  // Cast `a` and `b` to integers. In C, pointer comparisons between unrelated
  // objects are undefined whereas pointer to integer conversions are merely
  // implementation-defined. We assume the implementation defined it in a sane
  // way.
  uintptr_t a_u = (uintptr_t)a;
  uintptr_t b_u = (uintptr_t)b;
  return a_u + a_bytes > b_u && b_u + b_bytes > a_u;
}

// spans_alias returns one if `a` and `b` alias, and zero otherwise.
template <typename T>
inline int spans_alias(Span<const T> a, Span<const T> b) {
  return buffers_alias(a.data(), a.size() * sizeof(T), b.data(),
                       b.size() * sizeof(T));
}

// align_pointer returns `ptr`, advanced to `alignment`. `alignment` must be a
// power of two, and `ptr` must have at least `alignment - 1` bytes of scratch
// space.
inline void *align_pointer(void *ptr, size_t alignment) {
  // `alignment` must be a power of two.
  assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
  // Instead of aligning `ptr` as a `uintptr_t` and casting back, compute the
  // offset and advance in pointer space. C guarantees that casting from pointer
  // to `uintptr_t` and back gives the same pointer, but general
  // integer-to-pointer conversions are implementation-defined. GCC does define
  // it in the useful way, but this makes fewer assumptions.
  uintptr_t offset = (0u - (uintptr_t)ptr) & (alignment - 1);
  ptr = (char *)ptr + offset;
  assert(((uintptr_t)ptr & (alignment - 1)) == 0);
  return ptr;
}


// Constant-time utility functions.
//
// The following methods return a bitmask of all ones (0xff...f) for true and 0
// for false. This is useful for choosing a value based on the result of a
// conditional in constant time. For example,
//
// if (a < b) {
//   c = a;
// } else {
//   c = b;
// }
//
// can be written as
//
// crypto_word_t lt = constant_time_lt_w(a, b);
// c = constant_time_select_w(lt, a, b);

// crypto_word_t is the type that most constant-time functions use. Ideally we
// would like it to be `size_t`, but NaCl builds in 64-bit mode with 32-bit
// pointers, which means that `size_t` can be 32 bits when `BN_ULONG` is 64
// bits. Since we want to be able to do constant-time operations on a
// `BN_ULONG`, `crypto_word_t` is defined as an unsigned value with the native
// word length.
#if defined(OPENSSL_64_BIT)
typedef uint64_t crypto_word_t;
#elif defined(OPENSSL_32_BIT)
typedef uint32_t crypto_word_t;
#else
#error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT"
#endif

#define CONSTTIME_TRUE_W ~((crypto_word_t)0)
#define CONSTTIME_FALSE_W ((crypto_word_t)0)
#define CONSTTIME_TRUE_8 ((uint8_t)0xff)
#define CONSTTIME_FALSE_8 ((uint8_t)0)

// value_barrier_w returns `a`, but prevents GCC and Clang from reasoning about
// the returned value. This is used to mitigate compilers undoing constant-time
// code, until we can express our requirements directly in the language.
//
// Note the compiler is aware that `value_barrier_w` has no side effects and
// always has the same output for a given input. This allows it to eliminate
// dead code, move computations across loops, and vectorize.
inline crypto_word_t value_barrier_w(crypto_word_t a) {
#if defined(__GNUC__) || defined(__clang__)
  __asm__("" : "+r"(a) : /* no inputs */);
#endif
  return a;
}

// value_barrier_u32 behaves like `value_barrier_w` but takes a `uint32_t`.
inline uint32_t value_barrier_u32(uint32_t a) {
#if defined(__GNUC__) || defined(__clang__)
  __asm__("" : "+r"(a) : /* no inputs */);
#endif
  return a;
}

// value_barrier_u64 behaves like `value_barrier_w` but takes a `uint64_t`.
inline uint64_t value_barrier_u64(uint64_t a) {
#if defined(__GNUC__) || defined(__clang__)
  __asm__("" : "+r"(a) : /* no inputs */);
#endif
  return a;
}

// `value_barrier_u8` could be defined as above, but compilers other than
// clang seem to still materialize 0x00..00MM instead of reusing 0x??..??MM.

// constant_time_msb_w returns the given value with the MSB copied to all the
// other bits.
inline crypto_word_t constant_time_msb_w(crypto_word_t a) {
  return 0u - (a >> (sizeof(a) * 8 - 1));
}

// constant_time_lt_w returns 0xff..f if a < b and 0 otherwise.
inline crypto_word_t constant_time_lt_w(crypto_word_t a, crypto_word_t b) {
  // Consider the two cases of the problem:
  //   msb(a) == msb(b): a < b iff the MSB of a - b is set.
  //   msb(a) != msb(b): a < b iff the MSB of b is set.
  //
  // If msb(a) == msb(b) then the following evaluates as:
  //   msb(a^((a^b)|((a-b)^a))) ==
  //   msb(a^((a-b) ^ a))       ==   (because msb(a^b) == 0)
  //   msb(a^a^(a-b))           ==   (rearranging)
  //   msb(a-b)                      (because ∀x. x^x == 0)
  //
  // Else, if msb(a) != msb(b) then the following evaluates as:
  //   msb(a^((a^b)|((a-b)^a))) ==
  //   msb(a^(𝟙 | ((a-b)^a)))   ==   (because msb(a^b) == 1 and 𝟙
  //                                  represents a value s.t. msb(𝟙) = 1)
  //   msb(a^𝟙)                 ==   (because ORing with 1 results in 1)
  //   msb(b)
  //
  //
  // Here is an SMT-LIB verification of this formula:
  //
  // (define-fun lt ((a (_ BitVec 32)) (b (_ BitVec 32))) (_ BitVec 32)
  //   (bvxor a (bvor (bvxor a b) (bvxor (bvsub a b) a)))
  // )
  //
  // (declare-fun a () (_ BitVec 32))
  // (declare-fun b () (_ BitVec 32))
  //
  // (assert (not (= (= #x00000001 (bvlshr (lt a b) #x0000001f)) (bvult a b))))
  // (check-sat)
  // (get-model)
  return constant_time_msb_w(a ^ ((a ^ b) | ((a - b) ^ a)));
}

// constant_time_lt_8 acts like `constant_time_lt_w` but returns an 8-bit
// mask.
inline uint8_t constant_time_lt_8(crypto_word_t a, crypto_word_t b) {
  return (uint8_t)(constant_time_lt_w(a, b));
}

// constant_time_ge_w returns 0xff..f if a >= b and 0 otherwise.
inline crypto_word_t constant_time_ge_w(crypto_word_t a, crypto_word_t b) {
  return ~constant_time_lt_w(a, b);
}

// constant_time_ge_8 acts like `constant_time_ge_w` but returns an 8-bit
// mask.
inline uint8_t constant_time_ge_8(crypto_word_t a, crypto_word_t b) {
  return (uint8_t)(constant_time_ge_w(a, b));
}

// constant_time_is_zero returns 0xff..f if a == 0 and 0 otherwise.
inline crypto_word_t constant_time_is_zero_w(crypto_word_t a) {
  // Here is an SMT-LIB verification of this formula:
  //
  // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32)
  //   (bvand (bvnot a) (bvsub a #x00000001))
  // )
  //
  // (declare-fun a () (_ BitVec 32))
  //
  // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a
  // #x00000000)))) (check-sat) (get-model)
  return constant_time_msb_w(~a & (a - 1));
}

// constant_time_is_zero_8 acts like `constant_time_is_zero_w` but returns an
// 8-bit mask.
inline uint8_t constant_time_is_zero_8(crypto_word_t a) {
  return (uint8_t)(constant_time_is_zero_w(a));
}

// constant_time_eq_w returns 0xff..f if a == b and 0 otherwise.
inline crypto_word_t constant_time_eq_w(crypto_word_t a, crypto_word_t b) {
  return constant_time_is_zero_w(a ^ b);
}

// constant_time_eq_8 acts like `constant_time_eq_w` but returns an 8-bit
// mask.
inline uint8_t constant_time_eq_8(crypto_word_t a, crypto_word_t b) {
  return (uint8_t)(constant_time_eq_w(a, b));
}

// constant_time_eq_int acts like `constant_time_eq_w` but works on int
// values.
inline crypto_word_t constant_time_eq_int(int a, int b) {
  return constant_time_eq_w((crypto_word_t)(a), (crypto_word_t)(b));
}

// constant_time_eq_int_8 acts like `constant_time_eq_int` but returns an 8-bit
// mask.
inline uint8_t constant_time_eq_int_8(int a, int b) {
  return constant_time_eq_8((crypto_word_t)(a), (crypto_word_t)(b));
}

// constant_time_select_w returns (mask & a) | (~mask & b). When `mask` is all
// 1s or all 0s (as returned by the methods above), the select methods return
// either `a` (if `mask` is nonzero) or `b` (if `mask` is zero).
inline crypto_word_t constant_time_select_w(crypto_word_t mask, crypto_word_t a,
                                            crypto_word_t b) {
  // Clang recognizes this pattern as a select. While it usually transforms it
  // to a cmov, it sometimes further transforms it into a branch, which we do
  // not want.
  //
  // Hiding the value of the mask from the compiler evades this transformation.
  mask = value_barrier_w(mask);
  return (mask & a) | (~mask & b);
}

// constant_time_select_8 acts like `constant_time_select` but operates on
// 8-bit values.
inline uint8_t constant_time_select_8(crypto_word_t mask, uint8_t a,
                                      uint8_t b) {
  // `mask` is a word instead of `uint8_t` to avoid materializing 0x000..0MM
  // Making both `mask` and its value barrier `uint8_t` would allow the compiler
  // to materialize 0x????..?MM instead, but only clang is that clever.
  // However, vectorization of bitwise operations seems to work better on
  // `uint8_t` than a mix of `uint64_t` and `uint8_t`, so `m` is cast to
  // `uint8_t` after the value barrier but before the bitwise operations.
  uint8_t m = value_barrier_w(mask);
  return (m & a) | (~m & b);
}

// constant_time_select_int acts like `constant_time_select` but operates on
// ints.
inline int constant_time_select_int(crypto_word_t mask, int a, int b) {
  return static_cast<int>(constant_time_select_w(
      mask, static_cast<crypto_word_t>(a), static_cast<crypto_word_t>(b)));
}

// constant_time_select_32 acts like `constant_time_select` but operates on
// 32-bit values.
inline uint32_t constant_time_select_32(crypto_word_t mask, uint32_t a,
                                        uint32_t b) {
  return static_cast<uint32_t>(
      constant_time_select_w(mask, crypto_word_t{a}, crypto_word_t{b}));
}

// constant_time_conditional_memcpy copies `n` bytes from `src` to `dst` if
// `mask` is 0xff..ff and does nothing if `mask` is 0. The `n`-byte memory
// ranges at `dst` and `src` must not overlap, as when calling `memcpy`.
inline void constant_time_conditional_memcpy(void *dst, const void *src,
                                             const size_t n,
                                             const crypto_word_t mask) {
  assert(!buffers_alias(dst, n, src, n));
  uint8_t *out = (uint8_t *)dst;
  const uint8_t *in = (const uint8_t *)src;
  for (size_t i = 0; i < n; i++) {
    out[i] = constant_time_select_8(mask, in[i], out[i]);
  }
}

// constant_time_conditional_memxor xors `n` bytes from `src` to `dst` if
// `mask` is 0xff..ff and does nothing if `mask` is 0. The `n`-byte memory
// ranges at `dst` and `src` must not overlap, as when calling `memcpy`.
inline void constant_time_conditional_memxor(void *dst, const void *src,
                                             size_t n,
                                             const crypto_word_t mask) {
  assert(!buffers_alias(dst, n, src, n));
  uint8_t *out = (uint8_t *)dst;
  const uint8_t *in = (const uint8_t *)src;
#if defined(__GNUC__) || defined(__clang__)
  // gcc 13.2.0 doesn't automatically vectorize this loop regardless of barrier
  // clang 16.0.6 vectorizes if alias analysis finds src and dst are disjoint,
  // but does not conclude that from the !buffers_alias assert.
  typedef uint8_t v32u8 __attribute__((vector_size(32), aligned(1), may_alias));
  size_t n_vec = n & ~(size_t)31;
  v32u8 masks = ((uint8_t)mask - (v32u8){});  // broadcast
  for (size_t i = 0; i < n_vec; i += 32) {
    *(v32u8 *)&out[i] ^= masks & *(v32u8 *)&in[i];
  }
  in += n_vec;
  out += n_vec;
  n -= n_vec;
#endif
  for (size_t i = 0; i < n; i++) {
    out[i] ^= value_barrier_w(mask) & in[i];
  }
}

#if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)

// CONSTTIME_SECRET takes a pointer and a number of bytes and marks that region
// of memory as secret. Secret data is tracked as it flows to registers and
// other parts of a memory. If secret data is used as a condition for a branch,
// or as a memory index, it will trigger warnings in valgrind.
#define CONSTTIME_SECRET(ptr, len) VALGRIND_MAKE_MEM_UNDEFINED(ptr, len)

// CONSTTIME_DECLASSIFY takes a pointer and a number of bytes and marks that
// region of memory as public. Public data is not subject to constant-time
// rules.
#define CONSTTIME_DECLASSIFY(ptr, len) VALGRIND_MAKE_MEM_DEFINED(ptr, len)

#else

// Just disable unused warnings for those.
#define CONSTTIME_SECRET(ptr, len) \
  do {                             \
    (void)(ptr);                   \
    (void)(len);                   \
  } while (false)
#define CONSTTIME_DECLASSIFY(ptr, len) \
  do {                                 \
    (void)(ptr);                       \
    (void)(len);                       \
  } while (false)

#endif  // BORINGSSL_CONSTANT_TIME_VALIDATION

inline crypto_word_t constant_time_declassify_w(crypto_word_t v) {
  // Return `v` through a value barrier to be safe. Valgrind-based constant-time
  // validation is partly to check the compiler has not undone any constant-time
  // work. Any place `BORINGSSL_CONSTANT_TIME_VALIDATION` influences
  // optimizations, this validation is inaccurate.
  //
  // However, by sending pointers through valgrind, we likely inhibit escape
  // analysis. On local variables, particularly booleans, we likely
  // significantly impact optimizations.
  //
  // Thus, to be safe, stick a value barrier, in hopes of comparably inhibiting
  // compiler analysis.
  CONSTTIME_DECLASSIFY(&v, sizeof(v));
  return value_barrier_w(v);
}

inline int constant_time_declassify_int(int v) {
  static_assert(sizeof(uint32_t) == sizeof(int),
                "int is not the same size as uint32_t");
  // See comment above.
  CONSTTIME_DECLASSIFY(&v, sizeof(v));
  return value_barrier_u32(v);
}

// declassify_assert behaves like `assert` but declassifies the result of
// evaluating `expr`. This allows the assertion to branch on the (presumably
// public) result, but still ensures that values leading up to the computation
// were secret.
#define declassify_assert(expr) assert(constant_time_declassify_int(expr))


// Thread-safe initialisation.

#if !defined(OPENSSL_THREADS)
typedef uint32_t CRYPTO_once_t;
#define CRYPTO_ONCE_INIT 0
#elif defined(OPENSSL_WINDOWS_THREADS)
typedef INIT_ONCE CRYPTO_once_t;
#define CRYPTO_ONCE_INIT INIT_ONCE_STATIC_INIT
#elif defined(OPENSSL_PTHREADS)
typedef pthread_once_t CRYPTO_once_t;
#define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT
#else
#error "Unknown threading library"
#endif

// CRYPTO_once calls `init` exactly once per process. This is thread-safe: if
// concurrent threads call `CRYPTO_once` with the same `CRYPTO_once_t` argument
// then they will block until `init` completes, but `init` will have only been
// called once.
//
// The `once` argument must be a `CRYPTO_once_t` that has been initialised with
// the value `CRYPTO_ONCE_INIT`.
OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void (*init)());


// Atomics.
//
// This is a thin wrapper over std::atomic because some embedded platforms do
// not support threads and don't provide a trivial std::atomic implementation.
// For now, this does not wrap std::memory_order. If we ever use non-default
// std::memory_order, we will need to wrap these too, or fix the embedded
// platforms to provide a no-op std::atomic. See https://crbug.com/442112336.

#if defined(OPENSSL_THREADS)
template <typename T>
using Atomic = std::atomic<T>;
#else
template <typename T>
class Atomic {
 public:
  static_assert(std::is_integral_v<T> || std::is_pointer_v<T>);

  Atomic() = default;
  constexpr Atomic(T value) : value_(value) {}
  Atomic(const Atomic &) = delete;
  Atomic &operator=(const Atomic &) = delete;
  T operator=(T value) {
    value_ = value;
    return value_;
  }

  T load() const { return value_; }
  void store(T desired) { value_ = desired; }

  bool compare_exchange_strong(T &expected, T desired) {
    if (value_ != expected) {
      expected = value_;
      return false;
    }
    value_ = desired;
    return true;
  }
  bool compare_exchange_weak(T &expected, T desired) {
    return compare_exchange_strong(expected, desired);
  }

  T exchange(T desired) { return std::exchange(value_, desired); }

 private:
  T value_;
};
#endif


// Reference counting.

// CRYPTO_REFCOUNT_MAX is the value at which the reference count saturates.
#define CRYPTO_REFCOUNT_MAX 0xffffffff

using CRYPTO_refcount_t = Atomic<uint32_t>;

// CRYPTO_refcount_inc atomically increments the value at `*count` unless the
// value would overflow. It's safe for multiple threads to concurrently call
// this or `CRYPTO_refcount_dec_and_test_zero` on the same
// `CRYPTO_refcount_t`.
OPENSSL_EXPORT void CRYPTO_refcount_inc(CRYPTO_refcount_t *count);

// CRYPTO_refcount_dec_and_test_zero tests the value at `*count`:
//   if it's zero, it crashes the address space.
//   if it's the maximum value, it returns zero.
//   otherwise, it atomically decrements it and returns one iff the resulting
//       value is zero.
//
// It's safe for multiple threads to concurrently call this or
// `CRYPTO_refcount_inc` on the same `CRYPTO_refcount_t`.
OPENSSL_EXPORT int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count);


// Locks.

// A Mutex is a read/write lock. It can be constant-initialized, but has a
// destructor. To allocate a global one, use StaticMutex, which skips the
// destructor.
class OPENSSL_EXPORT StaticMutex {
 public:
  constexpr StaticMutex() = default;
  StaticMutex(const StaticMutex &) = delete;
  StaticMutex &operator=(const StaticMutex &) = delete;

  // LockRead locks the mutex such that other threads may also have a read lock,
  // but none may have a write lock.
  void LockRead();
  // UnlockRead releases a read lock.
  void UnlockRead();

  // LockWrite locks the mutex such that no other thread has any type of lock on
  // it.
  void LockWrite();
  // UnlockWrite releases a write lock.
  void UnlockWrite();

protected:
#if !defined(OPENSSL_THREADS)
  // Nothing.
#elif defined(OPENSSL_WINDOWS_THREADS)
  SRWLOCK lock_ = SRWLOCK_INIT;
#elif defined(OPENSSL_PTHREADS)
  pthread_rwlock_t lock_ = PTHREAD_RWLOCK_INITIALIZER;
#else
#error "Unknown threading library"
#endif
};

class OPENSSL_EXPORT Mutex  : public StaticMutex {
 public:
  constexpr Mutex() = default;
  ~Mutex();
};

namespace internal {

// MutexLockBase is a RAII helper for Mutex locking.
template <void (StaticMutex::*LockMethod)(),
          void (StaticMutex::*ReleaseMethod)()>
class MutexLockBase {
 public:
  explicit MutexLockBase(StaticMutex *mu) : mu_(mu) {
    assert(mu_ != nullptr);
    (mu_->*LockMethod)();
  }
  ~MutexLockBase() { (mu_->*ReleaseMethod)(); }
  MutexLockBase(const MutexLockBase &) = delete;
  MutexLockBase &operator=(const MutexLockBase &) = delete;

 private:
  StaticMutex *const mu_;
};

}  // namespace internal

using MutexWriteLock =
    internal::MutexLockBase<&StaticMutex::LockWrite, &StaticMutex::UnlockWrite>;
using MutexReadLock =
    internal::MutexLockBase<&StaticMutex::LockRead, &StaticMutex::UnlockRead>;
using MutexWriteUnlock =
    internal::MutexLockBase<&StaticMutex::UnlockWrite, &StaticMutex::LockWrite>;
using MutexReadUnlock =
    internal::MutexLockBase<&StaticMutex::UnlockRead, &StaticMutex::LockRead>;


// Thread local storage.

// thread_local_data_t enumerates the types of thread-local data that can be
// stored.
typedef enum {
  OPENSSL_THREAD_LOCAL_ERR = 0,
  OPENSSL_THREAD_LOCAL_RAND,
  OPENSSL_THREAD_LOCAL_FIPS_COUNTERS,
  OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE,
  OPENSSL_THREAD_LOCAL_TEST,
  NUM_OPENSSL_THREAD_LOCALS,
} thread_local_data_t;

// thread_local_destructor_t is the type of a destructor function that will be
// called when a thread exits and its thread-local storage needs to be freed.
typedef void (*thread_local_destructor_t)(void *);

// CRYPTO_get_thread_local gets the pointer value that is stored for the
// current thread for the given index, or NULL if none has been set.
OPENSSL_EXPORT void *CRYPTO_get_thread_local(thread_local_data_t value);

// CRYPTO_set_thread_local sets a pointer value for the current thread at the
// given index. This function should only be called once per thread for a given
// `index`: rather than update the pointer value itself, update the data that
// is pointed to.
//
// The destructor function will be called when a thread exits to free this
// thread-local data. All calls to `CRYPTO_set_thread_local` with the same
// `index` should have the same `destructor` argument. The destructor may be
// called with a NULL argument if a thread that never set a thread-local
// pointer for `index`, exits. The destructor may be called concurrently with
// different arguments.
//
// This function returns one on success or zero on error. If it returns zero
// then `destructor` has been called with `value` already.
OPENSSL_EXPORT int CRYPTO_set_thread_local(
    thread_local_data_t index, void *value,
    thread_local_destructor_t destructor);


// ex_data

BSSL_NAMESPACE_END

struct crypto_ex_data_st {
  STACK_OF(void) *sk;
} /* CRYPTO_EX_DATA */;

BSSL_NAMESPACE_BEGIN

struct ExDataFuncs;

// ExDataClass tracks the ex_indices registered for a type which
// supports ex_data. It should defined as a static global within the module
// which defines that type.
struct ExDataClass {
  explicit constexpr ExDataClass(bool with_app_data = false)
      : num_reserved(with_app_data ? 1 : 0) {}

  StaticMutex lock;
  // funcs is a linked list of `ExDataFuncs` structures. It may be traversed
  // without serialization only up to `num_funcs`. last points to the final
  // entry of `funcs`, or nullptr if empty.
  ExDataFuncs *funcs = nullptr, *last = nullptr;
  // num_funcs is the number of entries in `funcs`.
  Atomic<uint32_t> num_funcs = 0;
  // num_reserved is one if the ex_data index zero is reserved for legacy
  // `TYPE_get_app_data` functions.
  uint8_t num_reserved = 0;
};

// CRYPTO_get_ex_new_index_ex allocates a new index for `ex_data_class`. Each
// class of object should provide a wrapper function that uses the correct
// `ExDataClass`. It returns the new index on success and -1 on error.
OPENSSL_EXPORT int CRYPTO_get_ex_new_index_ex(
    ExDataClass *ex_data_class, long argl, void *argp,
    CRYPTO_EX_free *free_func);

// CRYPTO_set_ex_data sets an extra data pointer on a given object. Each class
// of object should provide a wrapper function.
OPENSSL_EXPORT int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val);

// CRYPTO_get_ex_data returns an extra data pointer for a given object, or NULL
// if no such index exists. Each class of object should provide a wrapper
// function.
OPENSSL_EXPORT void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int index);

// CRYPTO_new_ex_data initialises a newly allocated `CRYPTO_EX_DATA`.
OPENSSL_EXPORT void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad);

// CRYPTO_free_ex_data frees `ad`, which is an object of the given class.
OPENSSL_EXPORT void CRYPTO_free_ex_data(ExDataClass *ex_data_class,
                                        CRYPTO_EX_DATA *ad);


// Endianness conversions.

#if defined(__GNUC__) && __GNUC__ >= 2
inline uint16_t CRYPTO_bswap2(uint16_t x) { return __builtin_bswap16(x); }

inline uint32_t CRYPTO_bswap4(uint32_t x) { return __builtin_bswap32(x); }

inline uint64_t CRYPTO_bswap8(uint64_t x) { return __builtin_bswap64(x); }
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_uint64, _byteswap_ulong, _byteswap_ushort)
inline uint16_t CRYPTO_bswap2(uint16_t x) { return _byteswap_ushort(x); }

inline uint32_t CRYPTO_bswap4(uint32_t x) { return _byteswap_ulong(x); }

inline uint64_t CRYPTO_bswap8(uint64_t x) { return _byteswap_uint64(x); }
#else
inline uint16_t CRYPTO_bswap2(uint16_t x) { return (x >> 8) | (x << 8); }

inline uint32_t CRYPTO_bswap4(uint32_t x) {
  x = (x >> 16) | (x << 16);
  x = ((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8);
  return x;
}

inline uint64_t CRYPTO_bswap8(uint64_t x) {
  return CRYPTO_bswap4(x >> 32) | (((uint64_t)CRYPTO_bswap4(x)) << 32);
}
#endif


// Language bug workarounds.
//
// Most C standard library functions are undefined if passed NULL, even when the
// corresponding length is zero. This gives them (and, in turn, all functions
// which call them) surprising behavior on empty arrays. Some compilers will
// miscompile code due to this rule. See also
// https://www.imperialviolet.org/2016/06/26/nonnull.html
//
// These wrapper functions behave the same as the corresponding C standard
// functions, but behave as expected when passed NULL if the length is zero.
//
// Note `OPENSSL_memcmp` is a different function from `CRYPTO_memcmp`.

// C++ defines `memchr` as a const-correct overload.
inline const void *OPENSSL_memchr(const void *s, int c, size_t n) {
  if (n == 0) {
    return nullptr;
  }

  return memchr(s, c, n);
}

inline void *OPENSSL_memchr(void *s, int c, size_t n) {
  if (n == 0) {
    return nullptr;
  }

  return memchr(s, c, n);
}

inline int OPENSSL_memcmp(const void *s1, const void *s2, size_t n) {
  if (n == 0) {
    return 0;
  }

  return memcmp(s1, s2, n);
}

inline void *OPENSSL_memcpy(void *dst, const void *src, size_t n) {
  if (n == 0) {
    return dst;
  }

  return memcpy(dst, src, n);
}

inline void *OPENSSL_memmove(void *dst, const void *src, size_t n) {
  if (n == 0) {
    return dst;
  }

  return memmove(dst, src, n);
}

inline void *OPENSSL_memset(void *dst, int c, size_t n) {
  if (n == 0) {
    return dst;
  }

  return memset(dst, c, n);
}


// Loads and stores.
//
// The following functions load and store sized integers with the specified
// endianness. They use `memcpy`, and so avoid alignment or strict aliasing
// requirements on the input and output pointers.

inline uint16_t CRYPTO_load_u16_le(const void *in) {
  uint16_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return v;
}

inline void CRYPTO_store_u16_le(void *out, uint16_t v) {
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline uint16_t CRYPTO_load_u16_be(const void *in) {
  uint16_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return CRYPTO_bswap2(v);
}

inline void CRYPTO_store_u16_be(void *out, uint16_t v) {
  v = CRYPTO_bswap2(v);
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline uint32_t CRYPTO_load_u32_le(const void *in) {
  uint32_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return v;
}

inline void CRYPTO_store_u32_le(void *out, uint32_t v) {
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline uint32_t CRYPTO_load_u32_be(const void *in) {
  uint32_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return CRYPTO_bswap4(v);
}

inline void CRYPTO_store_u32_be(void *out, uint32_t v) {
  v = CRYPTO_bswap4(v);
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline uint64_t CRYPTO_load_u64_le(const void *in) {
  uint64_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return v;
}

inline void CRYPTO_store_u64_le(void *out, uint64_t v) {
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline uint64_t CRYPTO_load_u64_be(const void *ptr) {
  uint64_t ret;
  OPENSSL_memcpy(&ret, ptr, sizeof(ret));
  return CRYPTO_bswap8(ret);
}

inline void CRYPTO_store_u64_be(void *out, uint64_t v) {
  v = CRYPTO_bswap8(v);
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline crypto_word_t CRYPTO_load_word_le(const void *in) {
  crypto_word_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
  return v;
}

inline void CRYPTO_store_word_le(void *out, crypto_word_t v) {
  OPENSSL_memcpy(out, &v, sizeof(v));
}

inline crypto_word_t CRYPTO_load_word_be(const void *in) {
  crypto_word_t v;
  OPENSSL_memcpy(&v, in, sizeof(v));
#if defined(OPENSSL_64_BIT)
  static_assert(sizeof(v) == 8, "crypto_word_t has unexpected size");
  return CRYPTO_bswap8(v);
#else
  static_assert(sizeof(v) == 4, "crypto_word_t has unexpected size");
  return CRYPTO_bswap4(v);
#endif
}


// Bit rotation functions.
//
// Note these functions use `(-shift) & 31`, etc., because shifting by the bit
// width is undefined. Both Clang and GCC recognize this pattern as a rotation,
// but MSVC does not. Instead, we call MSVC's built-in functions.

inline uint32_t CRYPTO_rotl_u32(uint32_t value, int shift) {
#if defined(_MSC_VER)
  return _rotl(value, shift);
#else
  return (value << shift) | (value >> ((-shift) & 31));
#endif
}

inline uint32_t CRYPTO_rotr_u32(uint32_t value, int shift) {
#if defined(_MSC_VER)
  return _rotr(value, shift);
#else
  return (value >> shift) | (value << ((-shift) & 31));
#endif
}

inline uint64_t CRYPTO_rotl_u64(uint64_t value, int shift) {
#if defined(_MSC_VER)
  return _rotl64(value, shift);
#else
  return (value << shift) | (value >> ((-shift) & 63));
#endif
}

inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) {
#if defined(_MSC_VER)
  return _rotr64(value, shift);
#else
  return (value >> shift) | (value << ((-shift) & 63));
#endif
}


// FIPS functions.

#if defined(BORINGSSL_FIPS)

// BORINGSSL_FIPS_abort is called when a FIPS power-on or continuous test
// fails. It prevents any further cryptographic operations by the current
// process.
void BORINGSSL_FIPS_abort() __attribute__((noreturn));

// boringssl_self_test_startup runs all startup self tests and returns one on
// success or zero on error. Startup self tests do not include lazy tests.
// Call `BORINGSSL_self_test` to run every self test.
int boringssl_self_test_startup();

// boringssl_ensure_rsa_sign_self_test checks whether the RSA signing self-test
// has been run in this address space. If not, it runs it and crashes the
// address space if unsuccessful.
void boringssl_ensure_rsa_sign_self_test();

// boringssl_ensure_rsa_verify_self_test checks whether the RSA verification
// self-test has been run in this address space. If not, it runs it and crashes
// the address space if unsuccessful.
void boringssl_ensure_rsa_verify_self_test();

// boringssl_ensure_ecc_self_test checks whether the ECDSA and ECDH self-test
// has been run in this address space. If not, it runs it and crashes the
// address space if unsuccessful.
void boringssl_ensure_ecc_self_test();

// boringssl_ensure_ffdh_self_test checks whether the FFDH self-test has been
// run in this address space. If not, it runs it and crashes the address space
// if unsuccessful.
void boringssl_ensure_ffdh_self_test();

#else

// Outside of FIPS mode, the lazy tests are no-ops.

inline void boringssl_ensure_rsa_sign_self_test() {}
inline void boringssl_ensure_rsa_verify_self_test() {}
inline void boringssl_ensure_ecc_self_test() {}
inline void boringssl_ensure_ffdh_self_test() {}

#endif  // FIPS

// BORINGSSL_check_test checks that `expected` and `actual` are equal. It
// returns 1 on success and, on failure, it prints an error message that
// includes the hexdumps the two values and returns 0.
int BORINGSSL_check_test(Span<const uint8_t> expected,
                         Span<const uint8_t> actual, const char *name);

// boringssl_self_test_sha256 performs a SHA-256 KAT.
int boringssl_self_test_sha256();

// boringssl_self_test_sha512 performs a SHA-512 KAT.
int boringssl_self_test_sha512();

// boringssl_self_test_hmac_sha256 performs an HMAC-SHA-256 KAT.
int boringssl_self_test_hmac_sha256();

// boringssl_self_test_mlkem performs the ML-KEM KATs.
OPENSSL_EXPORT int boringssl_self_test_mlkem();

// boringssl_self_test_mldsa performs the ML-DSA KATs.
OPENSSL_EXPORT int boringssl_self_test_mldsa();

// boringssl_self_test_slhdsa performs the SLH-DSA KATs.
OPENSSL_EXPORT int boringssl_self_test_slhdsa();

#if defined(BORINGSSL_FIPS_COUNTERS)
void boringssl_fips_inc_counter(enum fips_counter_t counter);
#else
inline void boringssl_fips_inc_counter(enum fips_counter_t counter) {}
#endif

#if defined(BORINGSSL_FIPS_BREAK_TESTS)
inline int boringssl_fips_break_test(const char *test) {
  const char *const value = getenv("BORINGSSL_FIPS_BREAK_TEST");
  return value != nullptr && strcmp(value, test) == 0;
}
#else
inline int boringssl_fips_break_test(const char *test) { return 0; }
#endif  // BORINGSSL_FIPS_BREAK_TESTS


// Runtime CPU feature support

#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
// OPENSSL_ia32cap_P contains the Intel CPUID bits when running on an x86 or
// x86-64 system.
//
//   Index 0:
//     EDX for CPUID where EAX = 1
//     Bit 30 is used to indicate an Intel CPU
//   Index 1:
//     ECX for CPUID where EAX = 1
//   Index 2:
//     EBX for CPUID where EAX = 7, ECX = 0
//     Bit 14 (for removed feature MPX) is used to indicate a preference for ymm
//       registers over zmm even when zmm registers are supported
//   Index 3:
//     ECX for CPUID where EAX = 7, ECX = 0
//
// Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the XMM, YMM,
// and AVX512 bits in XCR0, so it is not necessary to check those. (WARNING: See
// caveats in cpu_intel.c.)
//
// This symbol should only be accessed with `OPENSSL_get_ia32cap`.
extern uint32_t OPENSSL_ia32cap_P[4];

// OPENSSL_get_ia32cap initializes the library if needed and returns the `idx`th
// entry of `OPENSSL_ia32cap_P`. It is marked as a const function so duplicate
// calls can be merged by the compiler, at least when indices match.
OPENSSL_ATTR_CONST uint32_t OPENSSL_get_ia32cap(int idx);

// OPENSSL_adjust_ia32cap adjusts `cap`, which should contain
// `OPENSSL_ia32cap_P`, based on the environment variable value in `env`. This
// function is exposed for unit tests.
void OPENSSL_adjust_ia32cap(uint32_t cap[4], const char *env);

// See Intel manual, volume 2A, table 3-11.

inline int CRYPTO_is_intel_cpu() {
  // The reserved bit 30 is used to indicate an Intel CPU.
  return (OPENSSL_get_ia32cap(0) & (1u << 30)) != 0;
}

// See Intel manual, volume 2A, table 3-10.

inline int CRYPTO_is_PCLMUL_capable() {
#if defined(__PCLMUL__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 1)) != 0;
#endif
}

inline int CRYPTO_is_SSSE3_capable() {
#if defined(__SSSE3__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 9)) != 0;
#endif
}

inline int CRYPTO_is_SSE4_1_capable() {
#if defined(__SSE4_1__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 19)) != 0;
#endif
}

inline int CRYPTO_is_MOVBE_capable() {
#if defined(__MOVBE__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 22)) != 0;
#endif
}

inline int CRYPTO_is_AESNI_capable() {
#if defined(__AES__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 25)) != 0;
#endif
}

// We intentionally avoid defining a `CRYPTO_is_XSAVE_capable` function. See
// `CRYPTO_cpu_perf_is_like_silvermont`.

inline int CRYPTO_is_AVX_capable() {
#if defined(__AVX__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(1) & (1u << 28)) != 0;
#endif
}

inline int CRYPTO_is_RDRAND_capable() {
  // We intentionally do not check `__RDRND__` here. On some AMD processors, we
  // will act as if the hardware is RDRAND-incapable, even it actually supports
  // it. See cpu_intel.c.
  return (OPENSSL_get_ia32cap(1) & (1u << 30)) != 0;
}

// See Intel manual, volume 2A, table 3-8.

inline int CRYPTO_is_BMI1_capable() {
#if defined(__BMI__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 3)) != 0;
#endif
}

inline int CRYPTO_is_AVX2_capable() {
#if defined(__AVX2__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 5)) != 0;
#endif
}

inline int CRYPTO_is_BMI2_capable() {
#if defined(__BMI2__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 8)) != 0;
#endif
}

inline int CRYPTO_is_ADX_capable() {
#if defined(__ADX__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 19)) != 0;
#endif
}

// SHA-1 and SHA-256 are defined as a single extension.
inline int CRYPTO_is_x86_SHA_capable() {
#if defined(__SHA__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 29)) != 0;
#endif
}

// CRYPTO_cpu_perf_is_like_silvermont returns one if, based on a heuristic, the
// CPU has Silvermont-like performance characteristics. It is often faster to
// run different codepaths on these CPUs than the available instructions would
// otherwise select. See chacha-x86_64.pl.
//
// Bonnell, Silvermont's predecessor in the Atom lineup, will also be matched by
// this. Goldmont (Silvermont's successor in the Atom lineup) added XSAVE so it
// isn't matched by this. Various sources indicate AMD first implemented MOVBE
// and XSAVE at the same time in Jaguar, so it seems like AMD chips will not be
// matched by this. That seems to be the case for other x86(-64) CPUs.
inline int CRYPTO_cpu_perf_is_like_silvermont() {
  // WARNING: This MUST NOT be used to guard the execution of the XSAVE
  // instruction. This is the "hardware supports XSAVE" bit, not the OSXSAVE bit
  // that indicates whether we can safely execute XSAVE. This bit may be set
  // even when XSAVE is disabled (by the operating system). See how the users of
  // this bit use it.
  //
  // Historically, the XSAVE bit was artificially cleared on Knights Landing
  // and Knights Mill chips, but as Intel has removed all support from GCC,
  // LLVM, and SDE, we assume they are no longer worth special-casing.
  int hardware_supports_xsave = (OPENSSL_get_ia32cap(1) & (1u << 26)) != 0;
  return !hardware_supports_xsave && CRYPTO_is_MOVBE_capable();
}

inline int CRYPTO_is_AVX512BW_capable() {
#if defined(__AVX512BW__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 30)) != 0;
#endif
}

inline int CRYPTO_is_AVX512VL_capable() {
#if defined(__AVX512VL__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(2) & (1u << 31)) != 0;
#endif
}

// CRYPTO_cpu_avoid_zmm_registers returns 1 if zmm registers (512-bit vectors)
// should not be used even if the CPU supports them.
//
// Note that this reuses the bit for the removed MPX feature.
inline int CRYPTO_cpu_avoid_zmm_registers() {
  return (OPENSSL_get_ia32cap(2) & (1u << 14)) != 0;
}

inline int CRYPTO_is_VAES_capable() {
#if defined(__VAES__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(3) & (1u << 9)) != 0;
#endif
}

inline int CRYPTO_is_VPCLMULQDQ_capable() {
#if defined(__VPCLMULQDQ__)
  return 1;
#else
  return (OPENSSL_get_ia32cap(3) & (1u << 10)) != 0;
#endif
}

#endif  // OPENSSL_X86 || OPENSSL_X86_64

#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)

// ARMV7_NEON indicates support for NEON.
#define ARMV7_NEON (1 << 0)

// ARMV8_AES indicates support for hardware AES instructions.
#define ARMV8_AES (1 << 2)

// ARMV8_SHA1 indicates support for hardware SHA-1 instructions.
#define ARMV8_SHA1 (1 << 3)

// ARMV8_SHA256 indicates support for hardware SHA-256 instructions.
#define ARMV8_SHA256 (1 << 4)

// ARMV8_PMULL indicates support for carryless multiplication.
#define ARMV8_PMULL (1 << 5)

// ARMV8_SHA512 indicates support for hardware SHA-512 instructions.
#define ARMV8_SHA512 (1 << 6)

// ARMV8_SHA3 indicates support for eor3 instructions.
#define ARMV8_SHA3 (1 << 7)

#if defined(OPENSSL_STATIC_ARMCAP)
// We assume `CRYPTO_is_*_capable` already checked static capabilities.
inline uint32_t OPENSSL_get_armcap() { return 0; }
#else
// OPENSSL_armcap_P contains ARM CPU capabilities as a bitmask of the above
// constants. This should only be accessed with `OPENSSL_get_armcap`.
extern uint32_t OPENSSL_armcap_P;

// OPENSSL_get_armcap initializes the library if needed and returns ARM CPU
// capabilities. It is marked as a const function so duplicate calls can be
// merged by the compiler.
OPENSSL_ATTR_CONST uint32_t OPENSSL_get_armcap();
#endif  // OPENSSL_STATIC_ARMCAP

// Normalize some older feature flags to their modern ACLE values.
// https://developer.arm.com/architectures/system-architectures/software-standards/acle
#if defined(__ARM_NEON__) && !defined(__ARM_NEON)
#define __ARM_NEON 1
#endif
#if defined(__ARM_FEATURE_CRYPTO)
#if !defined(__ARM_FEATURE_AES)
#define __ARM_FEATURE_AES 1
#endif
#if !defined(__ARM_FEATURE_SHA2)
#define __ARM_FEATURE_SHA2 1
#endif
#endif

// CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If
// this is known statically, it is a constant inline function.
inline int CRYPTO_is_NEON_capable() {
#if (defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON)) && \
    !defined(OPENSSL_NO_STATIC_NEON_FOR_TESTING)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV7_NEON) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_AES_capable() {
#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_AES)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_AES) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_PMULL_capable() {
#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_AES)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_PMULL) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_SHA1_capable() {
  // SHA-1 and SHA-2 (only) share `__ARM_FEATURE_SHA2` but otherwise
  // are dealt with independently.
#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_SHA2)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_SHA1) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_SHA256_capable() {
  // SHA-1 and SHA-2 (only) share `__ARM_FEATURE_SHA2` but otherwise
  // are dealt with independently.
#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_SHA2)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_SHA256) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_SHA512_capable() {
  // There is no `OPENSSL_STATIC_ARMCAP_SHA512`.
#if defined(__ARM_FEATURE_SHA512)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_SHA512) != 0;
#endif
}

inline int CRYPTO_is_ARMv8_SHA3_capable() {
  // There is no `OPENSSL_STATIC_ARMCAP_SHA3`.
#if defined(__ARM_FEATURE_SHA3)
  return 1;
#else
  return (OPENSSL_get_armcap() & ARMV8_SHA3) != 0;
#endif
}

#endif  // OPENSSL_ARM || OPENSSL_AARCH64


#if defined(BORINGSSL_DISPATCH_TEST)
// Runtime CPU dispatch testing support

// BORINGSSL_function_hit is an array of flags. The following functions will
// set these flags if BORINGSSL_DISPATCH_TEST is defined.
//   0: aes_hw_ctr32_encrypt_blocks
//   1: aes_hw_encrypt
//   2: aesni_gcm_encrypt
//   3: aes_hw_set_encrypt_key
//   4: vpaes_encrypt
//   5: vpaes_set_encrypt_key
//   6: aes_gcm_enc_update_vaes_avx2
//   7: aes_gcm_enc_update_vaes_avx512
extern "C" uint8_t BORINGSSL_function_hit[8];
#endif  // BORINGSSL_DISPATCH_TEST


// OPENSSL_vasprintf_internal is just like `vasprintf(3)`. If `system_malloc` is
// 0, memory will be allocated with `OPENSSL_malloc` and must be freed with
// `OPENSSL_free`. Otherwise the system `malloc` function is used and the memory
// must be freed with the system `free` function.
OPENSSL_EXPORT int OPENSSL_vasprintf_internal(char **str, const char *format,
                                              va_list args, int system_malloc)
    OPENSSL_PRINTF_FORMAT_FUNC(2, 0);


// Fuzzer mode.

#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
// CRYPTO_fuzzer_mode_enabled returns whether fuzzer mode is enabled. See
// `CRYPTO_set_fuzzer_mode`. In non-fuzzer builds, this function statically
// returns zero so the codepaths will be deleted by the optimizer.
int CRYPTO_fuzzer_mode_enabled();
#else
inline int CRYPTO_fuzzer_mode_enabled() { return 0; }
#endif


// Arithmetic functions.

// CRYPTO_addc_* returns `x + y + carry`, and sets `*out_carry` to the carry
// bit. `carry` must be zero or one.

// NOTE: Unoptimized GCC builds may compile these builtins to non-constant-time
// code. For correct constant-time behavior, ensure builds are optimized.
#if OPENSSL_HAS_BUILTIN(__builtin_addc)

inline unsigned int CRYPTO_addc_impl(unsigned int x, unsigned int y,
                                     unsigned int carry,
                                     unsigned int *out_carry) {
  return __builtin_addc(x, y, carry, out_carry);
}

inline unsigned long CRYPTO_addc_impl(unsigned long x, unsigned long y,
                                      unsigned long carry,
                                      unsigned long *out_carry) {
  return __builtin_addcl(x, y, carry, out_carry);
}

inline unsigned long long CRYPTO_addc_impl(unsigned long long x,
                                           unsigned long long y,
                                           unsigned long long carry,
                                           unsigned long long *out_carry) {
  return __builtin_addcll(x, y, carry, out_carry);
}

inline uint32_t CRYPTO_addc_u32(uint32_t x, uint32_t y, uint32_t carry,
                                uint32_t *out_carry) {
  return CRYPTO_addc_impl(x, y, carry, out_carry);
}

inline uint64_t CRYPTO_addc_u64(uint64_t x, uint64_t y, uint64_t carry,
                                uint64_t *out_carry) {
  return CRYPTO_addc_impl(x, y, carry, out_carry);
}

#else

inline uint32_t CRYPTO_addc_u32(uint32_t x, uint32_t y, uint32_t carry,
                                uint32_t *out_carry) {
  declassify_assert(carry <= 1);
#if defined(_M_IX86)
  uint32_t sum = 0;
  *out_carry = _addcarry_u32(carry, x, y, &sum);
  return sum;
#else
  uint64_t ret = carry;
  ret += (uint64_t)x + y;
  *out_carry = (uint32_t)(ret >> 32);
  return (uint32_t)ret;
#endif
}

inline uint64_t CRYPTO_addc_u64(uint64_t x, uint64_t y, uint64_t carry,
                                uint64_t *out_carry) {
  declassify_assert(carry <= 1);
#if defined(_M_X64)
  uint64_t sum = 0;
  *out_carry = _addcarry_u64(carry, x, y, &sum);
  return sum;
#elif defined(BORINGSSL_HAS_UINT128)
  uint128_t ret = carry;
  ret += (uint128_t)x + y;
  *out_carry = (uint64_t)(ret >> 64);
  return (uint64_t)ret;
#else
  x += carry;
  carry = x < carry;
  uint64_t ret = x + y;
  carry += ret < x;
  *out_carry = carry;
  return ret;
#endif
}
#endif


// CRYPTO_subc_* returns `x - y - borrow`, and sets `*out_borrow` to the borrow
// bit. `borrow` must be zero or one.
#if OPENSSL_HAS_BUILTIN(__builtin_subc)

inline unsigned int CRYPTO_subc_impl(unsigned int x, unsigned int y,
                                     unsigned int borrow,
                                     unsigned int *out_borrow) {
  return __builtin_subc(x, y, borrow, out_borrow);
}

inline unsigned long CRYPTO_subc_impl(unsigned long x, unsigned long y,
                                      unsigned long borrow,
                                      unsigned long *out_borrow) {
  return __builtin_subcl(x, y, borrow, out_borrow);
}

inline unsigned long long CRYPTO_subc_impl(unsigned long long x,
                                           unsigned long long y,
                                           unsigned long long borrow,
                                           unsigned long long *out_borrow) {
  return __builtin_subcll(x, y, borrow, out_borrow);
}

inline uint32_t CRYPTO_subc_u32(uint32_t x, uint32_t y, uint32_t borrow,
                                uint32_t *out_borrow) {
  return CRYPTO_subc_impl(x, y, borrow, out_borrow);
}

inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow,
                                uint64_t *out_borrow) {
  return CRYPTO_subc_impl(x, y, borrow, out_borrow);
}

#else

inline uint32_t CRYPTO_subc_u32(uint32_t x, uint32_t y, uint32_t borrow,
                                uint32_t *out_borrow) {
  declassify_assert(borrow <= 1);
#if defined(_M_IX86)
  uint32_t diff = 0;
  *out_borrow = _subborrow_u32(borrow, x, y, &diff);
  return diff;
#else
  uint32_t ret = x - y - borrow;
  *out_borrow = (x < y) | ((x == y) & borrow);
  return ret;
#endif
}

inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow,
                                uint64_t *out_borrow) {
  declassify_assert(borrow <= 1);
#if defined(_M_X64)
  uint64_t diff = 0;
  *out_borrow = _subborrow_u64(borrow, x, y, &diff);
  return diff;
#else
  uint64_t ret = x - y - borrow;
  *out_borrow = (x < y) | ((x == y) & borrow);
  return ret;
#endif
}
#endif

#if defined(OPENSSL_64_BIT)
#define CRYPTO_addc_w CRYPTO_addc_u64
#define CRYPTO_subc_w CRYPTO_subc_u64
#else
#define CRYPTO_addc_w CRYPTO_addc_u32
#define CRYPTO_subc_w CRYPTO_subc_u32
#endif


// Cleanup implements a custom scope guard, when the cleanup logic does not fit
// in a destructor. Usage:
//
//     bssl::Cleanup cleanup = [&] { SomeCleanupWork(local_var); };
template <typename F>
class Cleanup {
 public:
  static_assert(std::is_invocable_v<F>);
  static_assert(std::is_same_v<std::invoke_result_t<F>, void>);

  Cleanup(F func) : func_(func) {}
  Cleanup(const Cleanup &) = delete;
  Cleanup &operator=(const Cleanup &) = delete;
  ~Cleanup() { func_(); }

 private:
  F func_;
};
template <typename F>
Cleanup(F func) -> Cleanup<F>;

// DECLARE_OPAQUE_STRUCT defines a public struct `public_name` with an
// implementation struct `impl_name`.
//
// To prevent accidents, the `public_name` struct will be neither constructable,
// nor copyable/movable, nor deletable.
//
// It must be used from inside the `bssl` namespace; however, `public_name` will
// be defined outside.
//
// Usage:
//
// DECLARE_OPAQUE_STRUCT(public_st, PublicImpl)
//
// BSSL_NAMESPACE_BEGIN
//
// class PublicImpl : public public_st {
//  public:
//   PublicImpl();
//   ~PublicImpl();
//   void foo();
// };
//
// BSSL_NAMESPACE_END
//
// The implementation struct can be converted to the public struct implicitly;
// to convert the public struct to the implementation struct, call
// `FromOpaque` on it. It is explicitly allowed to call `FromOpaque` on a
// `nullptr`.
#define DECLARE_OPAQUE_STRUCT(public_name, impl_name)                  \
  BSSL_NAMESPACE_BEGIN                                                 \
  class impl_name;                                                     \
  BSSL_NAMESPACE_END                                                   \
                                                                       \
  /* This is unnamespaced but assumed to not create linker symbols. */ \
  struct public_name {                                                 \
    using ImplType = bssl::impl_name;                                  \
                                                                       \
   private:                                                            \
    public_name() = default;                                           \
    ~public_name() = default;                                          \
    public_name(const public_name &) = delete;                         \
    public_name &operator=(const public_name &) = delete;              \
                                                                       \
    friend class bssl::impl_name;                                      \
  };

template <typename Public>
inline typename Public::ImplType *FromOpaque(Public *p) {
  return static_cast<typename Public::ImplType *>(p);
}

template <typename Public>
inline const typename Public::ImplType *FromOpaque(const Public *p) {
  return static_cast<const typename Public::ImplType *>(p);
}

BSSL_NAMESPACE_END


#endif  // OPENSSL_HEADER_CRYPTO_INTERNAL_H
