blob: 4e79b248729c8f3906811478c78e031660c6fadd [file] [log] [blame]
Hanno Becker108fc842021-01-12 06:39:43 +00001/*
2 * Copyright The Mbed TLS Contributors
3 * SPDX-License-Identifier: Apache-2.0
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * This file is part of mbed TLS (https://tls.mbed.org)
18 */
19
20/**
Hanno Becker61d7eed2021-03-05 05:09:37 +000021 * \file mps_common.h
Hanno Becker108fc842021-01-12 06:39:43 +000022 *
23 * \brief Common functions and macros used by MPS
24 */
25
26#ifndef MBEDTLS_MPS_COMMON_H
27#define MBEDTLS_MPS_COMMON_H
28
Hanno Becker984fbde2021-01-28 09:02:18 +000029#include "mps_error.h"
30
Hanno Beckerd2f9f532021-01-12 07:11:11 +000031#include <stdio.h>
32
Hanno Becker6ed183c2021-01-12 06:42:16 +000033/**
34 * \name SECTION: MPS Configuration
35 *
36 * \{
37 */
38
Hanno Beckerac267f32021-01-12 07:25:41 +000039/*! This flag controls whether the MPS-internal components
40 * (reader, writer, Layer 1-3) perform validation of the
41 * expected abstract state at the entry of API calls.
42 *
43 * Context: All MPS API functions impose assumptions/preconditions on the
44 * context on which they operate. For example, every structure has a notion of
45 * state integrity which is established by `xxx_init()` and preserved by any
46 * calls to the MPS API which satisfy their preconditions and either succeed,
47 * or fail with an error code which is explicitly documented to not corrupt
48 * structure integrity (such as WANT_READ and WANT_WRITE);
49 * apart from `xxx_init()` any function assumes state integrity as a
50 * precondition (but usually more). If any of the preconditions is violated,
51 * the function's behavior is entirely undefined.
52 * In addition to state integrity, all MPS structures have a more refined
53 * notion of abstract state that the API operates on. For example, all layers
54 * have a notion of 'abtract read state' which indicates if incoming data has
55 * been passed to the user, e.g. through mps_l2_read_start() for Layer 2
56 * or mps_l3_read() in Layer 3. After such a call, it doesn't make sense to
57 * call these reading functions again until the incoming data has been
58 * explicitly 'consumed', e.g. through mps_l2_read_consume() for Layer 2 or
59 * mps_l3_read_consume() on Layer 3. However, even if it doesn't make sense,
60 * it's a design choice whether the API should fail gracefully on such
61 * non-sensical calls or not, and that's what this option is about:
62 *
63 * This option determines whether the expected abstract state
Hanno Becker6e3484e2021-02-22 15:09:03 +000064 * is part of the API preconditions or not: If the option is set,
65 * then the abstract state is not part of the precondition and is
66 * thus required to be validated by the implementation. If an unexpected
67 * abstract state is encountered, the implementation must fail gracefully
68 * with error #MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED.
69 * Conversely, if this option is not set, then the expected abstract state
70 * is included in the preconditions of the respective API calls, and
71 * an implementation's behaviour is undefined if the abstract state is
72 * not as expected.
Hanno Beckerac267f32021-01-12 07:25:41 +000073 *
74 * For example: Enabling this makes mps_l2_read_done() fail if
75 * no incoming record is currently open; disabling this would
76 * lead to undefined behavior in this case.
77 *
78 * Comment this to remove state validation.
79 */
80#define MBEDTLS_MPS_STATE_VALIDATION
81
Hanno Becker6ed183c2021-01-12 06:42:16 +000082/*! This flag enables/disables assertions on the internal state of MPS.
83 *
84 * Assertions are sanity checks that should never trigger when MPS
85 * is used within the bounds of its API and preconditions.
86 *
87 * Enabling this increases security by limiting the scope of
88 * potential bugs, but comes at the cost of increased code size.
89 *
90 * Note: So far, there is no guiding principle as to what
91 * expected conditions merit an assertion, and which don't.
92 *
93 * Comment this to disable assertions.
94 */
95#define MBEDTLS_MPS_ENABLE_ASSERTIONS
96
Hanno Becker1ae9f752021-01-12 06:43:17 +000097/*! This flag controls whether tracing for MPS should be enabled. */
Hanno Becker984fbde2021-01-28 09:02:18 +000098//#define MBEDTLS_MPS_ENABLE_TRACE
Hanno Becker1ae9f752021-01-12 06:43:17 +000099
Hanno Beckerac267f32021-01-12 07:25:41 +0000100#if defined(MBEDTLS_MPS_STATE_VALIDATION)
101
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200102# define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \
103 do { \
104 if (!(cond)) { \
105 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \
106 MBEDTLS_MPS_TRACE_RETURN( \
107 MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED); \
108 } \
109 } while (0)
Hanno Beckerac267f32021-01-12 07:25:41 +0000110
111#else /* MBEDTLS_MPS_STATE_VALIDATION */
112
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200113# define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \
114 do { \
115 (cond); \
116 } while (0)
Hanno Beckerac267f32021-01-12 07:25:41 +0000117
118#endif /* MBEDTLS_MPS_STATE_VALIDATION */
119
Hanno Becker75ac1f72021-01-12 07:25:26 +0000120#if defined(MBEDTLS_MPS_ENABLE_ASSERTIONS)
121
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122# define MBEDTLS_MPS_ASSERT_RAW(cond, string) \
123 do { \
124 if (!(cond)) { \
125 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \
126 MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_INTERNAL_ERROR); \
127 } \
128 } while (0)
Hanno Becker75ac1f72021-01-12 07:25:26 +0000129
130#else /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
131
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200132# define MBEDTLS_MPS_ASSERT_RAW(cond, string) \
133 do { \
134 } while (0)
Hanno Becker75ac1f72021-01-12 07:25:26 +0000135
136#endif /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
137
Hanno Becker6ed183c2021-01-12 06:42:16 +0000138/* \} name SECTION: MPS Configuration */
Hanno Becker108fc842021-01-12 06:39:43 +0000139
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000140/**
141 * \name SECTION: Common types
142 *
143 * Various common types used throughout MPS.
144 * \{
145 */
146
147/** \brief The type of buffer sizes and offsets used in MPS structures.
148 *
149 * This is an unsigned integer type that should be large enough to
Hanno Becker46101c72021-02-22 15:11:15 +0000150 * hold the length of any buffer or message processed by MPS.
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000151 *
152 * The reason to pick a value as small as possible here is
153 * to reduce the size of MPS structures.
154 *
155 * \warning Care has to be taken when using a narrower type
156 * than ::mbedtls_mps_size_t here because of
157 * potential truncation during conversion.
158 *
159 * \warning Handshake messages in TLS may be up to 2^24 ~ 16Mb in size.
160 * If mbedtls_mps_[opt_]stored_size_t is smaller than that, the
161 * maximum handshake message is restricted accordingly.
162 *
163 * For now, we use the default type of size_t throughout, and the use of
164 * smaller types or different types for ::mbedtls_mps_size_t and
165 * ::mbedtls_mps_stored_size_t is not yet supported.
166 *
167 */
168typedef size_t mbedtls_mps_stored_size_t;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200169#define MBEDTLS_MPS_STORED_SIZE_MAX ((mbedtls_mps_stored_size_t)-1)
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000170
171/** \brief The type of buffer sizes and offsets used in the MPS API
172 * and implementation.
173 *
174 * This must be at least as wide as ::mbedtls_stored_size_t but
175 * may be chosen to be strictly larger if more suitable for the
176 * target architecture.
177 *
178 * For example, in a test build for ARM Thumb, using uint_fast16_t
179 * instead of uint16_t reduced the code size from 1060 Byte to 962 Byte,
180 * so almost 10%.
181 */
182typedef size_t mbedtls_mps_size_t;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200183#define MBEDTLS_MPS_SIZE_MAX ((mbedtls_mps_size_t)-1)
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000184
Hanno Becker4a079c52021-02-22 15:13:28 +0000185#if MBEDTLS_MPS_STORED_SIZE_MAX > MBEDTLS_MPS_SIZE_MAX
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200186# error \
187 "Misconfiguration of mbedtls_mps_size_t and mbedtls_mps_stored_size_t."
Hanno Beckerd2f9f532021-01-12 07:11:11 +0000188#endif
189
190/* \} SECTION: Common types */
191
Hanno Becker108fc842021-01-12 06:39:43 +0000192#endif /* MBEDTLS_MPS_COMMON_H */