Go to the documentation of this file.
109 #ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H
110 #define OPENSSL_HEADER_CRYPTO_INTERNAL_H
120 #if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)
121 #include <valgrind/memcheck.h>
124 #if !defined(__cplusplus)
125 #if defined(_MSC_VER)
126 #define alignas(x) __declspec(align(x))
127 #define alignof __alignof
129 #include <stdalign.h>
133 #if defined(OPENSSL_THREADS) && \
134 (!defined(OPENSSL_WINDOWS) || defined(__MINGW32__))
136 #define OPENSSL_PTHREADS
139 #if defined(OPENSSL_THREADS) && !defined(OPENSSL_PTHREADS) && \
140 defined(OPENSSL_WINDOWS)
141 #define OPENSSL_WINDOWS_THREADS
147 #if defined(__cplusplus)
152 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || defined(OPENSSL_ARM) || \
153 defined(OPENSSL_AARCH64) || defined(OPENSSL_PPC64LE)
158 #if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
159 !defined(OPENSSL_STATIC_ARMCAP)
167 #if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT)
168 #define BORINGSSL_HAS_UINT128
169 typedef __int128_t int128_t;
170 typedef __uint128_t uint128_t;
174 #if !defined(_MSC_VER) || !defined(__clang__)
175 #define BORINGSSL_CAN_DIVIDE_UINT128
179 #define OPENSSL_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
182 #if defined(__cplusplus) && __cplusplus >= 201703L
183 #define OPENSSL_FALLTHROUGH [[fallthrough]]
184 #elif defined(__cplusplus) && __cplusplus >= 201103L && defined(__clang__)
185 #define OPENSSL_FALLTHROUGH [[clang::fallthrough]]
186 #elif defined(__cplusplus) && __cplusplus >= 201103L && defined(__GNUC__) && \
188 #define OPENSSL_FALLTHROUGH [[gnu::fallthrough]]
189 #elif defined(__GNUC__) && __GNUC__ >= 7 // gcc 7
190 #define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough))
191 #elif defined(__clang__)
192 #if __has_attribute(fallthrough) && __clang_major__ >= 5
196 #define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough))
197 #else // clang versions that do not support fallthrough.
198 #define OPENSSL_FALLTHROUGH
200 #else // C++11 on gcc 6, and all other cases
201 #define OPENSSL_FALLTHROUGH
208 #if defined(__SSE2__) && !defined(OPENSSL_NO_SSE2_FOR_TESTING)
224 return a_u + a_len > b_u && b_u + b_len > a_u;
268 #if defined(OPENSSL_64_BIT)
270 #elif defined(OPENSSL_32_BIT)
273 #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT"
276 #define CONSTTIME_TRUE_W ~((crypto_word_t)0)
277 #define CONSTTIME_FALSE_W ((crypto_word_t)0)
278 #define CONSTTIME_TRUE_8 ((uint8_t)0xff)
279 #define CONSTTIME_FALSE_8 ((uint8_t)0)
289 #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
290 __asm__(
"" :
"+r"(
a) : );
297 #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
298 __asm__(
"" :
"+r"(
a) : );
305 #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
306 __asm__(
"" :
"+r"(
a) : );
314 return 0
u - (
a >> (
sizeof(
a) * 8 - 1));
443 (crypto_word_t)(
b)));
446 #if defined(BORINGSSL_CONSTANT_TIME_VALIDATION)
452 #define CONSTTIME_SECRET(x, y) VALGRIND_MAKE_MEM_UNDEFINED(x, y)
457 #define CONSTTIME_DECLASSIFY(x, y) VALGRIND_MAKE_MEM_DEFINED(x, y)
461 #define CONSTTIME_SECRET(x, y)
462 #define CONSTTIME_DECLASSIFY(x, y)
464 #endif // BORINGSSL_CONSTANT_TIME_VALIDATION
469 #if !defined(OPENSSL_THREADS)
471 #define CRYPTO_ONCE_INIT 0
472 #elif defined(OPENSSL_WINDOWS_THREADS)
474 #define CRYPTO_ONCE_INIT INIT_ONCE_STATIC_INIT
475 #elif defined(OPENSSL_PTHREADS)
477 #define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT
479 #error "Unknown threading library"
495 #if !defined(OPENSSL_C11_ATOMIC) && defined(OPENSSL_THREADS) && \
496 !defined(__STDC_NO_ATOMICS__) && defined(__STDC_VERSION__) && \
497 __STDC_VERSION__ >= 201112L
498 #define OPENSSL_C11_ATOMIC
502 #define CRYPTO_REFCOUNT_MAX 0xffffffff
532 #if !defined(OPENSSL_THREADS)
536 #define CRYPTO_STATIC_MUTEX_INIT { 0 }
537 #elif defined(OPENSSL_WINDOWS_THREADS)
541 #define CRYPTO_STATIC_MUTEX_INIT { SRWLOCK_INIT }
542 #elif defined(OPENSSL_PTHREADS)
544 pthread_rwlock_t lock;
546 #define CRYPTO_STATIC_MUTEX_INIT { PTHREAD_RWLOCK_INITIALIZER }
548 #error "Unknown threading library"
594 #if defined(__cplusplus)
602 template <
void (*LockFunc)(CRYPTO_MUTEX *),
void (*ReleaseFunc)(CRYPTO_MUTEX *)>
603 class MutexLockBase {
606 assert(
mu_ !=
nullptr);
609 ~MutexLockBase() { ReleaseFunc(
mu_); }
610 MutexLockBase(
const MutexLockBase<LockFunc, ReleaseFunc> &) =
delete;
611 MutexLockBase &operator=(
const MutexLockBase<LockFunc, ReleaseFunc> &) =
620 using MutexWriteLock =
621 internal::MutexLockBase<CRYPTO_MUTEX_lock_write, CRYPTO_MUTEX_unlock_write>;
622 using MutexReadLock =
623 internal::MutexLockBase<CRYPTO_MUTEX_lock_read, CRYPTO_MUTEX_unlock_read>;
628 #endif // defined(__cplusplus)
687 #define CRYPTO_EX_DATA_CLASS_INIT {CRYPTO_STATIC_MUTEX_INIT, NULL, 0}
688 #define CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA \
689 {CRYPTO_STATIC_MUTEX_INIT, NULL, 1}
696 int *out_index,
long argl,
720 #if defined(__GNUC__) && __GNUC__ >= 2
722 return __builtin_bswap16(
x);
726 return __builtin_bswap32(
x);
730 return __builtin_bswap64(
x);
732 #elif defined(_MSC_VER)
736 #pragma intrinsic(_byteswap_uint64, _byteswap_ulong, _byteswap_ushort)
738 return _byteswap_ushort(
x);
742 return _byteswap_ulong(
x);
746 return _byteswap_uint64(
x);
750 return (
x >> 8) | (
x << 8);
754 x = (
x >> 16) | (
x << 16);
755 x = ((
x & 0xff00ff00) >> 8) | ((
x & 0x00ff00ff) << 8);
779 #if defined(__cplusplus)
787 return memchr(s,
c,
n);
795 return memchr(s,
c,
n);
806 return memchr(s,
c,
n);
809 #endif // __cplusplus
816 return memcmp(s1, s2,
n);
832 return memmove(
dst, src,
n);
900 #if defined(_MSC_VER)
901 return _rotl(
value, shift);
903 return (
value << shift) | (
value >> ((-shift) & 31));
908 #if defined(_MSC_VER)
909 return _rotr(
value, shift);
911 return (
value >> shift) | (
value << ((-shift) & 31));
916 #if defined(_MSC_VER)
917 return _rotl64(
value, shift);
919 return (
value << shift) | (
value >> ((-shift) & 63));
924 #if defined(_MSC_VER)
925 return _rotr64(
value, shift);
927 return (
value >> shift) | (
value << ((-shift) & 63));
934 #if defined(BORINGSSL_FIPS)
947 size_t module_hash_len);
949 #if defined(BORINGSSL_FIPS_COUNTERS)
955 #if defined(__cplusplus)
959 #endif // OPENSSL_HEADER_CRYPTO_INTERNAL_H
static uint32_t CRYPTO_rotr_u32(uint32_t value, int shift)
OPENSSL_EXPORT const ASN1_OBJECT * obj
#define OPENSSL_cpuid_setup
OPENSSL_INLINE void boringssl_fips_inc_counter(enum fips_counter_t counter)
static uint64_t CRYPTO_load_u64_be(const void *ptr)
static uint32_t value_barrier_u32(uint32_t a)
static int OPENSSL_memcmp(const void *s1, const void *s2, size_t n)
return memset(p, 0, total)
@ OPENSSL_THREAD_LOCAL_RAND
static void CRYPTO_store_u64_be(void *out, uint64_t v)
static uint16_t CRYPTO_bswap2(uint16_t x)
static void * align_pointer(void *ptr, size_t alignment)
static uint64_t CRYPTO_bswap8(uint64_t x)
OPENSSL_EXPORT void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad)
OPENSSL_EXPORT void CRYPTO_STATIC_MUTEX_lock_write(struct CRYPTO_STATIC_MUTEX *lock)
static void * OPENSSL_memchr(const void *s, int c, size_t n)
OPENSSL_EXPORT pem_password_cb void * u
OPENSSL_EXPORT void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, void *obj, CRYPTO_EX_DATA *ad)
static uint32_t CRYPTO_rotl_u32(uint32_t value, int shift)
OPENSSL_EXPORT void CRYPTO_MUTEX_lock_write(CRYPTO_MUTEX *lock)
static void CRYPTO_store_word_le(void *out, crypto_word_t v)
static void * OPENSSL_memset(void *dst, int c, size_t n)
static crypto_word_t constant_time_is_zero_w(crypto_word_t a)
static void CRYPTO_store_u32_le(void *out, uint32_t v)
OPENSSL_EXPORT void CRYPTO_refcount_inc(CRYPTO_refcount_t *count)
OPENSSL_EXPORT void * CRYPTO_get_thread_local(thread_local_data_t value)
static crypto_word_t constant_time_ge_w(crypto_word_t a, crypto_word_t b)
OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void(*init)(void))
static uint8_t constant_time_lt_8(crypto_word_t a, crypto_word_t b)
static crypto_word_t constant_time_msb_w(crypto_word_t a)
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
OPENSSL_EXPORT int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count)
static uint32_t CRYPTO_bswap4(uint32_t x)
static uint64_t CRYPTO_rotl_u64(uint64_t value, int shift)
static void CRYPTO_store_u32_be(void *out, uint32_t v)
static int constant_time_select_int(crypto_word_t mask, int a, int b)
OPENSSL_EXPORT void CRYPTO_STATIC_MUTEX_unlock_write(struct CRYPTO_STATIC_MUTEX *lock)
OPENSSL_EXPORT void CRYPTO_MUTEX_unlock_write(CRYPTO_MUTEX *lock)
unsigned __int64 uint64_t
int boringssl_fips_self_test(const uint8_t *module_hash, size_t module_hash_len)
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
#define BSSL_NAMESPACE_END
__attribute__(void) start
OPENSSL_EXPORT void CRYPTO_MUTEX_unlock_read(CRYPTO_MUTEX *lock)
OPENSSL_MSVC_PRAGMA(warning(disable:4702))
OPENSSL_EXPORT void CRYPTO_STATIC_MUTEX_unlock_read(struct CRYPTO_STATIC_MUTEX *lock)
static uint32_t CRYPTO_load_u32_be(const void *in)
_W64 unsigned int uintptr_t
static uint8_t constant_time_eq_int_8(int a, int b)
void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int index, long argl, void *argp)
#define DECLARE_STACK_OF(type)
int push(void *desc, unsigned char *buf, unsigned len)
static uint8_t constant_time_ge_8(crypto_word_t a, crypto_word_t b)
static uint8_t constant_time_eq_8(crypto_word_t a, crypto_word_t b)
static crypto_word_t value_barrier_w(crypto_word_t a)
static const std::size_t alignment
static uint64_t value_barrier_u64(uint64_t a)
OPENSSL_EXPORT int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, int *out_index, long argl, void *argp, CRYPTO_EX_free *free_func)
UniquePtr< SSL_SESSION > ret
@ OPENSSL_THREAD_LOCAL_FIPS_COUNTERS
OPENSSL_EXPORT void CRYPTO_MUTEX_cleanup(CRYPTO_MUTEX *lock)
OPENSSL_EXPORT int CRYPTO_set_thread_local(thread_local_data_t index, void *value, thread_local_destructor_t destructor)
OPENSSL_EXPORT void * CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int index)
OPENSSL_EXPORT void CRYPTO_MUTEX_lock_read(CRYPTO_MUTEX *lock)
static void * OPENSSL_memmove(void *dst, const void *src, size_t n)
static uint32_t CRYPTO_load_u32_le(const void *in)
static crypto_word_t constant_time_eq_int(int a, int b)
static crypto_word_t constant_time_select_w(crypto_word_t mask, crypto_word_t a, crypto_word_t b)
void(* thread_local_destructor_t)(void *)
static uint8_t constant_time_is_zero_8(crypto_word_t a)
OPENSSL_EXPORT void CRYPTO_STATIC_MUTEX_lock_read(struct CRYPTO_STATIC_MUTEX *lock)
OPENSSL_EXPORT int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val)
static uint64_t CRYPTO_rotr_u64(uint64_t value, int shift)
static int buffers_alias(const uint8_t *a, size_t a_len, const uint8_t *b, size_t b_len)
static uint8_t constant_time_select_8(uint8_t mask, uint8_t a, uint8_t b)
static crypto_word_t constant_time_eq_w(crypto_word_t a, crypto_word_t b)
@ OPENSSL_THREAD_LOCAL_TEST
uint32_t CRYPTO_refcount_t
@ OPENSSL_THREAD_LOCAL_ERR
OPENSSL_EXPORT void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock)
@ NUM_OPENSSL_THREAD_LOCALS
static crypto_word_t constant_time_lt_w(crypto_word_t a, crypto_word_t b)
static crypto_word_t CRYPTO_load_word_le(const void *in)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:07