blob: 1ac3bd8b2bac5dcc610d0361cf2356b71ac1ade6 [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/**
21 * \file common.h
22 *
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
64 * is part of the API preconditions or not. If it is, the function's
65 * behavior is undefined if the abstract state is not as expected.
66 * If it is set, API is required to fail gracefully with error
67 * #MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED, and without changing the abstract
68 * state of the input context, if the abstract state is unexpected but
69 * all other preconditions are satisfied.
70 *
71 * For example: Enabling this makes mps_l2_read_done() fail if
72 * no incoming record is currently open; disabling this would
73 * lead to undefined behavior in this case.
74 *
75 * Comment this to remove state validation.
76 */
77#define MBEDTLS_MPS_STATE_VALIDATION
78
Hanno Becker6ed183c2021-01-12 06:42:16 +000079/*! This flag enables/disables assertions on the internal state of MPS.
80 *
81 * Assertions are sanity checks that should never trigger when MPS
82 * is used within the bounds of its API and preconditions.
83 *
84 * Enabling this increases security by limiting the scope of
85 * potential bugs, but comes at the cost of increased code size.
86 *
87 * Note: So far, there is no guiding principle as to what
88 * expected conditions merit an assertion, and which don't.
89 *
90 * Comment this to disable assertions.
91 */
92#define MBEDTLS_MPS_ENABLE_ASSERTIONS
93
Hanno Becker1ae9f752021-01-12 06:43:17 +000094/*! This flag controls whether tracing for MPS should be enabled. */
Hanno Becker984fbde2021-01-28 09:02:18 +000095//#define MBEDTLS_MPS_ENABLE_TRACE
Hanno Becker1ae9f752021-01-12 06:43:17 +000096
Hanno Beckerac267f32021-01-12 07:25:41 +000097#if defined(MBEDTLS_MPS_STATE_VALIDATION)
98
Hanno Becker984fbde2021-01-28 09:02:18 +000099#define MBEDTLS_MPS_STATE_VALIDATE_RAW( cond, string ) \
100 do \
101 { \
102 if( !(cond) ) \
103 { \
104 MBEDTLS_MPS_TRACE( mbedtls_mps_trace_error, string ); \
105 MBEDTLS_MPS_TRACE_RETURN( MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED ); \
106 } \
Hanno Beckerac267f32021-01-12 07:25:41 +0000107 } while( 0 )
108
109#else /* MBEDTLS_MPS_STATE_VALIDATION */
110
111#define MBEDTLS_MPS_STATE_VALIDATE_RAW( cond, string ) \
112 do \
113 { \
114 ( cond ); \
115 } while( 0 )
116
117#endif /* MBEDTLS_MPS_STATE_VALIDATION */
118
Hanno Becker75ac1f72021-01-12 07:25:26 +0000119#if defined(MBEDTLS_MPS_ENABLE_ASSERTIONS)
120
Hanno Becker984fbde2021-01-28 09:02:18 +0000121#define MBEDTLS_MPS_ASSERT_RAW( cond, string ) \
122 do \
123 { \
124 if( !(cond) ) \
125 { \
126 MBEDTLS_MPS_TRACE( mbedtls_mps_trace_error, string ); \
127 MBEDTLS_MPS_TRACE_RETURN( MBEDTLS_ERR_MPS_INTERNAL_ERROR ); \
128 } \
Hanno Becker75ac1f72021-01-12 07:25:26 +0000129 } while( 0 )
130
131#else /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
132
133#define MBEDTLS_MPS_ASSERT_RAW( cond, string ) do {} while( 0 )
134
135#endif /* MBEDTLS_MPS_ENABLE_ASSERTIONS */
136
Hanno Beckerac267f32021-01-12 07:25:41 +0000137
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
150 * hold the length of any buffer resp. message processed by MPS.
151 *
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;
169#define MBEDTLS_MPS_SIZE_MAX ( (mbedtls_mps_size_t) -1 )
170
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;
183
184#if (mbedtls_mps_size_t) -1 > (mbedtls_mps_stored_size_t) -1
185#error "Misconfiguration of mbedtls_mps_size_t and mbedtls_mps_stored_size_t."
186#endif
187
188/* \} SECTION: Common types */
189
190
Hanno Becker108fc842021-01-12 06:39:43 +0000191#endif /* MBEDTLS_MPS_COMMON_H */