blob: 49e17535a7c7b6705ed20965478b6e4eebc052bd [file] [log] [blame]
Hanno Becker108fc842021-01-12 06:39:43 +00001/*
2 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00003 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Hanno Becker108fc842021-01-12 06:39:43 +00004 *
Gilles Peskinee820c0a2023-08-03 17:45:20 +02005 * This file is part of Mbed TLS (https://tls.mbed.org)
Hanno Becker108fc842021-01-12 06:39:43 +00006 */
7
8/**
Hanno Becker61d7eed2021-03-05 05:09:37 +00009 * \file mps_common.h
Hanno Becker108fc842021-01-12 06:39:43 +000010 *
11 * \brief Common functions and macros used by MPS
12 */
13
14#ifndef MBEDTLS_MPS_COMMON_H
15#define MBEDTLS_MPS_COMMON_H
16
Hanno Becker984fbde2021-01-28 09:02:18 +000017#include "mps_error.h"
18
Hanno Beckerd2f9f532021-01-12 07:11:11 +000019#include <stdio.h>
20
Hanno Becker6ed183c2021-01-12 06:42:16 +000021/**
22 * \name SECTION: MPS Configuration
23 *
24 * \{
25 */
26
Hanno Beckerac267f32021-01-12 07:25:41 +000027/*! This flag controls whether the MPS-internal components
28 * (reader, writer, Layer 1-3) perform validation of the
29 * expected abstract state at the entry of API calls.
30 *
31 * Context: All MPS API functions impose assumptions/preconditions on the
32 * context on which they operate. For example, every structure has a notion of
33 * state integrity which is established by `xxx_init()` and preserved by any
34 * calls to the MPS API which satisfy their preconditions and either succeed,
35 * or fail with an error code which is explicitly documented to not corrupt
36 * structure integrity (such as WANT_READ and WANT_WRITE);
37 * apart from `xxx_init()` any function assumes state integrity as a
38 * precondition (but usually more). If any of the preconditions is violated,
39 * the function's behavior is entirely undefined.
40 * In addition to state integrity, all MPS structures have a more refined
41 * notion of abstract state that the API operates on. For example, all layers
bootstrap-prime6dbbf442022-05-17 19:30:44 -040042 * have a notion of 'abstract read state' which indicates if incoming data has
Hanno Beckerac267f32021-01-12 07:25:41 +000043 * been passed to the user, e.g. through mps_l2_read_start() for Layer 2
44 * or mps_l3_read() in Layer 3. After such a call, it doesn't make sense to
45 * call these reading functions again until the incoming data has been
46 * explicitly 'consumed', e.g. through mps_l2_read_consume() for Layer 2 or
47 * mps_l3_read_consume() on Layer 3. However, even if it doesn't make sense,
48 * it's a design choice whether the API should fail gracefully on such
49 * non-sensical calls or not, and that's what this option is about:
50 *
51 * This option determines whether the expected abstract state
Hanno Becker6e3484e2021-02-22 15:09:03 +000052 * is part of the API preconditions or not: If the option is set,
53 * then the abstract state is not part of the precondition and is
54 * thus required to be validated by the implementation. If an unexpected
55 * abstract state is encountered, the implementation must fail gracefully
56 * with error #MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED.
57 * Conversely, if this option is not set, then the expected abstract state
58 * is included in the preconditions of the respective API calls, and
59 * an implementation's behaviour is undefined if the abstract state is
60 * not as expected.
Hanno Beckerac267f32021-01-12 07:25:41 +000061 *
62 * For example: Enabling this makes mps_l2_read_done() fail if
63 * no incoming record is currently open; disabling this would
64 * lead to undefined behavior in this case.
65 *
66 * Comment this to remove state validation.
67 */
68#define MBEDTLS_MPS_STATE_VALIDATION
69
Hanno Becker6ed183c2021-01-12 06:42:16 +000070/*! This flag enables/disables assertions on the internal state of MPS.
71 *
72 * Assertions are sanity checks that should never trigger when MPS
73 * is used within the bounds of its API and preconditions.
74 *
75 * Enabling this increases security by limiting the scope of
76 * potential bugs, but comes at the cost of increased code size.
77 *
78 * Note: So far, there is no guiding principle as to what
79 * expected conditions merit an assertion, and which don't.
80 *
81 * Comment this to disable assertions.
82 */
83#define MBEDTLS_MPS_ENABLE_ASSERTIONS
84
Hanno Becker1ae9f752021-01-12 06:43:17 +000085/*! This flag controls whether tracing for MPS should be enabled. */
Hanno Becker984fbde2021-01-28 09:02:18 +000086//#define MBEDTLS_MPS_ENABLE_TRACE
Hanno Becker1ae9f752021-01-12 06:43:17 +000087
Hanno Beckerac267f32021-01-12 07:25:41 +000088#if defined(MBEDTLS_MPS_STATE_VALIDATION)
89
Gilles Peskine449bd832023-01-11 14:50:10 +010090#define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \
Hanno Becker984fbde2021-01-28 09:02:18 +000091 do \
92 { \
Gilles Peskine449bd832023-01-11 14:50:10 +010093 if (!(cond)) \
Hanno Becker984fbde2021-01-28 09:02:18 +000094 { \
Gilles Peskine449bd832023-01-11 14:50:10 +010095 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \
96 MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED); \
Hanno Becker984fbde2021-01-28 09:02:18 +000097 } \
Gilles Peskine449bd832023-01-11 14:50:10 +010098 } while (0)
Hanno Beckerac267f32021-01-12 07:25:41 +000099
100#else /* MBEDTLS_MPS_STATE_VALIDATION */
101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102#define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \
Hanno Beckerac267f32021-01-12 07:25:41 +0000103 do \
104 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 (cond); \
106 } while (0)
Hanno Beckerac267f32021-01-12 07:25:41 +0000107
108#endif /* MBEDTLS_MPS_STATE_VALIDATION */
109
Hanno Becker75ac1f72021-01-12 07:25:26 +0000110#if defined(MBEDTLS_MPS_ENABLE_ASSERTIONS)
111
Gilles Peskine449bd832023-01-11 14:50:10 +0100112#define MBEDTLS_MPS_ASSERT_RAW(cond, string) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000113 do \
114 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 if (!(cond)) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000116 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \
118 MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_INTERNAL_ERROR); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000119 } \
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 } while (0)
Hanno Becker75ac1f72021-01-12 07:25:26 +0000121
122#else /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124#define MBEDTLS_MPS_ASSERT_RAW(cond, string) do {} while (0)
Hanno Becker75ac1f72021-01-12 07:25:26 +0000125
126#endif /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
127
Hanno Beckerac267f32021-01-12 07:25:41 +0000128
Hanno Becker6ed183c2021-01-12 06:42:16 +0000129/* \} name SECTION: MPS Configuration */
Hanno Becker108fc842021-01-12 06:39:43 +0000130
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000131/**
132 * \name SECTION: Common types
133 *
134 * Various common types used throughout MPS.
135 * \{
136 */
137
138/** \brief The type of buffer sizes and offsets used in MPS structures.
139 *
140 * This is an unsigned integer type that should be large enough to
Hanno Becker46101c72021-02-22 15:11:15 +0000141 * hold the length of any buffer or message processed by MPS.
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000142 *
143 * The reason to pick a value as small as possible here is
144 * to reduce the size of MPS structures.
145 *
146 * \warning Care has to be taken when using a narrower type
147 * than ::mbedtls_mps_size_t here because of
148 * potential truncation during conversion.
149 *
150 * \warning Handshake messages in TLS may be up to 2^24 ~ 16Mb in size.
151 * If mbedtls_mps_[opt_]stored_size_t is smaller than that, the
152 * maximum handshake message is restricted accordingly.
153 *
154 * For now, we use the default type of size_t throughout, and the use of
155 * smaller types or different types for ::mbedtls_mps_size_t and
156 * ::mbedtls_mps_stored_size_t is not yet supported.
157 *
158 */
159typedef size_t mbedtls_mps_stored_size_t;
Simon5205fb42022-09-05 23:15:07 +0200160#define MBEDTLS_MPS_STORED_SIZE_MAX (SIZE_MAX)
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000161
162/** \brief The type of buffer sizes and offsets used in the MPS API
163 * and implementation.
164 *
165 * This must be at least as wide as ::mbedtls_stored_size_t but
166 * may be chosen to be strictly larger if more suitable for the
167 * target architecture.
168 *
169 * For example, in a test build for ARM Thumb, using uint_fast16_t
170 * instead of uint16_t reduced the code size from 1060 Byte to 962 Byte,
171 * so almost 10%.
172 */
173typedef size_t mbedtls_mps_size_t;
Simon5205fb42022-09-05 23:15:07 +0200174#define MBEDTLS_MPS_SIZE_MAX (SIZE_MAX)
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000175
Hanno Becker4a079c52021-02-22 15:13:28 +0000176#if MBEDTLS_MPS_STORED_SIZE_MAX > MBEDTLS_MPS_SIZE_MAX
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000177#error "Misconfiguration of mbedtls_mps_size_t and mbedtls_mps_stored_size_t."
178#endif
179
180/* \} SECTION: Common types */
181
182
Hanno Becker108fc842021-01-12 06:39:43 +0000183#endif /* MBEDTLS_MPS_COMMON_H */