/src/mbedtls/include/mbedtls/ssl.h
Line | Count | Source (jump to first uncovered line) |
1 | | /** |
2 | | * \file ssl.h |
3 | | * |
4 | | * \brief SSL/TLS functions. |
5 | | */ |
6 | | /* |
7 | | * Copyright The Mbed TLS Contributors |
8 | | * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
9 | | */ |
10 | | #ifndef MBEDTLS_SSL_H |
11 | | #define MBEDTLS_SSL_H |
12 | | #include "mbedtls/platform_util.h" |
13 | | #include "mbedtls/private_access.h" |
14 | | |
15 | | #include "mbedtls/build_info.h" |
16 | | |
17 | | #include "mbedtls/bignum.h" |
18 | | #include "mbedtls/ecp.h" |
19 | | |
20 | | #include "mbedtls/ssl_ciphersuites.h" |
21 | | |
22 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
23 | | #include "mbedtls/x509_crt.h" |
24 | | #include "mbedtls/x509_crl.h" |
25 | | #endif |
26 | | |
27 | | #if defined(MBEDTLS_DHM_C) |
28 | | #include "mbedtls/dhm.h" |
29 | | #endif |
30 | | |
31 | | #include "mbedtls/md.h" |
32 | | |
33 | | #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_ANY_ENABLED) |
34 | | #include "mbedtls/ecdh.h" |
35 | | #endif |
36 | | |
37 | | #if defined(MBEDTLS_HAVE_TIME) |
38 | | #include "mbedtls/platform_time.h" |
39 | | #endif |
40 | | |
41 | | #include "psa/crypto.h" |
42 | | |
43 | | /* |
44 | | * SSL Error codes |
45 | | */ |
46 | | /** A cryptographic operation is in progress. Try again later. */ |
47 | | #define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 |
48 | | /** The requested feature is not available. */ |
49 | | #define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 |
50 | | /** Bad input parameters to function. */ |
51 | | #define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 |
52 | | /** Verification of the message MAC failed. */ |
53 | | #define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 |
54 | | /** An invalid SSL record was received. */ |
55 | | #define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 |
56 | | /** The connection indicated an EOF. */ |
57 | | #define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 |
58 | | /** A message could not be parsed due to a syntactic error. */ |
59 | | #define MBEDTLS_ERR_SSL_DECODE_ERROR -0x7300 |
60 | | /* Error space gap */ |
61 | | /** No RNG was provided to the SSL module. */ |
62 | | #define MBEDTLS_ERR_SSL_NO_RNG -0x7400 |
63 | | /** No client certification received from the client, but required by the authentication mode. */ |
64 | | #define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 |
65 | | /** Client received an extended server hello containing an unsupported extension */ |
66 | | #define MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION -0x7500 |
67 | | /** No ALPN protocols supported that the client advertises */ |
68 | | #define MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL -0x7580 |
69 | | /** The own private key or pre-shared key is not set, but needed. */ |
70 | | #define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 |
71 | | /** No CA Chain is set, but required to operate. */ |
72 | | #define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 |
73 | | /** An unexpected message was received from our peer. */ |
74 | | #define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 |
75 | | /** A fatal alert message was received from our peer. */ |
76 | | #define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 |
77 | | /** No server could be identified matching the client's SNI. */ |
78 | | #define MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME -0x7800 |
79 | | /** The peer notified us that the connection is going to be closed. */ |
80 | | #define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 |
81 | | /* Error space gap */ |
82 | | /* Error space gap */ |
83 | | /** Processing of the Certificate handshake message failed. */ |
84 | | #define MBEDTLS_ERR_SSL_BAD_CERTIFICATE -0x7A00 |
85 | | /* Error space gap */ |
86 | | /** A TLS 1.3 NewSessionTicket message has been received. */ |
87 | | #define MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET -0x7B00 |
88 | | /** Not possible to read early data */ |
89 | | #define MBEDTLS_ERR_SSL_CANNOT_READ_EARLY_DATA -0x7B80 |
90 | | /** |
91 | | * Early data has been received as part of an on-going handshake. |
92 | | * This error code can be returned only on server side if and only if early |
93 | | * data has been enabled by means of the mbedtls_ssl_conf_early_data() API. |
94 | | * This error code can then be returned by mbedtls_ssl_handshake(), |
95 | | * mbedtls_ssl_handshake_step(), mbedtls_ssl_read() or mbedtls_ssl_write() if |
96 | | * early data has been received as part of the handshake sequence they |
97 | | * triggered. To read the early data, call mbedtls_ssl_read_early_data(). |
98 | | */ |
99 | | #define MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA -0x7C00 |
100 | | /** Not possible to write early data */ |
101 | | #define MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA -0x7C80 |
102 | | /* Error space gap */ |
103 | | /* Error space gap */ |
104 | | /* Error space gap */ |
105 | | /* Error space gap */ |
106 | | /** Cache entry not found */ |
107 | | #define MBEDTLS_ERR_SSL_CACHE_ENTRY_NOT_FOUND -0x7E80 |
108 | | /** Memory allocation failed */ |
109 | | #define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 |
110 | | /** Hardware acceleration function returned with error */ |
111 | | #define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 |
112 | | /** Hardware acceleration function skipped / left alone data */ |
113 | | #define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 |
114 | | /** Handshake protocol not within min/max boundaries */ |
115 | | #define MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION -0x6E80 |
116 | | /** The handshake negotiation failed. */ |
117 | | #define MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE -0x6E00 |
118 | | /** Session ticket has expired. */ |
119 | | #define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 |
120 | | /** Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ |
121 | | #define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 |
122 | | /** Unknown identity received (eg, PSK identity) */ |
123 | | #define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 |
124 | | /** Internal error (eg, unexpected failure in lower-level module) */ |
125 | | #define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 |
126 | | /** A counter would wrap (eg, too many messages exchanged). */ |
127 | | #define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 |
128 | | /** Unexpected message at ServerHello in renegotiation. */ |
129 | | #define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 |
130 | | /** DTLS client must retry for hello verification */ |
131 | | #define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 |
132 | | /** A buffer is too small to receive or write a message */ |
133 | | #define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 |
134 | | /* Error space gap */ |
135 | | /** No data of requested type currently available on underlying transport. */ |
136 | | #define MBEDTLS_ERR_SSL_WANT_READ -0x6900 |
137 | | /** Connection requires a write call. */ |
138 | | #define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 |
139 | | /** The operation timed out. */ |
140 | | #define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 |
141 | | /** The client initiated a reconnect from the same port. */ |
142 | | #define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 |
143 | | /** Record header looks valid but is not expected. */ |
144 | | #define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD -0x6700 |
145 | | /** The alert message received indicates a non-fatal error. */ |
146 | | #define MBEDTLS_ERR_SSL_NON_FATAL -0x6680 |
147 | | /** A field in a message was incorrect or inconsistent with other fields. */ |
148 | | #define MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER -0x6600 |
149 | | /** Internal-only message signaling that further message-processing should be done */ |
150 | | #define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 |
151 | | /** The asynchronous operation is not completed yet. */ |
152 | | #define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 |
153 | | /** Internal-only message signaling that a message arrived early. */ |
154 | | #define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 |
155 | | /* Error space gap */ |
156 | | /* Error space gap */ |
157 | | /* Error space gap */ |
158 | | /* Error space gap */ |
159 | | /* Error space gap */ |
160 | | /* Error space gap */ |
161 | | /* Error space gap */ |
162 | | /* Error space gap */ |
163 | | /** An encrypted DTLS-frame with an unexpected CID was received. */ |
164 | | #define MBEDTLS_ERR_SSL_UNEXPECTED_CID -0x6000 |
165 | | /** An operation failed due to an unexpected version or configuration. */ |
166 | | #define MBEDTLS_ERR_SSL_VERSION_MISMATCH -0x5F00 |
167 | | /** Invalid value in SSL config */ |
168 | | #define MBEDTLS_ERR_SSL_BAD_CONFIG -0x5E80 |
169 | | |
170 | | /* |
171 | | * Constants from RFC 8446 for TLS 1.3 PSK modes |
172 | | * |
173 | | * Those are used in the Pre-Shared Key Exchange Modes extension. |
174 | | * See Section 4.2.9 in RFC 8446. |
175 | | */ |
176 | | #define MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE 0 /* Pure PSK-based exchange */ |
177 | | #define MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE 1 /* PSK+ECDHE-based exchange */ |
178 | | |
179 | | /* |
180 | | * TLS 1.3 NamedGroup values |
181 | | * |
182 | | * From RF 8446 |
183 | | * enum { |
184 | | * // Elliptic Curve Groups (ECDHE) |
185 | | * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019), |
186 | | * x25519(0x001D), x448(0x001E), |
187 | | * // Finite Field Groups (DHE) |
188 | | * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102), |
189 | | * ffdhe6144(0x0103), ffdhe8192(0x0104), |
190 | | * // Reserved Code Points |
191 | | * ffdhe_private_use(0x01FC..0x01FF), |
192 | | * ecdhe_private_use(0xFE00..0xFEFF), |
193 | | * (0xFFFF) |
194 | | * } NamedGroup; |
195 | | * |
196 | | */ |
197 | | |
198 | | /* Elliptic Curve Groups (ECDHE) */ |
199 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_NONE 0 |
200 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP192K1 0x0012 |
201 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1 0x0013 |
202 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP224K1 0x0014 |
203 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1 0x0015 |
204 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1 0x0016 |
205 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1 0x0017 |
206 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1 0x0018 |
207 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1 0x0019 |
208 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1 0x001A |
209 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1 0x001B |
210 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1 0x001C |
211 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_X25519 0x001D |
212 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_X448 0x001E |
213 | | /* Finite Field Groups (DHE) */ |
214 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048 0x0100 |
215 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072 0x0101 |
216 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096 0x0102 |
217 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144 0x0103 |
218 | | #define MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192 0x0104 |
219 | | |
220 | | /* |
221 | | * TLS 1.3 Key Exchange Modes |
222 | | * |
223 | | * Mbed TLS internal identifiers for use with the SSL configuration API |
224 | | * mbedtls_ssl_conf_tls13_key_exchange_modes(). |
225 | | */ |
226 | | |
227 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK (1u << 0) /*!< Pure-PSK TLS 1.3 key exchange, |
228 | | * encompassing both externally agreed PSKs |
229 | | * as well as resumption PSKs. */ |
230 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL (1u << 1) /*!< Pure-Ephemeral TLS 1.3 key exchanges, |
231 | | * including for example ECDHE and DHE |
232 | | * key exchanges. */ |
233 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL (1u << 2) /*!< PSK-Ephemeral TLS 1.3 key exchanges, |
234 | | * using both a PSK and an ephemeral |
235 | | * key exchange. */ |
236 | | |
237 | | /* Convenience macros for sets of key exchanges. */ |
238 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL \ |
239 | | (MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK | \ |
240 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL | \ |
241 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL) /*!< All TLS 1.3 key exchanges */ |
242 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL \ |
243 | | (MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK | \ |
244 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL) /*!< All PSK-based TLS 1.3 key exchanges */ |
245 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL \ |
246 | | (MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL | \ |
247 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL) /*!< All ephemeral TLS 1.3 key exchanges */ |
248 | | |
249 | | #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE (0) |
250 | | |
251 | | /* |
252 | | * Various constants |
253 | | */ |
254 | | |
255 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
256 | | /* These are the high and low bytes of ProtocolVersion as defined by: |
257 | | * - RFC 5246: ProtocolVersion version = { 3, 3 }; // TLS v1.2 |
258 | | * - RFC 8446: see section 4.2.1 |
259 | | */ |
260 | | #define MBEDTLS_SSL_MAJOR_VERSION_3 3 |
261 | | #define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ |
262 | | #define MBEDTLS_SSL_MINOR_VERSION_4 4 /*!< TLS v1.3 */ |
263 | | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
264 | | |
265 | | #define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ |
266 | | #define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ |
267 | | |
268 | | #define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ |
269 | | #define MBEDTLS_SSL_MAX_ALPN_NAME_LEN 255 /*!< Maximum size in bytes of a protocol name in alpn ext., RFC 7301 */ |
270 | | |
271 | | #define MBEDTLS_SSL_MAX_ALPN_LIST_LEN 65535 /*!< Maximum size in bytes of list in alpn ext., RFC 7301 */ |
272 | | |
273 | | /* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c |
274 | | * NONE must be zero so that memset()ing structure to zero works */ |
275 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ |
276 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ |
277 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ |
278 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ |
279 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ |
280 | | #define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ |
281 | | |
282 | | #define MBEDTLS_SSL_IS_CLIENT 0 |
283 | | #define MBEDTLS_SSL_IS_SERVER 1 |
284 | | |
285 | | #define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 |
286 | | #define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 |
287 | | |
288 | | #define MBEDTLS_SSL_CID_DISABLED 0 |
289 | | #define MBEDTLS_SSL_CID_ENABLED 1 |
290 | | |
291 | | #define MBEDTLS_SSL_ETM_DISABLED 0 |
292 | | #define MBEDTLS_SSL_ETM_ENABLED 1 |
293 | | |
294 | | #define MBEDTLS_SSL_COMPRESS_NULL 0 |
295 | | |
296 | | #define MBEDTLS_SSL_VERIFY_NONE 0 |
297 | | #define MBEDTLS_SSL_VERIFY_OPTIONAL 1 |
298 | | #define MBEDTLS_SSL_VERIFY_REQUIRED 2 |
299 | | #define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ |
300 | | |
301 | | #define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 |
302 | | #define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 |
303 | | |
304 | | #define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 |
305 | | #define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 |
306 | | |
307 | | #define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 |
308 | | #define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 |
309 | | |
310 | | #define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 |
311 | | #define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 |
312 | | |
313 | | #define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 |
314 | | #define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 |
315 | | #define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 |
316 | | |
317 | | #define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 |
318 | | #define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 |
319 | | #define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ |
320 | | |
321 | | #define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 |
322 | | #define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 |
323 | | |
324 | | #define MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_DISABLED 0 |
325 | | #define MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_ENABLED 1 |
326 | | |
327 | | #define MBEDTLS_SSL_PRESET_DEFAULT 0 |
328 | | #define MBEDTLS_SSL_PRESET_SUITEB 2 |
329 | | |
330 | | #define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED 1 |
331 | | #define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED 0 |
332 | | |
333 | | #define MBEDTLS_SSL_EARLY_DATA_DISABLED 0 |
334 | | #define MBEDTLS_SSL_EARLY_DATA_ENABLED 1 |
335 | | |
336 | | #define MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED 0 |
337 | | #define MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED 1 |
338 | | |
339 | | #define MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT 1 |
340 | | #define MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER 0 |
341 | | |
342 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS) |
343 | | #if defined(PSA_WANT_ALG_SHA_384) |
344 | | #define MBEDTLS_SSL_TLS1_3_TICKET_RESUMPTION_KEY_LEN 48 |
345 | | #elif defined(PSA_WANT_ALG_SHA_256) |
346 | | #define MBEDTLS_SSL_TLS1_3_TICKET_RESUMPTION_KEY_LEN 32 |
347 | | #endif |
348 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS */ |
349 | | /* |
350 | | * Default range for DTLS retransmission timer value, in milliseconds. |
351 | | * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. |
352 | | */ |
353 | | #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 |
354 | | #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 |
355 | | |
356 | | /* |
357 | | * Whether early data record should be discarded or not and how. |
358 | | * |
359 | | * The client has indicated early data and the server has rejected them. |
360 | | * The server has then to skip past early data by either: |
361 | | * - attempting to deprotect received records using the handshake traffic |
362 | | * key, discarding records which fail deprotection (up to the configured |
363 | | * max_early_data_size). Once a record is deprotected successfully, |
364 | | * it is treated as the start of the client's second flight and the |
365 | | * server proceeds as with an ordinary 1-RTT handshake. |
366 | | * - skipping all records with an external content type of |
367 | | * "application_data" (indicating that they are encrypted), up to the |
368 | | * configured max_early_data_size. This is the expected behavior if the |
369 | | * server has sent an HelloRetryRequest message. The server ignores |
370 | | * application data message before 2nd ClientHello. |
371 | | */ |
372 | | #define MBEDTLS_SSL_EARLY_DATA_NO_DISCARD 0 |
373 | | #define MBEDTLS_SSL_EARLY_DATA_TRY_TO_DEPROTECT_AND_DISCARD 1 |
374 | | #define MBEDTLS_SSL_EARLY_DATA_DISCARD 2 |
375 | | |
376 | | /** |
377 | | * \name SECTION: Module settings |
378 | | * |
379 | | * The configuration options you can set for this module are in this section. |
380 | | * Either change them in mbedtls_config.h or define them on the compiler command line. |
381 | | * \{ |
382 | | */ |
383 | | |
384 | | /* |
385 | | * Maximum fragment length in bytes, |
386 | | * determines the size of each of the two internal I/O buffers. |
387 | | * |
388 | | * Note: the RFC defines the default size of SSL / TLS messages. If you |
389 | | * change the value here, other clients / servers may not be able to |
390 | | * communicate with you anymore. Only change this value if you control |
391 | | * both sides of the connection and have it reduced at both sides, or |
392 | | * if you're using the Max Fragment Length extension and you know all your |
393 | | * peers are using it too! |
394 | | */ |
395 | | #if !defined(MBEDTLS_SSL_IN_CONTENT_LEN) |
396 | | #define MBEDTLS_SSL_IN_CONTENT_LEN 16384 |
397 | | #endif |
398 | | |
399 | | #if !defined(MBEDTLS_SSL_OUT_CONTENT_LEN) |
400 | | #define MBEDTLS_SSL_OUT_CONTENT_LEN 16384 |
401 | | #endif |
402 | | |
403 | | /* |
404 | | * Maximum number of heap-allocated bytes for the purpose of |
405 | | * DTLS handshake message reassembly and future message buffering. |
406 | | */ |
407 | | #if !defined(MBEDTLS_SSL_DTLS_MAX_BUFFERING) |
408 | | #define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 |
409 | | #endif |
410 | | |
411 | | /* |
412 | | * Maximum length of CIDs for incoming and outgoing messages. |
413 | | */ |
414 | | #if !defined(MBEDTLS_SSL_CID_IN_LEN_MAX) |
415 | | #define MBEDTLS_SSL_CID_IN_LEN_MAX 32 |
416 | | #endif |
417 | | |
418 | | #if !defined(MBEDTLS_SSL_CID_OUT_LEN_MAX) |
419 | | #define MBEDTLS_SSL_CID_OUT_LEN_MAX 32 |
420 | | #endif |
421 | | |
422 | | #if !defined(MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) |
423 | | #define MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY 16 |
424 | | #endif |
425 | | |
426 | | #if !defined(MBEDTLS_SSL_MAX_EARLY_DATA_SIZE) |
427 | | #define MBEDTLS_SSL_MAX_EARLY_DATA_SIZE 1024 |
428 | | #endif |
429 | | |
430 | | #if !defined(MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE) |
431 | | #define MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE 6000 |
432 | | #endif |
433 | | |
434 | | #if !defined(MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH) |
435 | | #define MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH 32 |
436 | | #endif |
437 | | |
438 | | #if !defined(MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS) |
439 | | #define MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS 1 |
440 | | #endif |
441 | | |
442 | | /** \} name SECTION: Module settings */ |
443 | | |
444 | | /* |
445 | | * Default to standard CID mode |
446 | | */ |
447 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \ |
448 | | !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID_COMPAT) |
449 | | #define MBEDTLS_SSL_DTLS_CONNECTION_ID_COMPAT 0 |
450 | | #endif |
451 | | |
452 | | /* |
453 | | * Length of the verify data for secure renegotiation |
454 | | */ |
455 | | #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 |
456 | | |
457 | | /* |
458 | | * Signaling ciphersuite values (SCSV) |
459 | | */ |
460 | | #define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ |
461 | | |
462 | | /* |
463 | | * Supported Signature and Hash algorithms (For TLS 1.2) |
464 | | * RFC 5246 section 7.4.1.4.1 |
465 | | */ |
466 | | #define MBEDTLS_SSL_HASH_NONE 0 |
467 | | #define MBEDTLS_SSL_HASH_MD5 1 |
468 | | #define MBEDTLS_SSL_HASH_SHA1 2 |
469 | | #define MBEDTLS_SSL_HASH_SHA224 3 |
470 | | #define MBEDTLS_SSL_HASH_SHA256 4 |
471 | | #define MBEDTLS_SSL_HASH_SHA384 5 |
472 | | #define MBEDTLS_SSL_HASH_SHA512 6 |
473 | | |
474 | | #define MBEDTLS_SSL_SIG_ANON 0 |
475 | | #define MBEDTLS_SSL_SIG_RSA 1 |
476 | | #define MBEDTLS_SSL_SIG_ECDSA 3 |
477 | | |
478 | | /* |
479 | | * TLS 1.3 signature algorithms |
480 | | * RFC 8446, Section 4.2.3 |
481 | | */ |
482 | | |
483 | | /* RSASSA-PKCS1-v1_5 algorithms */ |
484 | | #define MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256 0x0401 |
485 | | #define MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384 0x0501 |
486 | | #define MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512 0x0601 |
487 | | |
488 | | /* ECDSA algorithms */ |
489 | | #define MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256 0x0403 |
490 | | #define MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384 0x0503 |
491 | | #define MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512 0x0603 |
492 | | |
493 | | /* RSASSA-PSS algorithms with public key OID rsaEncryption */ |
494 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256 0x0804 |
495 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384 0x0805 |
496 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512 0x0806 |
497 | | |
498 | | /* EdDSA algorithms */ |
499 | | #define MBEDTLS_TLS1_3_SIG_ED25519 0x0807 |
500 | | #define MBEDTLS_TLS1_3_SIG_ED448 0x0808 |
501 | | |
502 | | /* RSASSA-PSS algorithms with public key OID RSASSA-PSS */ |
503 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA256 0x0809 |
504 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA384 0x080A |
505 | | #define MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA512 0x080B |
506 | | |
507 | | /* LEGACY ALGORITHMS */ |
508 | | #define MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA1 0x0201 |
509 | | #define MBEDTLS_TLS1_3_SIG_ECDSA_SHA1 0x0203 |
510 | | |
511 | | #define MBEDTLS_TLS1_3_SIG_NONE 0x0 |
512 | | |
513 | | /* |
514 | | * Client Certificate Types |
515 | | * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 |
516 | | */ |
517 | | #define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 |
518 | | #define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 |
519 | | |
520 | | /* |
521 | | * Message, alert and handshake types |
522 | | */ |
523 | | #define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 |
524 | | #define MBEDTLS_SSL_MSG_ALERT 21 |
525 | | #define MBEDTLS_SSL_MSG_HANDSHAKE 22 |
526 | | #define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 |
527 | | #define MBEDTLS_SSL_MSG_CID 25 |
528 | | |
529 | | #define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 |
530 | | #define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 |
531 | | |
532 | | #define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ |
533 | | #define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ |
534 | | #define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ |
535 | | #define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ |
536 | | #define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ |
537 | | #define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ |
538 | | #define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ |
539 | | #define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ |
540 | | #define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ |
541 | | #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ |
542 | | #define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ |
543 | | #define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ |
544 | | #define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ |
545 | | #define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ |
546 | | #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ |
547 | | #define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ |
548 | | #define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ |
549 | | #define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ |
550 | | #define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ |
551 | | #define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ |
552 | | #define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ |
553 | | #define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ |
554 | | #define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ |
555 | | #define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ |
556 | | #define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ |
557 | | #define MBEDTLS_SSL_ALERT_MSG_MISSING_EXTENSION 109 /* 0x6d -- new in TLS 1.3 */ |
558 | | #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ |
559 | | #define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ |
560 | | #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ |
561 | | #define MBEDTLS_SSL_ALERT_MSG_CERT_REQUIRED 116 /* 0x74 */ |
562 | | #define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ |
563 | | |
564 | | #define MBEDTLS_SSL_HS_HELLO_REQUEST 0 |
565 | | #define MBEDTLS_SSL_HS_CLIENT_HELLO 1 |
566 | | #define MBEDTLS_SSL_HS_SERVER_HELLO 2 |
567 | | #define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 |
568 | | #define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 |
569 | | #define MBEDTLS_SSL_HS_END_OF_EARLY_DATA 5 |
570 | | #define MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS 8 |
571 | | #define MBEDTLS_SSL_HS_CERTIFICATE 11 |
572 | | #define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 |
573 | | #define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 |
574 | | #define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 |
575 | | #define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 |
576 | | #define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 |
577 | | #define MBEDTLS_SSL_HS_FINISHED 20 |
578 | | #define MBEDTLS_SSL_HS_MESSAGE_HASH 254 |
579 | | |
580 | | /* |
581 | | * TLS extensions |
582 | | */ |
583 | | #define MBEDTLS_TLS_EXT_SERVERNAME 0 |
584 | | #define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 |
585 | | |
586 | | #define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 |
587 | | |
588 | | #define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 |
589 | | #define MBEDTLS_TLS_EXT_STATUS_REQUEST 5 /* RFC 6066 TLS 1.2 and 1.3 */ |
590 | | |
591 | | #define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 |
592 | | #define MBEDTLS_TLS_EXT_SUPPORTED_GROUPS 10 /* RFC 8422,7919 TLS 1.2 and 1.3 */ |
593 | | #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 |
594 | | |
595 | | #define MBEDTLS_TLS_EXT_SIG_ALG 13 /* RFC 8446 TLS 1.3 */ |
596 | | #define MBEDTLS_TLS_EXT_USE_SRTP 14 |
597 | | #define MBEDTLS_TLS_EXT_HEARTBEAT 15 /* RFC 6520 TLS 1.2 and 1.3 */ |
598 | | #define MBEDTLS_TLS_EXT_ALPN 16 |
599 | | |
600 | | #define MBEDTLS_TLS_EXT_SCT 18 /* RFC 6962 TLS 1.2 and 1.3 */ |
601 | | #define MBEDTLS_TLS_EXT_CLI_CERT_TYPE 19 /* RFC 7250 TLS 1.2 and 1.3 */ |
602 | | #define MBEDTLS_TLS_EXT_SERV_CERT_TYPE 20 /* RFC 7250 TLS 1.2 and 1.3 */ |
603 | | #define MBEDTLS_TLS_EXT_PADDING 21 /* RFC 7685 TLS 1.2 and 1.3 */ |
604 | | #define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ |
605 | | #define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ |
606 | | |
607 | | #define MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT 28 /* RFC 8449 (implemented for TLS 1.3 only) */ |
608 | | |
609 | | #define MBEDTLS_TLS_EXT_SESSION_TICKET 35 |
610 | | |
611 | | #define MBEDTLS_TLS_EXT_PRE_SHARED_KEY 41 /* RFC 8446 TLS 1.3 */ |
612 | | #define MBEDTLS_TLS_EXT_EARLY_DATA 42 /* RFC 8446 TLS 1.3 */ |
613 | | #define MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS 43 /* RFC 8446 TLS 1.3 */ |
614 | | #define MBEDTLS_TLS_EXT_COOKIE 44 /* RFC 8446 TLS 1.3 */ |
615 | | #define MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES 45 /* RFC 8446 TLS 1.3 */ |
616 | | |
617 | | #define MBEDTLS_TLS_EXT_CERT_AUTH 47 /* RFC 8446 TLS 1.3 */ |
618 | | #define MBEDTLS_TLS_EXT_OID_FILTERS 48 /* RFC 8446 TLS 1.3 */ |
619 | | #define MBEDTLS_TLS_EXT_POST_HANDSHAKE_AUTH 49 /* RFC 8446 TLS 1.3 */ |
620 | | #define MBEDTLS_TLS_EXT_SIG_ALG_CERT 50 /* RFC 8446 TLS 1.3 */ |
621 | | #define MBEDTLS_TLS_EXT_KEY_SHARE 51 /* RFC 8446 TLS 1.3 */ |
622 | | |
623 | | #if MBEDTLS_SSL_DTLS_CONNECTION_ID_COMPAT == 0 |
624 | | #define MBEDTLS_TLS_EXT_CID 54 /* RFC 9146 DTLS 1.2 CID */ |
625 | | #else |
626 | | #define MBEDTLS_TLS_EXT_CID 254 /* Pre-RFC 9146 DTLS 1.2 CID */ |
627 | | #endif |
628 | | |
629 | | #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */ |
630 | | |
631 | | #define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 |
632 | | |
633 | | /* |
634 | | * Size defines |
635 | | */ |
636 | | #if !defined(MBEDTLS_PSK_MAX_LEN) |
637 | | /* |
638 | | * If the library supports TLS 1.3 tickets and the cipher suite |
639 | | * TLS1-3-AES-256-GCM-SHA384, set the PSK maximum length to 48 instead of 32. |
640 | | * That way, the TLS 1.3 client and server are able to resume sessions where |
641 | | * the cipher suite is TLS1-3-AES-256-GCM-SHA384 (pre-shared keys are 48 |
642 | | * bytes long in that case). |
643 | | */ |
644 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \ |
645 | | defined(MBEDTLS_SSL_SESSION_TICKETS) && \ |
646 | | defined(MBEDTLS_SSL_HAVE_AES) && defined(MBEDTLS_SSL_HAVE_GCM) && \ |
647 | | defined(MBEDTLS_MD_CAN_SHA384) |
648 | | #define MBEDTLS_PSK_MAX_LEN 48 /* 384 bits */ |
649 | | #else |
650 | | #define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ |
651 | | #endif |
652 | | #endif /* !MBEDTLS_PSK_MAX_LEN */ |
653 | | |
654 | | /* Dummy type used only for its size */ |
655 | | union mbedtls_ssl_premaster_secret { |
656 | | unsigned char dummy; /* Make the union non-empty even with SSL disabled */ |
657 | | #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) |
658 | | unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ |
659 | | #endif |
660 | | #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) |
661 | | unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ |
662 | | #endif |
663 | | #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ |
664 | | defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ |
665 | | defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ |
666 | | defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) |
667 | | unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ |
668 | | #endif |
669 | | #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) |
670 | | unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ |
671 | | #endif |
672 | | #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) |
673 | | unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE |
674 | | + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ |
675 | | #endif |
676 | | #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) |
677 | | unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ |
678 | | #endif |
679 | | #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) |
680 | | unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES |
681 | | + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ |
682 | | #endif |
683 | | #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) |
684 | | unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */ |
685 | | #endif |
686 | | }; |
687 | | |
688 | | #define MBEDTLS_PREMASTER_SIZE sizeof(union mbedtls_ssl_premaster_secret) |
689 | | |
690 | | #define MBEDTLS_TLS1_3_MD_MAX_SIZE PSA_HASH_MAX_SIZE |
691 | | |
692 | | |
693 | | /* Length in number of bytes of the TLS sequence number */ |
694 | | #define MBEDTLS_SSL_SEQUENCE_NUMBER_LEN 8 |
695 | | |
696 | | #ifdef __cplusplus |
697 | | extern "C" { |
698 | | #endif |
699 | | |
700 | | /* |
701 | | * SSL state machine |
702 | | */ |
703 | | typedef enum { |
704 | | MBEDTLS_SSL_HELLO_REQUEST, |
705 | | MBEDTLS_SSL_CLIENT_HELLO, |
706 | | MBEDTLS_SSL_SERVER_HELLO, |
707 | | MBEDTLS_SSL_SERVER_CERTIFICATE, |
708 | | MBEDTLS_SSL_SERVER_KEY_EXCHANGE, |
709 | | MBEDTLS_SSL_CERTIFICATE_REQUEST, |
710 | | MBEDTLS_SSL_SERVER_HELLO_DONE, |
711 | | MBEDTLS_SSL_CLIENT_CERTIFICATE, |
712 | | MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, |
713 | | MBEDTLS_SSL_CERTIFICATE_VERIFY, |
714 | | MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, |
715 | | MBEDTLS_SSL_CLIENT_FINISHED, |
716 | | MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, |
717 | | MBEDTLS_SSL_SERVER_FINISHED, |
718 | | MBEDTLS_SSL_FLUSH_BUFFERS, |
719 | | MBEDTLS_SSL_HANDSHAKE_WRAPUP, |
720 | | MBEDTLS_SSL_NEW_SESSION_TICKET, |
721 | | MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, |
722 | | MBEDTLS_SSL_HELLO_RETRY_REQUEST, |
723 | | MBEDTLS_SSL_ENCRYPTED_EXTENSIONS, |
724 | | MBEDTLS_SSL_END_OF_EARLY_DATA, |
725 | | MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY, |
726 | | MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED, |
727 | | MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO, |
728 | | MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO, |
729 | | MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO, |
730 | | MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST, |
731 | | MBEDTLS_SSL_HANDSHAKE_OVER, |
732 | | MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET, |
733 | | MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH, |
734 | | } |
735 | | mbedtls_ssl_states; |
736 | | |
737 | | /* |
738 | | * Early data status, client side only. |
739 | | */ |
740 | | |
741 | | #if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_CLI_C) |
742 | | typedef enum { |
743 | | /* |
744 | | * See documentation of mbedtls_ssl_get_early_data_status(). |
745 | | */ |
746 | | MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_INDICATED, |
747 | | MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED, |
748 | | MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED, |
749 | | } mbedtls_ssl_early_data_status; |
750 | | #endif /* MBEDTLS_SSL_EARLY_DATA && MBEDTLS_SSL_CLI_C */ |
751 | | |
752 | | /** |
753 | | * \brief Callback type: send data on the network. |
754 | | * |
755 | | * \note That callback may be either blocking or non-blocking. |
756 | | * |
757 | | * \param ctx Context for the send callback (typically a file descriptor) |
758 | | * \param buf Buffer holding the data to send |
759 | | * \param len Length of the data to send |
760 | | * |
761 | | * \return The callback must return the number of bytes sent if any, |
762 | | * or a non-zero error code. |
763 | | * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_WRITE |
764 | | * must be returned when the operation would block. |
765 | | * |
766 | | * \note The callback is allowed to send fewer bytes than requested. |
767 | | * It must always return the number of bytes actually sent. |
768 | | */ |
769 | | typedef int mbedtls_ssl_send_t(void *ctx, |
770 | | const unsigned char *buf, |
771 | | size_t len); |
772 | | |
773 | | /** |
774 | | * \brief Callback type: receive data from the network. |
775 | | * |
776 | | * \note That callback may be either blocking or non-blocking. |
777 | | * |
778 | | * \param ctx Context for the receive callback (typically a file |
779 | | * descriptor) |
780 | | * \param buf Buffer to write the received data to |
781 | | * \param len Length of the receive buffer |
782 | | * |
783 | | * \returns If data has been received, the positive number of bytes received. |
784 | | * \returns \c 0 if the connection has been closed. |
785 | | * \returns If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_READ |
786 | | * must be returned when the operation would block. |
787 | | * \returns Another negative error code on other kinds of failures. |
788 | | * |
789 | | * \note The callback may receive fewer bytes than the length of the |
790 | | * buffer. It must always return the number of bytes actually |
791 | | * received and written to the buffer. |
792 | | */ |
793 | | typedef int mbedtls_ssl_recv_t(void *ctx, |
794 | | unsigned char *buf, |
795 | | size_t len); |
796 | | |
797 | | /** |
798 | | * \brief Callback type: receive data from the network, with timeout |
799 | | * |
800 | | * \note That callback must block until data is received, or the |
801 | | * timeout delay expires, or the operation is interrupted by a |
802 | | * signal. |
803 | | * |
804 | | * \param ctx Context for the receive callback (typically a file descriptor) |
805 | | * \param buf Buffer to write the received data to |
806 | | * \param len Length of the receive buffer |
807 | | * \param timeout Maximum number of milliseconds to wait for data |
808 | | * 0 means no timeout (potentially waiting forever) |
809 | | * |
810 | | * \return The callback must return the number of bytes received, |
811 | | * or a non-zero error code: |
812 | | * \c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, |
813 | | * \c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. |
814 | | * |
815 | | * \note The callback may receive fewer bytes than the length of the |
816 | | * buffer. It must always return the number of bytes actually |
817 | | * received and written to the buffer. |
818 | | */ |
819 | | typedef int mbedtls_ssl_recv_timeout_t(void *ctx, |
820 | | unsigned char *buf, |
821 | | size_t len, |
822 | | uint32_t timeout); |
823 | | /** |
824 | | * \brief Callback type: set a pair of timers/delays to watch |
825 | | * |
826 | | * \param ctx Context pointer |
827 | | * \param int_ms Intermediate delay in milliseconds |
828 | | * \param fin_ms Final delay in milliseconds |
829 | | * 0 cancels the current timer. |
830 | | * |
831 | | * \note This callback must at least store the necessary information |
832 | | * for the associated \c mbedtls_ssl_get_timer_t callback to |
833 | | * return correct information. |
834 | | * |
835 | | * \note If using an event-driven style of programming, an event must |
836 | | * be generated when the final delay is passed. The event must |
837 | | * cause a call to \c mbedtls_ssl_handshake() with the proper |
838 | | * SSL context to be scheduled. Care must be taken to ensure |
839 | | * that at most one such call happens at a time. |
840 | | * |
841 | | * \note Only one timer at a time must be running. Calling this |
842 | | * function while a timer is running must cancel it. Cancelled |
843 | | * timers must not generate any event. |
844 | | */ |
845 | | typedef void mbedtls_ssl_set_timer_t(void *ctx, |
846 | | uint32_t int_ms, |
847 | | uint32_t fin_ms); |
848 | | |
849 | | /** |
850 | | * \brief Callback type: get status of timers/delays |
851 | | * |
852 | | * \param ctx Context pointer |
853 | | * |
854 | | * \return This callback must return: |
855 | | * -1 if cancelled (fin_ms == 0), |
856 | | * 0 if none of the delays have passed, |
857 | | * 1 if only the intermediate delay has passed, |
858 | | * 2 if the final delay has passed. |
859 | | */ |
860 | | typedef int mbedtls_ssl_get_timer_t(void *ctx); |
861 | | |
862 | | /* Defined below */ |
863 | | typedef struct mbedtls_ssl_session mbedtls_ssl_session; |
864 | | typedef struct mbedtls_ssl_context mbedtls_ssl_context; |
865 | | typedef struct mbedtls_ssl_config mbedtls_ssl_config; |
866 | | |
867 | | /* Defined in library/ssl_misc.h */ |
868 | | typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; |
869 | | typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; |
870 | | typedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t; |
871 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
872 | | typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; |
873 | | #endif |
874 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
875 | | typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; |
876 | | #endif |
877 | | |
878 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS) |
879 | | #define MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_RESUMPTION \ |
880 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK /* 1U << 0 */ |
881 | | #define MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_EPHEMERAL_RESUMPTION \ |
882 | | MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL /* 1U << 2 */ |
883 | | #define MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA (1U << 3) |
884 | | |
885 | | #define MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK \ |
886 | | (MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_RESUMPTION | \ |
887 | | MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_EPHEMERAL_RESUMPTION | \ |
888 | | MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA) |
889 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS */ |
890 | | |
891 | | /** |
892 | | * \brief Callback type: server-side session cache getter |
893 | | * |
894 | | * The session cache is logically a key value store, with |
895 | | * keys being session IDs and values being instances of |
896 | | * mbedtls_ssl_session. |
897 | | * |
898 | | * This callback retrieves an entry in this key-value store. |
899 | | * |
900 | | * \param data The address of the session cache structure to query. |
901 | | * \param session_id The buffer holding the session ID to query. |
902 | | * \param session_id_len The length of \p session_id in Bytes. |
903 | | * \param session The address of the session structure to populate. |
904 | | * It is initialized with mbdtls_ssl_session_init(), |
905 | | * and the callback must always leave it in a state |
906 | | * where it can safely be freed via |
907 | | * mbedtls_ssl_session_free() independent of the |
908 | | * return code of this function. |
909 | | * |
910 | | * \return \c 0 on success |
911 | | * \return A non-zero return value on failure. |
912 | | * |
913 | | */ |
914 | | typedef int mbedtls_ssl_cache_get_t(void *data, |
915 | | unsigned char const *session_id, |
916 | | size_t session_id_len, |
917 | | mbedtls_ssl_session *session); |
918 | | /** |
919 | | * \brief Callback type: server-side session cache setter |
920 | | * |
921 | | * The session cache is logically a key value store, with |
922 | | * keys being session IDs and values being instances of |
923 | | * mbedtls_ssl_session. |
924 | | * |
925 | | * This callback sets an entry in this key-value store. |
926 | | * |
927 | | * \param data The address of the session cache structure to modify. |
928 | | * \param session_id The buffer holding the session ID to query. |
929 | | * \param session_id_len The length of \p session_id in Bytes. |
930 | | * \param session The address of the session to be stored in the |
931 | | * session cache. |
932 | | * |
933 | | * \return \c 0 on success |
934 | | * \return A non-zero return value on failure. |
935 | | */ |
936 | | typedef int mbedtls_ssl_cache_set_t(void *data, |
937 | | unsigned char const *session_id, |
938 | | size_t session_id_len, |
939 | | const mbedtls_ssl_session *session); |
940 | | |
941 | | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
942 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
943 | | /** |
944 | | * \brief Callback type: start external signature operation. |
945 | | * |
946 | | * This callback is called during an SSL handshake to start |
947 | | * a signature decryption operation using an |
948 | | * external processor. The parameter \p cert contains |
949 | | * the public key; it is up to the callback function to |
950 | | * determine how to access the associated private key. |
951 | | * |
952 | | * This function typically sends or enqueues a request, and |
953 | | * does not wait for the operation to complete. This allows |
954 | | * the handshake step to be non-blocking. |
955 | | * |
956 | | * The parameters \p ssl and \p cert are guaranteed to remain |
957 | | * valid throughout the handshake. On the other hand, this |
958 | | * function must save the contents of \p hash if the value |
959 | | * is needed for later processing, because the \p hash buffer |
960 | | * is no longer valid after this function returns. |
961 | | * |
962 | | * This function may call mbedtls_ssl_set_async_operation_data() |
963 | | * to store an operation context for later retrieval |
964 | | * by the resume or cancel callback. |
965 | | * |
966 | | * \note For RSA signatures, this function must produce output |
967 | | * that is consistent with PKCS#1 v1.5 in the same way as |
968 | | * mbedtls_rsa_pkcs1_sign(). Before the private key operation, |
969 | | * apply the padding steps described in RFC 8017, section 9.2 |
970 | | * "EMSA-PKCS1-v1_5" as follows. |
971 | | * - If \p md_alg is #MBEDTLS_MD_NONE, apply the PKCS#1 v1.5 |
972 | | * encoding, treating \p hash as the DigestInfo to be |
973 | | * padded. In other words, apply EMSA-PKCS1-v1_5 starting |
974 | | * from step 3, with `T = hash` and `tLen = hash_len`. |
975 | | * - If `md_alg != MBEDTLS_MD_NONE`, apply the PKCS#1 v1.5 |
976 | | * encoding, treating \p hash as the hash to be encoded and |
977 | | * padded. In other words, apply EMSA-PKCS1-v1_5 starting |
978 | | * from step 2, with `digestAlgorithm` obtained by calling |
979 | | * mbedtls_oid_get_oid_by_md() on \p md_alg. |
980 | | * |
981 | | * \note For ECDSA signatures, the output format is the DER encoding |
982 | | * `Ecdsa-Sig-Value` defined in |
983 | | * [RFC 4492 section 5.4](https://tools.ietf.org/html/rfc4492#section-5.4). |
984 | | * |
985 | | * \param ssl The SSL connection instance. It should not be |
986 | | * modified other than via |
987 | | * mbedtls_ssl_set_async_operation_data(). |
988 | | * \param cert Certificate containing the public key. |
989 | | * In simple cases, this is one of the pointers passed to |
990 | | * mbedtls_ssl_conf_own_cert() when configuring the SSL |
991 | | * connection. However, if other callbacks are used, this |
992 | | * property may not hold. For example, if an SNI callback |
993 | | * is registered with mbedtls_ssl_conf_sni(), then |
994 | | * this callback determines what certificate is used. |
995 | | * \param md_alg Hash algorithm. |
996 | | * \param hash Buffer containing the hash. This buffer is |
997 | | * no longer valid when the function returns. |
998 | | * \param hash_len Size of the \c hash buffer in bytes. |
999 | | * |
1000 | | * \return 0 if the operation was started successfully and the SSL |
1001 | | * stack should call the resume callback immediately. |
1002 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
1003 | | * was started successfully and the SSL stack should return |
1004 | | * immediately without calling the resume callback yet. |
1005 | | * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external |
1006 | | * processor does not support this key. The SSL stack will |
1007 | | * use the private key object instead. |
1008 | | * \return Any other error indicates a fatal failure and is |
1009 | | * propagated up the call chain. The callback should |
1010 | | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
1011 | | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
1012 | | * directed in the documentation of this callback. |
1013 | | */ |
1014 | | typedef int mbedtls_ssl_async_sign_t(mbedtls_ssl_context *ssl, |
1015 | | mbedtls_x509_crt *cert, |
1016 | | mbedtls_md_type_t md_alg, |
1017 | | const unsigned char *hash, |
1018 | | size_t hash_len); |
1019 | | |
1020 | | /** |
1021 | | * \brief Callback type: start external decryption operation. |
1022 | | * |
1023 | | * This callback is called during an SSL handshake to start |
1024 | | * an RSA decryption operation using an |
1025 | | * external processor. The parameter \p cert contains |
1026 | | * the public key; it is up to the callback function to |
1027 | | * determine how to access the associated private key. |
1028 | | * |
1029 | | * This function typically sends or enqueues a request, and |
1030 | | * does not wait for the operation to complete. This allows |
1031 | | * the handshake step to be non-blocking. |
1032 | | * |
1033 | | * The parameters \p ssl and \p cert are guaranteed to remain |
1034 | | * valid throughout the handshake. On the other hand, this |
1035 | | * function must save the contents of \p input if the value |
1036 | | * is needed for later processing, because the \p input buffer |
1037 | | * is no longer valid after this function returns. |
1038 | | * |
1039 | | * This function may call mbedtls_ssl_set_async_operation_data() |
1040 | | * to store an operation context for later retrieval |
1041 | | * by the resume or cancel callback. |
1042 | | * |
1043 | | * \warning RSA decryption as used in TLS is subject to a potential |
1044 | | * timing side channel attack first discovered by Bleichenbacher |
1045 | | * in 1998. This attack can be remotely exploitable |
1046 | | * in practice. To avoid this attack, you must ensure that |
1047 | | * if the callback performs an RSA decryption, the time it |
1048 | | * takes to execute and return the result does not depend |
1049 | | * on whether the RSA decryption succeeded or reported |
1050 | | * invalid padding. |
1051 | | * |
1052 | | * \param ssl The SSL connection instance. It should not be |
1053 | | * modified other than via |
1054 | | * mbedtls_ssl_set_async_operation_data(). |
1055 | | * \param cert Certificate containing the public key. |
1056 | | * In simple cases, this is one of the pointers passed to |
1057 | | * mbedtls_ssl_conf_own_cert() when configuring the SSL |
1058 | | * connection. However, if other callbacks are used, this |
1059 | | * property may not hold. For example, if an SNI callback |
1060 | | * is registered with mbedtls_ssl_conf_sni(), then |
1061 | | * this callback determines what certificate is used. |
1062 | | * \param input Buffer containing the input ciphertext. This buffer |
1063 | | * is no longer valid when the function returns. |
1064 | | * \param input_len Size of the \p input buffer in bytes. |
1065 | | * |
1066 | | * \return 0 if the operation was started successfully and the SSL |
1067 | | * stack should call the resume callback immediately. |
1068 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
1069 | | * was started successfully and the SSL stack should return |
1070 | | * immediately without calling the resume callback yet. |
1071 | | * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external |
1072 | | * processor does not support this key. The SSL stack will |
1073 | | * use the private key object instead. |
1074 | | * \return Any other error indicates a fatal failure and is |
1075 | | * propagated up the call chain. The callback should |
1076 | | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
1077 | | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
1078 | | * directed in the documentation of this callback. |
1079 | | */ |
1080 | | typedef int mbedtls_ssl_async_decrypt_t(mbedtls_ssl_context *ssl, |
1081 | | mbedtls_x509_crt *cert, |
1082 | | const unsigned char *input, |
1083 | | size_t input_len); |
1084 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1085 | | |
1086 | | /** |
1087 | | * \brief Callback type: resume external operation. |
1088 | | * |
1089 | | * This callback is called during an SSL handshake to resume |
1090 | | * an external operation started by the |
1091 | | * ::mbedtls_ssl_async_sign_t or |
1092 | | * ::mbedtls_ssl_async_decrypt_t callback. |
1093 | | * |
1094 | | * This function typically checks the status of a pending |
1095 | | * request or causes the request queue to make progress, and |
1096 | | * does not wait for the operation to complete. This allows |
1097 | | * the handshake step to be non-blocking. |
1098 | | * |
1099 | | * This function may call mbedtls_ssl_get_async_operation_data() |
1100 | | * to retrieve an operation context set by the start callback. |
1101 | | * It may call mbedtls_ssl_set_async_operation_data() to modify |
1102 | | * this context. |
1103 | | * |
1104 | | * Note that when this function returns a status other than |
1105 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, it must free any |
1106 | | * resources associated with the operation. |
1107 | | * |
1108 | | * \param ssl The SSL connection instance. It should not be |
1109 | | * modified other than via |
1110 | | * mbedtls_ssl_set_async_operation_data(). |
1111 | | * \param output Buffer containing the output (signature or decrypted |
1112 | | * data) on success. |
1113 | | * \param output_len On success, number of bytes written to \p output. |
1114 | | * \param output_size Size of the \p output buffer in bytes. |
1115 | | * |
1116 | | * \return 0 if output of the operation is available in the |
1117 | | * \p output buffer. |
1118 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
1119 | | * is still in progress. Subsequent requests for progress |
1120 | | * on the SSL connection will call the resume callback |
1121 | | * again. |
1122 | | * \return Any other error means that the operation is aborted. |
1123 | | * The SSL handshake is aborted. The callback should |
1124 | | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
1125 | | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
1126 | | * directed in the documentation of this callback. |
1127 | | */ |
1128 | | typedef int mbedtls_ssl_async_resume_t(mbedtls_ssl_context *ssl, |
1129 | | unsigned char *output, |
1130 | | size_t *output_len, |
1131 | | size_t output_size); |
1132 | | |
1133 | | /** |
1134 | | * \brief Callback type: cancel external operation. |
1135 | | * |
1136 | | * This callback is called if an SSL connection is closed |
1137 | | * while an asynchronous operation is in progress. Note that |
1138 | | * this callback is not called if the |
1139 | | * ::mbedtls_ssl_async_resume_t callback has run and has |
1140 | | * returned a value other than |
1141 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, since in that case |
1142 | | * the asynchronous operation has already completed. |
1143 | | * |
1144 | | * This function may call mbedtls_ssl_get_async_operation_data() |
1145 | | * to retrieve an operation context set by the start callback. |
1146 | | * |
1147 | | * \param ssl The SSL connection instance. It should not be |
1148 | | * modified. |
1149 | | */ |
1150 | | typedef void mbedtls_ssl_async_cancel_t(mbedtls_ssl_context *ssl); |
1151 | | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
1152 | | |
1153 | | #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \ |
1154 | | !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) |
1155 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN 48 |
1156 | | #if defined(MBEDTLS_MD_CAN_SHA256) |
1157 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA256 |
1158 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 32 |
1159 | | #elif defined(MBEDTLS_MD_CAN_SHA384) |
1160 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA384 |
1161 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 48 |
1162 | | #elif defined(MBEDTLS_MD_CAN_SHA1) |
1163 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA1 |
1164 | | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 20 |
1165 | | #else |
1166 | | /* This is already checked in check_config.h, but be sure. */ |
1167 | | #error "Bad configuration - need SHA-1, SHA-256 or SHA-512 enabled to compute digest of peer CRT." |
1168 | | #endif |
1169 | | #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && |
1170 | | !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
1171 | | |
1172 | | typedef struct { |
1173 | | unsigned char client_application_traffic_secret_N[MBEDTLS_TLS1_3_MD_MAX_SIZE]; |
1174 | | unsigned char server_application_traffic_secret_N[MBEDTLS_TLS1_3_MD_MAX_SIZE]; |
1175 | | unsigned char exporter_master_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE]; |
1176 | | unsigned char resumption_master_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE]; |
1177 | | } mbedtls_ssl_tls13_application_secrets; |
1178 | | |
1179 | | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1180 | | |
1181 | | #define MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH 255 |
1182 | | #define MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH 4 |
1183 | | /* |
1184 | | * For code readability use a typedef for DTLS-SRTP profiles |
1185 | | * |
1186 | | * Use_srtp extension protection profiles values as defined in |
1187 | | * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml |
1188 | | * |
1189 | | * Reminder: if this list is expanded mbedtls_ssl_check_srtp_profile_value |
1190 | | * must be updated too. |
1191 | | */ |
1192 | | #define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80 ((uint16_t) 0x0001) |
1193 | | #define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32 ((uint16_t) 0x0002) |
1194 | | #define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80 ((uint16_t) 0x0005) |
1195 | | #define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32 ((uint16_t) 0x0006) |
1196 | | /* This one is not iana defined, but for code readability. */ |
1197 | | #define MBEDTLS_TLS_SRTP_UNSET ((uint16_t) 0x0000) |
1198 | | |
1199 | | typedef uint16_t mbedtls_ssl_srtp_profile; |
1200 | | |
1201 | | typedef struct mbedtls_dtls_srtp_info_t { |
1202 | | /*! The SRTP profile that was negotiated. */ |
1203 | | mbedtls_ssl_srtp_profile MBEDTLS_PRIVATE(chosen_dtls_srtp_profile); |
1204 | | /*! The length of mki_value. */ |
1205 | | uint16_t MBEDTLS_PRIVATE(mki_len); |
1206 | | /*! The mki_value used, with max size of 256 bytes. */ |
1207 | | unsigned char MBEDTLS_PRIVATE(mki_value)[MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH]; |
1208 | | } |
1209 | | mbedtls_dtls_srtp_info; |
1210 | | |
1211 | | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
1212 | | |
1213 | | /** Human-friendly representation of the (D)TLS protocol version. */ |
1214 | | typedef enum { |
1215 | | MBEDTLS_SSL_VERSION_UNKNOWN, /*!< Context not in use or version not yet negotiated. */ |
1216 | | MBEDTLS_SSL_VERSION_TLS1_2 = 0x0303, /*!< (D)TLS 1.2 */ |
1217 | | MBEDTLS_SSL_VERSION_TLS1_3 = 0x0304, /*!< (D)TLS 1.3 */ |
1218 | | } mbedtls_ssl_protocol_version; |
1219 | | |
1220 | | /* |
1221 | | * This structure is used for storing current session data. |
1222 | | * |
1223 | | * Note: when changing this definition, we need to check and update: |
1224 | | * - in tests/suites/test_suite_ssl.function: |
1225 | | * ssl_populate_session() and ssl_serialize_session_save_load() |
1226 | | * - in library/ssl_tls.c: |
1227 | | * mbedtls_ssl_session_init() and mbedtls_ssl_session_free() |
1228 | | * mbedtls_ssl_session_save() and ssl_session_load() |
1229 | | * ssl_session_copy() |
1230 | | */ |
1231 | | struct mbedtls_ssl_session { |
1232 | | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
1233 | | unsigned char MBEDTLS_PRIVATE(mfl_code); /*!< MaxFragmentLength negotiated by peer */ |
1234 | | #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ |
1235 | | |
1236 | | /*!< RecordSizeLimit received from the peer */ |
1237 | | #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT) |
1238 | | uint16_t MBEDTLS_PRIVATE(record_size_limit); |
1239 | | #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */ |
1240 | | |
1241 | | unsigned char MBEDTLS_PRIVATE(exported); |
1242 | | uint8_t MBEDTLS_PRIVATE(endpoint); /*!< 0: client, 1: server */ |
1243 | | |
1244 | | /** TLS version negotiated in the session. Used if and when renegotiating |
1245 | | * or resuming a session instead of the configured minor TLS version. |
1246 | | */ |
1247 | | mbedtls_ssl_protocol_version MBEDTLS_PRIVATE(tls_version); |
1248 | | |
1249 | | #if defined(MBEDTLS_HAVE_TIME) |
1250 | | mbedtls_time_t MBEDTLS_PRIVATE(start); /*!< start time of current session */ |
1251 | | #endif |
1252 | | int MBEDTLS_PRIVATE(ciphersuite); /*!< chosen ciphersuite */ |
1253 | | size_t MBEDTLS_PRIVATE(id_len); /*!< session id length */ |
1254 | | unsigned char MBEDTLS_PRIVATE(id)[32]; /*!< session identifier */ |
1255 | | unsigned char MBEDTLS_PRIVATE(master)[48]; /*!< the master secret */ |
1256 | | |
1257 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1258 | | #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) |
1259 | | mbedtls_x509_crt *MBEDTLS_PRIVATE(peer_cert); /*!< peer X.509 cert chain */ |
1260 | | #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
1261 | | /*! The digest of the peer's end-CRT. This must be kept to detect CRT |
1262 | | * changes during renegotiation, mitigating the triple handshake attack. */ |
1263 | | unsigned char *MBEDTLS_PRIVATE(peer_cert_digest); |
1264 | | size_t MBEDTLS_PRIVATE(peer_cert_digest_len); |
1265 | | mbedtls_md_type_t MBEDTLS_PRIVATE(peer_cert_digest_type); |
1266 | | #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
1267 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1268 | | uint32_t MBEDTLS_PRIVATE(verify_result); /*!< verification result */ |
1269 | | |
1270 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) |
1271 | | unsigned char *MBEDTLS_PRIVATE(ticket); /*!< RFC 5077 session ticket */ |
1272 | | size_t MBEDTLS_PRIVATE(ticket_len); /*!< session ticket length */ |
1273 | | uint32_t MBEDTLS_PRIVATE(ticket_lifetime); /*!< ticket lifetime hint */ |
1274 | | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ |
1275 | | |
1276 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) && \ |
1277 | | defined(MBEDTLS_HAVE_TIME) |
1278 | | /*! When a ticket is created by a TLS server as part of an established TLS |
1279 | | * session, the ticket creation time may need to be saved for the ticket |
1280 | | * module to be able to check the ticket age when the ticket is used. |
1281 | | * That's the purpose of this field. |
1282 | | * Before creating a new ticket, an Mbed TLS server set this field with |
1283 | | * its current time in milliseconds. This time may then be saved in the |
1284 | | * session ticket data by the session ticket writing function and |
1285 | | * recovered by the ticket parsing function later when the ticket is used. |
1286 | | * The ticket module may then use this time to compute the ticket age and |
1287 | | * determine if it has expired or not. |
1288 | | * The Mbed TLS implementations of the session ticket writing and parsing |
1289 | | * functions save and retrieve the ticket creation time as part of the |
1290 | | * session ticket data. The session ticket parsing function relies on |
1291 | | * the mbedtls_ssl_session_get_ticket_creation_time() API to get the |
1292 | | * ticket creation time from the session ticket data. |
1293 | | */ |
1294 | | mbedtls_ms_time_t MBEDTLS_PRIVATE(ticket_creation_time); |
1295 | | #endif |
1296 | | |
1297 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS) |
1298 | | uint32_t MBEDTLS_PRIVATE(ticket_age_add); /*!< Randomly generated value used to obscure the age of the ticket */ |
1299 | | uint8_t MBEDTLS_PRIVATE(ticket_flags); /*!< Ticket flags */ |
1300 | | uint8_t MBEDTLS_PRIVATE(resumption_key_len); /*!< resumption_key length */ |
1301 | | unsigned char MBEDTLS_PRIVATE(resumption_key)[MBEDTLS_SSL_TLS1_3_TICKET_RESUMPTION_KEY_LEN]; |
1302 | | |
1303 | | #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && defined(MBEDTLS_SSL_CLI_C) |
1304 | | char *MBEDTLS_PRIVATE(hostname); /*!< host name binded with tickets */ |
1305 | | #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION && MBEDTLS_SSL_CLI_C */ |
1306 | | |
1307 | | #if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_ALPN) && defined(MBEDTLS_SSL_SRV_C) |
1308 | | char *ticket_alpn; /*!< ALPN negotiated in the session |
1309 | | during which the ticket was generated. */ |
1310 | | #endif |
1311 | | |
1312 | | #if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_CLI_C) |
1313 | | /*! Time in milliseconds when the last ticket was received. */ |
1314 | | mbedtls_ms_time_t MBEDTLS_PRIVATE(ticket_reception_time); |
1315 | | #endif |
1316 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS */ |
1317 | | |
1318 | | #if defined(MBEDTLS_SSL_EARLY_DATA) |
1319 | | uint32_t MBEDTLS_PRIVATE(max_early_data_size); /*!< maximum amount of early data in tickets */ |
1320 | | #endif |
1321 | | |
1322 | | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
1323 | | int MBEDTLS_PRIVATE(encrypt_then_mac); /*!< flag for EtM activation */ |
1324 | | #endif |
1325 | | |
1326 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
1327 | | mbedtls_ssl_tls13_application_secrets MBEDTLS_PRIVATE(app_secrets); |
1328 | | #endif |
1329 | | }; |
1330 | | |
1331 | | /* |
1332 | | * Identifiers for PRFs used in various versions of TLS. |
1333 | | */ |
1334 | | typedef enum { |
1335 | | MBEDTLS_SSL_TLS_PRF_NONE, |
1336 | | MBEDTLS_SSL_TLS_PRF_SHA384, |
1337 | | MBEDTLS_SSL_TLS_PRF_SHA256, |
1338 | | MBEDTLS_SSL_HKDF_EXPAND_SHA384, |
1339 | | MBEDTLS_SSL_HKDF_EXPAND_SHA256 |
1340 | | } |
1341 | | mbedtls_tls_prf_types; |
1342 | | |
1343 | | typedef enum { |
1344 | | MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET = 0, |
1345 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
1346 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_EARLY_SECRET, |
1347 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_EARLY_EXPORTER_SECRET, |
1348 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_HANDSHAKE_TRAFFIC_SECRET, |
1349 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_HANDSHAKE_TRAFFIC_SECRET, |
1350 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_APPLICATION_TRAFFIC_SECRET, |
1351 | | MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_APPLICATION_TRAFFIC_SECRET, |
1352 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ |
1353 | | } mbedtls_ssl_key_export_type; |
1354 | | |
1355 | | /** |
1356 | | * \brief Callback type: Export key alongside random values for |
1357 | | * session identification, and PRF for |
1358 | | * implementation of TLS key exporters. |
1359 | | * |
1360 | | * \param p_expkey Context for the callback. |
1361 | | * \param type The type of the key that is being exported. |
1362 | | * \param secret The address of the buffer holding the secret |
1363 | | * that's being exporterd. |
1364 | | * \param secret_len The length of \p secret in bytes. |
1365 | | * \param client_random The client random bytes. |
1366 | | * \param server_random The server random bytes. |
1367 | | * \param tls_prf_type The identifier for the PRF used in the handshake |
1368 | | * to which the key belongs. |
1369 | | */ |
1370 | | typedef void mbedtls_ssl_export_keys_t(void *p_expkey, |
1371 | | mbedtls_ssl_key_export_type type, |
1372 | | const unsigned char *secret, |
1373 | | size_t secret_len, |
1374 | | const unsigned char client_random[32], |
1375 | | const unsigned char server_random[32], |
1376 | | mbedtls_tls_prf_types tls_prf_type); |
1377 | | |
1378 | | #if defined(MBEDTLS_SSL_SRV_C) |
1379 | | /** |
1380 | | * \brief Callback type: generic handshake callback |
1381 | | * |
1382 | | * \note Callbacks may use user_data funcs to set/get app user data. |
1383 | | * See \c mbedtls_ssl_get_user_data_p() |
1384 | | * \c mbedtls_ssl_get_user_data_n() |
1385 | | * \c mbedtls_ssl_conf_get_user_data_p() |
1386 | | * \c mbedtls_ssl_conf_get_user_data_n() |
1387 | | * |
1388 | | * \param ssl \c mbedtls_ssl_context on which the callback is run |
1389 | | * |
1390 | | * \return The return value of the callback is 0 if successful, |
1391 | | * or a specific MBEDTLS_ERR_XXX code, which will cause |
1392 | | * the handshake to be aborted. |
1393 | | */ |
1394 | | typedef int (*mbedtls_ssl_hs_cb_t)(mbedtls_ssl_context *ssl); |
1395 | | #endif |
1396 | | |
1397 | | /* A type for storing user data in a library structure. |
1398 | | * |
1399 | | * The representation of type may change in future versions of the library. |
1400 | | * Only the behaviors guaranteed by documented accessor functions are |
1401 | | * guaranteed to remain stable. |
1402 | | */ |
1403 | | typedef union { |
1404 | | uintptr_t n; /* typically a handle to an associated object */ |
1405 | | void *p; /* typically a pointer to extra data */ |
1406 | | } mbedtls_ssl_user_data_t; |
1407 | | |
1408 | | /** |
1409 | | * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. |
1410 | | */ |
1411 | | struct mbedtls_ssl_config { |
1412 | | /* Group items mostly by size. This helps to reduce memory wasted to |
1413 | | * padding. It also helps to keep smaller fields early in the structure, |
1414 | | * so that elements tend to be in the 128-element direct access window |
1415 | | * on Arm Thumb, which reduces the code size. */ |
1416 | | |
1417 | | mbedtls_ssl_protocol_version MBEDTLS_PRIVATE(max_tls_version); /*!< max. TLS version used */ |
1418 | | mbedtls_ssl_protocol_version MBEDTLS_PRIVATE(min_tls_version); /*!< min. TLS version used */ |
1419 | | |
1420 | | /* |
1421 | | * Flags (could be bit-fields to save RAM, but separate bytes make |
1422 | | * the code smaller on architectures with an instruction for direct |
1423 | | * byte access). |
1424 | | */ |
1425 | | |
1426 | | uint8_t MBEDTLS_PRIVATE(endpoint); /*!< 0: client, 1: server */ |
1427 | | uint8_t MBEDTLS_PRIVATE(transport); /*!< 0: stream (TLS), 1: datagram (DTLS) */ |
1428 | | uint8_t MBEDTLS_PRIVATE(authmode); /*!< MBEDTLS_SSL_VERIFY_XXX */ |
1429 | | /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ |
1430 | | uint8_t MBEDTLS_PRIVATE(allow_legacy_renegotiation); /*!< MBEDTLS_LEGACY_XXX */ |
1431 | | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
1432 | | uint8_t MBEDTLS_PRIVATE(mfl_code); /*!< desired fragment length indicator |
1433 | | (MBEDTLS_SSL_MAX_FRAG_LEN_XXX) */ |
1434 | | #endif |
1435 | | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
1436 | | uint8_t MBEDTLS_PRIVATE(encrypt_then_mac); /*!< negotiate encrypt-then-mac? */ |
1437 | | #endif |
1438 | | #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) |
1439 | | uint8_t MBEDTLS_PRIVATE(extended_ms); /*!< negotiate extended master secret? */ |
1440 | | #endif |
1441 | | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
1442 | | uint8_t MBEDTLS_PRIVATE(anti_replay); /*!< detect and prevent replay? */ |
1443 | | #endif |
1444 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1445 | | uint8_t MBEDTLS_PRIVATE(disable_renegotiation); /*!< disable renegotiation? */ |
1446 | | #endif |
1447 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && \ |
1448 | | defined(MBEDTLS_SSL_CLI_C) |
1449 | | /** Encodes two booleans, one stating whether TLS 1.2 session tickets are |
1450 | | * enabled or not, the other one whether the handling of TLS 1.3 |
1451 | | * NewSessionTicket messages is enabled or not. They are respectively set |
1452 | | * by mbedtls_ssl_conf_session_tickets() and |
1453 | | * mbedtls_ssl_conf_tls13_enable_signal_new_session_tickets(). |
1454 | | */ |
1455 | | uint8_t MBEDTLS_PRIVATE(session_tickets); /*!< use session tickets? */ |
1456 | | #endif |
1457 | | |
1458 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && \ |
1459 | | defined(MBEDTLS_SSL_SRV_C) && \ |
1460 | | defined(MBEDTLS_SSL_PROTO_TLS1_3) |
1461 | | uint16_t MBEDTLS_PRIVATE(new_session_tickets_count); /*!< number of NewSessionTicket */ |
1462 | | #endif |
1463 | | |
1464 | | #if defined(MBEDTLS_SSL_SRV_C) |
1465 | | uint8_t MBEDTLS_PRIVATE(cert_req_ca_list); /*!< enable sending CA list in |
1466 | | Certificate Request messages? */ |
1467 | | uint8_t MBEDTLS_PRIVATE(respect_cli_pref); /*!< pick the ciphersuite according to |
1468 | | the client's preferences rather |
1469 | | than ours? */ |
1470 | | #endif |
1471 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1472 | | uint8_t MBEDTLS_PRIVATE(ignore_unexpected_cid); /*!< Should DTLS record with |
1473 | | * unexpected CID |
1474 | | * lead to failure? */ |
1475 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1476 | | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1477 | | uint8_t MBEDTLS_PRIVATE(dtls_srtp_mki_support); /* support having mki_value |
1478 | | in the use_srtp extension? */ |
1479 | | #endif |
1480 | | |
1481 | | /* |
1482 | | * Pointers |
1483 | | */ |
1484 | | |
1485 | | /** Allowed ciphersuites for (D)TLS 1.2 (0-terminated) */ |
1486 | | const int *MBEDTLS_PRIVATE(ciphersuite_list); |
1487 | | |
1488 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
1489 | | /** Allowed TLS 1.3 key exchange modes. */ |
1490 | | int MBEDTLS_PRIVATE(tls13_kex_modes); |
1491 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ |
1492 | | |
1493 | | /** Callback for printing debug output */ |
1494 | | void(*MBEDTLS_PRIVATE(f_dbg))(void *, int, const char *, int, const char *); |
1495 | | void *MBEDTLS_PRIVATE(p_dbg); /*!< context for the debug function */ |
1496 | | |
1497 | | /** Callback for getting (pseudo-)random numbers */ |
1498 | | int(*MBEDTLS_PRIVATE(f_rng))(void *, unsigned char *, size_t); |
1499 | | void *MBEDTLS_PRIVATE(p_rng); /*!< context for the RNG function */ |
1500 | | |
1501 | | /** Callback to retrieve a session from the cache */ |
1502 | | mbedtls_ssl_cache_get_t *MBEDTLS_PRIVATE(f_get_cache); |
1503 | | /** Callback to store a session into the cache */ |
1504 | | mbedtls_ssl_cache_set_t *MBEDTLS_PRIVATE(f_set_cache); |
1505 | | void *MBEDTLS_PRIVATE(p_cache); /*!< context for cache callbacks */ |
1506 | | |
1507 | | #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) |
1508 | | /** Callback for setting cert according to SNI extension */ |
1509 | | int(*MBEDTLS_PRIVATE(f_sni))(void *, mbedtls_ssl_context *, const unsigned char *, size_t); |
1510 | | void *MBEDTLS_PRIVATE(p_sni); /*!< context for SNI callback */ |
1511 | | #endif |
1512 | | |
1513 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1514 | | /** Callback to customize X.509 certificate chain verification */ |
1515 | | int(*MBEDTLS_PRIVATE(f_vrfy))(void *, mbedtls_x509_crt *, int, uint32_t *); |
1516 | | void *MBEDTLS_PRIVATE(p_vrfy); /*!< context for X.509 verify calllback */ |
1517 | | #endif |
1518 | | |
1519 | | #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED) |
1520 | | #if defined(MBEDTLS_SSL_SRV_C) |
1521 | | /** Callback to retrieve PSK key from identity */ |
1522 | | int(*MBEDTLS_PRIVATE(f_psk))(void *, mbedtls_ssl_context *, const unsigned char *, size_t); |
1523 | | void *MBEDTLS_PRIVATE(p_psk); /*!< context for PSK callback */ |
1524 | | #endif |
1525 | | #endif |
1526 | | |
1527 | | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
1528 | | /** Callback to create & write a cookie for ClientHello verification */ |
1529 | | int(*MBEDTLS_PRIVATE(f_cookie_write))(void *, unsigned char **, unsigned char *, |
1530 | | const unsigned char *, size_t); |
1531 | | /** Callback to verify validity of a ClientHello cookie */ |
1532 | | int(*MBEDTLS_PRIVATE(f_cookie_check))(void *, const unsigned char *, size_t, |
1533 | | const unsigned char *, size_t); |
1534 | | void *MBEDTLS_PRIVATE(p_cookie); /*!< context for the cookie callbacks */ |
1535 | | #endif |
1536 | | |
1537 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) |
1538 | | /** Callback to create & write a session ticket */ |
1539 | | int(*MBEDTLS_PRIVATE(f_ticket_write))(void *, const mbedtls_ssl_session *, |
1540 | | unsigned char *, const unsigned char *, size_t *, |
1541 | | uint32_t *); |
1542 | | /** Callback to parse a session ticket into a session structure */ |
1543 | | int(*MBEDTLS_PRIVATE(f_ticket_parse))(void *, mbedtls_ssl_session *, unsigned char *, size_t); |
1544 | | void *MBEDTLS_PRIVATE(p_ticket); /*!< context for the ticket callbacks */ |
1545 | | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ |
1546 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1547 | | size_t MBEDTLS_PRIVATE(cid_len); /*!< The length of CIDs for incoming DTLS records. */ |
1548 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1549 | | |
1550 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1551 | | const mbedtls_x509_crt_profile *MBEDTLS_PRIVATE(cert_profile); /*!< verification profile */ |
1552 | | mbedtls_ssl_key_cert *MBEDTLS_PRIVATE(key_cert); /*!< own certificate/key pair(s) */ |
1553 | | mbedtls_x509_crt *MBEDTLS_PRIVATE(ca_chain); /*!< trusted CAs */ |
1554 | | mbedtls_x509_crl *MBEDTLS_PRIVATE(ca_crl); /*!< trusted CAs CRLs */ |
1555 | | #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) |
1556 | | mbedtls_x509_crt_ca_cb_t MBEDTLS_PRIVATE(f_ca_cb); |
1557 | | void *MBEDTLS_PRIVATE(p_ca_cb); |
1558 | | #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ |
1559 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1560 | | |
1561 | | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
1562 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1563 | | mbedtls_ssl_async_sign_t *MBEDTLS_PRIVATE(f_async_sign_start); /*!< start asynchronous signature operation */ |
1564 | | mbedtls_ssl_async_decrypt_t *MBEDTLS_PRIVATE(f_async_decrypt_start); /*!< start asynchronous decryption operation */ |
1565 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1566 | | mbedtls_ssl_async_resume_t *MBEDTLS_PRIVATE(f_async_resume); /*!< resume asynchronous operation */ |
1567 | | mbedtls_ssl_async_cancel_t *MBEDTLS_PRIVATE(f_async_cancel); /*!< cancel asynchronous operation */ |
1568 | | void *MBEDTLS_PRIVATE(p_async_config_data); /*!< Configuration data set by mbedtls_ssl_conf_async_private_cb(). */ |
1569 | | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
1570 | | |
1571 | | #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) |
1572 | | |
1573 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
1574 | | const int *MBEDTLS_PRIVATE(sig_hashes); /*!< allowed signature hashes */ |
1575 | | #endif |
1576 | | const uint16_t *MBEDTLS_PRIVATE(sig_algs); /*!< allowed signature algorithms */ |
1577 | | #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ |
1578 | | |
1579 | | #if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED) |
1580 | | const mbedtls_ecp_group_id *MBEDTLS_PRIVATE(curve_list); /*!< allowed curves */ |
1581 | | #endif |
1582 | | |
1583 | | const uint16_t *MBEDTLS_PRIVATE(group_list); /*!< allowed IANA NamedGroups */ |
1584 | | |
1585 | | #if defined(MBEDTLS_DHM_C) |
1586 | | mbedtls_mpi MBEDTLS_PRIVATE(dhm_P); /*!< prime modulus for DHM */ |
1587 | | mbedtls_mpi MBEDTLS_PRIVATE(dhm_G); /*!< generator for DHM */ |
1588 | | #endif |
1589 | | |
1590 | | #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED) |
1591 | | |
1592 | | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
1593 | | mbedtls_svc_key_id_t MBEDTLS_PRIVATE(psk_opaque); /*!< PSA key slot holding opaque PSK. This field |
1594 | | * should only be set via |
1595 | | * mbedtls_ssl_conf_psk_opaque(). |
1596 | | * If either no PSK or a raw PSK have been |
1597 | | * configured, this has value \c 0. |
1598 | | */ |
1599 | | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
1600 | | unsigned char *MBEDTLS_PRIVATE(psk); /*!< The raw pre-shared key. This field should |
1601 | | * only be set via mbedtls_ssl_conf_psk(). |
1602 | | * If either no PSK or an opaque PSK |
1603 | | * have been configured, this has value NULL. */ |
1604 | | size_t MBEDTLS_PRIVATE(psk_len); /*!< The length of the raw pre-shared key. |
1605 | | * This field should only be set via |
1606 | | * mbedtls_ssl_conf_psk(). |
1607 | | * Its value is non-zero if and only if |
1608 | | * \c psk is not \c NULL. */ |
1609 | | |
1610 | | unsigned char *MBEDTLS_PRIVATE(psk_identity); /*!< The PSK identity for PSK negotiation. |
1611 | | * This field should only be set via |
1612 | | * mbedtls_ssl_conf_psk(). |
1613 | | * This is set if and only if either |
1614 | | * \c psk or \c psk_opaque are set. */ |
1615 | | size_t MBEDTLS_PRIVATE(psk_identity_len);/*!< The length of PSK identity. |
1616 | | * This field should only be set via |
1617 | | * mbedtls_ssl_conf_psk(). |
1618 | | * Its value is non-zero if and only if |
1619 | | * \c psk is not \c NULL or \c psk_opaque |
1620 | | * is not \c 0. */ |
1621 | | #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ |
1622 | | |
1623 | | #if defined(MBEDTLS_SSL_EARLY_DATA) |
1624 | | int MBEDTLS_PRIVATE(early_data_enabled); /*!< Early data enablement: |
1625 | | * - MBEDTLS_SSL_EARLY_DATA_DISABLED, |
1626 | | * - MBEDTLS_SSL_EARLY_DATA_ENABLED */ |
1627 | | |
1628 | | #if defined(MBEDTLS_SSL_SRV_C) |
1629 | | /* The maximum amount of 0-RTT data. RFC 8446 section 4.6.1 */ |
1630 | | uint32_t MBEDTLS_PRIVATE(max_early_data_size); |
1631 | | #endif /* MBEDTLS_SSL_SRV_C */ |
1632 | | |
1633 | | #endif /* MBEDTLS_SSL_EARLY_DATA */ |
1634 | | |
1635 | | #if defined(MBEDTLS_SSL_ALPN) |
1636 | | const char **MBEDTLS_PRIVATE(alpn_list); /*!< ordered list of protocols */ |
1637 | | #endif |
1638 | | |
1639 | | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1640 | | /*! ordered list of supported srtp profile */ |
1641 | | const mbedtls_ssl_srtp_profile *MBEDTLS_PRIVATE(dtls_srtp_profile_list); |
1642 | | /*! number of supported profiles */ |
1643 | | size_t MBEDTLS_PRIVATE(dtls_srtp_profile_list_len); |
1644 | | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
1645 | | |
1646 | | /* |
1647 | | * Numerical settings (int) |
1648 | | */ |
1649 | | |
1650 | | uint32_t MBEDTLS_PRIVATE(read_timeout); /*!< timeout for mbedtls_ssl_read (ms) */ |
1651 | | |
1652 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1653 | | uint32_t MBEDTLS_PRIVATE(hs_timeout_min); /*!< initial value of the handshake |
1654 | | retransmission timeout (ms) */ |
1655 | | uint32_t MBEDTLS_PRIVATE(hs_timeout_max); /*!< maximum value of the handshake |
1656 | | retransmission timeout (ms) */ |
1657 | | #endif |
1658 | | |
1659 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1660 | | int MBEDTLS_PRIVATE(renego_max_records); /*!< grace period for renegotiation */ |
1661 | | unsigned char MBEDTLS_PRIVATE(renego_period)[8]; /*!< value of the record counters |
1662 | | that triggers renegotiation */ |
1663 | | #endif |
1664 | | |
1665 | | unsigned int MBEDTLS_PRIVATE(badmac_limit); /*!< limit of records with a bad MAC */ |
1666 | | |
1667 | | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) |
1668 | | unsigned int MBEDTLS_PRIVATE(dhm_min_bitlen); /*!< min. bit length of the DHM prime */ |
1669 | | #endif |
1670 | | |
1671 | | /** User data pointer or handle. |
1672 | | * |
1673 | | * The library sets this to \p 0 when creating a context and does not |
1674 | | * access it afterwards. |
1675 | | */ |
1676 | | mbedtls_ssl_user_data_t MBEDTLS_PRIVATE(user_data); |
1677 | | |
1678 | | #if defined(MBEDTLS_SSL_SRV_C) |
1679 | | mbedtls_ssl_hs_cb_t MBEDTLS_PRIVATE(f_cert_cb); /*!< certificate selection callback */ |
1680 | | #endif /* MBEDTLS_SSL_SRV_C */ |
1681 | | |
1682 | | #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) |
1683 | | const mbedtls_x509_crt *MBEDTLS_PRIVATE(dn_hints);/*!< acceptable client cert issuers */ |
1684 | | #endif |
1685 | | }; |
1686 | | |
1687 | | struct mbedtls_ssl_context { |
1688 | | const mbedtls_ssl_config *MBEDTLS_PRIVATE(conf); /*!< configuration information */ |
1689 | | |
1690 | | /* |
1691 | | * Miscellaneous |
1692 | | */ |
1693 | | int MBEDTLS_PRIVATE(state); /*!< SSL handshake: current state */ |
1694 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1695 | | int MBEDTLS_PRIVATE(renego_status); /*!< Initial, in progress, pending? */ |
1696 | | int MBEDTLS_PRIVATE(renego_records_seen); /*!< Records since renego request, or with DTLS, |
1697 | | number of retransmissions of request if |
1698 | | renego_max_records is < 0 */ |
1699 | | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
1700 | | |
1701 | | /** |
1702 | | * Maximum TLS version to be negotiated, then negotiated TLS version. |
1703 | | * |
1704 | | * It is initialized as the configured maximum TLS version to be |
1705 | | * negotiated by mbedtls_ssl_setup(). |
1706 | | * |
1707 | | * When renegotiating or resuming a session, it is overwritten in the |
1708 | | * ClientHello writing preparation stage with the previously negotiated |
1709 | | * TLS version. |
1710 | | * |
1711 | | * On client side, it is updated to the TLS version selected by the server |
1712 | | * for the handshake when the ServerHello is received. |
1713 | | * |
1714 | | * On server side, it is updated to the TLS version the server selects for |
1715 | | * the handshake when the ClientHello is received. |
1716 | | */ |
1717 | | mbedtls_ssl_protocol_version MBEDTLS_PRIVATE(tls_version); |
1718 | | |
1719 | | #if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_CLI_C) |
1720 | | /** |
1721 | | * State of the negotiation and transfer of early data. Reset to |
1722 | | * MBEDTLS_SSL_EARLY_DATA_STATE_IDLE when the context is reset. |
1723 | | */ |
1724 | | int MBEDTLS_PRIVATE(early_data_state); |
1725 | | #endif |
1726 | | |
1727 | | unsigned MBEDTLS_PRIVATE(badmac_seen); /*!< records with a bad MAC received */ |
1728 | | |
1729 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1730 | | /** Callback to customize X.509 certificate chain verification */ |
1731 | | int(*MBEDTLS_PRIVATE(f_vrfy))(void *, mbedtls_x509_crt *, int, uint32_t *); |
1732 | | void *MBEDTLS_PRIVATE(p_vrfy); /*!< context for X.509 verify callback */ |
1733 | | #endif |
1734 | | |
1735 | | mbedtls_ssl_send_t *MBEDTLS_PRIVATE(f_send); /*!< Callback for network send */ |
1736 | | mbedtls_ssl_recv_t *MBEDTLS_PRIVATE(f_recv); /*!< Callback for network receive */ |
1737 | | mbedtls_ssl_recv_timeout_t *MBEDTLS_PRIVATE(f_recv_timeout); |
1738 | | /*!< Callback for network receive with timeout */ |
1739 | | |
1740 | | void *MBEDTLS_PRIVATE(p_bio); /*!< context for I/O operations */ |
1741 | | |
1742 | | /* |
1743 | | * Session layer |
1744 | | */ |
1745 | | mbedtls_ssl_session *MBEDTLS_PRIVATE(session_in); /*!< current session data (in) */ |
1746 | | mbedtls_ssl_session *MBEDTLS_PRIVATE(session_out); /*!< current session data (out) */ |
1747 | | mbedtls_ssl_session *MBEDTLS_PRIVATE(session); /*!< negotiated session data */ |
1748 | | mbedtls_ssl_session *MBEDTLS_PRIVATE(session_negotiate); /*!< session data in negotiation */ |
1749 | | |
1750 | | mbedtls_ssl_handshake_params *MBEDTLS_PRIVATE(handshake); /*!< params required only during |
1751 | | the handshake process */ |
1752 | | |
1753 | | /* |
1754 | | * Record layer transformations |
1755 | | */ |
1756 | | mbedtls_ssl_transform *MBEDTLS_PRIVATE(transform_in); /*!< current transform params (in) |
1757 | | * This is always a reference, |
1758 | | * never an owning pointer. */ |
1759 | | mbedtls_ssl_transform *MBEDTLS_PRIVATE(transform_out); /*!< current transform params (out) |
1760 | | * This is always a reference, |
1761 | | * never an owning pointer. */ |
1762 | | mbedtls_ssl_transform *MBEDTLS_PRIVATE(transform); /*!< negotiated transform params |
1763 | | * This pointer owns the transform |
1764 | | * it references. */ |
1765 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_2) |
1766 | | mbedtls_ssl_transform *MBEDTLS_PRIVATE(transform_negotiate); /*!< transform params in negotiation |
1767 | | * This pointer owns the transform |
1768 | | * it references. */ |
1769 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ |
1770 | | |
1771 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
1772 | | /*! The application data transform in TLS 1.3. |
1773 | | * This pointer owns the transform it references. */ |
1774 | | mbedtls_ssl_transform *MBEDTLS_PRIVATE(transform_application); |
1775 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ |
1776 | | |
1777 | | /* |
1778 | | * Timers |
1779 | | */ |
1780 | | void *MBEDTLS_PRIVATE(p_timer); /*!< context for the timer callbacks */ |
1781 | | |
1782 | | mbedtls_ssl_set_timer_t *MBEDTLS_PRIVATE(f_set_timer); /*!< set timer callback */ |
1783 | | mbedtls_ssl_get_timer_t *MBEDTLS_PRIVATE(f_get_timer); /*!< get timer callback */ |
1784 | | |
1785 | | /* |
1786 | | * Record layer (incoming data) |
1787 | | */ |
1788 | | unsigned char *MBEDTLS_PRIVATE(in_buf); /*!< input buffer */ |
1789 | | unsigned char *MBEDTLS_PRIVATE(in_ctr); /*!< 64-bit incoming message counter |
1790 | | TLS: maintained by us |
1791 | | DTLS: read from peer */ |
1792 | | unsigned char *MBEDTLS_PRIVATE(in_hdr); /*!< start of record header */ |
1793 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1794 | | unsigned char *MBEDTLS_PRIVATE(in_cid); /*!< The start of the CID; |
1795 | | * (the end is marked by in_len). */ |
1796 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1797 | | unsigned char *MBEDTLS_PRIVATE(in_len); /*!< two-bytes message length field */ |
1798 | | unsigned char *MBEDTLS_PRIVATE(in_iv); /*!< ivlen-byte IV */ |
1799 | | unsigned char *MBEDTLS_PRIVATE(in_msg); /*!< message contents (in_iv+ivlen) */ |
1800 | | unsigned char *MBEDTLS_PRIVATE(in_offt); /*!< read offset in application data */ |
1801 | | |
1802 | | int MBEDTLS_PRIVATE(in_msgtype); /*!< record header: message type */ |
1803 | | size_t MBEDTLS_PRIVATE(in_msglen); /*!< record header: message length */ |
1804 | | size_t MBEDTLS_PRIVATE(in_left); /*!< amount of data read so far */ |
1805 | | #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) |
1806 | | size_t MBEDTLS_PRIVATE(in_buf_len); /*!< length of input buffer */ |
1807 | | #endif |
1808 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1809 | | uint16_t MBEDTLS_PRIVATE(in_epoch); /*!< DTLS epoch for incoming records */ |
1810 | | size_t MBEDTLS_PRIVATE(next_record_offset); /*!< offset of the next record in datagram |
1811 | | (equal to in_left if none) */ |
1812 | | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1813 | | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
1814 | | uint64_t MBEDTLS_PRIVATE(in_window_top); /*!< last validated record seq_num */ |
1815 | | uint64_t MBEDTLS_PRIVATE(in_window); /*!< bitmask for replay detection */ |
1816 | | #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ |
1817 | | |
1818 | | size_t MBEDTLS_PRIVATE(in_hslen); /*!< current handshake message length, |
1819 | | including the handshake header */ |
1820 | | int MBEDTLS_PRIVATE(nb_zero); /*!< # of 0-length encrypted messages */ |
1821 | | |
1822 | | int MBEDTLS_PRIVATE(keep_current_message); /*!< drop or reuse current message |
1823 | | on next call to record layer? */ |
1824 | | |
1825 | | /* The following three variables indicate if and, if yes, |
1826 | | * what kind of alert is pending to be sent. |
1827 | | */ |
1828 | | unsigned char MBEDTLS_PRIVATE(send_alert); /*!< Determines if a fatal alert |
1829 | | should be sent. Values: |
1830 | | - \c 0 , no alert is to be sent. |
1831 | | - \c 1 , alert is to be sent. */ |
1832 | | unsigned char MBEDTLS_PRIVATE(alert_type); /*!< Type of alert if send_alert |
1833 | | != 0 */ |
1834 | | int MBEDTLS_PRIVATE(alert_reason); /*!< The error code to be returned |
1835 | | to the user once the fatal alert |
1836 | | has been sent. */ |
1837 | | |
1838 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1839 | | uint8_t MBEDTLS_PRIVATE(disable_datagram_packing); /*!< Disable packing multiple records |
1840 | | * within a single datagram. */ |
1841 | | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1842 | | |
1843 | | #if defined(MBEDTLS_SSL_EARLY_DATA) |
1844 | | #if defined(MBEDTLS_SSL_SRV_C) |
1845 | | /* |
1846 | | * One of: |
1847 | | * MBEDTLS_SSL_EARLY_DATA_NO_DISCARD |
1848 | | * MBEDTLS_SSL_EARLY_DATA_TRY_TO_DEPROTECT_AND_DISCARD |
1849 | | * MBEDTLS_SSL_EARLY_DATA_DISCARD |
1850 | | */ |
1851 | | uint8_t MBEDTLS_PRIVATE(discard_early_data_record); |
1852 | | #endif |
1853 | | uint32_t MBEDTLS_PRIVATE(total_early_data_size); /*!< Number of received/written early data bytes */ |
1854 | | #endif /* MBEDTLS_SSL_EARLY_DATA */ |
1855 | | |
1856 | | /* |
1857 | | * Record layer (outgoing data) |
1858 | | */ |
1859 | | unsigned char *MBEDTLS_PRIVATE(out_buf); /*!< output buffer */ |
1860 | | unsigned char *MBEDTLS_PRIVATE(out_ctr); /*!< 64-bit outgoing message counter */ |
1861 | | unsigned char *MBEDTLS_PRIVATE(out_hdr); /*!< start of record header */ |
1862 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1863 | | unsigned char *MBEDTLS_PRIVATE(out_cid); /*!< The start of the CID; |
1864 | | * (the end is marked by in_len). */ |
1865 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1866 | | unsigned char *MBEDTLS_PRIVATE(out_len); /*!< two-bytes message length field */ |
1867 | | unsigned char *MBEDTLS_PRIVATE(out_iv); /*!< ivlen-byte IV */ |
1868 | | unsigned char *MBEDTLS_PRIVATE(out_msg); /*!< message contents (out_iv+ivlen) */ |
1869 | | |
1870 | | int MBEDTLS_PRIVATE(out_msgtype); /*!< record header: message type */ |
1871 | | size_t MBEDTLS_PRIVATE(out_msglen); /*!< record header: message length */ |
1872 | | size_t MBEDTLS_PRIVATE(out_left); /*!< amount of data not yet written */ |
1873 | | #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) |
1874 | | size_t MBEDTLS_PRIVATE(out_buf_len); /*!< length of output buffer */ |
1875 | | #endif |
1876 | | |
1877 | | unsigned char MBEDTLS_PRIVATE(cur_out_ctr)[MBEDTLS_SSL_SEQUENCE_NUMBER_LEN]; /*!< Outgoing record sequence number. */ |
1878 | | |
1879 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1880 | | uint16_t MBEDTLS_PRIVATE(mtu); /*!< path mtu, used to fragment outgoing messages */ |
1881 | | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1882 | | |
1883 | | /* |
1884 | | * User settings |
1885 | | */ |
1886 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1887 | | char *MBEDTLS_PRIVATE(hostname); /*!< expected peer CN for verification |
1888 | | (and SNI if available) */ |
1889 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1890 | | |
1891 | | #if defined(MBEDTLS_SSL_ALPN) |
1892 | | const char *MBEDTLS_PRIVATE(alpn_chosen); /*!< negotiated protocol */ |
1893 | | #endif /* MBEDTLS_SSL_ALPN */ |
1894 | | |
1895 | | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1896 | | /* |
1897 | | * use_srtp extension |
1898 | | */ |
1899 | | mbedtls_dtls_srtp_info MBEDTLS_PRIVATE(dtls_srtp_info); |
1900 | | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
1901 | | |
1902 | | /* |
1903 | | * Information for DTLS hello verify |
1904 | | */ |
1905 | | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
1906 | | unsigned char *MBEDTLS_PRIVATE(cli_id); /*!< transport-level ID of the client */ |
1907 | | size_t MBEDTLS_PRIVATE(cli_id_len); /*!< length of cli_id */ |
1908 | | #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ |
1909 | | |
1910 | | /* |
1911 | | * Secure renegotiation |
1912 | | */ |
1913 | | /* needed to know when to send extension on server */ |
1914 | | int MBEDTLS_PRIVATE(secure_renegotiation); /*!< does peer support legacy or |
1915 | | secure renegotiation */ |
1916 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1917 | | size_t MBEDTLS_PRIVATE(verify_data_len); /*!< length of verify data stored */ |
1918 | | char MBEDTLS_PRIVATE(own_verify_data)[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ |
1919 | | char MBEDTLS_PRIVATE(peer_verify_data)[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ |
1920 | | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
1921 | | |
1922 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1923 | | /* CID configuration to use in subsequent handshakes. */ |
1924 | | |
1925 | | /*! The next incoming CID, chosen by the user and applying to |
1926 | | * all subsequent handshakes. This may be different from the |
1927 | | * CID currently used in case the user has re-configured the CID |
1928 | | * after an initial handshake. */ |
1929 | | unsigned char MBEDTLS_PRIVATE(own_cid)[MBEDTLS_SSL_CID_IN_LEN_MAX]; |
1930 | | uint8_t MBEDTLS_PRIVATE(own_cid_len); /*!< The length of \c own_cid. */ |
1931 | | uint8_t MBEDTLS_PRIVATE(negotiate_cid); /*!< This indicates whether the CID extension should |
1932 | | * be negotiated in the next handshake or not. |
1933 | | * Possible values are #MBEDTLS_SSL_CID_ENABLED |
1934 | | * and #MBEDTLS_SSL_CID_DISABLED. */ |
1935 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1936 | | |
1937 | | /** Callback to export key block and master secret */ |
1938 | | mbedtls_ssl_export_keys_t *MBEDTLS_PRIVATE(f_export_keys); |
1939 | | void *MBEDTLS_PRIVATE(p_export_keys); /*!< context for key export callback */ |
1940 | | |
1941 | | /** User data pointer or handle. |
1942 | | * |
1943 | | * The library sets this to \p 0 when creating a context and does not |
1944 | | * access it afterwards. |
1945 | | * |
1946 | | * \warning Serializing and restoring an SSL context with |
1947 | | * mbedtls_ssl_context_save() and mbedtls_ssl_context_load() |
1948 | | * does not currently restore the user data. |
1949 | | */ |
1950 | | mbedtls_ssl_user_data_t MBEDTLS_PRIVATE(user_data); |
1951 | | }; |
1952 | | |
1953 | | /** |
1954 | | * \brief Return the name of the ciphersuite associated with the |
1955 | | * given ID |
1956 | | * |
1957 | | * \param ciphersuite_id SSL ciphersuite ID |
1958 | | * |
1959 | | * \return a string containing the ciphersuite name |
1960 | | */ |
1961 | | const char *mbedtls_ssl_get_ciphersuite_name(const int ciphersuite_id); |
1962 | | |
1963 | | /** |
1964 | | * \brief Return the ID of the ciphersuite associated with the |
1965 | | * given name |
1966 | | * |
1967 | | * \param ciphersuite_name SSL ciphersuite name |
1968 | | * |
1969 | | * \return the ID with the ciphersuite or 0 if not found |
1970 | | */ |
1971 | | int mbedtls_ssl_get_ciphersuite_id(const char *ciphersuite_name); |
1972 | | |
1973 | | /** |
1974 | | * \brief Initialize an SSL context |
1975 | | * Just makes the context ready for mbedtls_ssl_setup() or |
1976 | | * mbedtls_ssl_free() |
1977 | | * |
1978 | | * \param ssl SSL context |
1979 | | */ |
1980 | | void mbedtls_ssl_init(mbedtls_ssl_context *ssl); |
1981 | | |
1982 | | /** |
1983 | | * \brief Set up an SSL context for use |
1984 | | * |
1985 | | * \note No copy of the configuration context is made, it can be |
1986 | | * shared by many mbedtls_ssl_context structures. |
1987 | | * |
1988 | | * \warning The conf structure will be accessed during the session. |
1989 | | * It must not be modified or freed as long as the session |
1990 | | * is active. |
1991 | | * |
1992 | | * \warning This function must be called exactly once per context. |
1993 | | * Calling mbedtls_ssl_setup again is not supported, even |
1994 | | * if no session is active. |
1995 | | * |
1996 | | * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto |
1997 | | * subsystem must have been initialized by calling |
1998 | | * psa_crypto_init() before calling this function. |
1999 | | * |
2000 | | * \param ssl SSL context |
2001 | | * \param conf SSL configuration to use |
2002 | | * |
2003 | | * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if |
2004 | | * memory allocation failed |
2005 | | */ |
2006 | | int mbedtls_ssl_setup(mbedtls_ssl_context *ssl, |
2007 | | const mbedtls_ssl_config *conf); |
2008 | | |
2009 | | /** |
2010 | | * \brief Reset an already initialized SSL context for re-use |
2011 | | * while retaining application-set variables, function |
2012 | | * pointers and data. |
2013 | | * |
2014 | | * \param ssl SSL context |
2015 | | * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED or |
2016 | | MBEDTLS_ERR_SSL_HW_ACCEL_FAILED |
2017 | | */ |
2018 | | int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl); |
2019 | | |
2020 | | /** |
2021 | | * \brief Set the current endpoint type |
2022 | | * |
2023 | | * \param conf SSL configuration |
2024 | | * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER |
2025 | | */ |
2026 | | void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint); |
2027 | | |
2028 | | /** |
2029 | | * \brief Get the current endpoint type |
2030 | | * |
2031 | | * \param conf SSL configuration |
2032 | | * |
2033 | | * \return Endpoint type, either MBEDTLS_SSL_IS_CLIENT |
2034 | | * or MBEDTLS_SSL_IS_SERVER |
2035 | | */ |
2036 | | static inline int mbedtls_ssl_conf_get_endpoint(const mbedtls_ssl_config *conf) |
2037 | 0 | { |
2038 | 0 | return conf->MBEDTLS_PRIVATE(endpoint); |
2039 | 0 | } |
2040 | | |
2041 | | /** |
2042 | | * \brief Set the transport type (TLS or DTLS). |
2043 | | * Default: TLS |
2044 | | * |
2045 | | * \note For DTLS, you must either provide a recv callback that |
2046 | | * doesn't block, or one that handles timeouts, see |
2047 | | * \c mbedtls_ssl_set_bio(). You also need to provide timer |
2048 | | * callbacks with \c mbedtls_ssl_set_timer_cb(). |
2049 | | * |
2050 | | * \param conf SSL configuration |
2051 | | * \param transport transport type: |
2052 | | * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, |
2053 | | * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. |
2054 | | */ |
2055 | | void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport); |
2056 | | |
2057 | | /** |
2058 | | * \brief Set the certificate verification mode |
2059 | | * Default: NONE on server, REQUIRED on client |
2060 | | * |
2061 | | * \param conf SSL configuration |
2062 | | * \param authmode can be: |
2063 | | * |
2064 | | * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked |
2065 | | * (default on server) |
2066 | | * (insecure on client) |
2067 | | * |
2068 | | * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the |
2069 | | * handshake continues even if verification failed; |
2070 | | * mbedtls_ssl_get_verify_result() can be called after the |
2071 | | * handshake is complete. |
2072 | | * |
2073 | | * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, |
2074 | | * handshake is aborted if verification failed. |
2075 | | * (default on client) |
2076 | | * |
2077 | | * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. |
2078 | | * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at |
2079 | | * the right time(s), which may not be obvious, while REQUIRED always perform |
2080 | | * the verification as soon as possible. For example, REQUIRED was protecting |
2081 | | * against the "triple handshake" attack even before it was found. |
2082 | | */ |
2083 | | void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode); |
2084 | | |
2085 | | #if defined(MBEDTLS_SSL_EARLY_DATA) |
2086 | | /** |
2087 | | * \brief Set the early data mode |
2088 | | * Default: disabled on server and client |
2089 | | * |
2090 | | * \param conf The SSL configuration to use. |
2091 | | * \param early_data_enabled can be: |
2092 | | * |
2093 | | * MBEDTLS_SSL_EARLY_DATA_DISABLED: |
2094 | | * Early data functionality is disabled. This is the default on client and |
2095 | | * server. |
2096 | | * |
2097 | | * MBEDTLS_SSL_EARLY_DATA_ENABLED: |
2098 | | * Early data functionality is enabled and may be negotiated in the handshake. |
2099 | | * Application using early data functionality needs to be aware that the |
2100 | | * security properties for early data (also refered to as 0-RTT data) are |
2101 | | * weaker than those for other kinds of TLS data. See the documentation of |
2102 | | * mbedtls_ssl_write_early_data() and mbedtls_ssl_read_early_data() for more |
2103 | | * information. |
2104 | | * When early data functionality is enabled on server and only in that case, |
2105 | | * the call to one of the APIs that trigger or resume an handshake sequence, |
2106 | | * namely mbedtls_ssl_handshake(), mbedtls_ssl_handshake_step(), |
2107 | | * mbedtls_ssl_read() or mbedtls_ssl_write() may return with the error code |
2108 | | * MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA indicating that some early data have |
2109 | | * been received. To read the early data, call mbedtls_ssl_read_early_data() |
2110 | | * before calling the original function again. |
2111 | | */ |
2112 | | void mbedtls_ssl_conf_early_data(mbedtls_ssl_config *conf, |
2113 | | int early_data_enabled); |
2114 | | |
2115 | | #if defined(MBEDTLS_SSL_SRV_C) |
2116 | | /** |
2117 | | * \brief Set the maximum amount of 0-RTT data in bytes |
2118 | | * Default: #MBEDTLS_SSL_MAX_EARLY_DATA_SIZE |
2119 | | * |
2120 | | * This function sets the value of the max_early_data_size |
2121 | | * field of the early data indication extension included in |
2122 | | * the NewSessionTicket messages that the server may send. |
2123 | | * |
2124 | | * The value defines the maximum amount of 0-RTT data |
2125 | | * in bytes that a client will be allowed to send when using |
2126 | | * one of the tickets defined by the NewSessionTicket messages. |
2127 | | * |
2128 | | * \note When resuming a session using a ticket, if the server receives more |
2129 | | * early data than allowed for the ticket, it terminates the connection. |
2130 | | * The maximum amount of 0-RTT data should thus be large enough |
2131 | | * to allow a minimum of early data to be exchanged. |
2132 | | * |
2133 | | * \param[in] conf The SSL configuration to use. |
2134 | | * \param[in] max_early_data_size The maximum amount of 0-RTT data. |
2135 | | * |
2136 | | * \warning This interface DOES NOT influence/limit the amount of early data |
2137 | | * that can be received through previously created and issued tickets, |
2138 | | * which clients may have stored. |
2139 | | */ |
2140 | | void mbedtls_ssl_conf_max_early_data_size( |
2141 | | mbedtls_ssl_config *conf, uint32_t max_early_data_size); |
2142 | | #endif /* MBEDTLS_SSL_SRV_C */ |
2143 | | |
2144 | | #endif /* MBEDTLS_SSL_EARLY_DATA */ |
2145 | | |
2146 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
2147 | | /** |
2148 | | * \brief Set the verification callback (Optional). |
2149 | | * |
2150 | | * If set, the provided verify callback is called for each |
2151 | | * certificate in the peer's CRT chain, including the trusted |
2152 | | * root. For more information, please see the documentation of |
2153 | | * \c mbedtls_x509_crt_verify(). |
2154 | | * |
2155 | | * \note For per context callbacks and contexts, please use |
2156 | | * mbedtls_ssl_set_verify() instead. |
2157 | | * |
2158 | | * \param conf The SSL configuration to use. |
2159 | | * \param f_vrfy The verification callback to use during CRT verification. |
2160 | | * \param p_vrfy The opaque context to be passed to the callback. |
2161 | | */ |
2162 | | void mbedtls_ssl_conf_verify(mbedtls_ssl_config *conf, |
2163 | | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), |
2164 | | void *p_vrfy); |
2165 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
2166 | | |
2167 | | /** |
2168 | | * \brief Set the random number generator callback |
2169 | | * |
2170 | | * \param conf SSL configuration |
2171 | | * \param f_rng RNG function (mandatory) |
2172 | | * \param p_rng RNG parameter |
2173 | | */ |
2174 | | void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf, |
2175 | | int (*f_rng)(void *, unsigned char *, size_t), |
2176 | | void *p_rng); |
2177 | | |
2178 | | /** |
2179 | | * \brief Set the debug callback |
2180 | | * |
2181 | | * The callback has the following argument: |
2182 | | * void * opaque context for the callback |
2183 | | * int debug level |
2184 | | * const char * file name |
2185 | | * int line number |
2186 | | * const char * message |
2187 | | * |
2188 | | * \param conf SSL configuration |
2189 | | * \param f_dbg debug function |
2190 | | * \param p_dbg debug parameter |
2191 | | */ |
2192 | | void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf, |
2193 | | void (*f_dbg)(void *, int, const char *, int, const char *), |
2194 | | void *p_dbg); |
2195 | | |
2196 | | /** |
2197 | | * \brief Return the SSL configuration structure associated |
2198 | | * with the given SSL context. |
2199 | | * |
2200 | | * \note The pointer returned by this function is guaranteed to |
2201 | | * remain valid until the context is freed. |
2202 | | * |
2203 | | * \param ssl The SSL context to query. |
2204 | | * \return Pointer to the SSL configuration associated with \p ssl. |
2205 | | */ |
2206 | | static inline const mbedtls_ssl_config *mbedtls_ssl_context_get_config( |
2207 | | const mbedtls_ssl_context *ssl) |
2208 | 0 | { |
2209 | 0 | return ssl->MBEDTLS_PRIVATE(conf); |
2210 | 0 | } |
2211 | | |
2212 | | /** |
2213 | | * \brief Set the underlying BIO callbacks for write, read and |
2214 | | * read-with-timeout. |
2215 | | * |
2216 | | * \param ssl SSL context |
2217 | | * \param p_bio parameter (context) shared by BIO callbacks |
2218 | | * \param f_send write callback |
2219 | | * \param f_recv read callback |
2220 | | * \param f_recv_timeout blocking read callback with timeout. |
2221 | | * |
2222 | | * \note One of f_recv or f_recv_timeout can be NULL, in which case |
2223 | | * the other is used. If both are non-NULL, f_recv_timeout is |
2224 | | * used and f_recv is ignored (as if it were NULL). |
2225 | | * |
2226 | | * \note The two most common use cases are: |
2227 | | * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL |
2228 | | * - blocking I/O, f_recv == NULL, f_recv_timeout != NULL |
2229 | | * |
2230 | | * \note For DTLS, you need to provide either a non-NULL |
2231 | | * f_recv_timeout callback, or a f_recv that doesn't block. |
2232 | | * |
2233 | | * \note See the documentations of \c mbedtls_ssl_send_t, |
2234 | | * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for |
2235 | | * the conventions those callbacks must follow. |
2236 | | * |
2237 | | * \note On some platforms, net_sockets.c provides |
2238 | | * \c mbedtls_net_send(), \c mbedtls_net_recv() and |
2239 | | * \c mbedtls_net_recv_timeout() that are suitable to be used |
2240 | | * here. |
2241 | | */ |
2242 | | void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl, |
2243 | | void *p_bio, |
2244 | | mbedtls_ssl_send_t *f_send, |
2245 | | mbedtls_ssl_recv_t *f_recv, |
2246 | | mbedtls_ssl_recv_timeout_t *f_recv_timeout); |
2247 | | |
2248 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
2249 | | |
2250 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
2251 | | |
2252 | | |
2253 | | /** |
2254 | | * \brief Configure the use of the Connection ID (CID) |
2255 | | * extension in the next handshake. |
2256 | | * |
2257 | | * Reference: RFC 9146 (or draft-ietf-tls-dtls-connection-id-05 |
2258 | | * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 |
2259 | | * for legacy version) |
2260 | | * |
2261 | | * The DTLS CID extension allows the reliable association of |
2262 | | * DTLS records to DTLS connections across changes in the |
2263 | | * underlying transport (changed IP and Port metadata) by |
2264 | | * adding explicit connection identifiers (CIDs) to the |
2265 | | * headers of encrypted DTLS records. The desired CIDs are |
2266 | | * configured by the application layer and are exchanged in |
2267 | | * new `ClientHello` / `ServerHello` extensions during the |
2268 | | * handshake, where each side indicates the CID it wants the |
2269 | | * peer to use when writing encrypted messages. The CIDs are |
2270 | | * put to use once records get encrypted: the stack discards |
2271 | | * any incoming records that don't include the configured CID |
2272 | | * in their header, and adds the peer's requested CID to the |
2273 | | * headers of outgoing messages. |
2274 | | * |
2275 | | * This API enables or disables the use of the CID extension |
2276 | | * in the next handshake and sets the value of the CID to |
2277 | | * be used for incoming messages. |
2278 | | * |
2279 | | * \param ssl The SSL context to configure. This must be initialized. |
2280 | | * \param enable This value determines whether the CID extension should |
2281 | | * be used or not. Possible values are: |
2282 | | * - MBEDTLS_SSL_CID_ENABLED to enable the use of the CID. |
2283 | | * - MBEDTLS_SSL_CID_DISABLED (default) to disable the use |
2284 | | * of the CID. |
2285 | | * \param own_cid The address of the readable buffer holding the CID we want |
2286 | | * the peer to use when sending encrypted messages to us. |
2287 | | * This may be \c NULL if \p own_cid_len is \c 0. |
2288 | | * This parameter is unused if \p enable is set to |
2289 | | * MBEDTLS_SSL_CID_DISABLED. |
2290 | | * \param own_cid_len The length of \p own_cid. |
2291 | | * This parameter is unused if \p enable is set to |
2292 | | * MBEDTLS_SSL_CID_DISABLED. |
2293 | | * |
2294 | | * \note The value of \p own_cid_len must match the value of the |
2295 | | * \c len parameter passed to mbedtls_ssl_conf_cid() |
2296 | | * when configuring the ::mbedtls_ssl_config that \p ssl |
2297 | | * is bound to. |
2298 | | * |
2299 | | * \note This CID configuration applies to subsequent handshakes |
2300 | | * performed on the SSL context \p ssl, but does not trigger |
2301 | | * one. You still have to call `mbedtls_ssl_handshake()` |
2302 | | * (for the initial handshake) or `mbedtls_ssl_renegotiate()` |
2303 | | * (for a renegotiation handshake) explicitly after a |
2304 | | * successful call to this function to run the handshake. |
2305 | | * |
2306 | | * \note This call cannot guarantee that the use of the CID |
2307 | | * will be successfully negotiated in the next handshake, |
2308 | | * because the peer might not support it. Specifically: |
2309 | | * - On the Client, enabling the use of the CID through |
2310 | | * this call implies that the `ClientHello` in the next |
2311 | | * handshake will include the CID extension, thereby |
2312 | | * offering the use of the CID to the server. Only if |
2313 | | * the `ServerHello` contains the CID extension, too, |
2314 | | * the CID extension will actually be put to use. |
2315 | | * - On the Server, enabling the use of the CID through |
2316 | | * this call implies that the server will look for |
2317 | | * the CID extension in a `ClientHello` from the client, |
2318 | | * and, if present, reply with a CID extension in its |
2319 | | * `ServerHello`. |
2320 | | * |
2321 | | * \note To check whether the use of the CID was negotiated |
2322 | | * after the subsequent handshake has completed, please |
2323 | | * use the API mbedtls_ssl_get_peer_cid(). |
2324 | | * |
2325 | | * \warning If the use of the CID extension is enabled in this call |
2326 | | * and the subsequent handshake negotiates its use, Mbed TLS |
2327 | | * will silently drop every packet whose CID does not match |
2328 | | * the CID configured in \p own_cid. It is the responsibility |
2329 | | * of the user to adapt the underlying transport to take care |
2330 | | * of CID-based demultiplexing before handing datagrams to |
2331 | | * Mbed TLS. |
2332 | | * |
2333 | | * \return \c 0 on success. In this case, the CID configuration |
2334 | | * applies to the next handshake. |
2335 | | * \return A negative error code on failure. |
2336 | | */ |
2337 | | int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl, |
2338 | | int enable, |
2339 | | unsigned char const *own_cid, |
2340 | | size_t own_cid_len); |
2341 | | |
2342 | | /** |
2343 | | * \brief Get information about our request for usage of the CID |
2344 | | * extension in the current connection. |
2345 | | * |
2346 | | * \param ssl The SSL context to query. |
2347 | | * \param enabled The address at which to store whether the CID extension |
2348 | | * is requested to be used or not. If the CID is |
2349 | | * requested, `*enabled` is set to |
2350 | | * MBEDTLS_SSL_CID_ENABLED; otherwise, it is set to |
2351 | | * MBEDTLS_SSL_CID_DISABLED. |
2352 | | * \param own_cid The address of the buffer in which to store our own |
2353 | | * CID (if the CID extension is requested). This may be |
2354 | | * \c NULL in case the value of our CID isn't needed. If |
2355 | | * it is not \c NULL, \p own_cid_len must not be \c NULL. |
2356 | | * \param own_cid_len The address at which to store the size of our own CID |
2357 | | * (if the CID extension is requested). This is also the |
2358 | | * number of Bytes in \p own_cid that have been written. |
2359 | | * This may be \c NULL in case the length of our own CID |
2360 | | * isn't needed. If it is \c NULL, \p own_cid must be |
2361 | | * \c NULL, too. |
2362 | | * |
2363 | | *\note If we are requesting an empty CID this function sets |
2364 | | * `*enabled` to #MBEDTLS_SSL_CID_DISABLED (the rationale |
2365 | | * for this is that the resulting outcome is the |
2366 | | * same as if the CID extensions wasn't requested). |
2367 | | * |
2368 | | * \return \c 0 on success. |
2369 | | * \return A negative error code on failure. |
2370 | | */ |
2371 | | int mbedtls_ssl_get_own_cid(mbedtls_ssl_context *ssl, |
2372 | | int *enabled, |
2373 | | unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX], |
2374 | | size_t *own_cid_len); |
2375 | | |
2376 | | /** |
2377 | | * \brief Get information about the use of the CID extension |
2378 | | * in the current connection. |
2379 | | * |
2380 | | * \param ssl The SSL context to query. |
2381 | | * \param enabled The address at which to store whether the CID extension |
2382 | | * is currently in use or not. If the CID is in use, |
2383 | | * `*enabled` is set to MBEDTLS_SSL_CID_ENABLED; |
2384 | | * otherwise, it is set to MBEDTLS_SSL_CID_DISABLED. |
2385 | | * \param peer_cid The address of the buffer in which to store the CID |
2386 | | * chosen by the peer (if the CID extension is used). |
2387 | | * This may be \c NULL in case the value of peer CID |
2388 | | * isn't needed. If it is not \c NULL, \p peer_cid_len |
2389 | | * must not be \c NULL. |
2390 | | * \param peer_cid_len The address at which to store the size of the CID |
2391 | | * chosen by the peer (if the CID extension is used). |
2392 | | * This is also the number of Bytes in \p peer_cid that |
2393 | | * have been written. |
2394 | | * This may be \c NULL in case the length of the peer CID |
2395 | | * isn't needed. If it is \c NULL, \p peer_cid must be |
2396 | | * \c NULL, too. |
2397 | | * |
2398 | | * \note This applies to the state of the CID negotiated in |
2399 | | * the last complete handshake. If a handshake is in |
2400 | | * progress, this function will attempt to complete |
2401 | | * the handshake first. |
2402 | | * |
2403 | | * \note If CID extensions have been exchanged but both client |
2404 | | * and server chose to use an empty CID, this function |
2405 | | * sets `*enabled` to #MBEDTLS_SSL_CID_DISABLED |
2406 | | * (the rationale for this is that the resulting |
2407 | | * communication is the same as if the CID extensions |
2408 | | * hadn't been used). |
2409 | | * |
2410 | | * \return \c 0 on success. |
2411 | | * \return A negative error code on failure. |
2412 | | */ |
2413 | | int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl, |
2414 | | int *enabled, |
2415 | | unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX], |
2416 | | size_t *peer_cid_len); |
2417 | | |
2418 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
2419 | | |
2420 | | /** |
2421 | | * \brief Set the Maximum Transport Unit (MTU). |
2422 | | * Special value: 0 means unset (no limit). |
2423 | | * This represents the maximum size of a datagram payload |
2424 | | * handled by the transport layer (usually UDP) as determined |
2425 | | * by the network link and stack. In practice, this controls |
2426 | | * the maximum size datagram the DTLS layer will pass to the |
2427 | | * \c f_send() callback set using \c mbedtls_ssl_set_bio(). |
2428 | | * |
2429 | | * \note The limit on datagram size is converted to a limit on |
2430 | | * record payload by subtracting the current overhead of |
2431 | | * encapsulation and encryption/authentication if any. |
2432 | | * |
2433 | | * \note This can be called at any point during the connection, for |
2434 | | * example when a Path Maximum Transfer Unit (PMTU) |
2435 | | * estimate becomes available from other sources, |
2436 | | * such as lower (or higher) protocol layers. |
2437 | | * |
2438 | | * \note This setting only controls the size of the packets we send, |
2439 | | * and does not restrict the size of the datagrams we're |
2440 | | * willing to receive. Client-side, you can request the |
2441 | | * server to use smaller records with \c |
2442 | | * mbedtls_ssl_conf_max_frag_len(). |
2443 | | * |
2444 | | * \note If both a MTU and a maximum fragment length have been |
2445 | | * configured (or negotiated with the peer), the resulting |
2446 | | * lower limit on record payload (see first note) is used. |
2447 | | * |
2448 | | * \note This can only be used to decrease the maximum size |
2449 | | * of datagrams (hence records, see first note) sent. It |
2450 | | * cannot be used to increase the maximum size of records over |
2451 | | * the limit set by #MBEDTLS_SSL_OUT_CONTENT_LEN. |
2452 | | * |
2453 | | * \note Values lower than the current record layer expansion will |
2454 | | * result in an error when trying to send data. |
2455 | | * |
2456 | | * \param ssl SSL context |
2457 | | * \param mtu Value of the path MTU in bytes |
2458 | | */ |
2459 | | void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu); |
2460 | | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
2461 | | |
2462 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
2463 | | /** |
2464 | | * \brief Set a connection-specific verification callback (optional). |
2465 | | * |
2466 | | * If set, the provided verify callback is called for each |
2467 | | * certificate in the peer's CRT chain, including the trusted |
2468 | | * root. For more information, please see the documentation of |
2469 | | * \c mbedtls_x509_crt_verify(). |
2470 | | * |
2471 | | * \note This call is analogous to mbedtls_ssl_conf_verify() but |
2472 | | * binds the verification callback and context to an SSL context |
2473 | | * as opposed to an SSL configuration. |
2474 | | * If mbedtls_ssl_conf_verify() and mbedtls_ssl_set_verify() |
2475 | | * are both used, mbedtls_ssl_set_verify() takes precedence. |
2476 | | * |
2477 | | * \param ssl The SSL context to use. |
2478 | | * \param f_vrfy The verification callback to use during CRT verification. |
2479 | | * \param p_vrfy The opaque context to be passed to the callback. |
2480 | | */ |
2481 | | void mbedtls_ssl_set_verify(mbedtls_ssl_context *ssl, |
2482 | | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), |
2483 | | void *p_vrfy); |
2484 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
2485 | | |
2486 | | /** |
2487 | | * \brief Set the timeout period for mbedtls_ssl_read() |
2488 | | * (Default: no timeout.) |
2489 | | * |
2490 | | * \param conf SSL configuration context |
2491 | | * \param timeout Timeout value in milliseconds. |
2492 | | * Use 0 for no timeout (default). |
2493 | | * |
2494 | | * \note With blocking I/O, this will only work if a non-NULL |
2495 | | * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). |
2496 | | * With non-blocking I/O, this will only work if timer |
2497 | | * callbacks were set with \c mbedtls_ssl_set_timer_cb(). |
2498 | | * |
2499 | | * \note With non-blocking I/O, you may also skip this function |
2500 | | * altogether and handle timeouts at the application layer. |
2501 | | */ |
2502 | | void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout); |
2503 | | |
2504 | | /** |
2505 | | * \brief Check whether a buffer contains a valid and authentic record |
2506 | | * that has not been seen before. (DTLS only). |
2507 | | * |
2508 | | * This function does not change the user-visible state |
2509 | | * of the SSL context. Its sole purpose is to provide |
2510 | | * an indication of the legitimacy of an incoming record. |
2511 | | * |
2512 | | * This can be useful e.g. in distributed server environments |
2513 | | * using the DTLS Connection ID feature, in which connections |
2514 | | * might need to be passed between service instances on a change |
2515 | | * of peer address, but where such disruptive operations should |
2516 | | * only happen after the validity of incoming records has been |
2517 | | * confirmed. |
2518 | | * |
2519 | | * \param ssl The SSL context to use. |
2520 | | * \param buf The address of the buffer holding the record to be checked. |
2521 | | * This must be a read/write buffer of length \p buflen Bytes. |
2522 | | * \param buflen The length of \p buf in Bytes. |
2523 | | * |
2524 | | * \note This routine only checks whether the provided buffer begins |
2525 | | * with a valid and authentic record that has not been seen |
2526 | | * before, but does not check potential data following the |
2527 | | * initial record. In particular, it is possible to pass DTLS |
2528 | | * datagrams containing multiple records, in which case only |
2529 | | * the first record is checked. |
2530 | | * |
2531 | | * \note This function modifies the input buffer \p buf. If you need |
2532 | | * to preserve the original record, you have to maintain a copy. |
2533 | | * |
2534 | | * \return \c 0 if the record is valid and authentic and has not been |
2535 | | * seen before. |
2536 | | * \return MBEDTLS_ERR_SSL_INVALID_MAC if the check completed |
2537 | | * successfully but the record was found to be not authentic. |
2538 | | * \return MBEDTLS_ERR_SSL_INVALID_RECORD if the check completed |
2539 | | * successfully but the record was found to be invalid for |
2540 | | * a reason different from authenticity checking. |
2541 | | * \return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD if the check completed |
2542 | | * successfully but the record was found to be unexpected |
2543 | | * in the state of the SSL context, including replayed records. |
2544 | | * \return Another negative error code on different kinds of failure. |
2545 | | * In this case, the SSL context becomes unusable and needs |
2546 | | * to be freed or reset before reuse. |
2547 | | */ |
2548 | | int mbedtls_ssl_check_record(mbedtls_ssl_context const *ssl, |
2549 | | unsigned char *buf, |
2550 | | size_t buflen); |
2551 | | |
2552 | | /** |
2553 | | * \brief Set the timer callbacks (Mandatory for DTLS.) |
2554 | | * |
2555 | | * \param ssl SSL context |
2556 | | * \param p_timer parameter (context) shared by timer callbacks |
2557 | | * \param f_set_timer set timer callback |
2558 | | * \param f_get_timer get timer callback. Must return: |
2559 | | * |
2560 | | * \note See the documentation of \c mbedtls_ssl_set_timer_t and |
2561 | | * \c mbedtls_ssl_get_timer_t for the conventions this pair of |
2562 | | * callbacks must follow. |
2563 | | * |
2564 | | * \note On some platforms, timing.c provides |
2565 | | * \c mbedtls_timing_set_delay() and |
2566 | | * \c mbedtls_timing_get_delay() that are suitable for using |
2567 | | * here, except if using an event-driven style. |
2568 | | * |
2569 | | * \note See also the "DTLS tutorial" article in our knowledge base. |
2570 | | * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/dtls-tutorial |
2571 | | */ |
2572 | | void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl, |
2573 | | void *p_timer, |
2574 | | mbedtls_ssl_set_timer_t *f_set_timer, |
2575 | | mbedtls_ssl_get_timer_t *f_get_timer); |
2576 | | |
2577 | | #if defined(MBEDTLS_SSL_SRV_C) |
2578 | | /** |
2579 | | * \brief Set the certificate selection callback (server-side only). |
2580 | | * |
2581 | | * If set, the callback is always called for each handshake, |
2582 | | * after `ClientHello` processing has finished. |
2583 | | * |
2584 | | * \param conf The SSL configuration to register the callback with. |
2585 | | * \param f_cert_cb The callback for selecting server certificate after |
2586 | | * `ClientHello` processing has finished. |
2587 | | */ |
2588 | | static inline void mbedtls_ssl_conf_cert_cb(mbedtls_ssl_config *conf, |
2589 | | mbedtls_ssl_hs_cb_t f_cert_cb) |
2590 | 0 | { |
2591 | 0 | conf->MBEDTLS_PRIVATE(f_cert_cb) = f_cert_cb; |
2592 | 0 | } |
2593 | | #endif /* MBEDTLS_SSL_SRV_C */ |
2594 | | |
2595 | | /** |
2596 | | * \brief Callback type: generate and write session ticket |
2597 | | * |
2598 | | * \note This describes what a callback implementation should do. |
2599 | | * This callback should generate an encrypted and |
2600 | | * authenticated ticket for the session and write it to the |
2601 | | * output buffer. Here, ticket means the opaque ticket part |
2602 | | * of the NewSessionTicket structure of RFC 5077. |
2603 | | * |
2604 | | * \param p_ticket Context for the callback |
2605 | | * \param session SSL session to be written in the ticket |
2606 | | * \param start Start of the output buffer |
2607 | | * \param end End of the output buffer |
2608 | | * \param tlen On exit, holds the length written |
2609 | | * \param lifetime On exit, holds the lifetime of the ticket in seconds |
2610 | | * |
2611 | | * \return 0 if successful, or |
2612 | | * a specific MBEDTLS_ERR_XXX code. |
2613 | | */ |
2614 | | typedef int mbedtls_ssl_ticket_write_t(void *p_ticket, |
2615 | | const mbedtls_ssl_session *session, |
2616 | | unsigned char *start, |
2617 | | const unsigned char *end, |
2618 | | size_t *tlen, |
2619 | | uint32_t *lifetime); |
2620 | | |
2621 | | /** |
2622 | | * \brief Callback type: parse and load session ticket |
2623 | | * |
2624 | | * \note This describes what a callback implementation should do. |
2625 | | * This callback should parse a session ticket as generated |
2626 | | * by the corresponding mbedtls_ssl_ticket_write_t function, |
2627 | | * and, if the ticket is authentic and valid, load the |
2628 | | * session. |
2629 | | * |
2630 | | * \note The implementation is allowed to modify the first len |
2631 | | * bytes of the input buffer, eg to use it as a temporary |
2632 | | * area for the decrypted ticket contents. |
2633 | | * |
2634 | | * \param p_ticket Context for the callback |
2635 | | * \param session SSL session to be loaded |
2636 | | * \param buf Start of the buffer containing the ticket |
2637 | | * \param len Length of the ticket. |
2638 | | * |
2639 | | * \return 0 if successful, or |
2640 | | * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or |
2641 | | * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or |
2642 | | * any other non-zero code for other failures. |
2643 | | */ |
2644 | | typedef int mbedtls_ssl_ticket_parse_t(void *p_ticket, |
2645 | | mbedtls_ssl_session *session, |
2646 | | unsigned char *buf, |
2647 | | size_t len); |
2648 | | |
2649 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) |
2650 | | /** |
2651 | | * \brief Configure SSL session ticket callbacks (server only). |
2652 | | * (Default: none.) |
2653 | | * |
2654 | | * \note On server, session tickets are enabled by providing |
2655 | | * non-NULL callbacks. |
2656 | | * |
2657 | | * \note On client, use \c mbedtls_ssl_conf_session_tickets(). |
2658 | | * |
2659 | | * \param conf SSL configuration context |
2660 | | * \param f_ticket_write Callback for writing a ticket |
2661 | | * \param f_ticket_parse Callback for parsing a ticket |
2662 | | * \param p_ticket Context shared by the two callbacks |
2663 | | */ |
2664 | | void mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config *conf, |
2665 | | mbedtls_ssl_ticket_write_t *f_ticket_write, |
2666 | | mbedtls_ssl_ticket_parse_t *f_ticket_parse, |
2667 | | void *p_ticket); |
2668 | | |
2669 | | #if defined(MBEDTLS_HAVE_TIME) |
2670 | | /** |
2671 | | * \brief Get the creation time of a session ticket. |
2672 | | * |
2673 | | * \note See the documentation of \c ticket_creation_time for information about |
2674 | | * the intended usage of this function. |
2675 | | * |
2676 | | * \param session SSL session |
2677 | | * \param ticket_creation_time On exit, holds the ticket creation time in |
2678 | | * milliseconds. |
2679 | | * |
2680 | | * \return 0 on success, |
2681 | | * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if an input is not valid. |
2682 | | */ |
2683 | | static inline int mbedtls_ssl_session_get_ticket_creation_time( |
2684 | | mbedtls_ssl_session *session, mbedtls_ms_time_t *ticket_creation_time) |
2685 | 0 | { |
2686 | 0 | if (session == NULL || ticket_creation_time == NULL || |
2687 | 0 | session->MBEDTLS_PRIVATE(endpoint) != MBEDTLS_SSL_IS_SERVER) { |
2688 | 0 | return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; |
2689 | 0 | } |
2690 | 0 |
|
2691 | 0 | *ticket_creation_time = session->MBEDTLS_PRIVATE(ticket_creation_time); |
2692 | 0 |
|
2693 | 0 | return 0; |
2694 | 0 | } |
2695 | | #endif /* MBEDTLS_HAVE_TIME */ |
2696 | | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ |
2697 | | |
2698 | | /** |
2699 | | * \brief Get the session-id buffer. |
2700 | | * |
2701 | | * \param session SSL session. |
2702 | | * |
2703 | | * \return The address of the session-id buffer. |
2704 | | */ |
2705 | | static inline unsigned const char (*mbedtls_ssl_session_get_id(const mbedtls_ssl_session * |
2706 | | session))[32] |
2707 | 0 | { |
2708 | 0 | return &session->MBEDTLS_PRIVATE(id); |
2709 | 0 | } |
2710 | | |
2711 | | /** |
2712 | | * \brief Get the size of the session-id. |
2713 | | * |
2714 | | * \param session SSL session. |
2715 | | * |
2716 | | * \return size_t size of session-id buffer. |
2717 | | */ |
2718 | | static inline size_t mbedtls_ssl_session_get_id_len(const mbedtls_ssl_session *session) |
2719 | 0 | { |
2720 | 0 | return session->MBEDTLS_PRIVATE(id_len); |
2721 | 0 | } |
2722 | | |
2723 | | /** |
2724 | | * \brief Get the ciphersuite-id. |
2725 | | * |
2726 | | * \param session SSL session. |
2727 | | * |
2728 | | * \return int represetation for ciphersuite. |
2729 | | */ |
2730 | | static inline int mbedtls_ssl_session_get_ciphersuite_id(const mbedtls_ssl_session *session) |
2731 | 0 | { |
2732 | 0 | return session->MBEDTLS_PRIVATE(ciphersuite); |
2733 | 0 | } |
2734 | | |
2735 | | /** |
2736 | | * \brief Configure a key export callback. |
2737 | | * (Default: none.) |
2738 | | * |
2739 | | * This API can be used for two purposes: |
2740 | | * - Debugging: Use this API to e.g. generate an NSSKeylog |
2741 | | * file and use it to inspect encrypted traffic in tools |
2742 | | * such as Wireshark. |
2743 | | * - Application-specific export: Use this API to implement |
2744 | | * key exporters, e.g. for EAP-TLS or DTLS-SRTP. |
2745 | | * |
2746 | | * |
2747 | | * \param ssl The SSL context to which the export |
2748 | | * callback should be attached. |
2749 | | * \param f_export_keys The callback for the key export. |
2750 | | * \param p_export_keys The opaque context pointer to be passed to the |
2751 | | * callback \p f_export_keys. |
2752 | | */ |
2753 | | void mbedtls_ssl_set_export_keys_cb(mbedtls_ssl_context *ssl, |
2754 | | mbedtls_ssl_export_keys_t *f_export_keys, |
2755 | | void *p_export_keys); |
2756 | | |
2757 | | /** \brief Set the user data in an SSL configuration to a pointer. |
2758 | | * |
2759 | | * You can retrieve this value later with mbedtls_ssl_conf_get_user_data_p(). |
2760 | | * |
2761 | | * \note The library stores \c p without accessing it. It is the responsibility |
2762 | | * of the caller to ensure that the pointer remains valid. |
2763 | | * |
2764 | | * \param conf The SSL configuration context to modify. |
2765 | | * \param p The new value of the user data. |
2766 | | */ |
2767 | | static inline void mbedtls_ssl_conf_set_user_data_p( |
2768 | | mbedtls_ssl_config *conf, |
2769 | | void *p) |
2770 | 0 | { |
2771 | 0 | conf->MBEDTLS_PRIVATE(user_data).p = p; |
2772 | 0 | } |
2773 | | |
2774 | | /** \brief Set the user data in an SSL configuration to an integer. |
2775 | | * |
2776 | | * You can retrieve this value later with mbedtls_ssl_conf_get_user_data_n(). |
2777 | | * |
2778 | | * \param conf The SSL configuration context to modify. |
2779 | | * \param n The new value of the user data. |
2780 | | */ |
2781 | | static inline void mbedtls_ssl_conf_set_user_data_n( |
2782 | | mbedtls_ssl_config *conf, |
2783 | | uintptr_t n) |
2784 | 0 | { |
2785 | 0 | conf->MBEDTLS_PRIVATE(user_data).n = n; |
2786 | 0 | } |
2787 | | |
2788 | | /** \brief Retrieve the user data in an SSL configuration as a pointer. |
2789 | | * |
2790 | | * This is the value last set with mbedtls_ssl_conf_set_user_data_p(), or |
2791 | | * \c NULL if mbedtls_ssl_conf_set_user_data_p() has not previously been |
2792 | | * called. The value is undefined if mbedtls_ssl_conf_set_user_data_n() has |
2793 | | * been called without a subsequent call to mbedtls_ssl_conf_set_user_data_p(). |
2794 | | * |
2795 | | * \param conf The SSL configuration context to modify. |
2796 | | * \return The current value of the user data. |
2797 | | */ |
2798 | | static inline void *mbedtls_ssl_conf_get_user_data_p( |
2799 | | mbedtls_ssl_config *conf) |
2800 | 0 | { |
2801 | 0 | return conf->MBEDTLS_PRIVATE(user_data).p; |
2802 | 0 | } |
2803 | | |
2804 | | /** \brief Retrieve the user data in an SSL configuration as an integer. |
2805 | | * |
2806 | | * This is the value last set with mbedtls_ssl_conf_set_user_data_n(), or |
2807 | | * \c 0 if mbedtls_ssl_conf_set_user_data_n() has not previously been |
2808 | | * called. The value is undefined if mbedtls_ssl_conf_set_user_data_p() has |
2809 | | * been called without a subsequent call to mbedtls_ssl_conf_set_user_data_n(). |
2810 | | * |
2811 | | * \param conf The SSL configuration context to modify. |
2812 | | * \return The current value of the user data. |
2813 | | */ |
2814 | | static inline uintptr_t mbedtls_ssl_conf_get_user_data_n( |
2815 | | mbedtls_ssl_config *conf) |
2816 | 0 | { |
2817 | 0 | return conf->MBEDTLS_PRIVATE(user_data).n; |
2818 | 0 | } |
2819 | | |
2820 | | /** \brief Set the user data in an SSL context to a pointer. |
2821 | | * |
2822 | | * You can retrieve this value later with mbedtls_ssl_get_user_data_p(). |
2823 | | * |
2824 | | * \note The library stores \c p without accessing it. It is the responsibility |
2825 | | * of the caller to ensure that the pointer remains valid. |
2826 | | * |
2827 | | * \param ssl The SSL context to modify. |
2828 | | * \param p The new value of the user data. |
2829 | | */ |
2830 | | static inline void mbedtls_ssl_set_user_data_p( |
2831 | | mbedtls_ssl_context *ssl, |
2832 | | void *p) |
2833 | 0 | { |
2834 | 0 | ssl->MBEDTLS_PRIVATE(user_data).p = p; |
2835 | 0 | } |
2836 | | |
2837 | | /** \brief Set the user data in an SSL context to an integer. |
2838 | | * |
2839 | | * You can retrieve this value later with mbedtls_ssl_get_user_data_n(). |
2840 | | * |
2841 | | * \param ssl The SSL context to modify. |
2842 | | * \param n The new value of the user data. |
2843 | | */ |
2844 | | static inline void mbedtls_ssl_set_user_data_n( |
2845 | | mbedtls_ssl_context *ssl, |
2846 | | uintptr_t n) |
2847 | 0 | { |
2848 | 0 | ssl->MBEDTLS_PRIVATE(user_data).n = n; |
2849 | 0 | } |
2850 | | |
2851 | | /** \brief Retrieve the user data in an SSL context as a pointer. |
2852 | | * |
2853 | | * This is the value last set with mbedtls_ssl_set_user_data_p(), or |
2854 | | * \c NULL if mbedtls_ssl_set_user_data_p() has not previously been |
2855 | | * called. The value is undefined if mbedtls_ssl_set_user_data_n() has |
2856 | | * been called without a subsequent call to mbedtls_ssl_set_user_data_p(). |
2857 | | * |
2858 | | * \param ssl The SSL context to modify. |
2859 | | * \return The current value of the user data. |
2860 | | */ |
2861 | | static inline void *mbedtls_ssl_get_user_data_p( |
2862 | | mbedtls_ssl_context *ssl) |
2863 | 0 | { |
2864 | 0 | return ssl->MBEDTLS_PRIVATE(user_data).p; |
2865 | 0 | } |
2866 | | |
2867 | | /** \brief Retrieve the user data in an SSL context as an integer. |
2868 | | * |
2869 | | * This is the value last set with mbedtls_ssl_set_user_data_n(), or |
2870 | | * \c 0 if mbedtls_ssl_set_user_data_n() has not previously been |
2871 | | * called. The value is undefined if mbedtls_ssl_set_user_data_p() has |
2872 | | * been called without a subsequent call to mbedtls_ssl_set_user_data_n(). |
2873 | | * |
2874 | | * \param ssl The SSL context to modify. |
2875 | | * \return The current value of the user data. |
2876 | | */ |
2877 | | static inline uintptr_t mbedtls_ssl_get_user_data_n( |
2878 | | mbedtls_ssl_context *ssl) |
2879 | 0 | { |
2880 | 0 | return ssl->MBEDTLS_PRIVATE(user_data).n; |
2881 | 0 | } |
2882 | | |
2883 | | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
2884 | | /** |
2885 | | * \brief Configure asynchronous private key operation callbacks. |
2886 | | * |
2887 | | * \param conf SSL configuration context |
2888 | | * \param f_async_sign Callback to start a signature operation. See |
2889 | | * the description of ::mbedtls_ssl_async_sign_t |
2890 | | * for more information. This may be \c NULL if the |
2891 | | * external processor does not support any signature |
2892 | | * operation; in this case the private key object |
2893 | | * associated with the certificate will be used. |
2894 | | * \param f_async_decrypt Callback to start a decryption operation. See |
2895 | | * the description of ::mbedtls_ssl_async_decrypt_t |
2896 | | * for more information. This may be \c NULL if the |
2897 | | * external processor does not support any decryption |
2898 | | * operation; in this case the private key object |
2899 | | * associated with the certificate will be used. |
2900 | | * \param f_async_resume Callback to resume an asynchronous operation. See |
2901 | | * the description of ::mbedtls_ssl_async_resume_t |
2902 | | * for more information. This may not be \c NULL unless |
2903 | | * \p f_async_sign and \p f_async_decrypt are both |
2904 | | * \c NULL. |
2905 | | * \param f_async_cancel Callback to cancel an asynchronous operation. See |
2906 | | * the description of ::mbedtls_ssl_async_cancel_t |
2907 | | * for more information. This may be \c NULL if |
2908 | | * no cleanup is needed. |
2909 | | * \param config_data A pointer to configuration data which can be |
2910 | | * retrieved with |
2911 | | * mbedtls_ssl_conf_get_async_config_data(). The |
2912 | | * library stores this value without dereferencing it. |
2913 | | */ |
2914 | | void mbedtls_ssl_conf_async_private_cb(mbedtls_ssl_config *conf, |
2915 | | mbedtls_ssl_async_sign_t *f_async_sign, |
2916 | | mbedtls_ssl_async_decrypt_t *f_async_decrypt, |
2917 | | mbedtls_ssl_async_resume_t *f_async_resume, |
2918 | | mbedtls_ssl_async_cancel_t *f_async_cancel, |
2919 | | void *config_data); |
2920 | | |
2921 | | /** |
2922 | | * \brief Retrieve the configuration data set by |
2923 | | * mbedtls_ssl_conf_async_private_cb(). |
2924 | | * |
2925 | | * \param conf SSL configuration context |
2926 | | * \return The configuration data set by |
2927 | | * mbedtls_ssl_conf_async_private_cb(). |
2928 | | */ |
2929 | | void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf); |
2930 | | |
2931 | | /** |
2932 | | * \brief Retrieve the asynchronous operation user context. |
2933 | | * |
2934 | | * \note This function may only be called while a handshake |
2935 | | * is in progress. |
2936 | | * |
2937 | | * \param ssl The SSL context to access. |
2938 | | * |
2939 | | * \return The asynchronous operation user context that was last |
2940 | | * set during the current handshake. If |
2941 | | * mbedtls_ssl_set_async_operation_data() has not yet been |
2942 | | * called during the current handshake, this function returns |
2943 | | * \c NULL. |
2944 | | */ |
2945 | | void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl); |
2946 | | |
2947 | | /** |
2948 | | * \brief Retrieve the asynchronous operation user context. |
2949 | | * |
2950 | | * \note This function may only be called while a handshake |
2951 | | * is in progress. |
2952 | | * |
2953 | | * \param ssl The SSL context to access. |
2954 | | * \param ctx The new value of the asynchronous operation user context. |
2955 | | * Call mbedtls_ssl_get_async_operation_data() later during the |
2956 | | * same handshake to retrieve this value. |
2957 | | */ |
2958 | | void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl, |
2959 | | void *ctx); |
2960 | | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
2961 | | |
2962 | | /** |
2963 | | * \brief Callback type: generate a cookie |
2964 | | * |
2965 | | * \param ctx Context for the callback |
2966 | | * \param p Buffer to write to, |
2967 | | * must be updated to point right after the cookie |
2968 | | * \param end Pointer to one past the end of the output buffer |
2969 | | * \param info Client ID info that was passed to |
2970 | | * \c mbedtls_ssl_set_client_transport_id() |
2971 | | * \param ilen Length of info in bytes |
2972 | | * |
2973 | | * \return The callback must return 0 on success, |
2974 | | * or a negative error code. |
2975 | | */ |
2976 | | typedef int mbedtls_ssl_cookie_write_t(void *ctx, |
2977 | | unsigned char **p, unsigned char *end, |
2978 | | const unsigned char *info, size_t ilen); |
2979 | | |
2980 | | /** |
2981 | | * \brief Callback type: verify a cookie |
2982 | | * |
2983 | | * \param ctx Context for the callback |
2984 | | * \param cookie Cookie to verify |
2985 | | * \param clen Length of cookie |
2986 | | * \param info Client ID info that was passed to |
2987 | | * \c mbedtls_ssl_set_client_transport_id() |
2988 | | * \param ilen Length of info in bytes |
2989 | | * |
2990 | | * \return The callback must return 0 if cookie is valid, |
2991 | | * or a negative error code. |
2992 | | */ |
2993 | | typedef int mbedtls_ssl_cookie_check_t(void *ctx, |
2994 | | const unsigned char *cookie, size_t clen, |
2995 | | const unsigned char *info, size_t ilen); |
2996 | | |
2997 | | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
2998 | | /** |
2999 | | * \brief Register callbacks for DTLS cookies |
3000 | | * (Server only. DTLS only.) |
3001 | | * |
3002 | | * Default: dummy callbacks that fail, in order to force you to |
3003 | | * register working callbacks (and initialize their context). |
3004 | | * |
3005 | | * To disable HelloVerifyRequest, register NULL callbacks. |
3006 | | * |
3007 | | * \warning Disabling hello verification allows your server to be used |
3008 | | * for amplification in DoS attacks against other hosts. |
3009 | | * Only disable if you known this can't happen in your |
3010 | | * particular environment. |
3011 | | * |
3012 | | * \note See comments on \c mbedtls_ssl_handshake() about handling |
3013 | | * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected |
3014 | | * on the first handshake attempt when this is enabled. |
3015 | | * |
3016 | | * \note This is also necessary to handle client reconnection from |
3017 | | * the same port as described in RFC 6347 section 4.2.8 (only |
3018 | | * the variant with cookies is supported currently). See |
3019 | | * comments on \c mbedtls_ssl_read() for details. |
3020 | | * |
3021 | | * \param conf SSL configuration |
3022 | | * \param f_cookie_write Cookie write callback |
3023 | | * \param f_cookie_check Cookie check callback |
3024 | | * \param p_cookie Context for both callbacks |
3025 | | */ |
3026 | | void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf, |
3027 | | mbedtls_ssl_cookie_write_t *f_cookie_write, |
3028 | | mbedtls_ssl_cookie_check_t *f_cookie_check, |
3029 | | void *p_cookie); |
3030 | | |
3031 | | /** |
3032 | | * \brief Set client's transport-level identification info. |
3033 | | * (Server only. DTLS only.) |
3034 | | * |
3035 | | * This is usually the IP address (and port), but could be |
3036 | | * anything identify the client depending on the underlying |
3037 | | * network stack. Used for HelloVerifyRequest with DTLS. |
3038 | | * This is *not* used to route the actual packets. |
3039 | | * |
3040 | | * \param ssl SSL context |
3041 | | * \param info Transport-level info identifying the client (eg IP + port) |
3042 | | * \param ilen Length of info in bytes |
3043 | | * |
3044 | | * \note An internal copy is made, so the info buffer can be reused. |
3045 | | * |
3046 | | * \return 0 on success, |
3047 | | * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, |
3048 | | * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. |
3049 | | */ |
3050 | | int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl, |
3051 | | const unsigned char *info, |
3052 | | size_t ilen); |
3053 | | |
3054 | | #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ |
3055 | | |
3056 | | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
3057 | | /** |
3058 | | * \brief Enable or disable anti-replay protection for DTLS. |
3059 | | * (DTLS only, no effect on TLS.) |
3060 | | * Default: enabled. |
3061 | | * |
3062 | | * \param conf SSL configuration |
3063 | | * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. |
3064 | | * |
3065 | | * \warning Disabling this is a security risk unless the application |
3066 | | * protocol handles duplicated packets in a safe way. You |
3067 | | * should not disable this without careful consideration. |
3068 | | * However, if your application already detects duplicated |
3069 | | * packets and needs information about them to adjust its |
3070 | | * transmission strategy, then you'll want to disable this. |
3071 | | */ |
3072 | | void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode); |
3073 | | #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ |
3074 | | |
3075 | | /** |
3076 | | * \brief Set a limit on the number of records with a bad MAC |
3077 | | * before terminating the connection. |
3078 | | * (DTLS only, no effect on TLS.) |
3079 | | * Default: 0 (disabled). |
3080 | | * |
3081 | | * \param conf SSL configuration |
3082 | | * \param limit Limit, or 0 to disable. |
3083 | | * |
3084 | | * \note If the limit is N, then the connection is terminated when |
3085 | | * the Nth non-authentic record is seen. |
3086 | | * |
3087 | | * \note Records with an invalid header are not counted, only the |
3088 | | * ones going through the authentication-decryption phase. |
3089 | | * |
3090 | | * \note This is a security trade-off related to the fact that it's |
3091 | | * often relatively easy for an active attacker to inject UDP |
3092 | | * datagrams. On one hand, setting a low limit here makes it |
3093 | | * easier for such an attacker to forcibly terminated a |
3094 | | * connection. On the other hand, a high limit or no limit |
3095 | | * might make us waste resources checking authentication on |
3096 | | * many bogus packets. |
3097 | | */ |
3098 | | void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf, unsigned limit); |
3099 | | |
3100 | | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
3101 | | |
3102 | | /** |
3103 | | * \brief Allow or disallow packing of multiple handshake records |
3104 | | * within a single datagram. |
3105 | | * |
3106 | | * \param ssl The SSL context to configure. |
3107 | | * \param allow_packing This determines whether datagram packing may |
3108 | | * be used or not. A value of \c 0 means that every |
3109 | | * record will be sent in a separate datagram; a |
3110 | | * value of \c 1 means that, if space permits, |
3111 | | * multiple handshake messages (including CCS) belonging to |
3112 | | * a single flight may be packed within a single datagram. |
3113 | | * |
3114 | | * \note This is enabled by default and should only be disabled |
3115 | | * for test purposes, or if datagram packing causes |
3116 | | * interoperability issues with peers that don't support it. |
3117 | | * |
3118 | | * \note Allowing datagram packing reduces the network load since |
3119 | | * there's less overhead if multiple messages share the same |
3120 | | * datagram. Also, it increases the handshake efficiency |
3121 | | * since messages belonging to a single datagram will not |
3122 | | * be reordered in transit, and so future message buffering |
3123 | | * or flight retransmission (if no buffering is used) as |
3124 | | * means to deal with reordering are needed less frequently. |
3125 | | * |
3126 | | * \note Application records are not affected by this option and |
3127 | | * are currently always sent in separate datagrams. |
3128 | | * |
3129 | | */ |
3130 | | void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl, |
3131 | | unsigned allow_packing); |
3132 | | |
3133 | | /** |
3134 | | * \brief Set retransmit timeout values for the DTLS handshake. |
3135 | | * (DTLS only, no effect on TLS.) |
3136 | | * |
3137 | | * \param conf SSL configuration |
3138 | | * \param min Initial timeout value in milliseconds. |
3139 | | * Default: 1000 (1 second). |
3140 | | * \param max Maximum timeout value in milliseconds. |
3141 | | * Default: 60000 (60 seconds). |
3142 | | * |
3143 | | * \note Default values are from RFC 6347 section 4.2.4.1. |
3144 | | * |
3145 | | * \note The 'min' value should typically be slightly above the |
3146 | | * expected round-trip time to your peer, plus whatever time |
3147 | | * it takes for the peer to process the message. For example, |
3148 | | * if your RTT is about 600ms and you peer needs up to 1s to |
3149 | | * do the cryptographic operations in the handshake, then you |
3150 | | * should set 'min' slightly above 1600. Lower values of 'min' |
3151 | | * might cause spurious resends which waste network resources, |
3152 | | * while larger value of 'min' will increase overall latency |
3153 | | * on unreliable network links. |
3154 | | * |
3155 | | * \note The more unreliable your network connection is, the larger |
3156 | | * your max / min ratio needs to be in order to achieve |
3157 | | * reliable handshakes. |
3158 | | * |
3159 | | * \note Messages are retransmitted up to log2(ceil(max/min)) times. |
3160 | | * For example, if min = 1s and max = 5s, the retransmit plan |
3161 | | * goes: send ... 1s -> resend ... 2s -> resend ... 4s -> |
3162 | | * resend ... 5s -> give up and return a timeout error. |
3163 | | */ |
3164 | | void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf, uint32_t min, uint32_t max); |
3165 | | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
3166 | | |
3167 | | #if defined(MBEDTLS_SSL_SRV_C) |
3168 | | /** |
3169 | | * \brief Set the session cache callbacks (server-side only) |
3170 | | * If not set, no session resuming is done (except if session |
3171 | | * tickets are enabled too). |
3172 | | * |
3173 | | * The session cache has the responsibility to check for stale |
3174 | | * entries based on timeout. See RFC 5246 for recommendations. |
3175 | | * |
3176 | | * Warning: session.peer_cert is cleared by the SSL/TLS layer on |
3177 | | * connection shutdown, so do not cache the pointer! Either set |
3178 | | * it to NULL or make a full copy of the certificate. |
3179 | | * |
3180 | | * The get callback is called once during the initial handshake |
3181 | | * to enable session resuming. The get function has the |
3182 | | * following parameters: (void *parameter, mbedtls_ssl_session *session) |
3183 | | * If a valid entry is found, it should fill the master of |
3184 | | * the session object with the cached values and return 0, |
3185 | | * return 1 otherwise. Optionally peer_cert can be set as well |
3186 | | * if it is properly present in cache entry. |
3187 | | * |
3188 | | * The set callback is called once during the initial handshake |
3189 | | * to enable session resuming after the entire handshake has |
3190 | | * been finished. The set function has the following parameters: |
3191 | | * (void *parameter, const mbedtls_ssl_session *session). The function |
3192 | | * should create a cache entry for future retrieval based on |
3193 | | * the data in the session structure and should keep in mind |
3194 | | * that the mbedtls_ssl_session object presented (and all its referenced |
3195 | | * data) is cleared by the SSL/TLS layer when the connection is |
3196 | | * terminated. It is recommended to add metadata to determine if |
3197 | | * an entry is still valid in the future. Return 0 if |
3198 | | * successfully cached, return 1 otherwise. |
3199 | | * |
3200 | | * \param conf SSL configuration |
3201 | | * \param p_cache parameter (context) for both callbacks |
3202 | | * \param f_get_cache session get callback |
3203 | | * \param f_set_cache session set callback |
3204 | | */ |
3205 | | void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf, |
3206 | | void *p_cache, |
3207 | | mbedtls_ssl_cache_get_t *f_get_cache, |
3208 | | mbedtls_ssl_cache_set_t *f_set_cache); |
3209 | | #endif /* MBEDTLS_SSL_SRV_C */ |
3210 | | |
3211 | | #if defined(MBEDTLS_SSL_CLI_C) |
3212 | | /** |
3213 | | * \brief Load a session for session resumption. |
3214 | | * |
3215 | | * Sessions loaded through this call will be considered |
3216 | | * for session resumption in the next handshake. |
3217 | | * |
3218 | | * \note Even if this call succeeds, it is not guaranteed that |
3219 | | * the next handshake will indeed be shortened through the |
3220 | | * use of session resumption: The server is always free |
3221 | | * to reject any attempt for resumption and fall back to |
3222 | | * a full handshake. |
3223 | | * |
3224 | | * \note This function can handle a variety of mechanisms for session |
3225 | | * resumption: For TLS 1.2, both session ID-based resumption |
3226 | | * and ticket-based resumption will be considered. For TLS 1.3, |
3227 | | * sessions equate to tickets, and loading one session by |
3228 | | * calling this function will lead to its corresponding ticket |
3229 | | * being advertised as resumption PSK by the client. This |
3230 | | * depends on session tickets being enabled (see |
3231 | | * #MBEDTLS_SSL_SESSION_TICKETS configuration option) though. |
3232 | | * If session tickets are disabled, a call to this function |
3233 | | * with a TLS 1.3 session, will not have any effect on the next |
3234 | | * handshake for the SSL context \p ssl. |
3235 | | * |
3236 | | * \param ssl The SSL context representing the connection which should |
3237 | | * be attempted to be setup using session resumption. This |
3238 | | * must be initialized via mbedtls_ssl_init() and bound to |
3239 | | * an SSL configuration via mbedtls_ssl_setup(), but |
3240 | | * the handshake must not yet have been started. |
3241 | | * \param session The session to be considered for session resumption. |
3242 | | * This must be a session previously exported via |
3243 | | * mbedtls_ssl_get_session(), and potentially serialized and |
3244 | | * deserialized through mbedtls_ssl_session_save() and |
3245 | | * mbedtls_ssl_session_load() in the meantime. |
3246 | | * |
3247 | | * \return \c 0 if successful. |
3248 | | * \return \c MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if the session |
3249 | | * could not be loaded because one session has already been |
3250 | | * loaded. This error is non-fatal, and has no observable |
3251 | | * effect on the SSL context or the session that was attempted |
3252 | | * to be loaded. |
3253 | | * \return Another negative error code on other kinds of failure. |
3254 | | * |
3255 | | * \sa mbedtls_ssl_get_session() |
3256 | | * \sa mbedtls_ssl_session_load() |
3257 | | */ |
3258 | | int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session); |
3259 | | #endif /* MBEDTLS_SSL_CLI_C */ |
3260 | | |
3261 | | /** |
3262 | | * \brief Load serialized session data into a session structure. |
3263 | | * On client, this can be used for loading saved sessions |
3264 | | * before resuming them with mbedtls_ssl_set_session(). |
3265 | | * On server, this can be used for alternative implementations |
3266 | | * of session cache or session tickets. |
3267 | | * |
3268 | | * \warning If a peer certificate chain is associated with the session, |
3269 | | * the serialized state will only contain the peer's |
3270 | | * end-entity certificate and the result of the chain |
3271 | | * verification (unless verification was disabled), but not |
3272 | | * the rest of the chain. |
3273 | | * |
3274 | | * \see mbedtls_ssl_session_save() |
3275 | | * \see mbedtls_ssl_set_session() |
3276 | | * |
3277 | | * \param session The session structure to be populated. It must have been |
3278 | | * initialised with mbedtls_ssl_session_init() but not |
3279 | | * populated yet. |
3280 | | * \param buf The buffer holding the serialized session data. It must be a |
3281 | | * readable buffer of at least \p len bytes. |
3282 | | * \param len The size of the serialized data in bytes. |
3283 | | * |
3284 | | * \return \c 0 if successful. |
3285 | | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. |
3286 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. |
3287 | | * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data |
3288 | | * was generated in a different version or configuration of |
3289 | | * Mbed TLS. |
3290 | | * \return Another negative value for other kinds of errors (for |
3291 | | * example, unsupported features in the embedded certificate). |
3292 | | */ |
3293 | | int mbedtls_ssl_session_load(mbedtls_ssl_session *session, |
3294 | | const unsigned char *buf, |
3295 | | size_t len); |
3296 | | |
3297 | | /** |
3298 | | * \brief Save session structure as serialized data in a buffer. |
3299 | | * On client, this can be used for saving session data, |
3300 | | * potentially in non-volatile storage, for resuming later. |
3301 | | * On server, this can be used for alternative implementations |
3302 | | * of session cache or session tickets. |
3303 | | * |
3304 | | * \see mbedtls_ssl_session_load() |
3305 | | * |
3306 | | * \param session The session structure to be saved. |
3307 | | * \param buf The buffer to write the serialized data to. It must be a |
3308 | | * writeable buffer of at least \p buf_len bytes, or may be \c |
3309 | | * NULL if \p buf_len is \c 0. |
3310 | | * \param buf_len The number of bytes available for writing in \p buf. |
3311 | | * \param olen The size in bytes of the data that has been or would have |
3312 | | * been written. It must point to a valid \c size_t. |
3313 | | * |
3314 | | * \note \p olen is updated to the correct value regardless of |
3315 | | * whether \p buf_len was large enough. This makes it possible |
3316 | | * to determine the necessary size by calling this function |
3317 | | * with \p buf set to \c NULL and \p buf_len to \c 0. |
3318 | | * |
3319 | | * \note For TLS 1.3 sessions, this feature is supported only if the |
3320 | | * MBEDTLS_SSL_SESSION_TICKETS configuration option is enabled, |
3321 | | * as in TLS 1.3 session resumption is possible only with |
3322 | | * tickets. |
3323 | | * |
3324 | | * \return \c 0 if successful. |
3325 | | * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. |
3326 | | * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if the |
3327 | | * MBEDTLS_SSL_SESSION_TICKETS configuration option is disabled |
3328 | | * and the session is a TLS 1.3 session. |
3329 | | */ |
3330 | | int mbedtls_ssl_session_save(const mbedtls_ssl_session *session, |
3331 | | unsigned char *buf, |
3332 | | size_t buf_len, |
3333 | | size_t *olen); |
3334 | | |
3335 | | /** |
3336 | | * \brief Set the list of allowed ciphersuites and the preference |
3337 | | * order. First in the list has the highest preference. |
3338 | | * |
3339 | | * For TLS 1.2, the notion of ciphersuite determines both |
3340 | | * the key exchange mechanism and the suite of symmetric |
3341 | | * algorithms to be used during and after the handshake. |
3342 | | * |
3343 | | * For TLS 1.3 (in development), the notion of ciphersuite |
3344 | | * only determines the suite of symmetric algorithms to be |
3345 | | * used during and after the handshake, while key exchange |
3346 | | * mechanisms are configured separately. |
3347 | | * |
3348 | | * In Mbed TLS, ciphersuites for both TLS 1.2 and TLS 1.3 |
3349 | | * are configured via this function. For users of TLS 1.3, |
3350 | | * there will be separate API for the configuration of key |
3351 | | * exchange mechanisms. |
3352 | | * |
3353 | | * The list of ciphersuites passed to this function may |
3354 | | * contain a mixture of TLS 1.2 and TLS 1.3 ciphersuite |
3355 | | * identifiers. This is useful if negotiation of TLS 1.3 |
3356 | | * should be attempted, but a fallback to TLS 1.2 would |
3357 | | * be tolerated. |
3358 | | * |
3359 | | * \note By default, the server chooses its preferred |
3360 | | * ciphersuite among those that the client supports. If |
3361 | | * mbedtls_ssl_conf_preference_order() is called to prefer |
3362 | | * the client's preferences, the server instead chooses |
3363 | | * the client's preferred ciphersuite among those that |
3364 | | * the server supports. |
3365 | | * |
3366 | | * \warning The ciphersuites array \p ciphersuites is not copied. |
3367 | | * It must remain valid for the lifetime of the SSL |
3368 | | * configuration \p conf. |
3369 | | * |
3370 | | * \param conf The SSL configuration to modify. |
3371 | | * \param ciphersuites A 0-terminated list of IANA identifiers of supported |
3372 | | * ciphersuites, accessible through \c MBEDTLS_TLS_XXX |
3373 | | * and \c MBEDTLS_TLS1_3_XXX macros defined in |
3374 | | * ssl_ciphersuites.h. |
3375 | | */ |
3376 | | void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf, |
3377 | | const int *ciphersuites); |
3378 | | |
3379 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
3380 | | /** |
3381 | | * \brief Set the supported key exchange modes for TLS 1.3 connections. |
3382 | | * |
3383 | | * In contrast to TLS 1.2, the ciphersuite concept in TLS 1.3 does not |
3384 | | * include the choice of key exchange mechanism. It is therefore not |
3385 | | * covered by the API mbedtls_ssl_conf_ciphersuites(). See the |
3386 | | * documentation of mbedtls_ssl_conf_ciphersuites() for more |
3387 | | * information on the ciphersuite concept in TLS 1.2 and TLS 1.3. |
3388 | | * |
3389 | | * The present function is specific to TLS 1.3 and allows users to |
3390 | | * configure the set of supported key exchange mechanisms in TLS 1.3. |
3391 | | * |
3392 | | * \param conf The SSL configuration the change should apply to. |
3393 | | * \param kex_modes A bitwise combination of one or more of the following: |
3394 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK |
3395 | | * This flag enables pure-PSK key exchanges. |
3396 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL |
3397 | | * This flag enables combined PSK-ephemeral key exchanges. |
3398 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL |
3399 | | * This flag enables pure-ephemeral key exchanges. |
3400 | | * For convenience, the following pre-defined macros are |
3401 | | * available for combinations of the above: |
3402 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL |
3403 | | * Includes all of pure-PSK, PSK-ephemeral and pure-ephemeral. |
3404 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL |
3405 | | * Includes both pure-PSK and combined PSK-ephemeral |
3406 | | * key exchanges, but excludes pure-ephemeral key exchanges. |
3407 | | * - MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL |
3408 | | * Includes both pure-ephemeral and combined PSK-ephemeral |
3409 | | * key exchanges. |
3410 | | * |
3411 | | * \note If a PSK-based key exchange mode shall be supported, applications |
3412 | | * must also use the APIs mbedtls_ssl_conf_psk() or |
3413 | | * mbedtls_ssl_conf_psk_cb() or mbedtls_ssl_conf_psk_opaque() |
3414 | | * to configure the PSKs to be used. |
3415 | | * |
3416 | | * \note If a pure-ephemeral key exchange mode shall be supported, |
3417 | | * server-side applications must also provide a certificate via |
3418 | | * mbedtls_ssl_conf_own_cert(). |
3419 | | * |
3420 | | */ |
3421 | | |
3422 | | void mbedtls_ssl_conf_tls13_key_exchange_modes(mbedtls_ssl_config *conf, |
3423 | | const int kex_modes); |
3424 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ |
3425 | | |
3426 | | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
3427 | | #define MBEDTLS_SSL_UNEXPECTED_CID_IGNORE 0 |
3428 | | #define MBEDTLS_SSL_UNEXPECTED_CID_FAIL 1 |
3429 | | /** |
3430 | | * \brief Specify the length of Connection IDs for incoming |
3431 | | * encrypted DTLS records, as well as the behaviour |
3432 | | * on unexpected CIDs. |
3433 | | * |
3434 | | * By default, the CID length is set to \c 0, |
3435 | | * and unexpected CIDs are silently ignored. |
3436 | | * |
3437 | | * \param conf The SSL configuration to modify. |
3438 | | * \param len The length in Bytes of the CID fields in encrypted |
3439 | | * DTLS records using the CID mechanism. This must |
3440 | | * not be larger than #MBEDTLS_SSL_CID_OUT_LEN_MAX. |
3441 | | * \param ignore_other_cids This determines the stack's behaviour when |
3442 | | * receiving a record with an unexpected CID. |
3443 | | * Possible values are: |
3444 | | * - #MBEDTLS_SSL_UNEXPECTED_CID_IGNORE |
3445 | | * In this case, the record is silently ignored. |
3446 | | * - #MBEDTLS_SSL_UNEXPECTED_CID_FAIL |
3447 | | * In this case, the stack fails with the specific |
3448 | | * error code #MBEDTLS_ERR_SSL_UNEXPECTED_CID. |
3449 | | * |
3450 | | * \note The CID specification allows implementations to either |
3451 | | * use a common length for all incoming connection IDs or |
3452 | | * allow variable-length incoming IDs. Mbed TLS currently |
3453 | | * requires a common length for all connections sharing the |
3454 | | * same SSL configuration; this allows simpler parsing of |
3455 | | * record headers. |
3456 | | * |
3457 | | * \return \c 0 on success. |
3458 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if \p len |
3459 | | * is too large. |
3460 | | */ |
3461 | | int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf, size_t len, |
3462 | | int ignore_other_cids); |
3463 | | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
3464 | | |
3465 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
3466 | | /** |
3467 | | * \brief Set the X.509 security profile used for verification |
3468 | | * |
3469 | | * \note The restrictions are enforced for all certificates in the |
3470 | | * chain. However, signatures in the handshake are not covered |
3471 | | * by this setting but by \b mbedtls_ssl_conf_sig_hashes(). |
3472 | | * |
3473 | | * \param conf SSL configuration |
3474 | | * \param profile Profile to use |
3475 | | */ |
3476 | | void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf, |
3477 | | const mbedtls_x509_crt_profile *profile); |
3478 | | |
3479 | | /** |
3480 | | * \brief Set the data required to verify peer certificate |
3481 | | * |
3482 | | * \note See \c mbedtls_x509_crt_verify() for notes regarding the |
3483 | | * parameters ca_chain (maps to trust_ca for that function) |
3484 | | * and ca_crl. |
3485 | | * |
3486 | | * \param conf SSL configuration |
3487 | | * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) |
3488 | | * \param ca_crl trusted CA CRLs |
3489 | | */ |
3490 | | void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf, |
3491 | | mbedtls_x509_crt *ca_chain, |
3492 | | mbedtls_x509_crl *ca_crl); |
3493 | | |
3494 | | #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) |
3495 | | /** |
3496 | | * \brief Set DN hints sent to client in CertificateRequest message |
3497 | | * |
3498 | | * \note If not set, subject distinguished names (DNs) are taken |
3499 | | * from \c mbedtls_ssl_conf_ca_chain() |
3500 | | * or \c mbedtls_ssl_set_hs_ca_chain()) |
3501 | | * |
3502 | | * \param conf SSL configuration |
3503 | | * \param crt crt chain whose subject DNs are issuer DNs of client certs |
3504 | | * from which the client should select client peer certificate. |
3505 | | */ |
3506 | | static inline |
3507 | | void mbedtls_ssl_conf_dn_hints(mbedtls_ssl_config *conf, |
3508 | | const mbedtls_x509_crt *crt) |
3509 | 0 | { |
3510 | 0 | conf->MBEDTLS_PRIVATE(dn_hints) = crt; |
3511 | 0 | } |
3512 | | #endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ |
3513 | | |
3514 | | #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) |
3515 | | /** |
3516 | | * \brief Set the trusted certificate callback. |
3517 | | * |
3518 | | * This API allows to register the set of trusted certificates |
3519 | | * through a callback, instead of a linked list as configured |
3520 | | * by mbedtls_ssl_conf_ca_chain(). |
3521 | | * |
3522 | | * This is useful for example in contexts where a large number |
3523 | | * of CAs are used, and the inefficiency of maintaining them |
3524 | | * in a linked list cannot be tolerated. It is also useful when |
3525 | | * the set of trusted CAs needs to be modified frequently. |
3526 | | * |
3527 | | * See the documentation of `mbedtls_x509_crt_ca_cb_t` for |
3528 | | * more information. |
3529 | | * |
3530 | | * \param conf The SSL configuration to register the callback with. |
3531 | | * \param f_ca_cb The trusted certificate callback to use when verifying |
3532 | | * certificate chains. |
3533 | | * \param p_ca_cb The context to be passed to \p f_ca_cb (for example, |
3534 | | * a reference to a trusted CA database). |
3535 | | * |
3536 | | * \note This API is incompatible with mbedtls_ssl_conf_ca_chain(): |
3537 | | * Any call to this function overwrites the values set through |
3538 | | * earlier calls to mbedtls_ssl_conf_ca_chain() or |
3539 | | * mbedtls_ssl_conf_ca_cb(). |
3540 | | * |
3541 | | * \note This API is incompatible with CA indication in |
3542 | | * CertificateRequest messages: A server-side SSL context which |
3543 | | * is bound to an SSL configuration that uses a CA callback |
3544 | | * configured via mbedtls_ssl_conf_ca_cb(), and which requires |
3545 | | * client authentication, will send an empty CA list in the |
3546 | | * corresponding CertificateRequest message. |
3547 | | * |
3548 | | * \note This API is incompatible with mbedtls_ssl_set_hs_ca_chain(): |
3549 | | * If an SSL context is bound to an SSL configuration which uses |
3550 | | * CA callbacks configured via mbedtls_ssl_conf_ca_cb(), then |
3551 | | * calls to mbedtls_ssl_set_hs_ca_chain() have no effect. |
3552 | | * |
3553 | | * \note The use of this API disables the use of restartable ECC |
3554 | | * during X.509 CRT signature verification (but doesn't affect |
3555 | | * other uses). |
3556 | | * |
3557 | | * \warning This API is incompatible with the use of CRLs. Any call to |
3558 | | * mbedtls_ssl_conf_ca_cb() unsets CRLs configured through |
3559 | | * earlier calls to mbedtls_ssl_conf_ca_chain(). |
3560 | | * |
3561 | | * \warning In multi-threaded environments, the callback \p f_ca_cb |
3562 | | * must be thread-safe, and it is the user's responsibility |
3563 | | * to guarantee this (for example through a mutex |
3564 | | * contained in the callback context pointed to by \p p_ca_cb). |
3565 | | */ |
3566 | | void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf, |
3567 | | mbedtls_x509_crt_ca_cb_t f_ca_cb, |
3568 | | void *p_ca_cb); |
3569 | | #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ |
3570 | | |
3571 | | /** |
3572 | | * \brief Set own certificate chain and private key |
3573 | | * |
3574 | | * \note own_cert should contain in order from the bottom up your |
3575 | | * certificate chain. The top certificate (self-signed) |
3576 | | * can be omitted. |
3577 | | * |
3578 | | * \note On server, this function can be called multiple times to |
3579 | | * provision more than one cert/key pair (eg one ECDSA, one |
3580 | | * RSA with SHA-256, one RSA with SHA-1). An adequate |
3581 | | * certificate will be selected according to the client's |
3582 | | * advertised capabilities. In case multiple certificates are |
3583 | | * adequate, preference is given to the one set by the first |
3584 | | * call to this function, then second, etc. |
3585 | | * |
3586 | | * \note On client, only the first call has any effect. That is, |
3587 | | * only one client certificate can be provisioned. The |
3588 | | * server's preferences in its CertificateRequest message will |
3589 | | * be ignored and our only cert will be sent regardless of |
3590 | | * whether it matches those preferences - the server can then |
3591 | | * decide what it wants to do with it. |
3592 | | * |
3593 | | * \note The provided \p pk_key needs to match the public key in the |
3594 | | * first certificate in \p own_cert, or all handshakes using |
3595 | | * that certificate will fail. It is your responsibility |
3596 | | * to ensure that; this function will not perform any check. |
3597 | | * You may use mbedtls_pk_check_pair() in order to perform |
3598 | | * this check yourself, but be aware that this function can |
3599 | | * be computationally expensive on some key types. |
3600 | | * |
3601 | | * \param conf SSL configuration |
3602 | | * \param own_cert own public certificate chain |
3603 | | * \param pk_key own private key |
3604 | | * |
3605 | | * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED |
3606 | | */ |
3607 | | int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf, |
3608 | | mbedtls_x509_crt *own_cert, |
3609 | | mbedtls_pk_context *pk_key); |
3610 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
3611 | | |
3612 | | #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED) |
3613 | | /** |
3614 | | * \brief Configure pre-shared keys (PSKs) and their |
3615 | | * identities to be used in PSK-based ciphersuites. |
3616 | | * |
3617 | | * Only one PSK can be registered, through either |
3618 | | * mbedtls_ssl_conf_psk() or mbedtls_ssl_conf_psk_opaque(). |
3619 | | * If you attempt to register more than one PSK, this function |
3620 | | * fails, though this may change in future versions, which |
3621 | | * may add support for multiple PSKs. |
3622 | | * |
3623 | | * \note This is mainly useful for clients. Servers will usually |
3624 | | * want to use \c mbedtls_ssl_conf_psk_cb() instead. |
3625 | | * |
3626 | | * \note A PSK set by \c mbedtls_ssl_set_hs_psk() in the PSK callback |
3627 | | * takes precedence over a PSK configured by this function. |
3628 | | * |
3629 | | * \param conf The SSL configuration to register the PSK with. |
3630 | | * \param psk The pointer to the pre-shared key to use. |
3631 | | * \param psk_len The length of the pre-shared key in bytes. |
3632 | | * \param psk_identity The pointer to the pre-shared key identity. |
3633 | | * \param psk_identity_len The length of the pre-shared key identity |
3634 | | * in bytes. |
3635 | | * |
3636 | | * \note The PSK and its identity are copied internally and |
3637 | | * hence need not be preserved by the caller for the lifetime |
3638 | | * of the SSL configuration. |
3639 | | * |
3640 | | * \return \c 0 if successful. |
3641 | | * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if no more PSKs |
3642 | | * can be configured. In this case, the old PSK(s) remain intact. |
3643 | | * \return Another negative error code on other kinds of failure. |
3644 | | */ |
3645 | | int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf, |
3646 | | const unsigned char *psk, size_t psk_len, |
3647 | | const unsigned char *psk_identity, size_t psk_identity_len); |
3648 | | |
3649 | | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
3650 | | /** |
3651 | | * \brief Configure one or more opaque pre-shared keys (PSKs) and |
3652 | | * their identities to be used in PSK-based ciphersuites. |
3653 | | * |
3654 | | * Only one PSK can be registered, through either |
3655 | | * mbedtls_ssl_conf_psk() or mbedtls_ssl_conf_psk_opaque(). |
3656 | | * If you attempt to register more than one PSK, this function |
3657 | | * fails, though this may change in future versions, which |
3658 | | * may add support for multiple PSKs. |
3659 | | * |
3660 | | * \note This is mainly useful for clients. Servers will usually |
3661 | | * want to use \c mbedtls_ssl_conf_psk_cb() instead. |
3662 | | * |
3663 | | * \note An opaque PSK set by \c mbedtls_ssl_set_hs_psk_opaque() in |
3664 | | * the PSK callback takes precedence over an opaque PSK |
3665 | | * configured by this function. |
3666 | | * |
3667 | | * \param conf The SSL configuration to register the PSK with. |
3668 | | * \param psk The identifier of the key slot holding the PSK. |
3669 | | * Until \p conf is destroyed or this function is successfully |
3670 | | * called again, the key slot \p psk must be populated with a |
3671 | | * key of type PSA_ALG_CATEGORY_KEY_DERIVATION whose policy |
3672 | | * allows its use for the key derivation algorithm applied |
3673 | | * in the handshake. |
3674 | | * \param psk_identity The pointer to the pre-shared key identity. |
3675 | | * \param psk_identity_len The length of the pre-shared key identity |
3676 | | * in bytes. |
3677 | | * |
3678 | | * \note The PSK identity hint is copied internally and hence need |
3679 | | * not be preserved by the caller for the lifetime of the |
3680 | | * SSL configuration. |
3681 | | * |
3682 | | * \return \c 0 if successful. |
3683 | | * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if no more PSKs |
3684 | | * can be configured. In this case, the old PSK(s) remain intact. |
3685 | | * \return Another negative error code on other kinds of failure. |
3686 | | */ |
3687 | | int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf, |
3688 | | mbedtls_svc_key_id_t psk, |
3689 | | const unsigned char *psk_identity, |
3690 | | size_t psk_identity_len); |
3691 | | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
3692 | | |
3693 | | /** |
3694 | | * \brief Set the pre-shared Key (PSK) for the current handshake. |
3695 | | * |
3696 | | * \note This should only be called inside the PSK callback, |
3697 | | * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). |
3698 | | * |
3699 | | * \note A PSK set by this function takes precedence over a PSK |
3700 | | * configured by \c mbedtls_ssl_conf_psk(). |
3701 | | * |
3702 | | * \param ssl The SSL context to configure a PSK for. |
3703 | | * \param psk The pointer to the pre-shared key. |
3704 | | * \param psk_len The length of the pre-shared key in bytes. |
3705 | | * |
3706 | | * \return \c 0 if successful. |
3707 | | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
3708 | | */ |
3709 | | int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl, |
3710 | | const unsigned char *psk, size_t psk_len); |
3711 | | |
3712 | | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
3713 | | /** |
3714 | | * \brief Set an opaque pre-shared Key (PSK) for the current handshake. |
3715 | | * |
3716 | | * \note This should only be called inside the PSK callback, |
3717 | | * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). |
3718 | | * |
3719 | | * \note An opaque PSK set by this function takes precedence over an |
3720 | | * opaque PSK configured by \c mbedtls_ssl_conf_psk_opaque(). |
3721 | | * |
3722 | | * \param ssl The SSL context to configure a PSK for. |
3723 | | * \param psk The identifier of the key slot holding the PSK. |
3724 | | * For the duration of the current handshake, the key slot |
3725 | | * must be populated with a key of type |
3726 | | * PSA_ALG_CATEGORY_KEY_DERIVATION whose policy allows its |
3727 | | * use for the key derivation algorithm |
3728 | | * applied in the handshake. |
3729 | | * |
3730 | | * \return \c 0 if successful. |
3731 | | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
3732 | | */ |
3733 | | int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl, |
3734 | | mbedtls_svc_key_id_t psk); |
3735 | | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
3736 | | |
3737 | | #if defined(MBEDTLS_SSL_SRV_C) |
3738 | | /** |
3739 | | * \brief Set the PSK callback (server-side only). |
3740 | | * |
3741 | | * If set, the PSK callback is called for each |
3742 | | * handshake where a PSK-based ciphersuite was negotiated. |
3743 | | * The caller provides the identity received and wants to |
3744 | | * receive the actual PSK data and length. |
3745 | | * |
3746 | | * The callback has the following parameters: |
3747 | | * - \c void*: The opaque pointer \p p_psk. |
3748 | | * - \c mbedtls_ssl_context*: The SSL context to which |
3749 | | * the operation applies. |
3750 | | * - \c const unsigned char*: The PSK identity |
3751 | | * selected by the client. |
3752 | | * - \c size_t: The length of the PSK identity |
3753 | | * selected by the client. |
3754 | | * |
3755 | | * If a valid PSK identity is found, the callback should use |
3756 | | * \c mbedtls_ssl_set_hs_psk() or |
3757 | | * \c mbedtls_ssl_set_hs_psk_opaque() |
3758 | | * on the SSL context to set the correct PSK and return \c 0. |
3759 | | * Any other return value will result in a denied PSK identity. |
3760 | | * |
3761 | | * \note A dynamic PSK (i.e. set by the PSK callback) takes |
3762 | | * precedence over a static PSK (i.e. set by |
3763 | | * \c mbedtls_ssl_conf_psk() or |
3764 | | * \c mbedtls_ssl_conf_psk_opaque()). |
3765 | | * This means that if you set a PSK callback using this |
3766 | | * function, you don't need to set a PSK using |
3767 | | * \c mbedtls_ssl_conf_psk() or |
3768 | | * \c mbedtls_ssl_conf_psk_opaque()). |
3769 | | * |
3770 | | * \param conf The SSL configuration to register the callback with. |
3771 | | * \param f_psk The callback for selecting and setting the PSK based |
3772 | | * in the PSK identity chosen by the client. |
3773 | | * \param p_psk A pointer to an opaque structure to be passed to |
3774 | | * the callback, for example a PSK store. |
3775 | | */ |
3776 | | void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, |
3777 | | int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, |
3778 | | size_t), |
3779 | | void *p_psk); |
3780 | | #endif /* MBEDTLS_SSL_SRV_C */ |
3781 | | #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ |
3782 | | |
3783 | | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) |
3784 | | /** |
3785 | | * \brief Set the Diffie-Hellman public P and G values |
3786 | | * from big-endian binary presentations. |
3787 | | * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN) |
3788 | | * |
3789 | | * \param conf SSL configuration |
3790 | | * \param dhm_P Diffie-Hellman-Merkle modulus in big-endian binary form |
3791 | | * \param P_len Length of DHM modulus |
3792 | | * \param dhm_G Diffie-Hellman-Merkle generator in big-endian binary form |
3793 | | * \param G_len Length of DHM generator |
3794 | | * |
3795 | | * \return 0 if successful |
3796 | | */ |
3797 | | int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf, |
3798 | | const unsigned char *dhm_P, size_t P_len, |
3799 | | const unsigned char *dhm_G, size_t G_len); |
3800 | | |
3801 | | /** |
3802 | | * \brief Set the Diffie-Hellman public P and G values, |
3803 | | * read from existing context (server-side only) |
3804 | | * |
3805 | | * \param conf SSL configuration |
3806 | | * \param dhm_ctx Diffie-Hellman-Merkle context |
3807 | | * |
3808 | | * \return 0 if successful |
3809 | | */ |
3810 | | int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx); |
3811 | | #endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ |
3812 | | |
3813 | | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) |
3814 | | /** |
3815 | | * \brief Set the minimum length for Diffie-Hellman parameters. |
3816 | | * (Client-side only.) |
3817 | | * (Default: 1024 bits.) |
3818 | | * |
3819 | | * \param conf SSL configuration |
3820 | | * \param bitlen Minimum bit length of the DHM prime |
3821 | | */ |
3822 | | void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf, |
3823 | | unsigned int bitlen); |
3824 | | #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ |
3825 | | |
3826 | | #if defined(MBEDTLS_ECP_C) |
3827 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
3828 | | /** |
3829 | | * \brief Set the allowed curves in order of preference. |
3830 | | * |
3831 | | * On server: this only affects selection of the ECDHE curve; |
3832 | | * the curves used for ECDH and ECDSA are determined by the |
3833 | | * list of available certificates instead. |
3834 | | * |
3835 | | * On client: this affects the list of curves offered for any |
3836 | | * use. The server can override our preference order. |
3837 | | * |
3838 | | * Both sides: limits the set of curves accepted for use in |
3839 | | * ECDHE and in the peer's end-entity certificate. |
3840 | | * |
3841 | | * \deprecated Superseded by mbedtls_ssl_conf_groups(). |
3842 | | * |
3843 | | * \note This has no influence on which curves are allowed inside the |
3844 | | * certificate chains, see \c mbedtls_ssl_conf_cert_profile() |
3845 | | * for that. For the end-entity certificate however, the key |
3846 | | * will be accepted only if it is allowed both by this list |
3847 | | * and by the cert profile. |
3848 | | * |
3849 | | * \note This list should be ordered by decreasing preference |
3850 | | * (preferred curve first). |
3851 | | * |
3852 | | * \note The default list is the same set of curves that |
3853 | | * #mbedtls_x509_crt_profile_default allows, plus |
3854 | | * ECDHE-only curves selected according to the same criteria. |
3855 | | * The order favors curves with the lowest resource usage. |
3856 | | * |
3857 | | * \note New minor versions of Mbed TLS may extend this list, |
3858 | | * for example if new curves are added to the library. |
3859 | | * New minor versions of Mbed TLS will not remove items |
3860 | | * from this list unless serious security concerns require it. |
3861 | | * New minor versions of Mbed TLS may change the order in |
3862 | | * keeping with the general principle of favoring the lowest |
3863 | | * resource usage. |
3864 | | * |
3865 | | * \param conf SSL configuration |
3866 | | * \param curves Ordered list of allowed curves, |
3867 | | * terminated by MBEDTLS_ECP_DP_NONE. |
3868 | | */ |
3869 | | void MBEDTLS_DEPRECATED mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf, |
3870 | | const mbedtls_ecp_group_id *curves); |
3871 | | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
3872 | | #endif /* MBEDTLS_ECP_C */ |
3873 | | |
3874 | | /** |
3875 | | * \brief Set the allowed groups in order of preference. |
3876 | | * |
3877 | | * On server: This only affects the choice of key agreement mechanism |
3878 | | * |
3879 | | * On client: this affects the list of groups offered for any |
3880 | | * use. The server can override our preference order. |
3881 | | * |
3882 | | * Both sides: limits the set of groups accepted for use in |
3883 | | * key sharing. |
3884 | | * |
3885 | | * \note This function replaces the deprecated mbedtls_ssl_conf_curves(), |
3886 | | * which only allows ECP curves to be configured. |
3887 | | * |
3888 | | * \note The most recent invocation of either mbedtls_ssl_conf_curves() |
3889 | | * or mbedtls_ssl_conf_groups() nullifies all previous invocations |
3890 | | * of both. |
3891 | | * |
3892 | | * \note This list should be ordered by decreasing preference |
3893 | | * (preferred group first). |
3894 | | * |
3895 | | * \note When this function is not called, a default list is used, |
3896 | | * consisting of all supported curves at 255 bits and above, |
3897 | | * and all supported finite fields at 2048 bits and above. |
3898 | | * The order favors groups with the lowest resource usage. |
3899 | | * |
3900 | | * \note New minor versions of Mbed TLS will not remove items |
3901 | | * from the default list unless serious security concerns require it. |
3902 | | * New minor versions of Mbed TLS may change the order in |
3903 | | * keeping with the general principle of favoring the lowest |
3904 | | * resource usage. |
3905 | | * |
3906 | | * \param conf SSL configuration |
3907 | | * \param groups List of allowed groups ordered by preference, terminated by 0. |
3908 | | * Must contain valid IANA NamedGroup IDs (provided via either an integer |
3909 | | * or using MBEDTLS_TLS1_3_NAMED_GROUP_XXX macros). |
3910 | | */ |
3911 | | void mbedtls_ssl_conf_groups(mbedtls_ssl_config *conf, |
3912 | | const uint16_t *groups); |
3913 | | |
3914 | | #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) |
3915 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) && defined(MBEDTLS_SSL_PROTO_TLS1_2) |
3916 | | /** |
3917 | | * \brief Set the allowed hashes for signatures during the handshake. |
3918 | | * |
3919 | | * \note This only affects which hashes are offered and can be used |
3920 | | * for signatures during the handshake. Hashes for message |
3921 | | * authentication and the TLS PRF are controlled by the |
3922 | | * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes |
3923 | | * used for certificate signature are controlled by the |
3924 | | * verification profile, see \c mbedtls_ssl_conf_cert_profile(). |
3925 | | * |
3926 | | * \deprecated Superseded by mbedtls_ssl_conf_sig_algs(). |
3927 | | * |
3928 | | * \note This list should be ordered by decreasing preference |
3929 | | * (preferred hash first). |
3930 | | * |
3931 | | * \note By default, all supported hashes whose length is at least |
3932 | | * 256 bits are allowed. This is the same set as the default |
3933 | | * for certificate verification |
3934 | | * (#mbedtls_x509_crt_profile_default). |
3935 | | * The preference order is currently unspecified and may |
3936 | | * change in future versions. |
3937 | | * |
3938 | | * \note New minor versions of Mbed TLS may extend this list, |
3939 | | * for example if new curves are added to the library. |
3940 | | * New minor versions of Mbed TLS will not remove items |
3941 | | * from this list unless serious security concerns require it. |
3942 | | * |
3943 | | * \param conf SSL configuration |
3944 | | * \param hashes Ordered list of allowed signature hashes, |
3945 | | * terminated by \c MBEDTLS_MD_NONE. |
3946 | | */ |
3947 | | void MBEDTLS_DEPRECATED mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf, |
3948 | | const int *hashes); |
3949 | | #endif /* !MBEDTLS_DEPRECATED_REMOVED && MBEDTLS_SSL_PROTO_TLS1_2 */ |
3950 | | |
3951 | | /** |
3952 | | * \brief Configure allowed signature algorithms for use in TLS |
3953 | | * |
3954 | | * \param conf The SSL configuration to use. |
3955 | | * \param sig_algs List of allowed IANA values for TLS 1.3 signature algorithms, |
3956 | | * terminated by #MBEDTLS_TLS1_3_SIG_NONE. The list must remain |
3957 | | * available throughout the lifetime of the conf object. |
3958 | | * - For TLS 1.3, values of \c MBEDTLS_TLS1_3_SIG_XXXX should be |
3959 | | * used. |
3960 | | * - For TLS 1.2, values should be given as |
3961 | | * "(HashAlgorithm << 8) | SignatureAlgorithm". |
3962 | | */ |
3963 | | void mbedtls_ssl_conf_sig_algs(mbedtls_ssl_config *conf, |
3964 | | const uint16_t *sig_algs); |
3965 | | #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ |
3966 | | |
3967 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
3968 | | /** |
3969 | | * \brief Set or reset the hostname to check against the received |
3970 | | * server certificate. It sets the ServerName TLS extension, |
3971 | | * too, if that extension is enabled. (client-side only) |
3972 | | * |
3973 | | * \param ssl SSL context |
3974 | | * \param hostname the server hostname, may be NULL to clear hostname |
3975 | | |
3976 | | * \note Maximum hostname length MBEDTLS_SSL_MAX_HOST_NAME_LEN. |
3977 | | * |
3978 | | * \return 0 if successful, MBEDTLS_ERR_SSL_ALLOC_FAILED on |
3979 | | * allocation failure, MBEDTLS_ERR_SSL_BAD_INPUT_DATA on |
3980 | | * too long input hostname. |
3981 | | * |
3982 | | * Hostname set to the one provided on success (cleared |
3983 | | * when NULL). On allocation failure hostname is cleared. |
3984 | | * On too long input failure, old hostname is unchanged. |
3985 | | */ |
3986 | | int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname); |
3987 | | |
3988 | | /** |
3989 | | * \brief Get the hostname that checked against the received |
3990 | | * server certificate. It is used to set the ServerName |
3991 | | * TLS extension, too, if that extension is enabled. |
3992 | | * (client-side only) |
3993 | | * |
3994 | | * \param ssl SSL context |
3995 | | * |
3996 | | * \return const pointer to the hostname value |
3997 | | */ |
3998 | | static inline const char *mbedtls_ssl_get_hostname(mbedtls_ssl_context *ssl) |
3999 | 0 | { |
4000 | 0 | return ssl->MBEDTLS_PRIVATE(hostname); |
4001 | 0 | } |
4002 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
4003 | | |
4004 | | #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) |
4005 | | /** |
4006 | | * \brief Retrieve SNI extension value for the current handshake. |
4007 | | * Available in \c f_cert_cb of \c mbedtls_ssl_conf_cert_cb(), |
4008 | | * this is the same value passed to \c f_sni callback of |
4009 | | * \c mbedtls_ssl_conf_sni() and may be used instead of |
4010 | | * \c mbedtls_ssl_conf_sni(). |
4011 | | * |
4012 | | * \param ssl SSL context |
4013 | | * \param name_len pointer into which to store length of returned value. |
4014 | | * 0 if SNI extension is not present or not yet processed. |
4015 | | * |
4016 | | * \return const pointer to SNI extension value. |
4017 | | * - value is valid only when called in \c f_cert_cb |
4018 | | * registered with \c mbedtls_ssl_conf_cert_cb(). |
4019 | | * - value is NULL if SNI extension is not present. |
4020 | | * - value is not '\0'-terminated. Use \c name_len for len. |
4021 | | * - value must not be freed. |
4022 | | */ |
4023 | | const unsigned char *mbedtls_ssl_get_hs_sni(mbedtls_ssl_context *ssl, |
4024 | | size_t *name_len); |
4025 | | |
4026 | | /** |
4027 | | * \brief Set own certificate and key for the current handshake |
4028 | | * |
4029 | | * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within |
4030 | | * the SNI callback or the certificate selection callback. |
4031 | | * |
4032 | | * \note Passing null \c own_cert clears the certificate list for |
4033 | | * the current handshake. |
4034 | | * |
4035 | | * \param ssl SSL context |
4036 | | * \param own_cert own public certificate chain |
4037 | | * \param pk_key own private key |
4038 | | * |
4039 | | * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED |
4040 | | */ |
4041 | | int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl, |
4042 | | mbedtls_x509_crt *own_cert, |
4043 | | mbedtls_pk_context *pk_key); |
4044 | | |
4045 | | /** |
4046 | | * \brief Set the data required to verify peer certificate for the |
4047 | | * current handshake |
4048 | | * |
4049 | | * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within |
4050 | | * the SNI callback or the certificate selection callback. |
4051 | | * |
4052 | | * \param ssl SSL context |
4053 | | * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) |
4054 | | * \param ca_crl trusted CA CRLs |
4055 | | */ |
4056 | | void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl, |
4057 | | mbedtls_x509_crt *ca_chain, |
4058 | | mbedtls_x509_crl *ca_crl); |
4059 | | |
4060 | | #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) |
4061 | | /** |
4062 | | * \brief Set DN hints sent to client in CertificateRequest message |
4063 | | * |
4064 | | * \note Same as \c mbedtls_ssl_conf_dn_hints() but for use within |
4065 | | * the SNI callback or the certificate selection callback. |
4066 | | * |
4067 | | * \param ssl SSL context |
4068 | | * \param crt crt chain whose subject DNs are issuer DNs of client certs |
4069 | | * from which the client should select client peer certificate. |
4070 | | */ |
4071 | | void mbedtls_ssl_set_hs_dn_hints(mbedtls_ssl_context *ssl, |
4072 | | const mbedtls_x509_crt *crt); |
4073 | | #endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ |
4074 | | |
4075 | | /** |
4076 | | * \brief Set authmode for the current handshake. |
4077 | | * |
4078 | | * \note Same as \c mbedtls_ssl_conf_authmode() but for use within |
4079 | | * the SNI callback or the certificate selection callback. |
4080 | | * |
4081 | | * \param ssl SSL context |
4082 | | * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or |
4083 | | * MBEDTLS_SSL_VERIFY_REQUIRED |
4084 | | */ |
4085 | | void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl, |
4086 | | int authmode); |
4087 | | |
4088 | | /** |
4089 | | * \brief Set server side ServerName TLS extension callback |
4090 | | * (optional, server-side only). |
4091 | | * |
4092 | | * If set, the ServerName callback is called whenever the |
4093 | | * server receives a ServerName TLS extension from the client |
4094 | | * during a handshake. The ServerName callback has the |
4095 | | * following parameters: (void *parameter, mbedtls_ssl_context *ssl, |
4096 | | * const unsigned char *hostname, size_t len). If a suitable |
4097 | | * certificate is found, the callback must set the |
4098 | | * certificate(s) and key(s) to use with \c |
4099 | | * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), |
4100 | | * and may optionally adjust the CA and associated CRL with \c |
4101 | | * mbedtls_ssl_set_hs_ca_chain() as well as the client |
4102 | | * authentication mode with \c mbedtls_ssl_set_hs_authmode(), |
4103 | | * then must return 0. If no matching name is found, the |
4104 | | * callback may return non-zero to abort the handshake. |
4105 | | * |
4106 | | * \param conf SSL configuration |
4107 | | * \param f_sni verification function |
4108 | | * \param p_sni verification parameter |
4109 | | */ |
4110 | | void mbedtls_ssl_conf_sni(mbedtls_ssl_config *conf, |
4111 | | int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, |
4112 | | size_t), |
4113 | | void *p_sni); |
4114 | | #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ |
4115 | | |
4116 | | #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) |
4117 | | /** |
4118 | | * \brief Set the EC J-PAKE password for current handshake. |
4119 | | * |
4120 | | * \note An internal copy is made, and destroyed as soon as the |
4121 | | * handshake is completed, or when the SSL context is reset or |
4122 | | * freed. |
4123 | | * |
4124 | | * \note The SSL context needs to be already set up. The right place |
4125 | | * to call this function is between \c mbedtls_ssl_setup() or |
4126 | | * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). |
4127 | | * Password cannot be empty (see RFC 8236). |
4128 | | * |
4129 | | * \param ssl SSL context |
4130 | | * \param pw EC J-PAKE password (pre-shared secret). It cannot be empty |
4131 | | * \param pw_len length of pw in bytes |
4132 | | * |
4133 | | * \return 0 on success, or a negative error code. |
4134 | | */ |
4135 | | int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl, |
4136 | | const unsigned char *pw, |
4137 | | size_t pw_len); |
4138 | | |
4139 | | /** |
4140 | | * \brief Set the EC J-PAKE opaque password for current handshake. |
4141 | | * |
4142 | | * \note The key must remain valid until the handshake is over. |
4143 | | * |
4144 | | * \note The SSL context needs to be already set up. The right place |
4145 | | * to call this function is between \c mbedtls_ssl_setup() or |
4146 | | * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). |
4147 | | * |
4148 | | * \param ssl SSL context |
4149 | | * \param pwd EC J-PAKE opaque password |
4150 | | * |
4151 | | * \return 0 on success, or a negative error code. |
4152 | | */ |
4153 | | int mbedtls_ssl_set_hs_ecjpake_password_opaque(mbedtls_ssl_context *ssl, |
4154 | | mbedtls_svc_key_id_t pwd); |
4155 | | #endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ |
4156 | | |
4157 | | #if defined(MBEDTLS_SSL_ALPN) |
4158 | | /** |
4159 | | * \brief Set the supported Application Layer Protocols. |
4160 | | * |
4161 | | * \param conf SSL configuration |
4162 | | * \param protos Pointer to a NULL-terminated list of supported protocols, |
4163 | | * in decreasing preference order. The pointer to the list is |
4164 | | * recorded by the library for later reference as required, so |
4165 | | * the lifetime of the table must be at least as long as the |
4166 | | * lifetime of the SSL configuration structure. |
4167 | | * |
4168 | | * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. |
4169 | | */ |
4170 | | int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos); |
4171 | | |
4172 | | /** |
4173 | | * \brief Get the name of the negotiated Application Layer Protocol. |
4174 | | * This function should be called after the handshake is |
4175 | | * completed. |
4176 | | * |
4177 | | * \param ssl SSL context |
4178 | | * |
4179 | | * \return Protocol name, or NULL if no protocol was negotiated. |
4180 | | */ |
4181 | | const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl); |
4182 | | #endif /* MBEDTLS_SSL_ALPN */ |
4183 | | |
4184 | | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
4185 | | #if defined(MBEDTLS_DEBUG_C) |
4186 | | static inline const char *mbedtls_ssl_get_srtp_profile_as_string(mbedtls_ssl_srtp_profile profile) |
4187 | 0 | { |
4188 | 0 | switch (profile) { |
4189 | 0 | case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80: |
4190 | 0 | return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80"; |
4191 | 0 | case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32: |
4192 | 0 | return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32"; |
4193 | 0 | case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80: |
4194 | 0 | return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80"; |
4195 | 0 | case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32: |
4196 | 0 | return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32"; |
4197 | 0 | default: break; |
4198 | 0 | } |
4199 | 0 | return ""; |
4200 | 0 | } |
4201 | | #endif /* MBEDTLS_DEBUG_C */ |
4202 | | /** |
4203 | | * \brief Manage support for mki(master key id) value |
4204 | | * in use_srtp extension. |
4205 | | * MKI is an optional part of SRTP used for key management |
4206 | | * and re-keying. See RFC3711 section 3.1 for details. |
4207 | | * The default value is |
4208 | | * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED. |
4209 | | * |
4210 | | * \param conf The SSL configuration to manage mki support. |
4211 | | * \param support_mki_value Enable or disable mki usage. Values are |
4212 | | * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED |
4213 | | * or #MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED. |
4214 | | */ |
4215 | | void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf, |
4216 | | int support_mki_value); |
4217 | | |
4218 | | /** |
4219 | | * \brief Set the supported DTLS-SRTP protection profiles. |
4220 | | * |
4221 | | * \param conf SSL configuration |
4222 | | * \param profiles Pointer to a List of MBEDTLS_TLS_SRTP_UNSET terminated |
4223 | | * supported protection profiles |
4224 | | * in decreasing preference order. |
4225 | | * The pointer to the list is recorded by the library |
4226 | | * for later reference as required, so the lifetime |
4227 | | * of the table must be at least as long as the lifetime |
4228 | | * of the SSL configuration structure. |
4229 | | * The list must not hold more than |
4230 | | * MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH elements |
4231 | | * (excluding the terminating MBEDTLS_TLS_SRTP_UNSET). |
4232 | | * |
4233 | | * \return 0 on success |
4234 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA when the list of |
4235 | | * protection profiles is incorrect. |
4236 | | */ |
4237 | | int mbedtls_ssl_conf_dtls_srtp_protection_profiles |
4238 | | (mbedtls_ssl_config *conf, |
4239 | | const mbedtls_ssl_srtp_profile *profiles); |
4240 | | |
4241 | | /** |
4242 | | * \brief Set the mki_value for the current DTLS-SRTP session. |
4243 | | * |
4244 | | * \param ssl SSL context to use. |
4245 | | * \param mki_value The MKI value to set. |
4246 | | * \param mki_len The length of the MKI value. |
4247 | | * |
4248 | | * \note This function is relevant on client side only. |
4249 | | * The server discovers the mki value during handshake. |
4250 | | * A mki value set on server side using this function |
4251 | | * is ignored. |
4252 | | * |
4253 | | * \return 0 on success |
4254 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA |
4255 | | * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE |
4256 | | */ |
4257 | | int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl, |
4258 | | unsigned char *mki_value, |
4259 | | uint16_t mki_len); |
4260 | | /** |
4261 | | * \brief Get the negotiated DTLS-SRTP information: |
4262 | | * Protection profile and MKI value. |
4263 | | * |
4264 | | * \warning This function must be called after the handshake is |
4265 | | * completed. The value returned by this function must |
4266 | | * not be trusted or acted upon before the handshake completes. |
4267 | | * |
4268 | | * \param ssl The SSL context to query. |
4269 | | * \param dtls_srtp_info The negotiated DTLS-SRTP information: |
4270 | | * - Protection profile in use. |
4271 | | * A direct mapping of the iana defined value for protection |
4272 | | * profile on an uint16_t. |
4273 | | http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml |
4274 | | * #MBEDTLS_TLS_SRTP_UNSET if the use of SRTP was not negotiated |
4275 | | * or peer's Hello packet was not parsed yet. |
4276 | | * - mki size and value( if size is > 0 ). |
4277 | | */ |
4278 | | void mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context *ssl, |
4279 | | mbedtls_dtls_srtp_info *dtls_srtp_info); |
4280 | | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
4281 | | |
4282 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
4283 | | /** |
4284 | | * \brief Set the maximum supported version sent from the client side |
4285 | | * and/or accepted at the server side. |
4286 | | * |
4287 | | * See also the documentation of mbedtls_ssl_conf_min_version(). |
4288 | | * |
4289 | | * \note This ignores ciphersuites from higher versions. |
4290 | | * |
4291 | | * \note This function is deprecated and has been replaced by |
4292 | | * \c mbedtls_ssl_conf_max_tls_version(). |
4293 | | * |
4294 | | * \param conf SSL configuration |
4295 | | * \param major Major version number (#MBEDTLS_SSL_MAJOR_VERSION_3) |
4296 | | * \param minor Minor version number |
4297 | | * (#MBEDTLS_SSL_MINOR_VERSION_3 for (D)TLS 1.2, |
4298 | | * #MBEDTLS_SSL_MINOR_VERSION_4 for TLS 1.3) |
4299 | | */ |
4300 | | void MBEDTLS_DEPRECATED mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf, int major, |
4301 | | int minor); |
4302 | | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
4303 | | |
4304 | | /** |
4305 | | * \brief Set the maximum supported version sent from the client side |
4306 | | * and/or accepted at the server side. |
4307 | | * |
4308 | | * \note After the handshake, you can call |
4309 | | * mbedtls_ssl_get_version_number() to see what version was |
4310 | | * negotiated. |
4311 | | * |
4312 | | * \param conf SSL configuration |
4313 | | * \param tls_version TLS protocol version number (\c mbedtls_ssl_protocol_version) |
4314 | | * (#MBEDTLS_SSL_VERSION_UNKNOWN is not valid) |
4315 | | */ |
4316 | | static inline void mbedtls_ssl_conf_max_tls_version(mbedtls_ssl_config *conf, |
4317 | | mbedtls_ssl_protocol_version tls_version) |
4318 | 0 | { |
4319 | 0 | conf->MBEDTLS_PRIVATE(max_tls_version) = tls_version; |
4320 | 0 | } |
4321 | | |
4322 | | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
4323 | | /** |
4324 | | * \brief Set the minimum accepted SSL/TLS protocol version |
4325 | | * |
4326 | | * \note By default, all supported versions are accepted. |
4327 | | * Future versions of the library may disable older |
4328 | | * protocol versions by default if they become deprecated. |
4329 | | * |
4330 | | * \note The following versions are supported (if enabled at |
4331 | | * compile time): |
4332 | | * - (D)TLS 1.2: \p major = #MBEDTLS_SSL_MAJOR_VERSION_3, |
4333 | | * \p minor = #MBEDTLS_SSL_MINOR_VERSION_3 |
4334 | | * - TLS 1.3: \p major = #MBEDTLS_SSL_MAJOR_VERSION_3, |
4335 | | * \p minor = #MBEDTLS_SSL_MINOR_VERSION_4 |
4336 | | * |
4337 | | * Note that the numbers in the constant names are the |
4338 | | * TLS internal protocol numbers, and the minor versions |
4339 | | * differ by one from the human-readable versions! |
4340 | | * |
4341 | | * \note Input outside of the SSL_MAX_XXXXX_VERSION and |
4342 | | * SSL_MIN_XXXXX_VERSION range is ignored. |
4343 | | * |
4344 | | * \note After the handshake, you can call |
4345 | | * mbedtls_ssl_get_version_number() to see what version was |
4346 | | * negotiated. |
4347 | | * |
4348 | | * \note This function is deprecated and has been replaced by |
4349 | | * \c mbedtls_ssl_conf_min_tls_version(). |
4350 | | * |
4351 | | * \param conf SSL configuration |
4352 | | * \param major Major version number (#MBEDTLS_SSL_MAJOR_VERSION_3) |
4353 | | * \param minor Minor version number |
4354 | | * (#MBEDTLS_SSL_MINOR_VERSION_3 for (D)TLS 1.2, |
4355 | | * #MBEDTLS_SSL_MINOR_VERSION_4 for TLS 1.3) |
4356 | | */ |
4357 | | void MBEDTLS_DEPRECATED mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf, int major, |
4358 | | int minor); |
4359 | | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
4360 | | |
4361 | | /** |
4362 | | * \brief Set the minimum supported version sent from the client side |
4363 | | * and/or accepted at the server side. |
4364 | | * |
4365 | | * \note After the handshake, you can call |
4366 | | * mbedtls_ssl_get_version_number() to see what version was |
4367 | | * negotiated. |
4368 | | * |
4369 | | * \param conf SSL configuration |
4370 | | * \param tls_version TLS protocol version number (\c mbedtls_ssl_protocol_version) |
4371 | | * (#MBEDTLS_SSL_VERSION_UNKNOWN is not valid) |
4372 | | */ |
4373 | | static inline void mbedtls_ssl_conf_min_tls_version(mbedtls_ssl_config *conf, |
4374 | | mbedtls_ssl_protocol_version tls_version) |
4375 | 0 | { |
4376 | 0 | conf->MBEDTLS_PRIVATE(min_tls_version) = tls_version; |
4377 | 0 | } |
4378 | | |
4379 | | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
4380 | | /** |
4381 | | * \brief Enable or disable Encrypt-then-MAC |
4382 | | * (Default: MBEDTLS_SSL_ETM_ENABLED) |
4383 | | * |
4384 | | * \note This should always be enabled, it is a security |
4385 | | * improvement, and should not cause any interoperability |
4386 | | * issue (used only if the peer supports it too). |
4387 | | * |
4388 | | * \param conf SSL configuration |
4389 | | * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED |
4390 | | */ |
4391 | | void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm); |
4392 | | #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ |
4393 | | |
4394 | | #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) |
4395 | | /** |
4396 | | * \brief Enable or disable Extended Master Secret negotiation. |
4397 | | * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) |
4398 | | * |
4399 | | * \note This should always be enabled, it is a security fix to the |
4400 | | * protocol, and should not cause any interoperability issue |
4401 | | * (used only if the peer supports it too). |
4402 | | * |
4403 | | * \param conf SSL configuration |
4404 | | * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED |
4405 | | */ |
4406 | | void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems); |
4407 | | #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ |
4408 | | |
4409 | | #if defined(MBEDTLS_SSL_SRV_C) |
4410 | | /** |
4411 | | * \brief Whether to send a list of acceptable CAs in |
4412 | | * CertificateRequest messages. |
4413 | | * (Default: do send) |
4414 | | * |
4415 | | * \param conf SSL configuration |
4416 | | * \param cert_req_ca_list MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or |
4417 | | * MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED |
4418 | | */ |
4419 | | void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf, |
4420 | | char cert_req_ca_list); |
4421 | | #endif /* MBEDTLS_SSL_SRV_C */ |
4422 | | |
4423 | | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
4424 | | /** |
4425 | | * \brief Set the maximum fragment length to emit and/or negotiate. |
4426 | | * (Typical: the smaller of #MBEDTLS_SSL_IN_CONTENT_LEN and |
4427 | | * #MBEDTLS_SSL_OUT_CONTENT_LEN, usually `2^14` bytes) |
4428 | | * (Server: set maximum fragment length to emit, |
4429 | | * usually negotiated by the client during handshake) |
4430 | | * (Client: set maximum fragment length to emit *and* |
4431 | | * negotiate with the server during handshake) |
4432 | | * (Default: #MBEDTLS_SSL_MAX_FRAG_LEN_NONE) |
4433 | | * |
4434 | | * \note On the client side, the maximum fragment length extension |
4435 | | * *will not* be used, unless the maximum fragment length has |
4436 | | * been set via this function to a value different than |
4437 | | * #MBEDTLS_SSL_MAX_FRAG_LEN_NONE. |
4438 | | * |
4439 | | * \note With TLS, this currently only affects ApplicationData (sent |
4440 | | * with \c mbedtls_ssl_read()), not handshake messages. |
4441 | | * With DTLS, this affects both ApplicationData and handshake. |
4442 | | * |
4443 | | * \note This sets the maximum length for a record's payload, |
4444 | | * excluding record overhead that will be added to it, see |
4445 | | * \c mbedtls_ssl_get_record_expansion(). |
4446 | | * |
4447 | | * \note For DTLS, it is also possible to set a limit for the total |
4448 | | * size of datagrams passed to the transport layer, including |
4449 | | * record overhead, see \c mbedtls_ssl_set_mtu(). |
4450 | | * |
4451 | | * \param conf SSL configuration |
4452 | | * \param mfl_code Code for maximum fragment length (allowed values: |
4453 | | * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, |
4454 | | * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) |
4455 | | * |
4456 | | * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA |
4457 | | */ |
4458 | | int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf, unsigned char mfl_code); |
4459 | | #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ |
4460 | | |
4461 | | #if defined(MBEDTLS_SSL_SRV_C) |
4462 | | /** |
4463 | | * \brief Pick the ciphersuites order according to the second parameter |
4464 | | * in the SSL Server module (MBEDTLS_SSL_SRV_C). |
4465 | | * (Default, if never called: MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER) |
4466 | | * |
4467 | | * \param conf SSL configuration |
4468 | | * \param order Server or client (MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER |
4469 | | * or MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) |
4470 | | */ |
4471 | | void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order); |
4472 | | #endif /* MBEDTLS_SSL_SRV_C */ |
4473 | | |
4474 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) |
4475 | | /** |
4476 | | * \brief Enable / Disable TLS 1.2 session tickets (client only, |
4477 | | * TLS 1.2 only). Enabled by default. |
4478 | | * |
4479 | | * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). |
4480 | | * |
4481 | | * \param conf SSL configuration |
4482 | | * \param use_tickets Enable or disable (#MBEDTLS_SSL_SESSION_TICKETS_ENABLED or |
4483 | | * #MBEDTLS_SSL_SESSION_TICKETS_DISABLED) |
4484 | | */ |
4485 | | void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets); |
4486 | | |
4487 | | #if defined(MBEDTLS_SSL_PROTO_TLS1_3) |
4488 | | /** |
4489 | | * \brief Enable / Disable handling of TLS 1.3 NewSessionTicket messages |
4490 | | * (client only, TLS 1.3 only). |
4491 | | * |
4492 | | * The handling of TLS 1.3 NewSessionTicket messages is disabled by |
4493 | | * default. |
4494 | | * |
4495 | | * In TLS 1.3, servers may send a NewSessionTicket message at any time, |
4496 | | * and may send multiple NewSessionTicket messages. By default, TLS 1.3 |
4497 | | * clients ignore NewSessionTicket messages. |
4498 | | * |
4499 | | * To support session tickets in TLS 1.3 clients, call this function |
4500 | | * with #MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_ENABLED. When |
4501 | | * this is enabled, when a client receives a NewSessionTicket message, |
4502 | | * the next call to a message processing functions (notably |
4503 | | * mbedtls_ssl_handshake() and mbedtls_ssl_read()) will return |
4504 | | * #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET. The client should then |
4505 | | * call mbedtls_ssl_get_session() to retrieve the session ticket before |
4506 | | * calling the same message processing function again. |
4507 | | * |
4508 | | * \param conf SSL configuration |
4509 | | * \param signal_new_session_tickets Enable or disable |
4510 | | * (#MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_ENABLED or |
4511 | | * #MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_DISABLED) |
4512 | | */ |
4513 | | void mbedtls_ssl_conf_tls13_enable_signal_new_session_tickets( |
4514 | | mbedtls_ssl_config *conf, int signal_new_session_tickets); |
4515 | | |
4516 | | #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ |
4517 | | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ |
4518 | | |
4519 | | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && \ |
4520 | | defined(MBEDTLS_SSL_SRV_C) && \ |
4521 | | defined(MBEDTLS_SSL_PROTO_TLS1_3) |
4522 | | /** |
4523 | | * \brief Number of NewSessionTicket messages for the server to send |
4524 | | * after handshake completion. |
4525 | | * |
4526 | | * \note The default value is |
4527 | | * \c MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS. |
4528 | | * |
4529 | | * \note In case of a session resumption, this setting only partially apply. |
4530 | | * At most one ticket is sent in that case to just renew the pool of |
4531 | | * tickets of the client. The rationale is to avoid the number of |
4532 | | * tickets on the server to become rapidly out of control when the |
4533 | | * server has the same configuration for all its connection instances. |
4534 | | * |
4535 | | * \param conf SSL configuration |
4536 | | * \param num_tickets Number of NewSessionTicket. |
4537 | | * |
4538 | | */ |
4539 | | void mbedtls_ssl_conf_new_session_tickets(mbedtls_ssl_config *conf, |
4540 | | uint16_t num_tickets); |
4541 | | #endif /* MBEDTLS_SSL_SESSION_TICKETS && |
4542 | | MBEDTLS_SSL_SRV_C && |
4543 | | MBEDTLS_SSL_PROTO_TLS1_3*/ |
4544 | | |
4545 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
4546 | | /** |
4547 | | * \brief Enable / Disable renegotiation support for connection when |
4548 | | * initiated by peer |
4549 | | * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) |
4550 | | * |
4551 | | * \warning It is recommended to always disable renegotiation unless you |
4552 | | * know you need it and you know what you're doing. In the |
4553 | | * past, there have been several issues associated with |
4554 | | * renegotiation or a poor understanding of its properties. |
4555 | | * |
4556 | | * \note Server-side, enabling renegotiation also makes the server |
4557 | | * susceptible to a resource DoS by a malicious client. |
4558 | | * |
4559 | | * \param conf SSL configuration |
4560 | | * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or |
4561 | | * MBEDTLS_SSL_RENEGOTIATION_DISABLED) |
4562 | | */ |
4563 | | void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation); |
4564 | | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
4565 | | |
4566 | | /** |
4567 | | * \brief Prevent or allow legacy renegotiation. |
4568 | | * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) |
4569 | | * |
4570 | | * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to |
4571 | | * be established even if the peer does not support |
4572 | | * secure renegotiation, but does not allow renegotiation |
4573 | | * to take place if not secure. |
4574 | | * (Interoperable and secure option) |
4575 | | * |
4576 | | * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations |
4577 | | * with non-upgraded peers. Allowing legacy renegotiation |
4578 | | * makes the connection vulnerable to specific man in the |
4579 | | * middle attacks. (See RFC 5746) |
4580 | | * (Most interoperable and least secure option) |
4581 | | * |
4582 | | * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections |
4583 | | * if peer does not support secure renegotiation. Results |
4584 | | * in interoperability issues with non-upgraded peers |
4585 | | * that do not support renegotiation altogether. |
4586 | | * (Most secure option, interoperability issues) |
4587 | | * |
4588 | | * \param conf SSL configuration |
4589 | | * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, |
4590 | | * SSL_ALLOW_LEGACY_RENEGOTIATION or |
4591 | | * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) |
4592 | | */ |
4593 | | void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf, int allow_legacy); |
4594 | | |
4595 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
4596 | | /** |
4597 | | * \brief Enforce renegotiation requests. |
4598 | | * (Default: enforced, max_records = 16) |
4599 | | * |
4600 | | * When we request a renegotiation, the peer can comply or |
4601 | | * ignore the request. This function allows us to decide |
4602 | | * whether to enforce our renegotiation requests by closing |
4603 | | * the connection if the peer doesn't comply. |
4604 | | * |
4605 | | * However, records could already be in transit from the peer |
4606 | | * when the request is emitted. In order to increase |
4607 | | * reliability, we can accept a number of records before the |
4608 | | * expected handshake records. |
4609 | | * |
4610 | | * The optimal value is highly dependent on the specific usage |
4611 | | * scenario. |
4612 | | * |
4613 | | * \note With DTLS and server-initiated renegotiation, the |
4614 | | * HelloRequest is retransmitted every time mbedtls_ssl_read() times |
4615 | | * out or receives Application Data, until: |
4616 | | * - max_records records have beens seen, if it is >= 0, or |
4617 | | * - the number of retransmits that would happen during an |
4618 | | * actual handshake has been reached. |
4619 | | * Please remember the request might be lost a few times |
4620 | | * if you consider setting max_records to a really low value. |
4621 | | * |
4622 | | * \warning On client, the grace period can only happen during |
4623 | | * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() |
4624 | | * which always behave as if max_record was 0. The reason is, |
4625 | | * if we receive application data from the server, we need a |
4626 | | * place to write it, which only happens during mbedtls_ssl_read(). |
4627 | | * |
4628 | | * \param conf SSL configuration |
4629 | | * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to |
4630 | | * enforce renegotiation, or a non-negative value to enforce |
4631 | | * it but allow for a grace period of max_records records. |
4632 | | */ |
4633 | | void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf, int max_records); |
4634 | | |
4635 | | /** |
4636 | | * \brief Set record counter threshold for periodic renegotiation. |
4637 | | * (Default: 2^48 - 1) |
4638 | | * |
4639 | | * Renegotiation is automatically triggered when a record |
4640 | | * counter (outgoing or incoming) crosses the defined |
4641 | | * threshold. The default value is meant to prevent the |
4642 | | * connection from being closed when the counter is about to |
4643 | | * reached its maximal value (it is not allowed to wrap). |
4644 | | * |
4645 | | * Lower values can be used to enforce policies such as "keys |
4646 | | * must be refreshed every N packets with cipher X". |
4647 | | * |
4648 | | * The renegotiation period can be disabled by setting |
4649 | | * conf->disable_renegotiation to |
4650 | | * MBEDTLS_SSL_RENEGOTIATION_DISABLED. |
4651 | | * |
4652 | | * \note When the configured transport is |
4653 | | * MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation |
4654 | | * period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM, |
4655 | | * the maximum renegotiation period is 2^64 - 1. |
4656 | | * |
4657 | | * \param conf SSL configuration |
4658 | | * \param period The threshold value: a big-endian 64-bit number. |
4659 | | */ |
4660 | | void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf, |
4661 | | const unsigned char period[8]); |
4662 | | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
4663 | | |
4664 | | /** |
4665 | | * \brief Check if there is data already read from the |
4666 | | * underlying transport but not yet processed. |
4667 | | * |
4668 | | * \param ssl SSL context |
4669 | | * |
4670 | | * \return 0 if nothing's pending, 1 otherwise. |
4671 | | * |
4672 | | * \note This is different in purpose and behaviour from |
4673 | | * \c mbedtls_ssl_get_bytes_avail in that it considers |
4674 | | * any kind of unprocessed data, not only unread |
4675 | | * application data. If \c mbedtls_ssl_get_bytes |
4676 | | * returns a non-zero value, this function will |
4677 | | * also signal pending data, but the converse does |
4678 | | * not hold. For example, in DTLS there might be |
4679 | | * further records waiting to be processed from |
4680 | | * the current underlying transport's datagram. |
4681 | | * |
4682 | | * \note If this function returns 1 (data pending), this |
4683 | | * does not imply that a subsequent call to |
4684 | | * \c mbedtls_ssl_read will provide any data; |
4685 | | * e.g., the unprocessed data might turn out |
4686 | | * to be an alert or a handshake message. |
4687 | | * |
4688 | | * \note This function is useful in the following situation: |
4689 | | * If the SSL/TLS module successfully returns from an |
4690 | | * operation - e.g. a handshake or an application record |
4691 | | * read - and you're awaiting incoming data next, you |
4692 | | * must not immediately idle on the underlying transport |
4693 | | * to have data ready, but you need to check the value |
4694 | | * of this function first. The reason is that the desired |
4695 | | * data might already be read but not yet processed. |
4696 | | * If, in contrast, a previous call to the SSL/TLS module |
4697 | | * returned MBEDTLS_ERR_SSL_WANT_READ, it is not necessary |
4698 | | * to call this function, as the latter error code entails |
4699 | | * that all internal data has been processed. |
4700 | | * |
4701 | | */ |
4702 | | int mbedtls_ssl_check_pending(const mbedtls_ssl_context *ssl); |
4703 | | |
4704 | | /** |
4705 | | * \brief Return the number of application data bytes |
4706 | | * remaining to be read from the current record. |
4707 | | * |
4708 | | * \param ssl SSL context |
4709 | | * |
4710 | | * \return How many bytes are available in the application |
4711 | | * data record read buffer. |
4712 | | * |
4713 | | * \note When working over a datagram transport, this is |
4714 | | * useful to detect the current datagram's boundary |
4715 | | * in case \c mbedtls_ssl_read has written the maximal |
4716 | | * amount of data fitting into the input buffer. |
4717 | | * |
4718 | | */ |
4719 | | size_t mbedtls_ssl_get_bytes_avail(const mbedtls_ssl_context *ssl); |
4720 | | |
4721 | | /** |
4722 | | * \brief Return the result of the certificate verification |
4723 | | * |
4724 | | * \param ssl The SSL context to use. |
4725 | | * |
4726 | | * \return \c 0 if the certificate verification was successful. |
4727 | | * \return \c -1u if the result is not available. This may happen |
4728 | | * e.g. if the handshake aborts early, or a verification |
4729 | | * callback returned a fatal error. |
4730 | | * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX |
4731 | | * and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h. |
4732 | | */ |
4733 | | uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl); |
4734 | | |
4735 | | /** |
4736 | | * \brief Return the id of the current ciphersuite |
4737 | | * |
4738 | | * \param ssl SSL context |
4739 | | * |
4740 | | * \return a ciphersuite id |
4741 | | */ |
4742 | | int mbedtls_ssl_get_ciphersuite_id_from_ssl(const mbedtls_ssl_context *ssl); |
4743 | | |
4744 | | /** |
4745 | | * \brief Return the name of the current ciphersuite |
4746 | | * |
4747 | | * \param ssl SSL context |
4748 | | * |
4749 | | * \return a string containing the ciphersuite name |
4750 | | */ |
4751 | | const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl); |
4752 | | |
4753 | | |
4754 | | /** |
4755 | | * \brief Return the (D)TLS protocol version negotiated in the |
4756 | | * given connection. |
4757 | | * |
4758 | | * \note If you call this function too early during the initial |
4759 | | * handshake, before the two sides have agreed on a version, |
4760 | | * this function returns #MBEDTLS_SSL_VERSION_UNKNOWN. |
4761 | | * |
4762 | | * \param ssl The SSL context to query. |
4763 | | * \return The negotiated protocol version. |
4764 | | */ |
4765 | | static inline mbedtls_ssl_protocol_version mbedtls_ssl_get_version_number( |
4766 | | const mbedtls_ssl_context *ssl) |
4767 | 0 | { |
4768 | 0 | return ssl->MBEDTLS_PRIVATE(tls_version); |
4769 | 0 | } |
4770 | | |
4771 | | /** |
4772 | | * \brief Return the current TLS version |
4773 | | * |
4774 | | * \param ssl SSL context |
4775 | | * |
4776 | | * \return a string containing the TLS version |
4777 | | */ |
4778 | | const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl); |
4779 | | |
4780 | | /** |
4781 | | * \brief Return the (maximum) number of bytes added by the record |
4782 | | * layer: header + encryption/MAC overhead (inc. padding) |
4783 | | * |
4784 | | * \param ssl SSL context |
4785 | | * |
4786 | | * \return Current maximum record expansion in bytes |
4787 | | */ |
4788 | | int mbedtls_ssl_get_record_expansion(const mbedtls_ssl_context *ssl); |
4789 | | |
4790 | | /** |
4791 | | * \brief Return the current maximum outgoing record payload in bytes. |
4792 | | * |
4793 | | * \note The logic to determine the maximum outgoing record payload is |
4794 | | * version-specific. It takes into account various factors, such as |
4795 | | * the mbedtls_config.h setting \c MBEDTLS_SSL_OUT_CONTENT_LEN, extensions |
4796 | | * such as the max fragment length or record size limit extension if |
4797 | | * used, and for DTLS the path MTU as configured and current |
4798 | | * record expansion. |
4799 | | * |
4800 | | * \note With DTLS, \c mbedtls_ssl_write() will return an error if |
4801 | | * called with a larger length value. |
4802 | | * With TLS, \c mbedtls_ssl_write() will fragment the input if |
4803 | | * necessary and return the number of bytes written; it is up |
4804 | | * to the caller to call \c mbedtls_ssl_write() again in |
4805 | | * order to send the remaining bytes if any. |
4806 | | * |
4807 | | * \sa mbedtls_ssl_get_max_out_record_payload() |
4808 | | * \sa mbedtls_ssl_get_record_expansion() |
4809 | | * |
4810 | | * \param ssl SSL context |
4811 | | * |
4812 | | * \return Current maximum payload for an outgoing record, |
4813 | | * or a negative error code. |
4814 | | */ |
4815 | | int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl); |
4816 | | |
4817 | | /** |
4818 | | * \brief Return the current maximum incoming record payload in bytes. |
4819 | | * |
4820 | | * \note The logic to determine the maximum incoming record payload is |
4821 | | * version-specific. It takes into account various factors, such as |
4822 | | * the mbedtls_config.h setting \c MBEDTLS_SSL_IN_CONTENT_LEN, extensions |
4823 | | * such as the max fragment length extension or record size limit |
4824 | | * extension if used, and the current record expansion. |
4825 | | * |
4826 | | * \sa mbedtls_ssl_set_mtu() |
4827 | | * \sa mbedtls_ssl_get_max_in_record_payload() |
4828 | | * \sa mbedtls_ssl_get_record_expansion() |
4829 | | * |
4830 | | * \param ssl SSL context |
4831 | | * |
4832 | | * \return Current maximum payload for an incoming record, |
4833 | | * or a negative error code. |
4834 | | */ |
4835 | | int mbedtls_ssl_get_max_in_record_payload(const mbedtls_ssl_context *ssl); |
4836 | | |
4837 | | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
4838 | | /** |
4839 | | * \brief Return the peer certificate from the current connection. |
4840 | | * |
4841 | | * \param ssl The SSL context to use. This must be initialized and setup. |
4842 | | * |
4843 | | * \return The current peer certificate, if available. |
4844 | | * The returned certificate is owned by the SSL context and |
4845 | | * is valid only until the next call to the SSL API. |
4846 | | * \return \c NULL if no peer certificate is available. This might |
4847 | | * be because the chosen ciphersuite doesn't use CRTs |
4848 | | * (PSK-based ciphersuites, for example), or because |
4849 | | * #MBEDTLS_SSL_KEEP_PEER_CERTIFICATE has been disabled, |
4850 | | * allowing the stack to free the peer's CRT to save memory. |
4851 | | * |
4852 | | * \note For one-time inspection of the peer's certificate during |
4853 | | * the handshake, consider registering an X.509 CRT verification |
4854 | | * callback through mbedtls_ssl_conf_verify() instead of calling |
4855 | | * this function. Using mbedtls_ssl_conf_verify() also comes at |
4856 | | * the benefit of allowing you to influence the verification |
4857 | | * process, for example by masking expected and tolerated |
4858 | | * verification failures. |
4859 | | * |
4860 | | * \warning You must not use the pointer returned by this function |
4861 | | * after any further call to the SSL API, including |
4862 | | * mbedtls_ssl_read() and mbedtls_ssl_write(); this is |
4863 | | * because the pointer might change during renegotiation, |
4864 | | * which happens transparently to the user. |
4865 | | * If you want to use the certificate across API calls, |
4866 | | * you must make a copy. |
4867 | | */ |
4868 | | const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl); |
4869 | | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
4870 | | |
4871 | | #if defined(MBEDTLS_SSL_CLI_C) |
4872 | | /** |
4873 | | * \brief Export a session in order to resume it later. |
4874 | | * |
4875 | | * \param ssl The SSL context representing the connection for which to |
4876 | | * to export a session structure for later resumption. |
4877 | | * \param session The target structure in which to store the exported session. |
4878 | | * This must have been initialized with mbedtls_ssl_session_init() |
4879 | | * but otherwise be unused. |
4880 | | * |
4881 | | * \note This function can handle a variety of mechanisms for session |
4882 | | * resumption: For TLS 1.2, both session ID-based resumption and |
4883 | | * ticket-based resumption will be considered. For TLS 1.3, |
4884 | | * sessions equate to tickets, and if session tickets are |
4885 | | * enabled (see #MBEDTLS_SSL_SESSION_TICKETS configuration |
4886 | | * option), this function exports the last received ticket and |
4887 | | * the exported session may be used to resume the TLS 1.3 |
4888 | | * session. If session tickets are disabled, exported sessions |
4889 | | * cannot be used to resume a TLS 1.3 session. |
4890 | | * |
4891 | | * \return \c 0 if successful. In this case, \p session can be used for |
4892 | | * session resumption by passing it to mbedtls_ssl_set_session(), |
4893 | | * and serialized for storage via mbedtls_ssl_session_save(). |
4894 | | * \return Another negative error code on other kinds of failure. |
4895 | | * |
4896 | | * \sa mbedtls_ssl_set_session() |
4897 | | * \sa mbedtls_ssl_session_save() |
4898 | | */ |
4899 | | int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl, |
4900 | | mbedtls_ssl_session *session); |
4901 | | #endif /* MBEDTLS_SSL_CLI_C */ |
4902 | | |
4903 | | /** |
4904 | | * \brief Perform the SSL handshake |
4905 | | * |
4906 | | * \param ssl SSL context |
4907 | | * |
4908 | | * \return \c 0 if successful. |
4909 | | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
4910 | | * if the handshake is incomplete and waiting for data to |
4911 | | * be available for reading from or writing to the underlying |
4912 | | * transport - in this case you must call this function again |
4913 | | * when the underlying transport is ready for the operation. |
4914 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
4915 | | * operation is in progress (see |
4916 | | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
4917 | | * must call this function again when the operation is ready. |
4918 | | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
4919 | | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
4920 | | * in this case you must call this function again to complete |
4921 | | * the handshake when you're done attending other tasks. |
4922 | | * \return #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED if DTLS is in use |
4923 | | * and the client did not demonstrate reachability yet - in |
4924 | | * this case you must stop using the context (see below). |
4925 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET if a TLS 1.3 |
4926 | | * NewSessionTicket message has been received. See the |
4927 | | * documentation of mbedtls_ssl_read() for more information |
4928 | | * about this error code. |
4929 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA if early data, as |
4930 | | * defined in RFC 8446 (TLS 1.3 specification), has been |
4931 | | * received as part of the handshake. This is server specific |
4932 | | * and may occur only if the early data feature has been |
4933 | | * enabled on server (see mbedtls_ssl_conf_early_data() |
4934 | | * documentation). You must call mbedtls_ssl_read_early_data() |
4935 | | * to read the early data before resuming the handshake. |
4936 | | * \return Another SSL error code - in this case you must stop using |
4937 | | * the context (see below). |
4938 | | * |
4939 | | * \warning If this function returns something other than |
4940 | | * \c 0, |
4941 | | * #MBEDTLS_ERR_SSL_WANT_READ, |
4942 | | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
4943 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
4944 | | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or |
4945 | | * #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET or |
4946 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA, |
4947 | | * you must stop using the SSL context for reading or writing, |
4948 | | * and either free it or call \c mbedtls_ssl_session_reset() |
4949 | | * on it before re-using it for a new connection; the current |
4950 | | * connection must be closed. |
4951 | | * |
4952 | | * \note If DTLS is in use, then you may choose to handle |
4953 | | * #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging |
4954 | | * purposes, as it is an expected return value rather than an |
4955 | | * actual error, but you still need to reset/free the context. |
4956 | | * |
4957 | | * \note Remarks regarding event-driven DTLS: |
4958 | | * If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram |
4959 | | * from the underlying transport layer is currently being processed, |
4960 | | * and it is safe to idle until the timer or the underlying transport |
4961 | | * signal a new event. This is not true for a successful handshake, |
4962 | | * in which case the datagram of the underlying transport that is |
4963 | | * currently being processed might or might not contain further |
4964 | | * DTLS records. |
4965 | | * |
4966 | | * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto |
4967 | | * subsystem must have been initialized by calling |
4968 | | * psa_crypto_init() before calling this function. |
4969 | | * Otherwise, the handshake may call psa_crypto_init() |
4970 | | * if a negotiation involving TLS 1.3 takes place (this may |
4971 | | * be the case even if TLS 1.3 is offered but eventually |
4972 | | * not selected). |
4973 | | */ |
4974 | | int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl); |
4975 | | |
4976 | | /** |
4977 | | * \brief After calling mbedtls_ssl_handshake() to start the SSL |
4978 | | * handshake you can call this function to check whether the |
4979 | | * handshake is over for a given SSL context. This function |
4980 | | * should be also used to determine when to stop calling |
4981 | | * mbedtls_handshake_step() for that context. |
4982 | | * |
4983 | | * \param ssl SSL context |
4984 | | * |
4985 | | * \return \c 1 if handshake is over, \c 0 if it is still ongoing. |
4986 | | */ |
4987 | | static inline int mbedtls_ssl_is_handshake_over(mbedtls_ssl_context *ssl) |
4988 | 0 | { |
4989 | 0 | return ssl->MBEDTLS_PRIVATE(state) >= MBEDTLS_SSL_HANDSHAKE_OVER; |
4990 | 0 | } |
4991 | | |
4992 | | /** |
4993 | | * \brief Perform a single step of the SSL handshake |
4994 | | * |
4995 | | * \note The state of the context (ssl->state) will be at |
4996 | | * the next state after this function returns \c 0. Do not |
4997 | | * call this function if mbedtls_ssl_is_handshake_over() |
4998 | | * returns \c 1. |
4999 | | * |
5000 | | * \warning Whilst in the past you may have used direct access to the |
5001 | | * context state (ssl->state) in order to ascertain when to |
5002 | | * stop calling this function and although you can still do |
5003 | | * so with something like ssl->MBEDTLS_PRIVATE(state) or by |
5004 | | * defining MBEDTLS_ALLOW_PRIVATE_ACCESS, this is now |
5005 | | * considered deprecated and could be broken in any future |
5006 | | * release. If you still find you have good reason for such |
5007 | | * direct access, then please do contact the team to explain |
5008 | | * this (raise an issue or post to the mailing list), so that |
5009 | | * we can add a solution to your problem that will be |
5010 | | * guaranteed to work in the future. |
5011 | | * |
5012 | | * \param ssl SSL context |
5013 | | * |
5014 | | * \return See mbedtls_ssl_handshake(). |
5015 | | * |
5016 | | * \warning If this function returns something other than \c 0, |
5017 | | * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, |
5018 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, |
5019 | | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or |
5020 | | * #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET or |
5021 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA, you must stop using |
5022 | | * the SSL context for reading or writing, and either free it |
5023 | | * or call \c mbedtls_ssl_session_reset() on it before |
5024 | | * re-using it for a new connection; the current connection |
5025 | | * must be closed. |
5026 | | */ |
5027 | | int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl); |
5028 | | |
5029 | | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
5030 | | /** |
5031 | | * \brief Initiate an SSL renegotiation on the running connection. |
5032 | | * Client: perform the renegotiation right now. |
5033 | | * Server: request renegotiation, which will be performed |
5034 | | * during the next call to mbedtls_ssl_read() if honored by |
5035 | | * client. |
5036 | | * |
5037 | | * \param ssl SSL context |
5038 | | * |
5039 | | * \return 0 if successful, or any mbedtls_ssl_handshake() return |
5040 | | * value except #MBEDTLS_ERR_SSL_CLIENT_RECONNECT that can't |
5041 | | * happen during a renegotiation. |
5042 | | * |
5043 | | * \warning If this function returns something other than \c 0, |
5044 | | * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, |
5045 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
5046 | | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using |
5047 | | * the SSL context for reading or writing, and either free it |
5048 | | * or call \c mbedtls_ssl_session_reset() on it before |
5049 | | * re-using it for a new connection; the current connection |
5050 | | * must be closed. |
5051 | | * |
5052 | | */ |
5053 | | int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl); |
5054 | | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
5055 | | |
5056 | | /** |
5057 | | * \brief Read at most 'len' application data bytes |
5058 | | * |
5059 | | * \param ssl SSL context |
5060 | | * \param buf buffer that will hold the data |
5061 | | * \param len maximum number of bytes to read |
5062 | | * |
5063 | | * \return The (positive) number of bytes read if successful. |
5064 | | * \return \c 0 if the read end of the underlying transport was closed |
5065 | | * without sending a CloseNotify beforehand, which might happen |
5066 | | * because of various reasons (internal error of an underlying |
5067 | | * stack, non-conformant peer not sending a CloseNotify and |
5068 | | * such) - in this case you must stop using the context |
5069 | | * (see below). |
5070 | | * \return #MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY if the underlying |
5071 | | * transport is still functional, but the peer has |
5072 | | * acknowledged to not send anything anymore. |
5073 | | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
5074 | | * if the handshake is incomplete and waiting for data to |
5075 | | * be available for reading from or writing to the underlying |
5076 | | * transport - in this case you must call this function again |
5077 | | * when the underlying transport is ready for the operation. |
5078 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
5079 | | * operation is in progress (see |
5080 | | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
5081 | | * must call this function again when the operation is ready. |
5082 | | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
5083 | | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
5084 | | * in this case you must call this function again to complete |
5085 | | * the handshake when you're done attending other tasks. |
5086 | | * \return #MBEDTLS_ERR_SSL_CLIENT_RECONNECT if we're at the server |
5087 | | * side of a DTLS connection and the client is initiating a |
5088 | | * new connection using the same source port. See below. |
5089 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET if a TLS 1.3 |
5090 | | * NewSessionTicket message has been received. |
5091 | | * This error code is only returned on the client side. It is |
5092 | | * only returned if handling of TLS 1.3 NewSessionTicket |
5093 | | * messages has been enabled through |
5094 | | * mbedtls_ssl_conf_tls13_enable_signal_new_session_tickets(). |
5095 | | * This error code indicates that a TLS 1.3 NewSessionTicket |
5096 | | * message has been received and parsed successfully by the |
5097 | | * client. The ticket data can be retrieved from the SSL |
5098 | | * context by calling mbedtls_ssl_get_session(). It remains |
5099 | | * available until the next call to mbedtls_ssl_read(). |
5100 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA if early data, as |
5101 | | * defined in RFC 8446 (TLS 1.3 specification), has been |
5102 | | * received as part of the handshake. This is server specific |
5103 | | * and may occur only if the early data feature has been |
5104 | | * enabled on server (see mbedtls_ssl_conf_early_data() |
5105 | | * documentation). You must call mbedtls_ssl_read_early_data() |
5106 | | * to read the early data before resuming the handshake. |
5107 | | * \return Another SSL error code - in this case you must stop using |
5108 | | * the context (see below). |
5109 | | * |
5110 | | * \warning If this function returns something other than |
5111 | | * a positive value, |
5112 | | * #MBEDTLS_ERR_SSL_WANT_READ, |
5113 | | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
5114 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, |
5115 | | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, |
5116 | | * #MBEDTLS_ERR_SSL_CLIENT_RECONNECT or |
5117 | | * #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET or |
5118 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA, |
5119 | | * you must stop using the SSL context for reading or writing, |
5120 | | * and either free it or call \c mbedtls_ssl_session_reset() |
5121 | | * on it before re-using it for a new connection; the current |
5122 | | * connection must be closed. |
5123 | | * |
5124 | | * \note When this function returns #MBEDTLS_ERR_SSL_CLIENT_RECONNECT |
5125 | | * (which can only happen server-side), it means that a client |
5126 | | * is initiating a new connection using the same source port. |
5127 | | * You can either treat that as a connection close and wait |
5128 | | * for the client to resend a ClientHello, or directly |
5129 | | * continue with \c mbedtls_ssl_handshake() with the same |
5130 | | * context (as it has been reset internally). Either way, you |
5131 | | * must make sure this is seen by the application as a new |
5132 | | * connection: application state, if any, should be reset, and |
5133 | | * most importantly the identity of the client must be checked |
5134 | | * again. WARNING: not validating the identity of the client |
5135 | | * again, or not transmitting the new identity to the |
5136 | | * application layer, would allow authentication bypass! |
5137 | | * |
5138 | | * \note Remarks regarding event-driven DTLS: |
5139 | | * - If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram |
5140 | | * from the underlying transport layer is currently being processed, |
5141 | | * and it is safe to idle until the timer or the underlying transport |
5142 | | * signal a new event. |
5143 | | * - This function may return MBEDTLS_ERR_SSL_WANT_READ even if data was |
5144 | | * initially available on the underlying transport, as this data may have |
5145 | | * been only e.g. duplicated messages or a renegotiation request. |
5146 | | * Therefore, you must be prepared to receive MBEDTLS_ERR_SSL_WANT_READ even |
5147 | | * when reacting to an incoming-data event from the underlying transport. |
5148 | | * - On success, the datagram of the underlying transport that is currently |
5149 | | * being processed may contain further DTLS records. You should call |
5150 | | * \c mbedtls_ssl_check_pending to check for remaining records. |
5151 | | * |
5152 | | */ |
5153 | | int mbedtls_ssl_read(mbedtls_ssl_context *ssl, unsigned char *buf, size_t len); |
5154 | | |
5155 | | /** |
5156 | | * \brief Try to write exactly 'len' application data bytes |
5157 | | * |
5158 | | * \warning This function will do partial writes in some cases. If the |
5159 | | * return value is non-negative but less than length, the |
5160 | | * function must be called again with updated arguments: |
5161 | | * buf + ret, len - ret (if ret is the return value) until |
5162 | | * it returns a value equal to the last 'len' argument. |
5163 | | * |
5164 | | * \param ssl SSL context |
5165 | | * \param buf buffer holding the data |
5166 | | * \param len how many bytes must be written |
5167 | | * |
5168 | | * \return The (non-negative) number of bytes actually written if |
5169 | | * successful (may be less than \p len). |
5170 | | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
5171 | | * if the handshake is incomplete and waiting for data to |
5172 | | * be available for reading from or writing to the underlying |
5173 | | * transport - in this case you must call this function again |
5174 | | * when the underlying transport is ready for the operation. |
5175 | | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
5176 | | * operation is in progress (see |
5177 | | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
5178 | | * must call this function again when the operation is ready. |
5179 | | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
5180 | | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
5181 | | * in this case you must call this function again to complete |
5182 | | * the handshake when you're done attending other tasks. |
5183 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET if a TLS 1.3 |
5184 | | * NewSessionTicket message has been received. See the |
5185 | | * documentation of mbedtls_ssl_read() for more information |
5186 | | * about this error code. |
5187 | | * \return #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA if early data, as |
5188 | | * defined in RFC 8446 (TLS 1.3 specification), has been |
5189 | | * received as part of the handshake. This is server specific |
5190 | | * and may occur only if the early data feature has been |
5191 | | * enabled on server (see mbedtls_ssl_conf_early_data() |
5192 | | * documentation). You must call mbedtls_ssl_read_early_data() |
5193 | | * to read the early data before resuming the handshake. |
5194 | | * \return Another SSL error code - in this case you must stop using |
5195 | | * the context (see below). |
5196 | | * |
5197 | | * \warning If this function returns something other than |
5198 | | * a non-negative value, |
5199 | | * #MBEDTLS_ERR_SSL_WANT_READ, |
5200 | | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
5201 | | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, |
5202 | | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or |
5203 | | * #MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET or |
5204 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA, |
5205 | | * you must stop using the SSL context for reading or writing, |
5206 | | * and either free it or call \c mbedtls_ssl_session_reset() |
5207 | | * on it before re-using it for a new connection; the current |
5208 | | * connection must be closed. |
5209 | | * |
5210 | | * \note When this function returns #MBEDTLS_ERR_SSL_WANT_WRITE/READ, |
5211 | | * it must be called later with the *same* arguments, |
5212 | | * until it returns a value greater than or equal to 0. When |
5213 | | * the function returns #MBEDTLS_ERR_SSL_WANT_WRITE there may be |
5214 | | * some partial data in the output buffer, however this is not |
5215 | | * yet sent. |
5216 | | * |
5217 | | * \note If the requested length is greater than the maximum |
5218 | | * fragment length (either the built-in limit or the one set |
5219 | | * or negotiated with the peer), then: |
5220 | | * - with TLS, less bytes than requested are written. |
5221 | | * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. |
5222 | | * \c mbedtls_ssl_get_max_out_record_payload() may be used to |
5223 | | * query the active maximum fragment length. |
5224 | | * |
5225 | | * \note Attempting to write 0 bytes will result in an empty TLS |
5226 | | * application record being sent. |
5227 | | */ |
5228 | | int mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len); |
5229 | | |
5230 | | /** |
5231 | | * \brief Send an alert message |
5232 | | * |
5233 | | * \param ssl SSL context |
5234 | | * \param level The alert level of the message |
5235 | | * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) |
5236 | | * \param message The alert message (SSL_ALERT_MSG_*) |
5237 | | * |
5238 | | * \return 0 if successful, or a specific SSL error code. |
5239 | | * |
5240 | | * \note If this function returns something other than 0 or |
5241 | | * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using |
5242 | | * the SSL context for reading or writing, and either free it or |
5243 | | * call \c mbedtls_ssl_session_reset() on it before re-using it |
5244 | | * for a new connection; the current connection must be closed. |
5245 | | */ |
5246 | | int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, |
5247 | | unsigned char level, |
5248 | | unsigned char message); |
5249 | | /** |
5250 | | * \brief Notify the peer that the connection is being closed |
5251 | | * |
5252 | | * \param ssl SSL context |
5253 | | * |
5254 | | * \return 0 if successful, or a specific SSL error code. |
5255 | | * |
5256 | | * \note If this function returns something other than 0 or |
5257 | | * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using |
5258 | | * the SSL context for reading or writing, and either free it or |
5259 | | * call \c mbedtls_ssl_session_reset() on it before re-using it |
5260 | | * for a new connection; the current connection must be closed. |
5261 | | */ |
5262 | | int mbedtls_ssl_close_notify(mbedtls_ssl_context *ssl); |
5263 | | |
5264 | | #if defined(MBEDTLS_SSL_EARLY_DATA) |
5265 | | |
5266 | | #if defined(MBEDTLS_SSL_SRV_C) |
5267 | | /** |
5268 | | * \brief Read at most 'len' bytes of early data |
5269 | | * |
5270 | | * \note This API is server specific. |
5271 | | * |
5272 | | * \warning Early data is defined in the TLS 1.3 specification, RFC 8446. |
5273 | | * IMPORTANT NOTE from section 2.3 of the specification: |
5274 | | * |
5275 | | * The security properties for 0-RTT data are weaker than |
5276 | | * those for other kinds of TLS data. Specifically: |
5277 | | * - This data is not forward secret, as it is encrypted |
5278 | | * solely under keys derived using the offered PSK. |
5279 | | * - There are no guarantees of non-replay between connections. |
5280 | | * Protection against replay for ordinary TLS 1.3 1-RTT data |
5281 | | * is provided via the server's Random value, but 0-RTT data |
5282 | | * does not depend on the ServerHello and therefore has |
5283 | | * weaker guarantees. This is especially relevant if the |
5284 | | * data is authenticated either with TLS client |
5285 | | * authentication or inside the application protocol. The |
5286 | | * same warnings apply to any use of the |
5287 | | * early_exporter_master_secret. |
5288 | | * |
5289 | | * \warning Mbed TLS does not implement any of the anti-replay defenses |
5290 | | * defined in section 8 of the TLS 1.3 specification: |
5291 | | * single-use of tickets or ClientHello recording within a |
5292 | | * given time window. |
5293 | | * |
5294 | | * \note This function is used in conjunction with |
5295 | | * mbedtls_ssl_handshake(), mbedtls_ssl_handshake_step(), |
5296 | | * mbedtls_ssl_read() and mbedtls_ssl_write() to read early |
5297 | | * data when these functions return |
5298 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA. |
5299 | | * |
5300 | | * \param ssl SSL context, it must have been initialized and set up. |
5301 | | * \param buf buffer that will hold the data |
5302 | | * \param len maximum number of bytes to read |
5303 | | * |
5304 | | * \return The (positive) number of bytes read if successful. |
5305 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. |
5306 | | * \return #MBEDTLS_ERR_SSL_CANNOT_READ_EARLY_DATA if it is not |
5307 | | * possible to read early data for the SSL context \p ssl. Note |
5308 | | * that this function is intended to be called for an SSL |
5309 | | * context \p ssl only after a call to mbedtls_ssl_handshake(), |
5310 | | * mbedtls_ssl_handshake_step(), mbedtls_ssl_read() or |
5311 | | * mbedtls_ssl_write() for \p ssl that has returned |
5312 | | * #MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA. |
5313 | | */ |
5314 | | int mbedtls_ssl_read_early_data(mbedtls_ssl_context *ssl, |
5315 | | unsigned char *buf, size_t len); |
5316 | | #endif /* MBEDTLS_SSL_SRV_C */ |
5317 | | |
5318 | | #if defined(MBEDTLS_SSL_CLI_C) |
5319 | | /** |
5320 | | * \brief Try to write exactly 'len' application data bytes while |
5321 | | * performing the handshake (early data). |
5322 | | * |
5323 | | * \warning Early data is defined in the TLS 1.3 specification, RFC 8446. |
5324 | | * IMPORTANT NOTE from section 2.3 of the specification: |
5325 | | * |
5326 | | * The security properties for 0-RTT data are weaker than |
5327 | | * those for other kinds of TLS data. Specifically: |
5328 | | * - This data is not forward secret, as it is encrypted |
5329 | | * solely under keys derived using the offered PSK. |
5330 | | * - There are no guarantees of non-replay between connections. |
5331 | | * Protection against replay for ordinary TLS 1.3 1-RTT data |
5332 | | * is provided via the server's Random value, but 0-RTT data |
5333 | | * does not depend on the ServerHello and therefore has |
5334 | | * weaker guarantees. This is especially relevant if the |
5335 | | * data is authenticated either with TLS client |
5336 | | * authentication or inside the application protocol. The |
5337 | | * same warnings apply to any use of the |
5338 | | * early_exporter_master_secret. |
5339 | | * |
5340 | | * \note This function behaves mainly as mbedtls_ssl_write(). The |
5341 | | * specification of mbedtls_ssl_write() relevant to TLS 1.3 |
5342 | | * (thus not the parts specific to (D)TLS1.2) applies to this |
5343 | | * function and the present documentation is mainly restricted |
5344 | | * to the differences with mbedtls_ssl_write(). One noticeable |
5345 | | * difference though is that mbedtls_ssl_write() aims to |
5346 | | * complete the handshake before to write application data |
5347 | | * while mbedtls_ssl_write_early() aims to drive the handshake |
5348 | | * just past the point where it is not possible to send early |
5349 | | * data anymore. |
5350 | | * |
5351 | | * \param ssl SSL context |
5352 | | * \param buf buffer holding the data |
5353 | | * \param len how many bytes must be written |
5354 | | * |
5355 | | * \return The (non-negative) number of bytes actually written if |
5356 | | * successful (may be less than \p len). |
5357 | | * |
5358 | | * \return One additional specific error code compared to |
5359 | | * mbedtls_ssl_write(): |
5360 | | * #MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA. |
5361 | | * |
5362 | | * #MBEDTLS_ERR_SSL_CANNOT_WRITE_EARLY_DATA is returned when it |
5363 | | * is not possible to write early data for the SSL context |
5364 | | * \p ssl. |
5365 | | * |
5366 | | * It may have been possible and it is not possible |
5367 | | * anymore because the client received the server Finished |
5368 | | * message, the server rejected early data or the maximum |
5369 | | * number of allowed early data for the PSK in use has been |
5370 | | * reached. |
5371 | | * |
5372 | | * It may never have been possible and will never be possible |
5373 | | * for the SSL context \p ssl because the use of early data |
5374 | | * is disabled for that context or more generally the context |
5375 | | * is not suitably configured to enable early data or the first |
5376 | | * call to the function was done while the handshake was |
5377 | | * already completed. |
5378 | | * |
5379 | | * It is not possible to write early data for the SSL context |
5380 | | * \p ssl and any subsequent call to this API will return this |
5381 | | * error code. But this does not preclude for using it with |
5382 | | * mbedtls_ssl_write(), mbedtls_ssl_read() or |
5383 | | * mbedtls_ssl_handshake() and the handshake can be |
5384 | | * completed by calling one of these APIs. |
5385 | | * |
5386 | | * \note This function may write early data only if the SSL context |
5387 | | * has been configured for the handshake with a PSK for which |
5388 | | * early data is allowed. |
5389 | | * |
5390 | | * \note To maximize the number of early data that can be written in |
5391 | | * the course of the handshake, it is expected that this |
5392 | | * function starts the handshake for the SSL context \p ssl. |
5393 | | * But this is not mandatory. |
5394 | | * |
5395 | | * \note This function does not provide any information on whether |
5396 | | * the server has accepted or will accept early data or not. |
5397 | | * When it returns a positive value, it just means that it |
5398 | | * has written early data to the server. To know whether the |
5399 | | * server has accepted early data or not, you should call |
5400 | | * mbedtls_ssl_get_early_data_status() with the handshake |
5401 | | * completed. |
5402 | | */ |
5403 | | int mbedtls_ssl_write_early_data(mbedtls_ssl_context *ssl, |
5404 | | const unsigned char *buf, size_t len); |
5405 | | |
5406 | | /** |
5407 | | * \brief Get the status of the negotiation of the use of early data. |
5408 | | * |
5409 | | * \param ssl The SSL context to query |
5410 | | * |
5411 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if this function is called |
5412 | | * from the server-side. |
5413 | | * |
5414 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if this function is called |
5415 | | * prior to completion of the handshake. |
5416 | | * |
5417 | | * \return #MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_INDICATED if the client |
5418 | | * has not indicated the use of early data to the server. |
5419 | | * |
5420 | | * \return #MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED if the client has |
5421 | | * indicated the use of early data and the server has accepted |
5422 | | * it. |
5423 | | * |
5424 | | * \return #MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED if the client has |
5425 | | * indicated the use of early data but the server has rejected |
5426 | | * it. In this situation, the client may want to re-send the |
5427 | | * early data it may have tried to send by calling |
5428 | | * mbedtls_ssl_write_early_data() as ordinary post-handshake |
5429 | | * application data by calling mbedtls_ssl_write(). |
5430 | | * |
5431 | | */ |
5432 | | int mbedtls_ssl_get_early_data_status(mbedtls_ssl_context *ssl); |
5433 | | #endif /* MBEDTLS_SSL_CLI_C */ |
5434 | | |
5435 | | #endif /* MBEDTLS_SSL_EARLY_DATA */ |
5436 | | |
5437 | | /** |
5438 | | * \brief Free referenced items in an SSL context and clear memory |
5439 | | * |
5440 | | * \param ssl SSL context |
5441 | | */ |
5442 | | void mbedtls_ssl_free(mbedtls_ssl_context *ssl); |
5443 | | |
5444 | | #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) |
5445 | | /** |
5446 | | * \brief Save an active connection as serialized data in a buffer. |
5447 | | * This allows the freeing or re-using of the SSL context |
5448 | | * while still picking up the connection later in a way that |
5449 | | * it entirely transparent to the peer. |
5450 | | * |
5451 | | * \see mbedtls_ssl_context_load() |
5452 | | * |
5453 | | * \note The serialized data only contains the data that is |
5454 | | * necessary to resume the connection: negotiated protocol |
5455 | | * options, session identifier, keys, etc. |
5456 | | * Loading a saved SSL context does not restore settings and |
5457 | | * state related to how the application accesses the context, |
5458 | | * such as configured callback functions, user data, pending |
5459 | | * incoming or outgoing data, etc. |
5460 | | * |
5461 | | * \note This feature is currently only available under certain |
5462 | | * conditions, see the documentation of the return value |
5463 | | * #MBEDTLS_ERR_SSL_BAD_INPUT_DATA for details. |
5464 | | * |
5465 | | * \note When this function succeeds, it calls |
5466 | | * mbedtls_ssl_session_reset() on \p ssl which as a result is |
5467 | | * no longer associated with the connection that has been |
5468 | | * serialized. This avoids creating copies of the connection |
5469 | | * state. You're then free to either re-use the context |
5470 | | * structure for a different connection, or call |
5471 | | * mbedtls_ssl_free() on it. See the documentation of |
5472 | | * mbedtls_ssl_session_reset() for more details. |
5473 | | * |
5474 | | * \param ssl The SSL context to save. On success, it is no longer |
5475 | | * associated with the connection that has been serialized. |
5476 | | * \param buf The buffer to write the serialized data to. It must be a |
5477 | | * writeable buffer of at least \p buf_len bytes, or may be \c |
5478 | | * NULL if \p buf_len is \c 0. |
5479 | | * \param buf_len The number of bytes available for writing in \p buf. |
5480 | | * \param olen The size in bytes of the data that has been or would have |
5481 | | * been written. It must point to a valid \c size_t. |
5482 | | * |
5483 | | * \note \p olen is updated to the correct value regardless of |
5484 | | * whether \p buf_len was large enough. This makes it possible |
5485 | | * to determine the necessary size by calling this function |
5486 | | * with \p buf set to \c NULL and \p buf_len to \c 0. However, |
5487 | | * the value of \p olen is only guaranteed to be correct when |
5488 | | * the function returns #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL or |
5489 | | * \c 0. If the return value is different, then the value of |
5490 | | * \p olen is undefined. |
5491 | | * |
5492 | | * \return \c 0 if successful. |
5493 | | * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. |
5494 | | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed |
5495 | | * while resetting the context. |
5496 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if a handshake is in |
5497 | | * progress, or there is pending data for reading or sending, |
5498 | | * or the connection does not use DTLS 1.2 with an AEAD |
5499 | | * ciphersuite, or renegotiation is enabled. |
5500 | | */ |
5501 | | int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl, |
5502 | | unsigned char *buf, |
5503 | | size_t buf_len, |
5504 | | size_t *olen); |
5505 | | |
5506 | | /** |
5507 | | * \brief Load serialized connection data to an SSL context. |
5508 | | * |
5509 | | * \see mbedtls_ssl_context_save() |
5510 | | * |
5511 | | * \warning The same serialized data must never be loaded into more |
5512 | | * that one context. In order to ensure that, after |
5513 | | * successfully loading serialized data to an SSL context, you |
5514 | | * should immediately destroy or invalidate all copies of the |
5515 | | * serialized data that was loaded. Loading the same data in |
5516 | | * more than one context would cause severe security failures |
5517 | | * including but not limited to loss of confidentiality. |
5518 | | * |
5519 | | * \note Before calling this function, the SSL context must be |
5520 | | * prepared in one of the two following ways. The first way is |
5521 | | * to take a context freshly initialised with |
5522 | | * mbedtls_ssl_init() and call mbedtls_ssl_setup() on it with |
5523 | | * the same ::mbedtls_ssl_config structure that was used in |
5524 | | * the original connection. The second way is to |
5525 | | * call mbedtls_ssl_session_reset() on a context that was |
5526 | | * previously prepared as above but used in the meantime. |
5527 | | * Either way, you must not use the context to perform a |
5528 | | * handshake between calling mbedtls_ssl_setup() or |
5529 | | * mbedtls_ssl_session_reset() and calling this function. You |
5530 | | * may however call other setter functions in that time frame |
5531 | | * as indicated in the note below. |
5532 | | * |
5533 | | * \note Before or after calling this function successfully, you |
5534 | | * also need to configure some connection-specific callbacks |
5535 | | * and settings before you can use the connection again |
5536 | | * (unless they were already set before calling |
5537 | | * mbedtls_ssl_session_reset() and the values are suitable for |
5538 | | * the present connection). Specifically, you want to call |
5539 | | * at least mbedtls_ssl_set_bio(), |
5540 | | * mbedtls_ssl_set_timer_cb(), and |
5541 | | * mbedtls_ssl_set_user_data_n() or |
5542 | | * mbedtls_ssl_set_user_data_p() if they were set originally. |
5543 | | * All other SSL setter functions |
5544 | | * are not necessary to call, either because they're only used |
5545 | | * in handshakes, or because the setting is already saved. You |
5546 | | * might choose to call them anyway, for example in order to |
5547 | | * share code between the cases of establishing a new |
5548 | | * connection and the case of loading an already-established |
5549 | | * connection. |
5550 | | * |
5551 | | * \note If you have new information about the path MTU, you want to |
5552 | | * call mbedtls_ssl_set_mtu() after calling this function, as |
5553 | | * otherwise this function would overwrite your |
5554 | | * newly-configured value with the value that was active when |
5555 | | * the context was saved. |
5556 | | * |
5557 | | * \note When this function returns an error code, it calls |
5558 | | * mbedtls_ssl_free() on \p ssl. In this case, you need to |
5559 | | * prepare the context with the usual sequence starting with a |
5560 | | * call to mbedtls_ssl_init() if you want to use it again. |
5561 | | * |
5562 | | * \param ssl The SSL context structure to be populated. It must have |
5563 | | * been prepared as described in the note above. |
5564 | | * \param buf The buffer holding the serialized connection data. It must |
5565 | | * be a readable buffer of at least \p len bytes. |
5566 | | * \param len The size of the serialized data in bytes. |
5567 | | * |
5568 | | * \return \c 0 if successful. |
5569 | | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. |
5570 | | * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data |
5571 | | * comes from a different Mbed TLS version or build. |
5572 | | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. |
5573 | | */ |
5574 | | int mbedtls_ssl_context_load(mbedtls_ssl_context *ssl, |
5575 | | const unsigned char *buf, |
5576 | | size_t len); |
5577 | | #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ |
5578 | | |
5579 | | /** |
5580 | | * \brief Initialize an SSL configuration context |
5581 | | * Just makes the context ready for |
5582 | | * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). |
5583 | | * |
5584 | | * \note You need to call mbedtls_ssl_config_defaults() unless you |
5585 | | * manually set all of the relevant fields yourself. |
5586 | | * |
5587 | | * \param conf SSL configuration context |
5588 | | */ |
5589 | | void mbedtls_ssl_config_init(mbedtls_ssl_config *conf); |
5590 | | |
5591 | | /** |
5592 | | * \brief Load reasonable default SSL configuration values. |
5593 | | * (You need to call mbedtls_ssl_config_init() first.) |
5594 | | * |
5595 | | * \param conf SSL configuration context |
5596 | | * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER |
5597 | | * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or |
5598 | | * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS |
5599 | | * \param preset a MBEDTLS_SSL_PRESET_XXX value |
5600 | | * |
5601 | | * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. |
5602 | | * |
5603 | | * \return 0 if successful, or |
5604 | | * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. |
5605 | | */ |
5606 | | int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf, |
5607 | | int endpoint, int transport, int preset); |
5608 | | |
5609 | | /** |
5610 | | * \brief Free an SSL configuration context |
5611 | | * |
5612 | | * \param conf SSL configuration context |
5613 | | */ |
5614 | | void mbedtls_ssl_config_free(mbedtls_ssl_config *conf); |
5615 | | |
5616 | | /** |
5617 | | * \brief Initialize SSL session structure |
5618 | | * |
5619 | | * \param session SSL session |
5620 | | */ |
5621 | | void mbedtls_ssl_session_init(mbedtls_ssl_session *session); |
5622 | | |
5623 | | /** |
5624 | | * \brief Free referenced items in an SSL session including the |
5625 | | * peer certificate and clear memory |
5626 | | * |
5627 | | * \note A session object can be freed even if the SSL context |
5628 | | * that was used to retrieve the session is still in use. |
5629 | | * |
5630 | | * \param session SSL session |
5631 | | */ |
5632 | | void mbedtls_ssl_session_free(mbedtls_ssl_session *session); |
5633 | | |
5634 | | /** |
5635 | | * \brief TLS-PRF function for key derivation. |
5636 | | * |
5637 | | * \param prf The tls_prf type function type to be used. |
5638 | | * \param secret Secret for the key derivation function. |
5639 | | * \param slen Length of the secret. |
5640 | | * \param label String label for the key derivation function, |
5641 | | * terminated with null character. |
5642 | | * \param random Random bytes. |
5643 | | * \param rlen Length of the random bytes buffer. |
5644 | | * \param dstbuf The buffer holding the derived key. |
5645 | | * \param dlen Length of the output buffer. |
5646 | | * |
5647 | | * \return 0 on success. An SSL specific error on failure. |
5648 | | */ |
5649 | | int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf, |
5650 | | const unsigned char *secret, size_t slen, |
5651 | | const char *label, |
5652 | | const unsigned char *random, size_t rlen, |
5653 | | unsigned char *dstbuf, size_t dlen); |
5654 | | |
5655 | | #ifdef __cplusplus |
5656 | | } |
5657 | | #endif |
5658 | | |
5659 | | #endif /* ssl.h */ |