blob: 2f954e94fa533d8093434ebd0423634c7f80ec7d [file] [log] [blame]
Janos Follath96cfd7a2024-08-22 18:30:06 +01001/** Support for path tracking in optionally safe bignum functions
2 *
3 * The functions are called when an optionally safe path is taken and logs it with a single
4 * variable. This variable is at any time in one of three states:
5 * - MBEDTLS_MPI_IS_TEST: No optionally safe path has been taken since the last reset
6 * - MBEDTLS_MPI_IS_SECRET: Only safe paths were teken since the last reset
7 * - MBEDTLS_MPI_IS_PUBLIC: At least one unsafe path has been taken since the last reset
8 *
9 * Using a simple global variable to track execution path. Making it work with multithreading
10 * doesn't worth the effort as multithreaded tests add little to no value here.
11 */
12/*
13 * Copyright The Mbed TLS Contributors
14 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
15 */
16
17#ifndef BIGNUM_CODEPATH_CHECK_H
18#define BIGNUM_CODEPATH_CHECK_H
19
20#include "bignum_core.h"
21
22#if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C)
23
24extern int mbedtls_codepath_check;
25
26/**
27 * \brief Setup the codepath test hooks used by optionally safe bignum functions to signal
28 * the path taken.
29 */
30void mbedtls_codepath_test_hooks_setup(void);
31
32/**
33 * \brief Teardown the codepath test hooks used by optionally safe bignum functions to
34 * signal the path taken.
35 */
36void mbedtls_codepath_test_hooks_teardown(void);
37
38/**
39 * \brief Reset the state of the codepath to the initial state.
40 */
41static inline void mbedtls_codepath_reset(void)
42{
43 mbedtls_codepath_check = MBEDTLS_MPI_IS_TEST;
44}
45
Janos Follath0a75adc2024-08-22 20:00:23 +010046/** Check the codepath taken and fail if it doesn't match.
47 *
48 * When a function returns with an error, it can do so before reaching any interesting codepath. The
49 * same can happen if a parameter to the function is zero. In these cases we need to allow
50 * uninitialised value for the codepath tracking variable.
51 *
52 * This macro expands to an instruction, not an expression.
53 * It may jump to the \c exit label.
54 *
55 * \param path The expected codepath.
56 * This expression may be evaluated multiple times.
57 * \param ret The expected return value.
58 * \param E The MPI parameter that can cause shortcuts.
59 */
60#define ASSERT_BIGNUM_CODEPATH(path, ret, E) \
61 do { \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020062 if ((ret) != 0 || (E).n == 0) { \
Janos Follath0a75adc2024-08-22 20:00:23 +010063 TEST_ASSERT(mbedtls_codepath_check == (path) || \
64 mbedtls_codepath_check == MBEDTLS_MPI_IS_TEST); \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020065 } else { \
Janos Follath0a75adc2024-08-22 20:00:23 +010066 TEST_EQUAL(mbedtls_codepath_check, (path)); \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020067 } \
Janos Follath0a75adc2024-08-22 20:00:23 +010068 } while (0)
69
70/** Check the codepath taken and fail if it doesn't match.
71 *
72 * When a function returns with an error, it can do so before reaching any interesting codepath. In
73 * this case we need to allow uninitialised value for the codepath tracking variable.
74 *
75 * This macro expands to an instruction, not an expression.
76 * It may jump to the \c exit label.
77 *
78 * \param path The expected codepath.
79 * This expression may be evaluated multiple times.
80 * \param ret The expected return value.
81 */
82#define ASSERT_RSA_CODEPATH(path, ret) \
83 do { \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020084 if ((ret) != 0) { \
Janos Follath0a75adc2024-08-22 20:00:23 +010085 TEST_ASSERT(mbedtls_codepath_check == (path) || \
86 mbedtls_codepath_check == MBEDTLS_MPI_IS_TEST); \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020087 } else { \
Janos Follath0a75adc2024-08-22 20:00:23 +010088 TEST_EQUAL(mbedtls_codepath_check, (path)); \
Manuel Pégourié-Gonnard9ec6d452024-09-02 12:41:05 +020089 } \
Janos Follath0a75adc2024-08-22 20:00:23 +010090 } while (0)
Janos Follath96cfd7a2024-08-22 18:30:06 +010091#endif /* MBEDTLS_TEST_HOOKS && !MBEDTLS_THREADING_C */
92
93#endif /* BIGNUM_CODEPATH_CHECK_H */