1 /** 2 * Constant-time functions 3 * 4 * Copyright The Mbed TLS Contributors 5 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 6 */ 7 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 */ 67 typedef size_t mbedtls_ct_condition_t; 68 typedef size_t mbedtls_ct_uint_t; 69 typedef ptrdiff_t mbedtls_ct_int_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 */ 73 typedef uint64_t mbedtls_ct_condition_t; 74 typedef uint64_t mbedtls_ct_uint_t; 75 typedef int64_t mbedtls_ct_int_t; 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 */ 80 typedef uint32_t mbedtls_ct_condition_t; 81 typedef uint32_t mbedtls_ct_uint_t; 82 typedef int32_t mbedtls_ct_int_t; 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 92 /** Convert a number into a mbedtls_ct_condition_t. 93 * 94 * \param x Number to convert. 95 * 96 * \return MBEDTLS_CT_TRUE if \p x != 0, or MBEDTLS_CT_FALSE if \p x == 0 97 * 98 */ 99 static inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x); 100 101 /** Boolean "not equal" operation. 102 * 103 * Functionally equivalent to: 104 * 105 * \p x != \p y 106 * 107 * \param x The first value to analyze. 108 * \param y The second value to analyze. 109 * 110 * \return MBEDTLS_CT_TRUE if \p x != \p y, otherwise MBEDTLS_CT_FALSE. 111 */ 112 static inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); 113 114 /** Boolean "equals" operation. 115 * 116 * Functionally equivalent to: 117 * 118 * \p x == \p y 119 * 120 * \param x The first value to analyze. 121 * \param y The second value to analyze. 122 * 123 * \return MBEDTLS_CT_TRUE if \p x == \p y, otherwise MBEDTLS_CT_FALSE. 124 */ 125 static inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, 126 mbedtls_ct_uint_t y); 127 128 /** Boolean "less than" operation. 129 * 130 * Functionally equivalent to: 131 * 132 * \p x < \p y 133 * 134 * \param x The first value to analyze. 135 * \param y The second value to analyze. 136 * 137 * \return MBEDTLS_CT_TRUE if \p x < \p y, otherwise MBEDTLS_CT_FALSE. 138 */ 139 static inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); 140 141 /** Boolean "greater than" operation. 142 * 143 * Functionally equivalent to: 144 * 145 * \p x > \p y 146 * 147 * \param x The first value to analyze. 148 * \param y The second value to analyze. 149 * 150 * \return MBEDTLS_CT_TRUE if \p x > \p y, otherwise MBEDTLS_CT_FALSE. 151 */ 152 static inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, 153 mbedtls_ct_uint_t y); 154 155 /** Boolean "greater or equal" operation. 156 * 157 * Functionally equivalent to: 158 * 159 * \p x >= \p y 160 * 161 * \param x The first value to analyze. 162 * \param y The second value to analyze. 163 * 164 * \return MBEDTLS_CT_TRUE if \p x >= \p y, 165 * otherwise MBEDTLS_CT_FALSE. 166 */ 167 static inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, 168 mbedtls_ct_uint_t y); 169 170 /** Boolean "less than or equal" operation. 171 * 172 * Functionally equivalent to: 173 * 174 * \p x <= \p y 175 * 176 * \param x The first value to analyze. 177 * \param y The second value to analyze. 178 * 179 * \return MBEDTLS_CT_TRUE if \p x <= \p y, 180 * otherwise MBEDTLS_CT_FALSE. 181 */ 182 static inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, 183 mbedtls_ct_uint_t y); 184 185 /** Boolean not-equals operation. 186 * 187 * Functionally equivalent to: 188 * 189 * \p x != \p y 190 * 191 * \param x The first value to analyze. 192 * \param y The second value to analyze. 193 * 194 * \note This is more efficient than mbedtls_ct_uint_ne if both arguments are 195 * mbedtls_ct_condition_t. 196 * 197 * \return MBEDTLS_CT_TRUE if \p x != \p y, 198 * otherwise MBEDTLS_CT_FALSE. 199 */ 200 static inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, 201 mbedtls_ct_condition_t y); 202 203 /** Boolean "and" operation. 204 * 205 * Functionally equivalent to: 206 * 207 * \p x && \p y 208 * 209 * \param x The first value to analyze. 210 * \param y The second value to analyze. 211 * 212 * \return MBEDTLS_CT_TRUE if \p x && \p y, 213 * otherwise MBEDTLS_CT_FALSE. 214 */ 215 static inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, 216 mbedtls_ct_condition_t y); 217 218 /** Boolean "or" operation. 219 * 220 * Functionally equivalent to: 221 * 222 * \p x || \p y 223 * 224 * \param x The first value to analyze. 225 * \param y The second value to analyze. 226 * 227 * \return MBEDTLS_CT_TRUE if \p x || \p y, 228 * otherwise MBEDTLS_CT_FALSE. 229 */ 230 static inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, 231 mbedtls_ct_condition_t y); 232 233 /** Boolean "not" operation. 234 * 235 * Functionally equivalent to: 236 * 237 * ! \p x 238 * 239 * \param x The value to invert 240 * 241 * \return MBEDTLS_CT_FALSE if \p x, otherwise MBEDTLS_CT_TRUE. 242 */ 243 static inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x); 244 245 246 /* ============================================================================ 247 * Data selection operations 248 */ 249 250 /** Choose between two size_t values. 251 * 252 * Functionally equivalent to: 253 * 254 * condition ? if1 : if0. 255 * 256 * \param condition Condition to test. 257 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 258 * \param if0 Value to use if \p condition == MBEDTLS_CT_FALSE. 259 * 260 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. 261 */ 262 static inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, 263 size_t if1, 264 size_t if0); 265 266 /** Choose between two unsigned values. 267 * 268 * Functionally equivalent to: 269 * 270 * condition ? if1 : if0. 271 * 272 * \param condition Condition to test. 273 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 274 * \param if0 Value to use if \p condition == MBEDTLS_CT_FALSE. 275 * 276 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. 277 */ 278 static inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, 279 unsigned if1, 280 unsigned if0); 281 282 /** Choose between two mbedtls_ct_condition_t values. 283 * 284 * Functionally equivalent to: 285 * 286 * condition ? if1 : if0. 287 * 288 * \param condition Condition to test. 289 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 290 * \param if0 Value to use if \p condition == MBEDTLS_CT_FALSE. 291 * 292 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. 293 */ 294 static inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition, 295 mbedtls_ct_condition_t if1, 296 mbedtls_ct_condition_t if0); 297 298 #if defined(MBEDTLS_BIGNUM_C) 299 300 /** Choose between two mbedtls_mpi_uint values. 301 * 302 * Functionally equivalent to: 303 * 304 * condition ? if1 : if0. 305 * 306 * \param condition Condition to test. 307 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 308 * \param if0 Value to use if \p condition == MBEDTLS_CT_FALSE. 309 * 310 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. 311 */ 312 static 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 318 /** Choose between an unsigned value and 0. 319 * 320 * Functionally equivalent to: 321 * 322 * condition ? if1 : 0. 323 * 324 * Functionally equivalent to mbedtls_ct_uint_if(condition, if1, 0) but 325 * results in smaller code size. 326 * 327 * \param condition Condition to test. 328 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 329 * 330 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. 331 */ 332 static inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1); 333 334 /** Choose between an mbedtls_ct_condition_t and 0. 335 * 336 * Functionally equivalent to: 337 * 338 * condition ? if1 : 0. 339 * 340 * Functionally equivalent to mbedtls_ct_bool_if(condition, if1, 0) but 341 * results in smaller code size. 342 * 343 * \param condition Condition to test. 344 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 345 * 346 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. 347 */ 348 static inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition, 349 mbedtls_ct_condition_t if1); 350 351 /** Choose between a size_t value and 0. 352 * 353 * Functionally equivalent to: 354 * 355 * condition ? if1 : 0. 356 * 357 * Functionally equivalent to mbedtls_ct_size_if(condition, if1, 0) but 358 * results in smaller code size. 359 * 360 * \param condition Condition to test. 361 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 362 * 363 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. 364 */ 365 static 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 369 /** Choose between an mbedtls_mpi_uint value and 0. 370 * 371 * Functionally equivalent to: 372 * 373 * condition ? if1 : 0. 374 * 375 * Functionally equivalent to mbedtls_ct_mpi_uint_if(condition, if1, 0) but 376 * results in smaller code size. 377 * 378 * \param condition Condition to test. 379 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 380 * 381 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. 382 */ 383 static 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 388 /** Constant-flow char selection 389 * 390 * \param low Secret. Bottom of range 391 * \param high Secret. Top of range 392 * \param c Secret. Value to compare to range 393 * \param t Secret. Value to return, if in range 394 * 395 * \return \p t if \p low <= \p c <= \p high, 0 otherwise. 396 */ 397 static 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 402 /** Choose between two error values. The values must be in the range [-32767..0]. 403 * 404 * Functionally equivalent to: 405 * 406 * condition ? if1 : if0. 407 * 408 * \param condition Condition to test. 409 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 410 * \param if0 Value to use if \p condition == MBEDTLS_CT_FALSE. 411 * 412 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. 413 */ 414 static inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0); 415 416 /** Choose between an error value and 0. The error value must be in the range [-32767..0]. 417 * 418 * Functionally equivalent to: 419 * 420 * condition ? if1 : 0. 421 * 422 * Functionally equivalent to mbedtls_ct_error_if(condition, if1, 0) but 423 * results in smaller code size. 424 * 425 * \param condition Condition to test. 426 * \param if1 Value to use if \p condition == MBEDTLS_CT_TRUE. 427 * 428 * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. 429 */ 430 static 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 438 /** Conditionally set a block of memory to zero. 439 * 440 * Regardless of the condition, every byte will be read once and written to 441 * once. 442 * 443 * \param condition Secret. Condition to test. 444 * \param buf Secret. Pointer to the start of the buffer. 445 * \param len Number of bytes to set to zero. 446 * 447 * \warning Unlike mbedtls_platform_zeroize, this does not have the same guarantees 448 * about not being optimised away if the memory is never read again. 449 */ 450 void mbedtls_ct_zeroize_if(mbedtls_ct_condition_t condition, void *buf, size_t len); 451 452 /** Shift some data towards the left inside a buffer. 453 * 454 * Functionally equivalent to: 455 * 456 * memmove(start, start + offset, total - offset); 457 * memset(start + (total - offset), 0, offset); 458 * 459 * Timing independence comes at the expense of performance. 460 * 461 * \param start Secret. Pointer to the start of the buffer. 462 * \param total Total size of the buffer. 463 * \param offset Secret. Offset from which to copy \p total - \p offset bytes. 464 */ 465 void 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 471 /** Conditional memcpy. 472 * 473 * Functionally equivalent to: 474 * 475 * if (condition) { 476 * memcpy(dest, src1, len); 477 * } else { 478 * if (src2 != NULL) 479 * memcpy(dest, src2, len); 480 * } 481 * 482 * It will always read len bytes from src1. 483 * If src2 != NULL, it will always read len bytes from src2. 484 * If src2 == NULL, it will instead read len bytes from dest (as if src2 == dest). 485 * 486 * \param condition The condition 487 * \param dest Secret. Destination pointer. 488 * \param src1 Secret. Pointer to copy from (if \p condition == MBEDTLS_CT_TRUE). 489 * This may be equal to \p dest, but may not overlap in other ways. 490 * \param src2 Secret (contents only - may branch to determine if this parameter is NULL). 491 * Pointer to copy from (if \p condition == MBEDTLS_CT_FALSE and \p src2 is not NULL). May be NULL. 492 * This may be equal to \p dest, but may not overlap it in other ways. It may overlap with \p src1. 493 * \param len Number of bytes to copy. 494 */ 495 void mbedtls_ct_memcpy_if(mbedtls_ct_condition_t condition, 496 unsigned char *dest, 497 const unsigned char *src1, 498 const unsigned char *src2, 499 size_t len 500 ); 501 502 /** Copy data from a secret position. 503 * 504 * Functionally equivalent to: 505 * 506 * memcpy(dst, src + offset, len) 507 * 508 * This function copies \p len bytes from \p src + \p offset to 509 * \p dst, with a code flow and memory access pattern that does not depend on 510 * \p offset, but only on \p offset_min, \p offset_max and \p len. 511 * 512 * \note This function reads from \p dest, but the value that 513 * is read does not influence the result and this 514 * function's behavior is well-defined regardless of the 515 * contents of the buffers. This may result in false 516 * positives from static or dynamic analyzers, especially 517 * if \p dest is not initialized. 518 * 519 * \param dest Secret. The destination buffer. This must point to a writable 520 * buffer of at least \p len bytes. 521 * \param src Secret. The base of the source buffer. This must point to a 522 * readable buffer of at least \p offset_max + \p len 523 * bytes. Shouldn't overlap with \p dest 524 * \param offset Secret. The offset in the source buffer from which to copy. 525 * This must be no less than \p offset_min and no greater 526 * than \p offset_max. 527 * \param offset_min The minimal value of \p offset. 528 * \param offset_max The maximal value of \p offset. 529 * \param len The number of bytes to copy. 530 */ 531 void 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 547 /** Constant-time buffer comparison without branches. 548 * 549 * Similar to mbedtls_ct_memcmp, except that the result only depends on part of 550 * the input data - differences in the head or tail are ignored. Functionally equivalent to: 551 * 552 * memcmp(a + skip_head, b + skip_head, size - skip_head - skip_tail) 553 * 554 * Time taken depends on \p n, but not on \p skip_head or \p skip_tail . 555 * 556 * Behaviour is undefined if ( \p skip_head + \p skip_tail) > \p n. 557 * 558 * \param a Secret. Pointer to the first buffer, containing at least \p n bytes. May not be NULL. 559 * \param b Secret. Pointer to the second buffer, containing at least \p n bytes. May not be NULL. 560 * \param n The number of bytes to examine (total size of the buffers). 561 * \param skip_head Secret. The number of bytes to treat as non-significant at the start of the buffer. 562 * These bytes will still be read. 563 * \param skip_tail Secret. The number of bytes to treat as non-significant at the end of the buffer. 564 * These bytes will still be read. 565 * 566 * \return Zero if the contents of the two buffers are the same, otherwise non-zero. 567 */ 568 int 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 */ 580