XenevaOS
Loading...
Searching...
No Matches
constant_time_internal.h
Go to the documentation of this file.
1
8#ifndef MBEDTLS_CONSTANT_TIME_INTERNAL_H
9#define MBEDTLS_CONSTANT_TIME_INTERNAL_H
10
11#include <stdint.h>
12#include <stddef.h>
13
14#include "common.h"
15
16#if defined(MBEDTLS_BIGNUM_C)
17#include "mbedtls/bignum.h"
18#endif
19
20/* The constant-time interface provides various operations that are likely
21 * to result in constant-time code that does not branch or use conditional
22 * instructions for secret data (for secret pointers, this also applies to
23 * the data pointed to).
24 *
25 * It has three main parts:
26 *
27 * - boolean operations
28 * These are all named mbedtls_ct_<type>_<operation>.
29 * They operate over <type> and return mbedtls_ct_condition_t.
30 * All arguments are considered secret.
31 * example: bool x = y | z => x = mbedtls_ct_bool_or(y, z)
32 * example: bool x = y == z => x = mbedtls_ct_uint_eq(y, z)
33 *
34 * - conditional data selection
35 * These are all named mbedtls_ct_<type>_if and mbedtls_ct_<type>_if_else_0
36 * All arguments are considered secret.
37 * example: size_t a = x ? b : c => a = mbedtls_ct_size_if(x, b, c)
38 * example: unsigned a = x ? b : 0 => a = mbedtls_ct_uint_if_else_0(x, b)
39 *
40 * - block memory operations
41 * Only some arguments are considered secret, as documented for each
42 * function.
43 * example: if (x) memcpy(...) => mbedtls_ct_memcpy_if(x, ...)
44 *
45 * mbedtls_ct_condition_t must be treated as opaque and only created and
46 * manipulated via the functions in this header. The compiler should never
47 * be able to prove anything about its value at compile-time.
48 *
49 * mbedtls_ct_uint_t is an unsigned integer type over which constant time
50 * operations may be performed via the functions in this header. It is as big
51 * as the larger of size_t and mbedtls_mpi_uint, i.e. it is safe to cast
52 * to/from "unsigned int", "size_t", and "mbedtls_mpi_uint" (and any other
53 * not-larger integer types).
54 *
55 * For Arm (32-bit, 64-bit and Thumb), x86 and x86-64, assembly implementations
56 * are used to ensure that the generated code is constant time. For other
57 * architectures, it uses a plain C fallback designed to yield constant-time code
58 * (this has been observed to be constant-time on latest gcc, clang and MSVC
59 * as of May 2023).
60 *
61 * For readability, the static inline definitions are separated out into
62 * constant_time_impl.h.
63 */
64
65#if (SIZE_MAX > 0xffffffffffffffffULL)
66/* Pointer size > 64-bit */
68typedef size_t mbedtls_ct_uint_t;
70#define MBEDTLS_CT_TRUE ((mbedtls_ct_condition_t) mbedtls_ct_compiler_opaque(SIZE_MAX))
71#elif (SIZE_MAX > 0xffffffff) || defined(MBEDTLS_HAVE_INT64)
72/* 32-bit < pointer size <= 64-bit, or 64-bit MPI */
76#define MBEDTLS_CT_SIZE_64
77#define MBEDTLS_CT_TRUE ((mbedtls_ct_condition_t) mbedtls_ct_compiler_opaque(UINT64_MAX))
78#else
79/* Pointer size <= 32-bit, and no 64-bit MPIs */
83#define MBEDTLS_CT_SIZE_32
84#define MBEDTLS_CT_TRUE ((mbedtls_ct_condition_t) mbedtls_ct_compiler_opaque(UINT32_MAX))
85#endif
86#define MBEDTLS_CT_FALSE ((mbedtls_ct_condition_t) mbedtls_ct_compiler_opaque(0))
87
88/* ============================================================================
89 * Boolean operations
90 */
91
99static inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x);
100
112static inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y);
113
125static inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x,
127
139static inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y);
140
152static inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x,
154
167static inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x,
169
182static inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x,
184
200static inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x,
202
215static inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x,
217
230static inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x,
232
243static inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x);
244
245
246/* ============================================================================
247 * Data selection operations
248 */
249
262static inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition,
263 size_t if1,
264 size_t if0);
265
278static inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition,
279 unsigned if1,
280 unsigned if0);
281
294static inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition,
297
298#if defined(MBEDTLS_BIGNUM_C)
299
312static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, \
313 mbedtls_mpi_uint if1, \
314 mbedtls_mpi_uint if0);
315
316#endif
317
332static inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1);
333
348static inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition,
350
365static inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t if1);
366
367#if defined(MBEDTLS_BIGNUM_C)
368
383static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t condition,
384 mbedtls_mpi_uint if1);
385
386#endif
387
397static inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low,
398 unsigned char high,
399 unsigned char c,
400 unsigned char t);
401
414static inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0);
415
430static inline int mbedtls_ct_error_if_else_0(mbedtls_ct_condition_t condition, int if1);
431
432/* ============================================================================
433 * Block memory operations
434 */
435
436#if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT)
437
450void mbedtls_ct_zeroize_if(mbedtls_ct_condition_t condition, void *buf, size_t len);
451
465void mbedtls_ct_memmove_left(void *start,
466 size_t total,
467 size_t offset);
468
469#endif /* defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) */
470
496 unsigned char *dest,
497 const unsigned char *src1,
498 const unsigned char *src2,
499 size_t len
500 );
501
531void mbedtls_ct_memcpy_offset(unsigned char *dest,
532 const unsigned char *src,
533 size_t offset,
534 size_t offset_min,
535 size_t offset_max,
536 size_t len);
537
538/* Documented in include/mbedtls/constant_time.h. a and b are secret.
539
540 int mbedtls_ct_memcmp(const void *a,
541 const void *b,
542 size_t n);
543 */
544
545#if defined(MBEDTLS_NIST_KW_C)
546
568int mbedtls_ct_memcmp_partial(const void *a,
569 const void *b,
570 size_t n,
571 size_t skip_head,
572 size_t skip_tail);
573
574#endif
575
576/* Include the implementation of static inline functions above. */
577#include "constant_time_impl.h"
578
579#endif /* MBEDTLS_CONSTANT_TIME_INTERNAL_H */
int64_t ptrdiff_t
Definition stddef.h:37
XETime t
Definition main.cpp:53
size_t a
Definition main.cpp:156
size_t b
Definition main.cpp:156
int int32_t
Definition acefiex.h:160
unsigned int uint32_t
Definition acefiex.h:163
COMPILER_DEPENDENT_INT64 int64_t
Definition acefiex.h:164
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
Multi-precision integer library.
uint32_t mbedtls_mpi_uint
The type of machine digits in a bignum, called limbs.
Definition bignum.h:170
Utility macros for internal use in the library.
size_t mbedtls_ct_condition_t
Definition constant_time_internal.h:67
size_t mbedtls_ct_uint_t
Definition constant_time_internal.h:68
ptrdiff_t mbedtls_ct_int_t
Definition constant_time_internal.h:69
void mbedtls_ct_memcpy_if(mbedtls_ct_condition_t condition, unsigned char *dest, const unsigned char *src1, const unsigned char *src2, size_t len)
Definition constant_time.c:170
void mbedtls_ct_memcpy_offset(unsigned char *dest, const unsigned char *src, size_t offset, size_t offset_min, size_t offset_max, size_t len)
Definition constant_time.c:215
size_t size_t offset
Definition drm_bridge.h:1299
size_t len
Definition initial.c:23