blob: 34dfc5651cd20634a3dd5b9ebe281668660c59ab [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 { \
62 if((ret)!=0 || (E).n == 0) \
63 TEST_ASSERT(mbedtls_codepath_check == (path) || \
64 mbedtls_codepath_check == MBEDTLS_MPI_IS_TEST); \
65 else \
66 TEST_EQUAL(mbedtls_codepath_check, (path)); \
67 } while (0)
68
69/** Check the codepath taken and fail if it doesn't match.
70 *
71 * When a function returns with an error, it can do so before reaching any interesting codepath. In
72 * this case we need to allow uninitialised value for the codepath tracking variable.
73 *
74 * This macro expands to an instruction, not an expression.
75 * It may jump to the \c exit label.
76 *
77 * \param path The expected codepath.
78 * This expression may be evaluated multiple times.
79 * \param ret The expected return value.
80 */
81#define ASSERT_RSA_CODEPATH(path, ret) \
82 do { \
83 if((ret)!=0) \
84 TEST_ASSERT(mbedtls_codepath_check == (path) || \
85 mbedtls_codepath_check == MBEDTLS_MPI_IS_TEST); \
86 else \
87 TEST_EQUAL(mbedtls_codepath_check, (path)); \
88 } while (0)
Janos Follath96cfd7a2024-08-22 18:30:06 +010089#endif /* MBEDTLS_TEST_HOOKS && !MBEDTLS_THREADING_C */
90
91#endif /* BIGNUM_CODEPATH_CHECK_H */