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 |
9 | * |
10 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
11 | * not use this file except in compliance with the License. |
12 | * You may obtain a copy of the License at |
13 | * |
14 | * http://www.apache.org/licenses/LICENSE-2.0 |
15 | * |
16 | * Unless required by applicable law or agreed to in writing, software |
17 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
18 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
19 | * See the License for the specific language governing permissions and |
20 | * limitations under the License. |
21 | */ |
22 | #ifndef MBEDTLS_SSL_H |
23 | #define MBEDTLS_SSL_H |
24 | |
25 | #if !defined(MBEDTLS_CONFIG_FILE) |
26 | #include "mbedtls/config.h" |
27 | #else |
28 | #include MBEDTLS_CONFIG_FILE |
29 | #endif |
30 | |
31 | #include "mbedtls/bignum.h" |
32 | #include "mbedtls/ecp.h" |
33 | |
34 | #include "mbedtls/ssl_ciphersuites.h" |
35 | |
36 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
37 | #include "mbedtls/x509_crt.h" |
38 | #include "mbedtls/x509_crl.h" |
39 | #endif |
40 | |
41 | #if defined(MBEDTLS_DHM_C) |
42 | #include "mbedtls/dhm.h" |
43 | #endif |
44 | |
45 | /* Adding guard for MBEDTLS_ECDSA_C to ensure no compile errors due |
46 | * to guards also being in ssl_srv.c and ssl_cli.c. There is a gap |
47 | * in functionality that access to ecdh_ctx structure is needed for |
48 | * MBEDTLS_ECDSA_C which does not seem correct. |
49 | */ |
50 | #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) |
51 | #include "mbedtls/ecdh.h" |
52 | #endif |
53 | |
54 | #if defined(MBEDTLS_ZLIB_SUPPORT) |
55 | |
56 | #if defined(MBEDTLS_DEPRECATED_WARNING) |
57 | #warning \ |
58 | "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and will be removed in the next major revision of the library" |
59 | #endif |
60 | |
61 | #if defined(MBEDTLS_DEPRECATED_REMOVED) |
62 | #error \ |
63 | "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and cannot be used if MBEDTLS_DEPRECATED_REMOVED is set" |
64 | #endif |
65 | |
66 | #include "zlib.h" |
67 | #endif |
68 | |
69 | #if defined(MBEDTLS_HAVE_TIME) |
70 | #include "mbedtls/platform_time.h" |
71 | #endif |
72 | |
73 | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
74 | #include "psa/crypto.h" |
75 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
76 | |
77 | /* |
78 | * SSL Error codes |
79 | */ |
80 | /** The requested feature is not available. */ |
81 | #define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 |
82 | /** Bad input parameters to function. */ |
83 | #define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 |
84 | /** Verification of the message MAC failed. */ |
85 | #define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 |
86 | /** An invalid SSL record was received. */ |
87 | #define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 |
88 | /** The connection indicated an EOF. */ |
89 | #define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 |
90 | /** An unknown cipher was received. */ |
91 | #define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 |
92 | /** The server has no ciphersuites in common with the client. */ |
93 | #define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 |
94 | /** No RNG was provided to the SSL module. */ |
95 | #define MBEDTLS_ERR_SSL_NO_RNG -0x7400 |
96 | /** No client certification received from the client, but required by the authentication mode. */ |
97 | #define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 |
98 | /** Our own certificate(s) is/are too large to send in an SSL message. */ |
99 | #define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 |
100 | /** The own certificate is not set, but needed by the server. */ |
101 | #define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 |
102 | /** The own private key or pre-shared key is not set, but needed. */ |
103 | #define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 |
104 | /** No CA Chain is set, but required to operate. */ |
105 | #define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 |
106 | /** An unexpected message was received from our peer. */ |
107 | #define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 |
108 | /** A fatal alert message was received from our peer. */ |
109 | #define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 |
110 | /** Verification of our peer failed. */ |
111 | #define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 |
112 | /** The peer notified us that the connection is going to be closed. */ |
113 | #define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 |
114 | /** Processing of the ClientHello handshake message failed. */ |
115 | #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 |
116 | /** Processing of the ServerHello handshake message failed. */ |
117 | #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 |
118 | /** Processing of the Certificate handshake message failed. */ |
119 | #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 |
120 | /** Processing of the CertificateRequest handshake message failed. */ |
121 | #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 |
122 | /** Processing of the ServerKeyExchange handshake message failed. */ |
123 | #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 |
124 | /** Processing of the ServerHelloDone handshake message failed. */ |
125 | #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 |
126 | /** Processing of the ClientKeyExchange handshake message failed. */ |
127 | #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 |
128 | /** Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ |
129 | #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 |
130 | /** Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ |
131 | #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 |
132 | /** Processing of the CertificateVerify handshake message failed. */ |
133 | #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 |
134 | /** Processing of the ChangeCipherSpec handshake message failed. */ |
135 | #define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 |
136 | /** Processing of the Finished handshake message failed. */ |
137 | #define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 |
138 | /** Memory allocation failed */ |
139 | #define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 |
140 | /** Hardware acceleration function returned with error */ |
141 | #define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 |
142 | /** Hardware acceleration function skipped / left alone data */ |
143 | #define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 |
144 | /** Processing of the compression / decompression failed */ |
145 | #define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 |
146 | /** Handshake protocol not within min/max boundaries */ |
147 | #define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 |
148 | /** Processing of the NewSessionTicket handshake message failed. */ |
149 | #define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 |
150 | /** Session ticket has expired. */ |
151 | #define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 |
152 | /** Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ |
153 | #define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 |
154 | /** Unknown identity received (eg, PSK identity) */ |
155 | #define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 |
156 | /** Internal error (eg, unexpected failure in lower-level module) */ |
157 | #define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 |
158 | /** A counter would wrap (eg, too many messages exchanged). */ |
159 | #define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 |
160 | /** Unexpected message at ServerHello in renegotiation. */ |
161 | #define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 |
162 | /** DTLS client must retry for hello verification */ |
163 | #define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 |
164 | /** A buffer is too small to receive or write a message */ |
165 | #define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 |
166 | /** None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ |
167 | #define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 |
168 | /** No data of requested type currently available on underlying transport. */ |
169 | #define MBEDTLS_ERR_SSL_WANT_READ -0x6900 |
170 | /** Connection requires a write call. */ |
171 | #define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 |
172 | /** The operation timed out. */ |
173 | #define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 |
174 | /** The client initiated a reconnect from the same port. */ |
175 | #define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 |
176 | /** Record header looks valid but is not expected. */ |
177 | #define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD -0x6700 |
178 | /** The alert message received indicates a non-fatal error. */ |
179 | #define MBEDTLS_ERR_SSL_NON_FATAL -0x6680 |
180 | /** Couldn't set the hash for verifying CertificateVerify */ |
181 | #define MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH -0x6600 |
182 | /** Internal-only message signaling that further message-processing should be done */ |
183 | #define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 |
184 | /** The asynchronous operation is not completed yet. */ |
185 | #define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 |
186 | /** Internal-only message signaling that a message arrived early. */ |
187 | #define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 |
188 | /** An encrypted DTLS-frame with an unexpected CID was received. */ |
189 | #define MBEDTLS_ERR_SSL_UNEXPECTED_CID -0x6000 |
190 | /** An operation failed due to an unexpected version or configuration. */ |
191 | #define MBEDTLS_ERR_SSL_VERSION_MISMATCH -0x5F00 |
192 | /** A cryptographic operation is in progress. Try again later. */ |
193 | #define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 |
194 | /** Invalid value in SSL config */ |
195 | #define MBEDTLS_ERR_SSL_BAD_CONFIG -0x5E80 |
196 | |
197 | /* |
198 | * Various constants |
199 | */ |
200 | #define MBEDTLS_SSL_MAJOR_VERSION_3 3 |
201 | #define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ |
202 | #define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ |
203 | #define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ |
204 | #define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ |
205 | #define MBEDTLS_SSL_MINOR_VERSION_4 4 /*!< TLS v1.3 (experimental) */ |
206 | |
207 | #define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ |
208 | #define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ |
209 | |
210 | #define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ |
211 | #define MBEDTLS_SSL_MAX_ALPN_NAME_LEN 255 /*!< Maximum size in bytes of a protocol name in alpn ext., RFC 7301 */ |
212 | |
213 | #define MBEDTLS_SSL_MAX_ALPN_LIST_LEN 65535 /*!< Maximum size in bytes of list in alpn ext., RFC 7301 */ |
214 | |
215 | /* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c |
216 | * NONE must be zero so that memset()ing structure to zero works */ |
217 | #define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ |
218 | #define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ |
219 | #define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ |
220 | #define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ |
221 | #define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ |
222 | #define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ |
223 | |
224 | #define MBEDTLS_SSL_IS_CLIENT 0 |
225 | #define MBEDTLS_SSL_IS_SERVER 1 |
226 | |
227 | #define MBEDTLS_SSL_IS_NOT_FALLBACK 0 |
228 | #define MBEDTLS_SSL_IS_FALLBACK 1 |
229 | |
230 | #define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 |
231 | #define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 |
232 | |
233 | #define MBEDTLS_SSL_CID_DISABLED 0 |
234 | #define MBEDTLS_SSL_CID_ENABLED 1 |
235 | |
236 | #define MBEDTLS_SSL_ETM_DISABLED 0 |
237 | #define MBEDTLS_SSL_ETM_ENABLED 1 |
238 | |
239 | #define MBEDTLS_SSL_COMPRESS_NULL 0 |
240 | #define MBEDTLS_SSL_COMPRESS_DEFLATE 1 |
241 | |
242 | #define MBEDTLS_SSL_VERIFY_NONE 0 |
243 | #define MBEDTLS_SSL_VERIFY_OPTIONAL 1 |
244 | #define MBEDTLS_SSL_VERIFY_REQUIRED 2 |
245 | #define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ |
246 | |
247 | #define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 |
248 | #define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 |
249 | |
250 | #define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 |
251 | #define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 |
252 | |
253 | #define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 |
254 | #define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 |
255 | |
256 | #define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 |
257 | #define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 |
258 | |
259 | #define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 |
260 | #define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 |
261 | #define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 |
262 | |
263 | #define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 |
264 | #define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 |
265 | #define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ |
266 | |
267 | #define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 |
268 | #define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 |
269 | |
270 | #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 |
271 | #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 |
272 | |
273 | #define MBEDTLS_SSL_ARC4_ENABLED 0 |
274 | #define MBEDTLS_SSL_ARC4_DISABLED 1 |
275 | |
276 | #define MBEDTLS_SSL_PRESET_DEFAULT 0 |
277 | #define MBEDTLS_SSL_PRESET_SUITEB 2 |
278 | |
279 | #define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED 1 |
280 | #define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED 0 |
281 | |
282 | #define MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED 0 |
283 | #define MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED 1 |
284 | |
285 | /* |
286 | * Default range for DTLS retransmission timer value, in milliseconds. |
287 | * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. |
288 | */ |
289 | #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 |
290 | #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 |
291 | |
292 | /** |
293 | * \name SECTION: Module settings |
294 | * |
295 | * The configuration options you can set for this module are in this section. |
296 | * Either change them in config.h or define them on the compiler command line. |
297 | * \{ |
298 | */ |
299 | |
300 | #if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) |
301 | #define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ |
302 | #endif |
303 | |
304 | /* |
305 | * Maximum fragment length in bytes, |
306 | * determines the size of each of the two internal I/O buffers. |
307 | * |
308 | * Note: the RFC defines the default size of SSL / TLS messages. If you |
309 | * change the value here, other clients / servers may not be able to |
310 | * communicate with you anymore. Only change this value if you control |
311 | * both sides of the connection and have it reduced at both sides, or |
312 | * if you're using the Max Fragment Length extension and you know all your |
313 | * peers are using it too! |
314 | */ |
315 | #if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) |
316 | #define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ |
317 | #endif |
318 | |
319 | #if !defined(MBEDTLS_SSL_IN_CONTENT_LEN) |
320 | #define MBEDTLS_SSL_IN_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN |
321 | #endif |
322 | |
323 | #if !defined(MBEDTLS_SSL_OUT_CONTENT_LEN) |
324 | #define MBEDTLS_SSL_OUT_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN |
325 | #endif |
326 | |
327 | /* |
328 | * Maximum number of heap-allocated bytes for the purpose of |
329 | * DTLS handshake message reassembly and future message buffering. |
330 | */ |
331 | #if !defined(MBEDTLS_SSL_DTLS_MAX_BUFFERING) |
332 | #define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 |
333 | #endif |
334 | |
335 | /* |
336 | * Maximum length of CIDs for incoming and outgoing messages. |
337 | */ |
338 | #if !defined(MBEDTLS_SSL_CID_IN_LEN_MAX) |
339 | #define MBEDTLS_SSL_CID_IN_LEN_MAX 32 |
340 | #endif |
341 | |
342 | #if !defined(MBEDTLS_SSL_CID_OUT_LEN_MAX) |
343 | #define MBEDTLS_SSL_CID_OUT_LEN_MAX 32 |
344 | #endif |
345 | |
346 | #if !defined(MBEDTLS_SSL_CID_PADDING_GRANULARITY) |
347 | #define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16 |
348 | #endif |
349 | |
350 | #if !defined(MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY) |
351 | #define MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY 1 |
352 | #endif |
353 | |
354 | /** \} name SECTION: Module settings */ |
355 | |
356 | /* |
357 | * Length of the verify data for secure renegotiation |
358 | */ |
359 | #if defined(MBEDTLS_SSL_PROTO_SSL3) |
360 | #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 |
361 | #else |
362 | #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 |
363 | #endif |
364 | |
365 | /* |
366 | * Signaling ciphersuite values (SCSV) |
367 | */ |
368 | #define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ |
369 | #define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< RFC 7507 section 2 */ |
370 | |
371 | /* |
372 | * Supported Signature and Hash algorithms (For TLS 1.2) |
373 | * RFC 5246 section 7.4.1.4.1 |
374 | */ |
375 | #define MBEDTLS_SSL_HASH_NONE 0 |
376 | #define MBEDTLS_SSL_HASH_MD5 1 |
377 | #define MBEDTLS_SSL_HASH_SHA1 2 |
378 | #define MBEDTLS_SSL_HASH_SHA224 3 |
379 | #define MBEDTLS_SSL_HASH_SHA256 4 |
380 | #define MBEDTLS_SSL_HASH_SHA384 5 |
381 | #define MBEDTLS_SSL_HASH_SHA512 6 |
382 | |
383 | #define MBEDTLS_SSL_SIG_ANON 0 |
384 | #define MBEDTLS_SSL_SIG_RSA 1 |
385 | #define MBEDTLS_SSL_SIG_ECDSA 3 |
386 | |
387 | /* |
388 | * Client Certificate Types |
389 | * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 |
390 | */ |
391 | #define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 |
392 | #define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 |
393 | |
394 | /* |
395 | * Message, alert and handshake types |
396 | */ |
397 | #define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 |
398 | #define MBEDTLS_SSL_MSG_ALERT 21 |
399 | #define MBEDTLS_SSL_MSG_HANDSHAKE 22 |
400 | #define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 |
401 | #define MBEDTLS_SSL_MSG_CID 25 |
402 | |
403 | #define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 |
404 | #define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 |
405 | |
406 | #define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ |
407 | #define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ |
408 | #define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ |
409 | #define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ |
410 | #define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ |
411 | #define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ |
412 | #define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ |
413 | #define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ |
414 | #define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ |
415 | #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ |
416 | #define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ |
417 | #define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ |
418 | #define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ |
419 | #define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ |
420 | #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ |
421 | #define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ |
422 | #define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ |
423 | #define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ |
424 | #define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ |
425 | #define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ |
426 | #define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ |
427 | #define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ |
428 | #define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ |
429 | #define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ |
430 | #define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ |
431 | #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ |
432 | #define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ |
433 | #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ |
434 | #define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ |
435 | |
436 | #define MBEDTLS_SSL_HS_HELLO_REQUEST 0 |
437 | #define MBEDTLS_SSL_HS_CLIENT_HELLO 1 |
438 | #define MBEDTLS_SSL_HS_SERVER_HELLO 2 |
439 | #define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 |
440 | #define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 |
441 | #define MBEDTLS_SSL_HS_CERTIFICATE 11 |
442 | #define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 |
443 | #define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 |
444 | #define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 |
445 | #define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 |
446 | #define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 |
447 | #define MBEDTLS_SSL_HS_FINISHED 20 |
448 | |
449 | /* |
450 | * TLS extensions |
451 | */ |
452 | #define MBEDTLS_TLS_EXT_SERVERNAME 0 |
453 | #define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 |
454 | |
455 | #define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 |
456 | |
457 | #define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 |
458 | |
459 | #define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 |
460 | #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 |
461 | |
462 | #define MBEDTLS_TLS_EXT_SIG_ALG 13 |
463 | |
464 | #define MBEDTLS_TLS_EXT_USE_SRTP 14 |
465 | |
466 | #define MBEDTLS_TLS_EXT_ALPN 16 |
467 | |
468 | #define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ |
469 | #define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ |
470 | |
471 | #define MBEDTLS_TLS_EXT_SESSION_TICKET 35 |
472 | |
473 | /* The value of the CID extension is still TBD as of |
474 | * draft-ietf-tls-dtls-connection-id-05 |
475 | * (https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05). |
476 | * |
477 | * A future minor revision of Mbed TLS may change the default value of |
478 | * this option to match evolving standards and usage. |
479 | */ |
480 | #if !defined(MBEDTLS_TLS_EXT_CID) |
481 | #define MBEDTLS_TLS_EXT_CID 254 /* TBD */ |
482 | #endif |
483 | |
484 | #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */ |
485 | |
486 | #define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 |
487 | |
488 | /* |
489 | * Size defines |
490 | */ |
491 | #if !defined(MBEDTLS_PSK_MAX_LEN) |
492 | #define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ |
493 | #endif |
494 | |
495 | /* Dummy type used only for its size */ |
496 | union mbedtls_ssl_premaster_secret { |
497 | unsigned char dummy; /* Make the union non-empty even with SSL disabled */ |
498 | #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) |
499 | unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ |
500 | #endif |
501 | #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) |
502 | unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ |
503 | #endif |
504 | #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ |
505 | defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ |
506 | defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ |
507 | defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) |
508 | unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ |
509 | #endif |
510 | #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) |
511 | unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ |
512 | #endif |
513 | #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) |
514 | unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE |
515 | + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ |
516 | #endif |
517 | #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) |
518 | unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ |
519 | #endif |
520 | #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) |
521 | unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES |
522 | + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ |
523 | #endif |
524 | #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) |
525 | unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */ |
526 | #endif |
527 | }; |
528 | |
529 | #define MBEDTLS_PREMASTER_SIZE sizeof(union mbedtls_ssl_premaster_secret) |
530 | |
531 | #ifdef __cplusplus |
532 | extern "C" { |
533 | #endif |
534 | |
535 | /* |
536 | * SSL state machine |
537 | */ |
538 | typedef enum { |
539 | MBEDTLS_SSL_HELLO_REQUEST, |
540 | MBEDTLS_SSL_CLIENT_HELLO, |
541 | MBEDTLS_SSL_SERVER_HELLO, |
542 | MBEDTLS_SSL_SERVER_CERTIFICATE, |
543 | MBEDTLS_SSL_SERVER_KEY_EXCHANGE, |
544 | MBEDTLS_SSL_CERTIFICATE_REQUEST, |
545 | MBEDTLS_SSL_SERVER_HELLO_DONE, |
546 | MBEDTLS_SSL_CLIENT_CERTIFICATE, |
547 | MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, |
548 | MBEDTLS_SSL_CERTIFICATE_VERIFY, |
549 | MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, |
550 | MBEDTLS_SSL_CLIENT_FINISHED, |
551 | MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, |
552 | MBEDTLS_SSL_SERVER_FINISHED, |
553 | MBEDTLS_SSL_FLUSH_BUFFERS, |
554 | MBEDTLS_SSL_HANDSHAKE_WRAPUP, |
555 | MBEDTLS_SSL_HANDSHAKE_OVER, |
556 | MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, |
557 | MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, |
558 | } |
559 | mbedtls_ssl_states; |
560 | |
561 | /* |
562 | * The tls_prf function types. |
563 | */ |
564 | typedef enum { |
565 | MBEDTLS_SSL_TLS_PRF_NONE, |
566 | MBEDTLS_SSL_TLS_PRF_SSL3, |
567 | MBEDTLS_SSL_TLS_PRF_TLS1, |
568 | MBEDTLS_SSL_TLS_PRF_SHA384, |
569 | MBEDTLS_SSL_TLS_PRF_SHA256 |
570 | } |
571 | mbedtls_tls_prf_types; |
572 | /** |
573 | * \brief Callback type: send data on the network. |
574 | * |
575 | * \note That callback may be either blocking or non-blocking. |
576 | * |
577 | * \param ctx Context for the send callback (typically a file descriptor) |
578 | * \param buf Buffer holding the data to send |
579 | * \param len Length of the data to send |
580 | * |
581 | * \return The callback must return the number of bytes sent if any, |
582 | * or a non-zero error code. |
583 | * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_WRITE |
584 | * must be returned when the operation would block. |
585 | * |
586 | * \note The callback is allowed to send fewer bytes than requested. |
587 | * It must always return the number of bytes actually sent. |
588 | */ |
589 | typedef int mbedtls_ssl_send_t(void *ctx, |
590 | const unsigned char *buf, |
591 | size_t len); |
592 | |
593 | /** |
594 | * \brief Callback type: receive data from the network. |
595 | * |
596 | * \note That callback may be either blocking or non-blocking. |
597 | * |
598 | * \param ctx Context for the receive callback (typically a file |
599 | * descriptor) |
600 | * \param buf Buffer to write the received data to |
601 | * \param len Length of the receive buffer |
602 | * |
603 | * \returns If data has been received, the positive number of bytes received. |
604 | * \returns \c 0 if the connection has been closed. |
605 | * \returns If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_READ |
606 | * must be returned when the operation would block. |
607 | * \returns Another negative error code on other kinds of failures. |
608 | * |
609 | * \note The callback may receive fewer bytes than the length of the |
610 | * buffer. It must always return the number of bytes actually |
611 | * received and written to the buffer. |
612 | */ |
613 | typedef int mbedtls_ssl_recv_t(void *ctx, |
614 | unsigned char *buf, |
615 | size_t len); |
616 | |
617 | /** |
618 | * \brief Callback type: receive data from the network, with timeout |
619 | * |
620 | * \note That callback must block until data is received, or the |
621 | * timeout delay expires, or the operation is interrupted by a |
622 | * signal. |
623 | * |
624 | * \param ctx Context for the receive callback (typically a file descriptor) |
625 | * \param buf Buffer to write the received data to |
626 | * \param len Length of the receive buffer |
627 | * \param timeout Maximum number of milliseconds to wait for data |
628 | * 0 means no timeout (potentially waiting forever) |
629 | * |
630 | * \return The callback must return the number of bytes received, |
631 | * or a non-zero error code: |
632 | * \c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, |
633 | * \c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. |
634 | * |
635 | * \note The callback may receive fewer bytes than the length of the |
636 | * buffer. It must always return the number of bytes actually |
637 | * received and written to the buffer. |
638 | */ |
639 | typedef int mbedtls_ssl_recv_timeout_t(void *ctx, |
640 | unsigned char *buf, |
641 | size_t len, |
642 | uint32_t timeout); |
643 | /** |
644 | * \brief Callback type: set a pair of timers/delays to watch |
645 | * |
646 | * \param ctx Context pointer |
647 | * \param int_ms Intermediate delay in milliseconds |
648 | * \param fin_ms Final delay in milliseconds |
649 | * 0 cancels the current timer. |
650 | * |
651 | * \note This callback must at least store the necessary information |
652 | * for the associated \c mbedtls_ssl_get_timer_t callback to |
653 | * return correct information. |
654 | * |
655 | * \note If using an event-driven style of programming, an event must |
656 | * be generated when the final delay is passed. The event must |
657 | * cause a call to \c mbedtls_ssl_handshake() with the proper |
658 | * SSL context to be scheduled. Care must be taken to ensure |
659 | * that at most one such call happens at a time. |
660 | * |
661 | * \note Only one timer at a time must be running. Calling this |
662 | * function while a timer is running must cancel it. Cancelled |
663 | * timers must not generate any event. |
664 | */ |
665 | typedef void mbedtls_ssl_set_timer_t(void *ctx, |
666 | uint32_t int_ms, |
667 | uint32_t fin_ms); |
668 | |
669 | /** |
670 | * \brief Callback type: get status of timers/delays |
671 | * |
672 | * \param ctx Context pointer |
673 | * |
674 | * \return This callback must return: |
675 | * -1 if cancelled (fin_ms == 0), |
676 | * 0 if none of the delays have passed, |
677 | * 1 if only the intermediate delay has passed, |
678 | * 2 if the final delay has passed. |
679 | */ |
680 | typedef int mbedtls_ssl_get_timer_t(void *ctx); |
681 | |
682 | /* Defined below */ |
683 | typedef struct mbedtls_ssl_session mbedtls_ssl_session; |
684 | typedef struct mbedtls_ssl_context mbedtls_ssl_context; |
685 | typedef struct mbedtls_ssl_config mbedtls_ssl_config; |
686 | |
687 | /* Defined in ssl_internal.h */ |
688 | typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; |
689 | typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; |
690 | typedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t; |
691 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
692 | typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; |
693 | #endif |
694 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
695 | typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; |
696 | #endif |
697 | |
698 | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
699 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
700 | /** |
701 | * \brief Callback type: start external signature operation. |
702 | * |
703 | * This callback is called during an SSL handshake to start |
704 | * a signature decryption operation using an |
705 | * external processor. The parameter \p cert contains |
706 | * the public key; it is up to the callback function to |
707 | * determine how to access the associated private key. |
708 | * |
709 | * This function typically sends or enqueues a request, and |
710 | * does not wait for the operation to complete. This allows |
711 | * the handshake step to be non-blocking. |
712 | * |
713 | * The parameters \p ssl and \p cert are guaranteed to remain |
714 | * valid throughout the handshake. On the other hand, this |
715 | * function must save the contents of \p hash if the value |
716 | * is needed for later processing, because the \p hash buffer |
717 | * is no longer valid after this function returns. |
718 | * |
719 | * This function may call mbedtls_ssl_set_async_operation_data() |
720 | * to store an operation context for later retrieval |
721 | * by the resume or cancel callback. |
722 | * |
723 | * \note For RSA signatures, this function must produce output |
724 | * that is consistent with PKCS#1 v1.5 in the same way as |
725 | * mbedtls_rsa_pkcs1_sign(). Before the private key operation, |
726 | * apply the padding steps described in RFC 8017, section 9.2 |
727 | * "EMSA-PKCS1-v1_5" as follows. |
728 | * - If \p md_alg is #MBEDTLS_MD_NONE, apply the PKCS#1 v1.5 |
729 | * encoding, treating \p hash as the DigestInfo to be |
730 | * padded. In other words, apply EMSA-PKCS1-v1_5 starting |
731 | * from step 3, with `T = hash` and `tLen = hash_len`. |
732 | * - If `md_alg != MBEDTLS_MD_NONE`, apply the PKCS#1 v1.5 |
733 | * encoding, treating \p hash as the hash to be encoded and |
734 | * padded. In other words, apply EMSA-PKCS1-v1_5 starting |
735 | * from step 2, with `digestAlgorithm` obtained by calling |
736 | * mbedtls_oid_get_oid_by_md() on \p md_alg. |
737 | * |
738 | * \note For ECDSA signatures, the output format is the DER encoding |
739 | * `Ecdsa-Sig-Value` defined in |
740 | * [RFC 4492 section 5.4](https://tools.ietf.org/html/rfc4492#section-5.4). |
741 | * |
742 | * \param ssl The SSL connection instance. It should not be |
743 | * modified other than via |
744 | * mbedtls_ssl_set_async_operation_data(). |
745 | * \param cert Certificate containing the public key. |
746 | * In simple cases, this is one of the pointers passed to |
747 | * mbedtls_ssl_conf_own_cert() when configuring the SSL |
748 | * connection. However, if other callbacks are used, this |
749 | * property may not hold. For example, if an SNI callback |
750 | * is registered with mbedtls_ssl_conf_sni(), then |
751 | * this callback determines what certificate is used. |
752 | * \param md_alg Hash algorithm. |
753 | * \param hash Buffer containing the hash. This buffer is |
754 | * no longer valid when the function returns. |
755 | * \param hash_len Size of the \c hash buffer in bytes. |
756 | * |
757 | * \return 0 if the operation was started successfully and the SSL |
758 | * stack should call the resume callback immediately. |
759 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
760 | * was started successfully and the SSL stack should return |
761 | * immediately without calling the resume callback yet. |
762 | * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external |
763 | * processor does not support this key. The SSL stack will |
764 | * use the private key object instead. |
765 | * \return Any other error indicates a fatal failure and is |
766 | * propagated up the call chain. The callback should |
767 | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
768 | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
769 | * directed in the documentation of this callback. |
770 | */ |
771 | typedef int mbedtls_ssl_async_sign_t(mbedtls_ssl_context *ssl, |
772 | mbedtls_x509_crt *cert, |
773 | mbedtls_md_type_t md_alg, |
774 | const unsigned char *hash, |
775 | size_t hash_len); |
776 | |
777 | /** |
778 | * \brief Callback type: start external decryption operation. |
779 | * |
780 | * This callback is called during an SSL handshake to start |
781 | * an RSA decryption operation using an |
782 | * external processor. The parameter \p cert contains |
783 | * the public key; it is up to the callback function to |
784 | * determine how to access the associated private key. |
785 | * |
786 | * This function typically sends or enqueues a request, and |
787 | * does not wait for the operation to complete. This allows |
788 | * the handshake step to be non-blocking. |
789 | * |
790 | * The parameters \p ssl and \p cert are guaranteed to remain |
791 | * valid throughout the handshake. On the other hand, this |
792 | * function must save the contents of \p input if the value |
793 | * is needed for later processing, because the \p input buffer |
794 | * is no longer valid after this function returns. |
795 | * |
796 | * This function may call mbedtls_ssl_set_async_operation_data() |
797 | * to store an operation context for later retrieval |
798 | * by the resume or cancel callback. |
799 | * |
800 | * \warning RSA decryption as used in TLS is subject to a potential |
801 | * timing side channel attack first discovered by Bleichenbacher |
802 | * in 1998. This attack can be remotely exploitable |
803 | * in practice. To avoid this attack, you must ensure that |
804 | * if the callback performs an RSA decryption, the time it |
805 | * takes to execute and return the result does not depend |
806 | * on whether the RSA decryption succeeded or reported |
807 | * invalid padding. |
808 | * |
809 | * \param ssl The SSL connection instance. It should not be |
810 | * modified other than via |
811 | * mbedtls_ssl_set_async_operation_data(). |
812 | * \param cert Certificate containing the public key. |
813 | * In simple cases, this is one of the pointers passed to |
814 | * mbedtls_ssl_conf_own_cert() when configuring the SSL |
815 | * connection. However, if other callbacks are used, this |
816 | * property may not hold. For example, if an SNI callback |
817 | * is registered with mbedtls_ssl_conf_sni(), then |
818 | * this callback determines what certificate is used. |
819 | * \param input Buffer containing the input ciphertext. This buffer |
820 | * is no longer valid when the function returns. |
821 | * \param input_len Size of the \p input buffer in bytes. |
822 | * |
823 | * \return 0 if the operation was started successfully and the SSL |
824 | * stack should call the resume callback immediately. |
825 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
826 | * was started successfully and the SSL stack should return |
827 | * immediately without calling the resume callback yet. |
828 | * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external |
829 | * processor does not support this key. The SSL stack will |
830 | * use the private key object instead. |
831 | * \return Any other error indicates a fatal failure and is |
832 | * propagated up the call chain. The callback should |
833 | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
834 | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
835 | * directed in the documentation of this callback. |
836 | */ |
837 | typedef int mbedtls_ssl_async_decrypt_t(mbedtls_ssl_context *ssl, |
838 | mbedtls_x509_crt *cert, |
839 | const unsigned char *input, |
840 | size_t input_len); |
841 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
842 | |
843 | /** |
844 | * \brief Callback type: resume external operation. |
845 | * |
846 | * This callback is called during an SSL handshake to resume |
847 | * an external operation started by the |
848 | * ::mbedtls_ssl_async_sign_t or |
849 | * ::mbedtls_ssl_async_decrypt_t callback. |
850 | * |
851 | * This function typically checks the status of a pending |
852 | * request or causes the request queue to make progress, and |
853 | * does not wait for the operation to complete. This allows |
854 | * the handshake step to be non-blocking. |
855 | * |
856 | * This function may call mbedtls_ssl_get_async_operation_data() |
857 | * to retrieve an operation context set by the start callback. |
858 | * It may call mbedtls_ssl_set_async_operation_data() to modify |
859 | * this context. |
860 | * |
861 | * Note that when this function returns a status other than |
862 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, it must free any |
863 | * resources associated with the operation. |
864 | * |
865 | * \param ssl The SSL connection instance. It should not be |
866 | * modified other than via |
867 | * mbedtls_ssl_set_async_operation_data(). |
868 | * \param output Buffer containing the output (signature or decrypted |
869 | * data) on success. |
870 | * \param output_len On success, number of bytes written to \p output. |
871 | * \param output_size Size of the \p output buffer in bytes. |
872 | * |
873 | * \return 0 if output of the operation is available in the |
874 | * \p output buffer. |
875 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation |
876 | * is still in progress. Subsequent requests for progress |
877 | * on the SSL connection will call the resume callback |
878 | * again. |
879 | * \return Any other error means that the operation is aborted. |
880 | * The SSL handshake is aborted. The callback should |
881 | * use \c MBEDTLS_ERR_PK_xxx error codes, and <b>must not</b> |
882 | * use \c MBEDTLS_ERR_SSL_xxx error codes except as |
883 | * directed in the documentation of this callback. |
884 | */ |
885 | typedef int mbedtls_ssl_async_resume_t(mbedtls_ssl_context *ssl, |
886 | unsigned char *output, |
887 | size_t *output_len, |
888 | size_t output_size); |
889 | |
890 | /** |
891 | * \brief Callback type: cancel external operation. |
892 | * |
893 | * This callback is called if an SSL connection is closed |
894 | * while an asynchronous operation is in progress. Note that |
895 | * this callback is not called if the |
896 | * ::mbedtls_ssl_async_resume_t callback has run and has |
897 | * returned a value other than |
898 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, since in that case |
899 | * the asynchronous operation has already completed. |
900 | * |
901 | * This function may call mbedtls_ssl_get_async_operation_data() |
902 | * to retrieve an operation context set by the start callback. |
903 | * |
904 | * \param ssl The SSL connection instance. It should not be |
905 | * modified. |
906 | */ |
907 | typedef void mbedtls_ssl_async_cancel_t(mbedtls_ssl_context *ssl); |
908 | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
909 | |
910 | #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \ |
911 | !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) |
912 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN 48 |
913 | #if defined(MBEDTLS_SHA256_C) |
914 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA256 |
915 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 32 |
916 | #elif defined(MBEDTLS_SHA512_C) |
917 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA384 |
918 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 48 |
919 | #elif defined(MBEDTLS_SHA1_C) |
920 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA1 |
921 | #define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 20 |
922 | #else |
923 | /* This is already checked in check_config.h, but be sure. */ |
924 | #error "Bad configuration - need SHA-1, SHA-256 or SHA-512 enabled to compute digest of peer CRT." |
925 | #endif |
926 | #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && |
927 | !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
928 | |
929 | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
930 | |
931 | #define MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH 255 |
932 | #define MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH 4 |
933 | /* |
934 | * For code readability use a typedef for DTLS-SRTP profiles |
935 | * |
936 | * Use_srtp extension protection profiles values as defined in |
937 | * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml |
938 | * |
939 | * Reminder: if this list is expanded mbedtls_ssl_check_srtp_profile_value |
940 | * must be updated too. |
941 | */ |
942 | #define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80 ((uint16_t) 0x0001) |
943 | #define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32 ((uint16_t) 0x0002) |
944 | #define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80 ((uint16_t) 0x0005) |
945 | #define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32 ((uint16_t) 0x0006) |
946 | /* This one is not iana defined, but for code readability. */ |
947 | #define MBEDTLS_TLS_SRTP_UNSET ((uint16_t) 0x0000) |
948 | |
949 | typedef uint16_t mbedtls_ssl_srtp_profile; |
950 | |
951 | typedef struct mbedtls_dtls_srtp_info_t { |
952 | /*! The SRTP profile that was negotiated. */ |
953 | mbedtls_ssl_srtp_profile chosen_dtls_srtp_profile; |
954 | /*! The length of mki_value. */ |
955 | uint16_t mki_len; |
956 | /*! The mki_value used, with max size of 256 bytes. */ |
957 | unsigned char mki_value[MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH]; |
958 | } |
959 | mbedtls_dtls_srtp_info; |
960 | |
961 | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
962 | |
963 | /* |
964 | * This structure is used for storing current session data. |
965 | * |
966 | * Note: when changing this definition, we need to check and update: |
967 | * - in tests/suites/test_suite_ssl.function: |
968 | * ssl_populate_session() and ssl_serialize_session_save_load() |
969 | * - in library/ssl_tls.c: |
970 | * mbedtls_ssl_session_init() and mbedtls_ssl_session_free() |
971 | * mbedtls_ssl_session_save() and ssl_session_load() |
972 | * ssl_session_copy() |
973 | */ |
974 | struct mbedtls_ssl_session { |
975 | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
976 | unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ |
977 | #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ |
978 | |
979 | #if defined(MBEDTLS_HAVE_TIME) |
980 | mbedtls_time_t start; /*!< starting time */ |
981 | #endif |
982 | int ciphersuite; /*!< chosen ciphersuite */ |
983 | int compression; /*!< chosen compression */ |
984 | size_t id_len; /*!< session id length */ |
985 | unsigned char id[32]; /*!< session identifier */ |
986 | unsigned char master[48]; /*!< the master secret */ |
987 | |
988 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
989 | #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) |
990 | mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ |
991 | #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
992 | /*! The digest of the peer's end-CRT. This must be kept to detect CRT |
993 | * changes during renegotiation, mitigating the triple handshake attack. */ |
994 | unsigned char *peer_cert_digest; |
995 | size_t peer_cert_digest_len; |
996 | mbedtls_md_type_t peer_cert_digest_type; |
997 | #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ |
998 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
999 | uint32_t verify_result; /*!< verification result */ |
1000 | |
1001 | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) |
1002 | unsigned char *ticket; /*!< RFC 5077 session ticket */ |
1003 | size_t ticket_len; /*!< session ticket length */ |
1004 | uint32_t ticket_lifetime; /*!< ticket lifetime hint */ |
1005 | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ |
1006 | |
1007 | #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) |
1008 | int trunc_hmac; /*!< flag for truncated hmac activation */ |
1009 | #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ |
1010 | |
1011 | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
1012 | int encrypt_then_mac; /*!< flag for EtM activation */ |
1013 | #endif |
1014 | }; |
1015 | |
1016 | /** |
1017 | * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. |
1018 | */ |
1019 | struct mbedtls_ssl_config { |
1020 | /* Group items by size and reorder them to maximize usage of immediate offset access. */ |
1021 | |
1022 | /* |
1023 | * Numerical settings (char) |
1024 | */ |
1025 | |
1026 | unsigned char max_major_ver; /*!< max. major version used */ |
1027 | unsigned char max_minor_ver; /*!< max. minor version used */ |
1028 | unsigned char min_major_ver; /*!< min. major version used */ |
1029 | unsigned char min_minor_ver; /*!< min. minor version used */ |
1030 | |
1031 | /* |
1032 | * Flags (could be bit-fields to save RAM, but separate bytes make |
1033 | * the code smaller on architectures with an instruction for direct |
1034 | * byte access). |
1035 | */ |
1036 | |
1037 | uint8_t endpoint /*bool*/; /*!< 0: client, 1: server */ |
1038 | uint8_t transport /*bool*/; /*!< stream (TLS) or datagram (DTLS) */ |
1039 | uint8_t authmode /*2 bits*/; /*!< MBEDTLS_SSL_VERIFY_XXX */ |
1040 | /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ |
1041 | uint8_t allow_legacy_renegotiation /*2 bits*/; /*!< MBEDTLS_LEGACY_XXX */ |
1042 | #if defined(MBEDTLS_ARC4_C) |
1043 | uint8_t arc4_disabled /*bool*/; /*!< blacklist RC4 ciphersuites? */ |
1044 | #endif |
1045 | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
1046 | uint8_t mfl_code /*3 bits*/; /*!< desired fragment length */ |
1047 | #endif |
1048 | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
1049 | uint8_t encrypt_then_mac /*bool*/; /*!< negotiate encrypt-then-mac? */ |
1050 | #endif |
1051 | #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) |
1052 | uint8_t extended_ms /*bool*/; /*!< negotiate extended master secret? */ |
1053 | #endif |
1054 | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
1055 | uint8_t anti_replay /*bool*/; /*!< detect and prevent replay? */ |
1056 | #endif |
1057 | #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) |
1058 | uint8_t cbc_record_splitting /*bool*/; /*!< do cbc record splitting */ |
1059 | #endif |
1060 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1061 | uint8_t disable_renegotiation /*bool*/; /*!< disable renegotiation? */ |
1062 | #endif |
1063 | #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) |
1064 | uint8_t trunc_hmac /*bool*/; /*!< negotiate truncated hmac? */ |
1065 | #endif |
1066 | #if defined(MBEDTLS_SSL_SESSION_TICKETS) |
1067 | uint8_t session_tickets /*bool*/; /*!< use session tickets? */ |
1068 | #endif |
1069 | #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) |
1070 | uint8_t fallback /*bool*/; /*!< is this a fallback? */ |
1071 | #endif |
1072 | #if defined(MBEDTLS_SSL_SRV_C) |
1073 | uint8_t cert_req_ca_list /*bool*/; /*!< enable sending CA list in |
1074 | Certificate Request messages? */ |
1075 | #endif |
1076 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1077 | uint8_t ignore_unexpected_cid /*bool*/; /*!< Determines whether DTLS |
1078 | * record with unexpected CID |
1079 | * should lead to failure. */ |
1080 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1081 | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1082 | uint8_t dtls_srtp_mki_support /*bool*/; /*!< support having mki_value |
1083 | in the use_srtp extension? */ |
1084 | #endif |
1085 | |
1086 | /* |
1087 | * Numerical settings (int or larger) |
1088 | */ |
1089 | |
1090 | uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ |
1091 | |
1092 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1093 | uint32_t hs_timeout_min; /*!< initial value of the handshake |
1094 | retransmission timeout (ms) */ |
1095 | uint32_t hs_timeout_max; /*!< maximum value of the handshake |
1096 | retransmission timeout (ms) */ |
1097 | #endif |
1098 | |
1099 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1100 | int renego_max_records; /*!< grace period for renegotiation */ |
1101 | unsigned char renego_period[8]; /*!< value of the record counters |
1102 | that triggers renegotiation */ |
1103 | #endif |
1104 | |
1105 | #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) |
1106 | unsigned int badmac_limit; /*!< limit of records with a bad MAC */ |
1107 | #endif |
1108 | |
1109 | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) |
1110 | unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ |
1111 | #endif |
1112 | |
1113 | /* |
1114 | * Pointers |
1115 | */ |
1116 | |
1117 | const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ |
1118 | |
1119 | /** Callback for printing debug output */ |
1120 | void (*f_dbg)(void *, int, const char *, int, const char *); |
1121 | void *p_dbg; /*!< context for the debug function */ |
1122 | |
1123 | /** Callback for getting (pseudo-)random numbers */ |
1124 | int (*f_rng)(void *, unsigned char *, size_t); |
1125 | void *p_rng; /*!< context for the RNG function */ |
1126 | |
1127 | /** Callback to retrieve a session from the cache */ |
1128 | int (*f_get_cache)(void *, mbedtls_ssl_session *); |
1129 | /** Callback to store a session into the cache */ |
1130 | int (*f_set_cache)(void *, const mbedtls_ssl_session *); |
1131 | void *p_cache; /*!< context for cache callbacks */ |
1132 | |
1133 | #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) |
1134 | /** Callback for setting cert according to SNI extension */ |
1135 | int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); |
1136 | void *p_sni; /*!< context for SNI callback */ |
1137 | #endif |
1138 | |
1139 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1140 | /** Callback to customize X.509 certificate chain verification */ |
1141 | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); |
1142 | void *p_vrfy; /*!< context for X.509 verify calllback */ |
1143 | #endif |
1144 | |
1145 | #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) |
1146 | /** Callback to retrieve PSK key from identity */ |
1147 | int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); |
1148 | void *p_psk; /*!< context for PSK callback */ |
1149 | #endif |
1150 | |
1151 | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
1152 | /** Callback to create & write a cookie for ClientHello verification */ |
1153 | int (*f_cookie_write)(void *, unsigned char **, unsigned char *, |
1154 | const unsigned char *, size_t); |
1155 | /** Callback to verify validity of a ClientHello cookie */ |
1156 | int (*f_cookie_check)(void *, const unsigned char *, size_t, |
1157 | const unsigned char *, size_t); |
1158 | void *p_cookie; /*!< context for the cookie callbacks */ |
1159 | #endif |
1160 | |
1161 | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) |
1162 | /** Callback to create & write a session ticket */ |
1163 | int (*f_ticket_write)(void *, const mbedtls_ssl_session *, |
1164 | unsigned char *, const unsigned char *, size_t *, uint32_t *); |
1165 | /** Callback to parse a session ticket into a session structure */ |
1166 | int (*f_ticket_parse)(void *, mbedtls_ssl_session *, unsigned char *, size_t); |
1167 | void *p_ticket; /*!< context for the ticket callbacks */ |
1168 | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ |
1169 | |
1170 | #if defined(MBEDTLS_SSL_EXPORT_KEYS) |
1171 | /** Callback to export key block and master secret */ |
1172 | int (*f_export_keys)(void *, const unsigned char *, |
1173 | const unsigned char *, size_t, size_t, size_t); |
1174 | /** Callback to export key block, master secret, |
1175 | * tls_prf and random bytes. Should replace f_export_keys */ |
1176 | int (*f_export_keys_ext)(void *, const unsigned char *, |
1177 | const unsigned char *, size_t, size_t, size_t, |
1178 | const unsigned char[32], const unsigned char[32], |
1179 | mbedtls_tls_prf_types); |
1180 | void *p_export_keys; /*!< context for key export callback */ |
1181 | #endif |
1182 | |
1183 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1184 | size_t cid_len; /*!< The length of CIDs for incoming DTLS records. */ |
1185 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1186 | |
1187 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1188 | const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ |
1189 | mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ |
1190 | mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ |
1191 | mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ |
1192 | #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) |
1193 | mbedtls_x509_crt_ca_cb_t f_ca_cb; |
1194 | void *p_ca_cb; |
1195 | #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ |
1196 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1197 | |
1198 | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
1199 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1200 | mbedtls_ssl_async_sign_t *f_async_sign_start; /*!< start asynchronous signature operation */ |
1201 | mbedtls_ssl_async_decrypt_t *f_async_decrypt_start; /*!< start asynchronous decryption operation */ |
1202 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1203 | mbedtls_ssl_async_resume_t *f_async_resume; /*!< resume asynchronous operation */ |
1204 | mbedtls_ssl_async_cancel_t *f_async_cancel; /*!< cancel asynchronous operation */ |
1205 | void *p_async_config_data; /*!< Configuration data set by mbedtls_ssl_conf_async_private_cb(). */ |
1206 | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
1207 | |
1208 | #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) |
1209 | const int *sig_hashes; /*!< allowed signature hashes */ |
1210 | #endif |
1211 | |
1212 | #if defined(MBEDTLS_ECP_C) |
1213 | const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ |
1214 | #endif |
1215 | |
1216 | #if defined(MBEDTLS_DHM_C) |
1217 | mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ |
1218 | mbedtls_mpi dhm_G; /*!< generator for DHM */ |
1219 | #endif |
1220 | |
1221 | #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) |
1222 | |
1223 | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
1224 | psa_key_id_t psk_opaque; /*!< PSA key slot holding opaque PSK. This field |
1225 | * should only be set via |
1226 | * mbedtls_ssl_conf_psk_opaque(). |
1227 | * If either no PSK or a raw PSK have been |
1228 | * configured, this has value \c 0. |
1229 | */ |
1230 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
1231 | |
1232 | unsigned char *psk; /*!< The raw pre-shared key. This field should |
1233 | * only be set via mbedtls_ssl_conf_psk(). |
1234 | * If either no PSK or an opaque PSK |
1235 | * have been configured, this has value NULL. */ |
1236 | size_t psk_len; /*!< The length of the raw pre-shared key. |
1237 | * This field should only be set via |
1238 | * mbedtls_ssl_conf_psk(). |
1239 | * Its value is non-zero if and only if |
1240 | * \c psk is not \c NULL. */ |
1241 | |
1242 | unsigned char *psk_identity; /*!< The PSK identity for PSK negotiation. |
1243 | * This field should only be set via |
1244 | * mbedtls_ssl_conf_psk(). |
1245 | * This is set if and only if either |
1246 | * \c psk or \c psk_opaque are set. */ |
1247 | size_t psk_identity_len;/*!< The length of PSK identity. |
1248 | * This field should only be set via |
1249 | * mbedtls_ssl_conf_psk(). |
1250 | * Its value is non-zero if and only if |
1251 | * \c psk is not \c NULL or \c psk_opaque |
1252 | * is not \c 0. */ |
1253 | #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ |
1254 | |
1255 | #if defined(MBEDTLS_SSL_ALPN) |
1256 | const char **alpn_list; /*!< ordered list of protocols */ |
1257 | #endif |
1258 | |
1259 | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1260 | /*! ordered list of supported srtp profile */ |
1261 | const mbedtls_ssl_srtp_profile *dtls_srtp_profile_list; |
1262 | /*! number of supported profiles */ |
1263 | size_t dtls_srtp_profile_list_len; |
1264 | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
1265 | }; |
1266 | |
1267 | struct mbedtls_ssl_context { |
1268 | const mbedtls_ssl_config *conf; /*!< configuration information */ |
1269 | |
1270 | /* |
1271 | * Miscellaneous |
1272 | */ |
1273 | int state; /*!< SSL handshake: current state */ |
1274 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1275 | int renego_status; /*!< Initial, in progress, pending? */ |
1276 | int renego_records_seen; /*!< Records since renego request, or with DTLS, |
1277 | number of retransmissions of request if |
1278 | renego_max_records is < 0 */ |
1279 | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
1280 | |
1281 | int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ |
1282 | int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ |
1283 | |
1284 | #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) |
1285 | unsigned badmac_seen; /*!< records with a bad MAC received */ |
1286 | #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ |
1287 | |
1288 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1289 | /** Callback to customize X.509 certificate chain verification */ |
1290 | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); |
1291 | void *p_vrfy; /*!< context for X.509 verify callback */ |
1292 | #endif |
1293 | |
1294 | mbedtls_ssl_send_t *f_send; /*!< Callback for network send */ |
1295 | mbedtls_ssl_recv_t *f_recv; /*!< Callback for network receive */ |
1296 | mbedtls_ssl_recv_timeout_t *f_recv_timeout; |
1297 | /*!< Callback for network receive with timeout */ |
1298 | |
1299 | void *p_bio; /*!< context for I/O operations */ |
1300 | |
1301 | /* |
1302 | * Session layer |
1303 | */ |
1304 | mbedtls_ssl_session *session_in; /*!< current session data (in) */ |
1305 | mbedtls_ssl_session *session_out; /*!< current session data (out) */ |
1306 | mbedtls_ssl_session *session; /*!< negotiated session data */ |
1307 | mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ |
1308 | |
1309 | mbedtls_ssl_handshake_params *handshake; /*!< params required only during |
1310 | the handshake process */ |
1311 | |
1312 | /* |
1313 | * Record layer transformations |
1314 | */ |
1315 | mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ |
1316 | mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ |
1317 | mbedtls_ssl_transform *transform; /*!< negotiated transform params */ |
1318 | mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ |
1319 | |
1320 | /* |
1321 | * Timers |
1322 | */ |
1323 | void *p_timer; /*!< context for the timer callbacks */ |
1324 | |
1325 | mbedtls_ssl_set_timer_t *f_set_timer; /*!< set timer callback */ |
1326 | mbedtls_ssl_get_timer_t *f_get_timer; /*!< get timer callback */ |
1327 | |
1328 | /* |
1329 | * Record layer (incoming data) |
1330 | */ |
1331 | unsigned char *in_buf; /*!< input buffer */ |
1332 | unsigned char *in_ctr; /*!< 64-bit incoming message counter |
1333 | TLS: maintained by us |
1334 | DTLS: read from peer */ |
1335 | unsigned char *in_hdr; /*!< start of record header */ |
1336 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1337 | unsigned char *in_cid; /*!< The start of the CID; |
1338 | * (the end is marked by in_len). */ |
1339 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1340 | unsigned char *in_len; /*!< two-bytes message length field */ |
1341 | unsigned char *in_iv; /*!< ivlen-byte IV */ |
1342 | unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ |
1343 | unsigned char *in_offt; /*!< read offset in application data */ |
1344 | |
1345 | int in_msgtype; /*!< record header: message type */ |
1346 | size_t in_msglen; /*!< record header: message length */ |
1347 | size_t in_left; /*!< amount of data read so far */ |
1348 | #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) |
1349 | size_t in_buf_len; /*!< length of input buffer */ |
1350 | #endif |
1351 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1352 | uint16_t in_epoch; /*!< DTLS epoch for incoming records */ |
1353 | size_t next_record_offset; /*!< offset of the next record in datagram |
1354 | (equal to in_left if none) */ |
1355 | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1356 | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
1357 | uint64_t in_window_top; /*!< last validated record seq_num */ |
1358 | uint64_t in_window; /*!< bitmask for replay detection */ |
1359 | #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ |
1360 | |
1361 | size_t in_hslen; /*!< current handshake message length, |
1362 | including the handshake header */ |
1363 | int nb_zero; /*!< # of 0-length encrypted messages */ |
1364 | |
1365 | int keep_current_message; /*!< drop or reuse current message |
1366 | on next call to record layer? */ |
1367 | |
1368 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1369 | uint8_t disable_datagram_packing; /*!< Disable packing multiple records |
1370 | * within a single datagram. */ |
1371 | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1372 | |
1373 | /* |
1374 | * Record layer (outgoing data) |
1375 | */ |
1376 | unsigned char *out_buf; /*!< output buffer */ |
1377 | unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ |
1378 | unsigned char *out_hdr; /*!< start of record header */ |
1379 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1380 | unsigned char *out_cid; /*!< The start of the CID; |
1381 | * (the end is marked by in_len). */ |
1382 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1383 | unsigned char *out_len; /*!< two-bytes message length field */ |
1384 | unsigned char *out_iv; /*!< ivlen-byte IV */ |
1385 | unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ |
1386 | |
1387 | int out_msgtype; /*!< record header: message type */ |
1388 | size_t out_msglen; /*!< record header: message length */ |
1389 | size_t out_left; /*!< amount of data not yet written */ |
1390 | #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) |
1391 | size_t out_buf_len; /*!< length of output buffer */ |
1392 | #endif |
1393 | |
1394 | unsigned char cur_out_ctr[8]; /*!< Outgoing record sequence number. */ |
1395 | |
1396 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1397 | uint16_t mtu; /*!< path mtu, used to fragment outgoing messages */ |
1398 | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1399 | |
1400 | #if defined(MBEDTLS_ZLIB_SUPPORT) |
1401 | unsigned char *compress_buf; /*!< zlib data buffer */ |
1402 | #endif /* MBEDTLS_ZLIB_SUPPORT */ |
1403 | #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) |
1404 | signed char split_done; /*!< current record already split? */ |
1405 | #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ |
1406 | |
1407 | /* |
1408 | * PKI layer |
1409 | */ |
1410 | int client_auth; /*!< flag for client auth. */ |
1411 | |
1412 | /* |
1413 | * User settings |
1414 | */ |
1415 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1416 | char *hostname; /*!< expected peer CN for verification |
1417 | (and SNI if available) */ |
1418 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1419 | |
1420 | #if defined(MBEDTLS_SSL_ALPN) |
1421 | const char *alpn_chosen; /*!< negotiated protocol */ |
1422 | #endif /* MBEDTLS_SSL_ALPN */ |
1423 | |
1424 | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
1425 | /* |
1426 | * use_srtp extension |
1427 | */ |
1428 | mbedtls_dtls_srtp_info dtls_srtp_info; |
1429 | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
1430 | |
1431 | /* |
1432 | * Information for DTLS hello verify |
1433 | */ |
1434 | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
1435 | unsigned char *cli_id; /*!< transport-level ID of the client */ |
1436 | size_t cli_id_len; /*!< length of cli_id */ |
1437 | #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ |
1438 | |
1439 | /* |
1440 | * Secure renegotiation |
1441 | */ |
1442 | /* needed to know when to send extension on server */ |
1443 | int secure_renegotiation; /*!< does peer support legacy or |
1444 | secure renegotiation */ |
1445 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
1446 | size_t verify_data_len; /*!< length of verify data stored */ |
1447 | char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ |
1448 | char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ |
1449 | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
1450 | |
1451 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1452 | /* CID configuration to use in subsequent handshakes. */ |
1453 | |
1454 | /*! The next incoming CID, chosen by the user and applying to |
1455 | * all subsequent handshakes. This may be different from the |
1456 | * CID currently used in case the user has re-configured the CID |
1457 | * after an initial handshake. */ |
1458 | unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; |
1459 | uint8_t own_cid_len; /*!< The length of \c own_cid. */ |
1460 | uint8_t negotiate_cid; /*!< This indicates whether the CID extension should |
1461 | * be negotiated in the next handshake or not. |
1462 | * Possible values are #MBEDTLS_SSL_CID_ENABLED |
1463 | * and #MBEDTLS_SSL_CID_DISABLED. */ |
1464 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1465 | }; |
1466 | |
1467 | #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) |
1468 | |
1469 | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
1470 | |
1471 | #define MBEDTLS_SSL_CHANNEL_OUTBOUND MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(0) |
1472 | #define MBEDTLS_SSL_CHANNEL_INBOUND MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(1) |
1473 | |
1474 | #if defined(MBEDTLS_DEPRECATED_WARNING) |
1475 | #define MBEDTLS_DEPRECATED __attribute__((deprecated)) |
1476 | #else |
1477 | #define MBEDTLS_DEPRECATED |
1478 | #endif /* MBEDTLS_DEPRECATED_WARNING */ |
1479 | |
1480 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_init)( |
1481 | mbedtls_ssl_context *ssl, |
1482 | const unsigned char *key_enc, const unsigned char *key_dec, |
1483 | size_t keylen, |
1484 | const unsigned char *iv_enc, const unsigned char *iv_dec, |
1485 | size_t ivlen, |
1486 | const unsigned char *mac_enc, const unsigned char *mac_dec, |
1487 | size_t maclen); |
1488 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_activate)( |
1489 | mbedtls_ssl_context *ssl, |
1490 | int direction); |
1491 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_reset)( |
1492 | mbedtls_ssl_context *ssl); |
1493 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_write)( |
1494 | mbedtls_ssl_context *ssl); |
1495 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_read)( |
1496 | mbedtls_ssl_context *ssl); |
1497 | MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_finish)( |
1498 | mbedtls_ssl_context *ssl); |
1499 | |
1500 | #undef MBEDTLS_DEPRECATED |
1501 | #endif /* !MBEDTLS_DEPRECATED_REMOVED */ |
1502 | |
1503 | #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ |
1504 | |
1505 | /** |
1506 | * \brief Return the name of the ciphersuite associated with the |
1507 | * given ID |
1508 | * |
1509 | * \param ciphersuite_id SSL ciphersuite ID |
1510 | * |
1511 | * \return a string containing the ciphersuite name |
1512 | */ |
1513 | const char *mbedtls_ssl_get_ciphersuite_name(const int ciphersuite_id); |
1514 | |
1515 | /** |
1516 | * \brief Return the ID of the ciphersuite associated with the |
1517 | * given name |
1518 | * |
1519 | * \param ciphersuite_name SSL ciphersuite name |
1520 | * |
1521 | * \return the ID with the ciphersuite or 0 if not found |
1522 | */ |
1523 | int mbedtls_ssl_get_ciphersuite_id(const char *ciphersuite_name); |
1524 | |
1525 | /** |
1526 | * \brief Initialize an SSL context |
1527 | * Just makes the context ready for mbedtls_ssl_setup() or |
1528 | * mbedtls_ssl_free() |
1529 | * |
1530 | * \param ssl SSL context |
1531 | */ |
1532 | void mbedtls_ssl_init(mbedtls_ssl_context *ssl); |
1533 | |
1534 | /** |
1535 | * \brief Set up an SSL context for use |
1536 | * |
1537 | * \note No copy of the configuration context is made, it can be |
1538 | * shared by many mbedtls_ssl_context structures. |
1539 | * |
1540 | * \warning The conf structure will be accessed during the session. |
1541 | * It must not be modified or freed as long as the session |
1542 | * is active. |
1543 | * |
1544 | * \warning This function must be called exactly once per context. |
1545 | * Calling mbedtls_ssl_setup again is not supported, even |
1546 | * if no session is active. |
1547 | * |
1548 | * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto |
1549 | * subsystem must have been initialized by calling |
1550 | * psa_crypto_init() before calling this function. |
1551 | * |
1552 | * \param ssl SSL context |
1553 | * \param conf SSL configuration to use |
1554 | * |
1555 | * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if |
1556 | * memory allocation failed |
1557 | */ |
1558 | int mbedtls_ssl_setup(mbedtls_ssl_context *ssl, |
1559 | const mbedtls_ssl_config *conf); |
1560 | |
1561 | /** |
1562 | * \brief Reset an already initialized SSL context for re-use |
1563 | * while retaining application-set variables, function |
1564 | * pointers and data. |
1565 | * |
1566 | * \param ssl SSL context |
1567 | * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED, |
1568 | MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or |
1569 | * MBEDTLS_ERR_SSL_COMPRESSION_FAILED |
1570 | */ |
1571 | int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl); |
1572 | |
1573 | /** |
1574 | * \brief Set the current endpoint type |
1575 | * |
1576 | * \param conf SSL configuration |
1577 | * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER |
1578 | */ |
1579 | void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint); |
1580 | |
1581 | /** |
1582 | * \brief Set the transport type (TLS or DTLS). |
1583 | * Default: TLS |
1584 | * |
1585 | * \note For DTLS, you must either provide a recv callback that |
1586 | * doesn't block, or one that handles timeouts, see |
1587 | * \c mbedtls_ssl_set_bio(). You also need to provide timer |
1588 | * callbacks with \c mbedtls_ssl_set_timer_cb(). |
1589 | * |
1590 | * \param conf SSL configuration |
1591 | * \param transport transport type: |
1592 | * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, |
1593 | * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. |
1594 | */ |
1595 | void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport); |
1596 | |
1597 | /** |
1598 | * \brief Set the certificate verification mode |
1599 | * Default: NONE on server, REQUIRED on client |
1600 | * |
1601 | * \param conf SSL configuration |
1602 | * \param authmode can be: |
1603 | * |
1604 | * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked |
1605 | * (default on server) |
1606 | * (insecure on client) |
1607 | * |
1608 | * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the |
1609 | * handshake continues even if verification failed; |
1610 | * mbedtls_ssl_get_verify_result() can be called after the |
1611 | * handshake is complete. |
1612 | * |
1613 | * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, |
1614 | * handshake is aborted if verification failed. |
1615 | * (default on client) |
1616 | * |
1617 | * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. |
1618 | * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at |
1619 | * the right time(s), which may not be obvious, while REQUIRED always perform |
1620 | * the verification as soon as possible. For example, REQUIRED was protecting |
1621 | * against the "triple handshake" attack even before it was found. |
1622 | */ |
1623 | void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode); |
1624 | |
1625 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1626 | /** |
1627 | * \brief Set the verification callback (Optional). |
1628 | * |
1629 | * If set, the provided verify callback is called for each |
1630 | * certificate in the peer's CRT chain, including the trusted |
1631 | * root. For more information, please see the documentation of |
1632 | * \c mbedtls_x509_crt_verify(). |
1633 | * |
1634 | * \note For per context callbacks and contexts, please use |
1635 | * mbedtls_ssl_set_verify() instead. |
1636 | * |
1637 | * \param conf The SSL configuration to use. |
1638 | * \param f_vrfy The verification callback to use during CRT verification. |
1639 | * \param p_vrfy The opaque context to be passed to the callback. |
1640 | */ |
1641 | void mbedtls_ssl_conf_verify(mbedtls_ssl_config *conf, |
1642 | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), |
1643 | void *p_vrfy); |
1644 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1645 | |
1646 | /** |
1647 | * \brief Set the random number generator callback |
1648 | * |
1649 | * \param conf SSL configuration |
1650 | * \param f_rng RNG function |
1651 | * \param p_rng RNG parameter |
1652 | */ |
1653 | void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf, |
1654 | int (*f_rng)(void *, unsigned char *, size_t), |
1655 | void *p_rng); |
1656 | |
1657 | /** |
1658 | * \brief Set the debug callback |
1659 | * |
1660 | * The callback has the following argument: |
1661 | * void * opaque context for the callback |
1662 | * int debug level |
1663 | * const char * file name |
1664 | * int line number |
1665 | * const char * message |
1666 | * |
1667 | * \param conf SSL configuration |
1668 | * \param f_dbg debug function |
1669 | * \param p_dbg debug parameter |
1670 | */ |
1671 | void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf, |
1672 | void (*f_dbg)(void *, int, const char *, int, const char *), |
1673 | void *p_dbg); |
1674 | |
1675 | /** |
1676 | * \brief Set the underlying BIO callbacks for write, read and |
1677 | * read-with-timeout. |
1678 | * |
1679 | * \param ssl SSL context |
1680 | * \param p_bio parameter (context) shared by BIO callbacks |
1681 | * \param f_send write callback |
1682 | * \param f_recv read callback |
1683 | * \param f_recv_timeout blocking read callback with timeout. |
1684 | * |
1685 | * \note One of f_recv or f_recv_timeout can be NULL, in which case |
1686 | * the other is used. If both are non-NULL, f_recv_timeout is |
1687 | * used and f_recv is ignored (as if it were NULL). |
1688 | * |
1689 | * \note The two most common use cases are: |
1690 | * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL |
1691 | * - blocking I/O, f_recv == NULL, f_recv_timeout != NULL |
1692 | * |
1693 | * \note For DTLS, you need to provide either a non-NULL |
1694 | * f_recv_timeout callback, or a f_recv that doesn't block. |
1695 | * |
1696 | * \note See the documentations of \c mbedtls_ssl_send_t, |
1697 | * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for |
1698 | * the conventions those callbacks must follow. |
1699 | * |
1700 | * \note On some platforms, net_sockets.c provides |
1701 | * \c mbedtls_net_send(), \c mbedtls_net_recv() and |
1702 | * \c mbedtls_net_recv_timeout() that are suitable to be used |
1703 | * here. |
1704 | */ |
1705 | void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl, |
1706 | void *p_bio, |
1707 | mbedtls_ssl_send_t *f_send, |
1708 | mbedtls_ssl_recv_t *f_recv, |
1709 | mbedtls_ssl_recv_timeout_t *f_recv_timeout); |
1710 | |
1711 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
1712 | |
1713 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
1714 | |
1715 | |
1716 | /** |
1717 | * \brief Configure the use of the Connection ID (CID) |
1718 | * extension in the next handshake. |
1719 | * |
1720 | * Reference: draft-ietf-tls-dtls-connection-id-05 |
1721 | * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 |
1722 | * |
1723 | * The DTLS CID extension allows the reliable association of |
1724 | * DTLS records to DTLS connections across changes in the |
1725 | * underlying transport (changed IP and Port metadata) by |
1726 | * adding explicit connection identifiers (CIDs) to the |
1727 | * headers of encrypted DTLS records. The desired CIDs are |
1728 | * configured by the application layer and are exchanged in |
1729 | * new `ClientHello` / `ServerHello` extensions during the |
1730 | * handshake, where each side indicates the CID it wants the |
1731 | * peer to use when writing encrypted messages. The CIDs are |
1732 | * put to use once records get encrypted: the stack discards |
1733 | * any incoming records that don't include the configured CID |
1734 | * in their header, and adds the peer's requested CID to the |
1735 | * headers of outgoing messages. |
1736 | * |
1737 | * This API enables or disables the use of the CID extension |
1738 | * in the next handshake and sets the value of the CID to |
1739 | * be used for incoming messages. |
1740 | * |
1741 | * \param ssl The SSL context to configure. This must be initialized. |
1742 | * \param enable This value determines whether the CID extension should |
1743 | * be used or not. Possible values are: |
1744 | * - MBEDTLS_SSL_CID_ENABLED to enable the use of the CID. |
1745 | * - MBEDTLS_SSL_CID_DISABLED (default) to disable the use |
1746 | * of the CID. |
1747 | * \param own_cid The address of the readable buffer holding the CID we want |
1748 | * the peer to use when sending encrypted messages to us. |
1749 | * This may be \c NULL if \p own_cid_len is \c 0. |
1750 | * This parameter is unused if \p enable is set to |
1751 | * MBEDTLS_SSL_CID_DISABLED. |
1752 | * \param own_cid_len The length of \p own_cid. |
1753 | * This parameter is unused if \p enable is set to |
1754 | * MBEDTLS_SSL_CID_DISABLED. |
1755 | * |
1756 | * \note The value of \p own_cid_len must match the value of the |
1757 | * \c len parameter passed to mbedtls_ssl_conf_cid() |
1758 | * when configuring the ::mbedtls_ssl_config that \p ssl |
1759 | * is bound to. |
1760 | * |
1761 | * \note This CID configuration applies to subsequent handshakes |
1762 | * performed on the SSL context \p ssl, but does not trigger |
1763 | * one. You still have to call `mbedtls_ssl_handshake()` |
1764 | * (for the initial handshake) or `mbedtls_ssl_renegotiate()` |
1765 | * (for a renegotiation handshake) explicitly after a |
1766 | * successful call to this function to run the handshake. |
1767 | * |
1768 | * \note This call cannot guarantee that the use of the CID |
1769 | * will be successfully negotiated in the next handshake, |
1770 | * because the peer might not support it. Specifically: |
1771 | * - On the Client, enabling the use of the CID through |
1772 | * this call implies that the `ClientHello` in the next |
1773 | * handshake will include the CID extension, thereby |
1774 | * offering the use of the CID to the server. Only if |
1775 | * the `ServerHello` contains the CID extension, too, |
1776 | * the CID extension will actually be put to use. |
1777 | * - On the Server, enabling the use of the CID through |
1778 | * this call implies that that the server will look for |
1779 | * the CID extension in a `ClientHello` from the client, |
1780 | * and, if present, reply with a CID extension in its |
1781 | * `ServerHello`. |
1782 | * |
1783 | * \note To check whether the use of the CID was negotiated |
1784 | * after the subsequent handshake has completed, please |
1785 | * use the API mbedtls_ssl_get_peer_cid(). |
1786 | * |
1787 | * \warning If the use of the CID extension is enabled in this call |
1788 | * and the subsequent handshake negotiates its use, Mbed TLS |
1789 | * will silently drop every packet whose CID does not match |
1790 | * the CID configured in \p own_cid. It is the responsibility |
1791 | * of the user to adapt the underlying transport to take care |
1792 | * of CID-based demultiplexing before handing datagrams to |
1793 | * Mbed TLS. |
1794 | * |
1795 | * \return \c 0 on success. In this case, the CID configuration |
1796 | * applies to the next handshake. |
1797 | * \return A negative error code on failure. |
1798 | */ |
1799 | int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl, |
1800 | int enable, |
1801 | unsigned char const *own_cid, |
1802 | size_t own_cid_len); |
1803 | |
1804 | /** |
1805 | * \brief Get information about the use of the CID extension |
1806 | * in the current connection. |
1807 | * |
1808 | * \param ssl The SSL context to query. |
1809 | * \param enabled The address at which to store whether the CID extension |
1810 | * is currently in use or not. If the CID is in use, |
1811 | * `*enabled` is set to MBEDTLS_SSL_CID_ENABLED; |
1812 | * otherwise, it is set to MBEDTLS_SSL_CID_DISABLED. |
1813 | * \param peer_cid The address of the buffer in which to store the CID |
1814 | * chosen by the peer (if the CID extension is used). |
1815 | * This may be \c NULL in case the value of peer CID |
1816 | * isn't needed. If it is not \c NULL, \p peer_cid_len |
1817 | * must not be \c NULL. |
1818 | * \param peer_cid_len The address at which to store the size of the CID |
1819 | * chosen by the peer (if the CID extension is used). |
1820 | * This is also the number of Bytes in \p peer_cid that |
1821 | * have been written. |
1822 | * This may be \c NULL in case the length of the peer CID |
1823 | * isn't needed. If it is \c NULL, \p peer_cid must be |
1824 | * \c NULL, too. |
1825 | * |
1826 | * \note This applies to the state of the CID negotiated in |
1827 | * the last complete handshake. If a handshake is in |
1828 | * progress, this function will attempt to complete |
1829 | * the handshake first. |
1830 | * |
1831 | * \note If CID extensions have been exchanged but both client |
1832 | * and server chose to use an empty CID, this function |
1833 | * sets `*enabled` to #MBEDTLS_SSL_CID_DISABLED |
1834 | * (the rationale for this is that the resulting |
1835 | * communication is the same as if the CID extensions |
1836 | * hadn't been used). |
1837 | * |
1838 | * \return \c 0 on success. |
1839 | * \return A negative error code on failure. |
1840 | */ |
1841 | int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl, |
1842 | int *enabled, |
1843 | unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX], |
1844 | size_t *peer_cid_len); |
1845 | |
1846 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
1847 | |
1848 | /** |
1849 | * \brief Set the Maximum Transport Unit (MTU). |
1850 | * Special value: 0 means unset (no limit). |
1851 | * This represents the maximum size of a datagram payload |
1852 | * handled by the transport layer (usually UDP) as determined |
1853 | * by the network link and stack. In practice, this controls |
1854 | * the maximum size datagram the DTLS layer will pass to the |
1855 | * \c f_send() callback set using \c mbedtls_ssl_set_bio(). |
1856 | * |
1857 | * \note The limit on datagram size is converted to a limit on |
1858 | * record payload by subtracting the current overhead of |
1859 | * encapsulation and encryption/authentication if any. |
1860 | * |
1861 | * \note This can be called at any point during the connection, for |
1862 | * example when a Path Maximum Transfer Unit (PMTU) |
1863 | * estimate becomes available from other sources, |
1864 | * such as lower (or higher) protocol layers. |
1865 | * |
1866 | * \note This setting only controls the size of the packets we send, |
1867 | * and does not restrict the size of the datagrams we're |
1868 | * willing to receive. Client-side, you can request the |
1869 | * server to use smaller records with \c |
1870 | * mbedtls_ssl_conf_max_frag_len(). |
1871 | * |
1872 | * \note If both a MTU and a maximum fragment length have been |
1873 | * configured (or negotiated with the peer), the resulting |
1874 | * lower limit on record payload (see first note) is used. |
1875 | * |
1876 | * \note This can only be used to decrease the maximum size |
1877 | * of datagrams (hence records, see first note) sent. It |
1878 | * cannot be used to increase the maximum size of records over |
1879 | * the limit set by #MBEDTLS_SSL_OUT_CONTENT_LEN. |
1880 | * |
1881 | * \note Values lower than the current record layer expansion will |
1882 | * result in an error when trying to send data. |
1883 | * |
1884 | * \note Using record compression together with a non-zero MTU value |
1885 | * will result in an error when trying to send data. |
1886 | * |
1887 | * \param ssl SSL context |
1888 | * \param mtu Value of the path MTU in bytes |
1889 | */ |
1890 | void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu); |
1891 | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
1892 | |
1893 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
1894 | /** |
1895 | * \brief Set a connection-specific verification callback (optional). |
1896 | * |
1897 | * If set, the provided verify callback is called for each |
1898 | * certificate in the peer's CRT chain, including the trusted |
1899 | * root. For more information, please see the documentation of |
1900 | * \c mbedtls_x509_crt_verify(). |
1901 | * |
1902 | * \note This call is analogous to mbedtls_ssl_conf_verify() but |
1903 | * binds the verification callback and context to an SSL context |
1904 | * as opposed to an SSL configuration. |
1905 | * If mbedtls_ssl_conf_verify() and mbedtls_ssl_set_verify() |
1906 | * are both used, mbedtls_ssl_set_verify() takes precedence. |
1907 | * |
1908 | * \param ssl The SSL context to use. |
1909 | * \param f_vrfy The verification callback to use during CRT verification. |
1910 | * \param p_vrfy The opaque context to be passed to the callback. |
1911 | */ |
1912 | void mbedtls_ssl_set_verify(mbedtls_ssl_context *ssl, |
1913 | int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), |
1914 | void *p_vrfy); |
1915 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
1916 | |
1917 | /** |
1918 | * \brief Set the timeout period for mbedtls_ssl_read() |
1919 | * (Default: no timeout.) |
1920 | * |
1921 | * \param conf SSL configuration context |
1922 | * \param timeout Timeout value in milliseconds. |
1923 | * Use 0 for no timeout (default). |
1924 | * |
1925 | * \note With blocking I/O, this will only work if a non-NULL |
1926 | * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). |
1927 | * With non-blocking I/O, this will only work if timer |
1928 | * callbacks were set with \c mbedtls_ssl_set_timer_cb(). |
1929 | * |
1930 | * \note With non-blocking I/O, you may also skip this function |
1931 | * altogether and handle timeouts at the application layer. |
1932 | */ |
1933 | void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout); |
1934 | |
1935 | #if defined(MBEDTLS_SSL_RECORD_CHECKING) |
1936 | /** |
1937 | * \brief Check whether a buffer contains a valid and authentic record |
1938 | * that has not been seen before. (DTLS only). |
1939 | * |
1940 | * This function does not change the user-visible state |
1941 | * of the SSL context. Its sole purpose is to provide |
1942 | * an indication of the legitimacy of an incoming record. |
1943 | * |
1944 | * This can be useful e.g. in distributed server environments |
1945 | * using the DTLS Connection ID feature, in which connections |
1946 | * might need to be passed between service instances on a change |
1947 | * of peer address, but where such disruptive operations should |
1948 | * only happen after the validity of incoming records has been |
1949 | * confirmed. |
1950 | * |
1951 | * \param ssl The SSL context to use. |
1952 | * \param buf The address of the buffer holding the record to be checked. |
1953 | * This must be a read/write buffer of length \p buflen Bytes. |
1954 | * \param buflen The length of \p buf in Bytes. |
1955 | * |
1956 | * \note This routine only checks whether the provided buffer begins |
1957 | * with a valid and authentic record that has not been seen |
1958 | * before, but does not check potential data following the |
1959 | * initial record. In particular, it is possible to pass DTLS |
1960 | * datagrams containing multiple records, in which case only |
1961 | * the first record is checked. |
1962 | * |
1963 | * \note This function modifies the input buffer \p buf. If you need |
1964 | * to preserve the original record, you have to maintain a copy. |
1965 | * |
1966 | * \return \c 0 if the record is valid and authentic and has not been |
1967 | * seen before. |
1968 | * \return MBEDTLS_ERR_SSL_INVALID_MAC if the check completed |
1969 | * successfully but the record was found to be not authentic. |
1970 | * \return MBEDTLS_ERR_SSL_INVALID_RECORD if the check completed |
1971 | * successfully but the record was found to be invalid for |
1972 | * a reason different from authenticity checking. |
1973 | * \return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD if the check completed |
1974 | * successfully but the record was found to be unexpected |
1975 | * in the state of the SSL context, including replayed records. |
1976 | * \return Another negative error code on different kinds of failure. |
1977 | * In this case, the SSL context becomes unusable and needs |
1978 | * to be freed or reset before reuse. |
1979 | */ |
1980 | int mbedtls_ssl_check_record(mbedtls_ssl_context const *ssl, |
1981 | unsigned char *buf, |
1982 | size_t buflen); |
1983 | #endif /* MBEDTLS_SSL_RECORD_CHECKING */ |
1984 | |
1985 | /** |
1986 | * \brief Set the timer callbacks (Mandatory for DTLS.) |
1987 | * |
1988 | * \param ssl SSL context |
1989 | * \param p_timer parameter (context) shared by timer callbacks |
1990 | * \param f_set_timer set timer callback |
1991 | * \param f_get_timer get timer callback. Must return: |
1992 | * |
1993 | * \note See the documentation of \c mbedtls_ssl_set_timer_t and |
1994 | * \c mbedtls_ssl_get_timer_t for the conventions this pair of |
1995 | * callbacks must follow. |
1996 | * |
1997 | * \note On some platforms, timing.c provides |
1998 | * \c mbedtls_timing_set_delay() and |
1999 | * \c mbedtls_timing_get_delay() that are suitable for using |
2000 | * here, except if using an event-driven style. |
2001 | * |
2002 | * \note See also the "DTLS tutorial" article in our knowledge base. |
2003 | * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/dtls-tutorial |
2004 | */ |
2005 | void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl, |
2006 | void *p_timer, |
2007 | mbedtls_ssl_set_timer_t *f_set_timer, |
2008 | mbedtls_ssl_get_timer_t *f_get_timer); |
2009 | |
2010 | /** |
2011 | * \brief Callback type: generate and write session ticket |
2012 | * |
2013 | * \note This describes what a callback implementation should do. |
2014 | * This callback should generate an encrypted and |
2015 | * authenticated ticket for the session and write it to the |
2016 | * output buffer. Here, ticket means the opaque ticket part |
2017 | * of the NewSessionTicket structure of RFC 5077. |
2018 | * |
2019 | * \param p_ticket Context for the callback |
2020 | * \param session SSL session to be written in the ticket |
2021 | * \param start Start of the output buffer |
2022 | * \param end End of the output buffer |
2023 | * \param tlen On exit, holds the length written |
2024 | * \param lifetime On exit, holds the lifetime of the ticket in seconds |
2025 | * |
2026 | * \return 0 if successful, or |
2027 | * a specific MBEDTLS_ERR_XXX code. |
2028 | */ |
2029 | typedef int mbedtls_ssl_ticket_write_t(void *p_ticket, |
2030 | const mbedtls_ssl_session *session, |
2031 | unsigned char *start, |
2032 | const unsigned char *end, |
2033 | size_t *tlen, |
2034 | uint32_t *lifetime); |
2035 | |
2036 | #if defined(MBEDTLS_SSL_EXPORT_KEYS) |
2037 | /** |
2038 | * \brief Callback type: Export key block and master secret |
2039 | * |
2040 | * \note This is required for certain uses of TLS, e.g. EAP-TLS |
2041 | * (RFC 5216) and Thread. The key pointers are ephemeral and |
2042 | * therefore must not be stored. The master secret and keys |
2043 | * should not be used directly except as an input to a key |
2044 | * derivation function. |
2045 | * |
2046 | * \param p_expkey Context for the callback |
2047 | * \param ms Pointer to master secret (fixed length: 48 bytes) |
2048 | * \param kb Pointer to key block, see RFC 5246 section 6.3 |
2049 | * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). |
2050 | * \param maclen MAC length |
2051 | * \param keylen Key length |
2052 | * \param ivlen IV length |
2053 | * |
2054 | * \return 0 if successful, or |
2055 | * a specific MBEDTLS_ERR_XXX code. |
2056 | */ |
2057 | typedef int mbedtls_ssl_export_keys_t(void *p_expkey, |
2058 | const unsigned char *ms, |
2059 | const unsigned char *kb, |
2060 | size_t maclen, |
2061 | size_t keylen, |
2062 | size_t ivlen); |
2063 | |
2064 | /** |
2065 | * \brief Callback type: Export key block, master secret, |
2066 | * handshake randbytes and the tls_prf function |
2067 | * used to derive keys. |
2068 | * |
2069 | * \note This is required for certain uses of TLS, e.g. EAP-TLS |
2070 | * (RFC 5216) and Thread. The key pointers are ephemeral and |
2071 | * therefore must not be stored. The master secret and keys |
2072 | * should not be used directly except as an input to a key |
2073 | * derivation function. |
2074 | * |
2075 | * \param p_expkey Context for the callback. |
2076 | * \param ms Pointer to master secret (fixed length: 48 bytes). |
2077 | * \param kb Pointer to key block, see RFC 5246 section 6.3. |
2078 | * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). |
2079 | * \param maclen MAC length. |
2080 | * \param keylen Key length. |
2081 | * \param ivlen IV length. |
2082 | * \param client_random The client random bytes. |
2083 | * \param server_random The server random bytes. |
2084 | * \param tls_prf_type The tls_prf enum type. |
2085 | * |
2086 | * \return 0 if successful, or |
2087 | * a specific MBEDTLS_ERR_XXX code. |
2088 | */ |
2089 | typedef int mbedtls_ssl_export_keys_ext_t(void *p_expkey, |
2090 | const unsigned char *ms, |
2091 | const unsigned char *kb, |
2092 | size_t maclen, |
2093 | size_t keylen, |
2094 | size_t ivlen, |
2095 | const unsigned char client_random[32], |
2096 | const unsigned char server_random[32], |
2097 | mbedtls_tls_prf_types tls_prf_type); |
2098 | #endif /* MBEDTLS_SSL_EXPORT_KEYS */ |
2099 | |
2100 | /** |
2101 | * \brief Callback type: parse and load session ticket |
2102 | * |
2103 | * \note This describes what a callback implementation should do. |
2104 | * This callback should parse a session ticket as generated |
2105 | * by the corresponding mbedtls_ssl_ticket_write_t function, |
2106 | * and, if the ticket is authentic and valid, load the |
2107 | * session. |
2108 | * |
2109 | * \note The implementation is allowed to modify the first len |
2110 | * bytes of the input buffer, eg to use it as a temporary |
2111 | * area for the decrypted ticket contents. |
2112 | * |
2113 | * \param p_ticket Context for the callback |
2114 | * \param session SSL session to be loaded |
2115 | * \param buf Start of the buffer containing the ticket |
2116 | * \param len Length of the ticket. |
2117 | * |
2118 | * \return 0 if successful, or |
2119 | * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or |
2120 | * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or |
2121 | * any other non-zero code for other failures. |
2122 | */ |
2123 | typedef int mbedtls_ssl_ticket_parse_t(void *p_ticket, |
2124 | mbedtls_ssl_session *session, |
2125 | unsigned char *buf, |
2126 | size_t len); |
2127 | |
2128 | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) |
2129 | /** |
2130 | * \brief Configure SSL session ticket callbacks (server only). |
2131 | * (Default: none.) |
2132 | * |
2133 | * \note On server, session tickets are enabled by providing |
2134 | * non-NULL callbacks. |
2135 | * |
2136 | * \note On client, use \c mbedtls_ssl_conf_session_tickets(). |
2137 | * |
2138 | * \param conf SSL configuration context |
2139 | * \param f_ticket_write Callback for writing a ticket |
2140 | * \param f_ticket_parse Callback for parsing a ticket |
2141 | * \param p_ticket Context shared by the two callbacks |
2142 | */ |
2143 | void mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config *conf, |
2144 | mbedtls_ssl_ticket_write_t *f_ticket_write, |
2145 | mbedtls_ssl_ticket_parse_t *f_ticket_parse, |
2146 | void *p_ticket); |
2147 | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ |
2148 | |
2149 | #if defined(MBEDTLS_SSL_EXPORT_KEYS) |
2150 | /** |
2151 | * \brief Configure key export callback. |
2152 | * (Default: none.) |
2153 | * |
2154 | * \note See \c mbedtls_ssl_export_keys_t. |
2155 | * |
2156 | * \param conf SSL configuration context |
2157 | * \param f_export_keys Callback for exporting keys |
2158 | * \param p_export_keys Context for the callback |
2159 | */ |
2160 | void mbedtls_ssl_conf_export_keys_cb(mbedtls_ssl_config *conf, |
2161 | mbedtls_ssl_export_keys_t *f_export_keys, |
2162 | void *p_export_keys); |
2163 | |
2164 | /** |
2165 | * \brief Configure extended key export callback. |
2166 | * (Default: none.) |
2167 | * |
2168 | * \note See \c mbedtls_ssl_export_keys_ext_t. |
2169 | * \warning Exported key material must not be used for any purpose |
2170 | * before the (D)TLS handshake is completed |
2171 | * |
2172 | * \param conf SSL configuration context |
2173 | * \param f_export_keys_ext Callback for exporting keys |
2174 | * \param p_export_keys Context for the callback |
2175 | */ |
2176 | void mbedtls_ssl_conf_export_keys_ext_cb(mbedtls_ssl_config *conf, |
2177 | mbedtls_ssl_export_keys_ext_t *f_export_keys_ext, |
2178 | void *p_export_keys); |
2179 | #endif /* MBEDTLS_SSL_EXPORT_KEYS */ |
2180 | |
2181 | #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) |
2182 | /** |
2183 | * \brief Configure asynchronous private key operation callbacks. |
2184 | * |
2185 | * \param conf SSL configuration context |
2186 | * \param f_async_sign Callback to start a signature operation. See |
2187 | * the description of ::mbedtls_ssl_async_sign_t |
2188 | * for more information. This may be \c NULL if the |
2189 | * external processor does not support any signature |
2190 | * operation; in this case the private key object |
2191 | * associated with the certificate will be used. |
2192 | * \param f_async_decrypt Callback to start a decryption operation. See |
2193 | * the description of ::mbedtls_ssl_async_decrypt_t |
2194 | * for more information. This may be \c NULL if the |
2195 | * external processor does not support any decryption |
2196 | * operation; in this case the private key object |
2197 | * associated with the certificate will be used. |
2198 | * \param f_async_resume Callback to resume an asynchronous operation. See |
2199 | * the description of ::mbedtls_ssl_async_resume_t |
2200 | * for more information. This may not be \c NULL unless |
2201 | * \p f_async_sign and \p f_async_decrypt are both |
2202 | * \c NULL. |
2203 | * \param f_async_cancel Callback to cancel an asynchronous operation. See |
2204 | * the description of ::mbedtls_ssl_async_cancel_t |
2205 | * for more information. This may be \c NULL if |
2206 | * no cleanup is needed. |
2207 | * \param config_data A pointer to configuration data which can be |
2208 | * retrieved with |
2209 | * mbedtls_ssl_conf_get_async_config_data(). The |
2210 | * library stores this value without dereferencing it. |
2211 | */ |
2212 | void mbedtls_ssl_conf_async_private_cb(mbedtls_ssl_config *conf, |
2213 | mbedtls_ssl_async_sign_t *f_async_sign, |
2214 | mbedtls_ssl_async_decrypt_t *f_async_decrypt, |
2215 | mbedtls_ssl_async_resume_t *f_async_resume, |
2216 | mbedtls_ssl_async_cancel_t *f_async_cancel, |
2217 | void *config_data); |
2218 | |
2219 | /** |
2220 | * \brief Retrieve the configuration data set by |
2221 | * mbedtls_ssl_conf_async_private_cb(). |
2222 | * |
2223 | * \param conf SSL configuration context |
2224 | * \return The configuration data set by |
2225 | * mbedtls_ssl_conf_async_private_cb(). |
2226 | */ |
2227 | void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf); |
2228 | |
2229 | /** |
2230 | * \brief Retrieve the asynchronous operation user context. |
2231 | * |
2232 | * \note This function may only be called while a handshake |
2233 | * is in progress. |
2234 | * |
2235 | * \param ssl The SSL context to access. |
2236 | * |
2237 | * \return The asynchronous operation user context that was last |
2238 | * set during the current handshake. If |
2239 | * mbedtls_ssl_set_async_operation_data() has not yet been |
2240 | * called during the current handshake, this function returns |
2241 | * \c NULL. |
2242 | */ |
2243 | void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl); |
2244 | |
2245 | /** |
2246 | * \brief Retrieve the asynchronous operation user context. |
2247 | * |
2248 | * \note This function may only be called while a handshake |
2249 | * is in progress. |
2250 | * |
2251 | * \param ssl The SSL context to access. |
2252 | * \param ctx The new value of the asynchronous operation user context. |
2253 | * Call mbedtls_ssl_get_async_operation_data() later during the |
2254 | * same handshake to retrieve this value. |
2255 | */ |
2256 | void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl, |
2257 | void *ctx); |
2258 | #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ |
2259 | |
2260 | /** |
2261 | * \brief Callback type: generate a cookie |
2262 | * |
2263 | * \param ctx Context for the callback |
2264 | * \param p Buffer to write to, |
2265 | * must be updated to point right after the cookie |
2266 | * \param end Pointer to one past the end of the output buffer |
2267 | * \param info Client ID info that was passed to |
2268 | * \c mbedtls_ssl_set_client_transport_id() |
2269 | * \param ilen Length of info in bytes |
2270 | * |
2271 | * \return The callback must return 0 on success, |
2272 | * or a negative error code. |
2273 | */ |
2274 | typedef int mbedtls_ssl_cookie_write_t(void *ctx, |
2275 | unsigned char **p, unsigned char *end, |
2276 | const unsigned char *info, size_t ilen); |
2277 | |
2278 | /** |
2279 | * \brief Callback type: verify a cookie |
2280 | * |
2281 | * \param ctx Context for the callback |
2282 | * \param cookie Cookie to verify |
2283 | * \param clen Length of cookie |
2284 | * \param info Client ID info that was passed to |
2285 | * \c mbedtls_ssl_set_client_transport_id() |
2286 | * \param ilen Length of info in bytes |
2287 | * |
2288 | * \return The callback must return 0 if cookie is valid, |
2289 | * or a negative error code. |
2290 | */ |
2291 | typedef int mbedtls_ssl_cookie_check_t(void *ctx, |
2292 | const unsigned char *cookie, size_t clen, |
2293 | const unsigned char *info, size_t ilen); |
2294 | |
2295 | #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) |
2296 | /** |
2297 | * \brief Register callbacks for DTLS cookies |
2298 | * (Server only. DTLS only.) |
2299 | * |
2300 | * Default: dummy callbacks that fail, in order to force you to |
2301 | * register working callbacks (and initialize their context). |
2302 | * |
2303 | * To disable HelloVerifyRequest, register NULL callbacks. |
2304 | * |
2305 | * \warning Disabling hello verification allows your server to be used |
2306 | * for amplification in DoS attacks against other hosts. |
2307 | * Only disable if you known this can't happen in your |
2308 | * particular environment. |
2309 | * |
2310 | * \note See comments on \c mbedtls_ssl_handshake() about handling |
2311 | * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected |
2312 | * on the first handshake attempt when this is enabled. |
2313 | * |
2314 | * \note This is also necessary to handle client reconnection from |
2315 | * the same port as described in RFC 6347 section 4.2.8 (only |
2316 | * the variant with cookies is supported currently). See |
2317 | * comments on \c mbedtls_ssl_read() for details. |
2318 | * |
2319 | * \param conf SSL configuration |
2320 | * \param f_cookie_write Cookie write callback |
2321 | * \param f_cookie_check Cookie check callback |
2322 | * \param p_cookie Context for both callbacks |
2323 | */ |
2324 | void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf, |
2325 | mbedtls_ssl_cookie_write_t *f_cookie_write, |
2326 | mbedtls_ssl_cookie_check_t *f_cookie_check, |
2327 | void *p_cookie); |
2328 | |
2329 | /** |
2330 | * \brief Set client's transport-level identification info. |
2331 | * (Server only. DTLS only.) |
2332 | * |
2333 | * This is usually the IP address (and port), but could be |
2334 | * anything identify the client depending on the underlying |
2335 | * network stack. Used for HelloVerifyRequest with DTLS. |
2336 | * This is *not* used to route the actual packets. |
2337 | * |
2338 | * \param ssl SSL context |
2339 | * \param info Transport-level info identifying the client (eg IP + port) |
2340 | * \param ilen Length of info in bytes |
2341 | * |
2342 | * \note An internal copy is made, so the info buffer can be reused. |
2343 | * |
2344 | * \return 0 on success, |
2345 | * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, |
2346 | * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. |
2347 | */ |
2348 | int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl, |
2349 | const unsigned char *info, |
2350 | size_t ilen); |
2351 | |
2352 | #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ |
2353 | |
2354 | #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) |
2355 | /** |
2356 | * \brief Enable or disable anti-replay protection for DTLS. |
2357 | * (DTLS only, no effect on TLS.) |
2358 | * Default: enabled. |
2359 | * |
2360 | * \param conf SSL configuration |
2361 | * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. |
2362 | * |
2363 | * \warning Disabling this is a security risk unless the application |
2364 | * protocol handles duplicated packets in a safe way. You |
2365 | * should not disable this without careful consideration. |
2366 | * However, if your application already detects duplicated |
2367 | * packets and needs information about them to adjust its |
2368 | * transmission strategy, then you'll want to disable this. |
2369 | */ |
2370 | void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode); |
2371 | #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ |
2372 | |
2373 | #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) |
2374 | /** |
2375 | * \brief Set a limit on the number of records with a bad MAC |
2376 | * before terminating the connection. |
2377 | * (DTLS only, no effect on TLS.) |
2378 | * Default: 0 (disabled). |
2379 | * |
2380 | * \param conf SSL configuration |
2381 | * \param limit Limit, or 0 to disable. |
2382 | * |
2383 | * \note If the limit is N, then the connection is terminated when |
2384 | * the Nth non-authentic record is seen. |
2385 | * |
2386 | * \note Records with an invalid header are not counted, only the |
2387 | * ones going through the authentication-decryption phase. |
2388 | * |
2389 | * \note This is a security trade-off related to the fact that it's |
2390 | * often relatively easy for an active attacker to inject UDP |
2391 | * datagrams. On one hand, setting a low limit here makes it |
2392 | * easier for such an attacker to forcibly terminated a |
2393 | * connection. On the other hand, a high limit or no limit |
2394 | * might make us waste resources checking authentication on |
2395 | * many bogus packets. |
2396 | */ |
2397 | void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf, unsigned limit); |
2398 | #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ |
2399 | |
2400 | #if defined(MBEDTLS_SSL_PROTO_DTLS) |
2401 | |
2402 | /** |
2403 | * \brief Allow or disallow packing of multiple handshake records |
2404 | * within a single datagram. |
2405 | * |
2406 | * \param ssl The SSL context to configure. |
2407 | * \param allow_packing This determines whether datagram packing may |
2408 | * be used or not. A value of \c 0 means that every |
2409 | * record will be sent in a separate datagram; a |
2410 | * value of \c 1 means that, if space permits, |
2411 | * multiple handshake messages (including CCS) belonging to |
2412 | * a single flight may be packed within a single datagram. |
2413 | * |
2414 | * \note This is enabled by default and should only be disabled |
2415 | * for test purposes, or if datagram packing causes |
2416 | * interoperability issues with peers that don't support it. |
2417 | * |
2418 | * \note Allowing datagram packing reduces the network load since |
2419 | * there's less overhead if multiple messages share the same |
2420 | * datagram. Also, it increases the handshake efficiency |
2421 | * since messages belonging to a single datagram will not |
2422 | * be reordered in transit, and so future message buffering |
2423 | * or flight retransmission (if no buffering is used) as |
2424 | * means to deal with reordering are needed less frequently. |
2425 | * |
2426 | * \note Application records are not affected by this option and |
2427 | * are currently always sent in separate datagrams. |
2428 | * |
2429 | */ |
2430 | void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl, |
2431 | unsigned allow_packing); |
2432 | |
2433 | /** |
2434 | * \brief Set retransmit timeout values for the DTLS handshake. |
2435 | * (DTLS only, no effect on TLS.) |
2436 | * |
2437 | * \param conf SSL configuration |
2438 | * \param min Initial timeout value in milliseconds. |
2439 | * Default: 1000 (1 second). |
2440 | * \param max Maximum timeout value in milliseconds. |
2441 | * Default: 60000 (60 seconds). |
2442 | * |
2443 | * \note Default values are from RFC 6347 section 4.2.4.1. |
2444 | * |
2445 | * \note The 'min' value should typically be slightly above the |
2446 | * expected round-trip time to your peer, plus whatever time |
2447 | * it takes for the peer to process the message. For example, |
2448 | * if your RTT is about 600ms and you peer needs up to 1s to |
2449 | * do the cryptographic operations in the handshake, then you |
2450 | * should set 'min' slightly above 1600. Lower values of 'min' |
2451 | * might cause spurious resends which waste network resources, |
2452 | * while larger value of 'min' will increase overall latency |
2453 | * on unreliable network links. |
2454 | * |
2455 | * \note The more unreliable your network connection is, the larger |
2456 | * your max / min ratio needs to be in order to achieve |
2457 | * reliable handshakes. |
2458 | * |
2459 | * \note Messages are retransmitted up to log2(ceil(max/min)) times. |
2460 | * For example, if min = 1s and max = 5s, the retransmit plan |
2461 | * goes: send ... 1s -> resend ... 2s -> resend ... 4s -> |
2462 | * resend ... 5s -> give up and return a timeout error. |
2463 | */ |
2464 | void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf, uint32_t min, uint32_t max); |
2465 | #endif /* MBEDTLS_SSL_PROTO_DTLS */ |
2466 | |
2467 | #if defined(MBEDTLS_SSL_SRV_C) |
2468 | /** |
2469 | * \brief Set the session cache callbacks (server-side only) |
2470 | * If not set, no session resuming is done (except if session |
2471 | * tickets are enabled too). |
2472 | * |
2473 | * The session cache has the responsibility to check for stale |
2474 | * entries based on timeout. See RFC 5246 for recommendations. |
2475 | * |
2476 | * Warning: session.peer_cert is cleared by the SSL/TLS layer on |
2477 | * connection shutdown, so do not cache the pointer! Either set |
2478 | * it to NULL or make a full copy of the certificate. |
2479 | * |
2480 | * The get callback is called once during the initial handshake |
2481 | * to enable session resuming. The get function has the |
2482 | * following parameters: (void *parameter, mbedtls_ssl_session *session) |
2483 | * If a valid entry is found, it should fill the master of |
2484 | * the session object with the cached values and return 0, |
2485 | * return 1 otherwise. Optionally peer_cert can be set as well |
2486 | * if it is properly present in cache entry. |
2487 | * |
2488 | * The set callback is called once during the initial handshake |
2489 | * to enable session resuming after the entire handshake has |
2490 | * been finished. The set function has the following parameters: |
2491 | * (void *parameter, const mbedtls_ssl_session *session). The function |
2492 | * should create a cache entry for future retrieval based on |
2493 | * the data in the session structure and should keep in mind |
2494 | * that the mbedtls_ssl_session object presented (and all its referenced |
2495 | * data) is cleared by the SSL/TLS layer when the connection is |
2496 | * terminated. It is recommended to add metadata to determine if |
2497 | * an entry is still valid in the future. Return 0 if |
2498 | * successfully cached, return 1 otherwise. |
2499 | * |
2500 | * \param conf SSL configuration |
2501 | * \param p_cache parameter (context) for both callbacks |
2502 | * \param f_get_cache session get callback |
2503 | * \param f_set_cache session set callback |
2504 | */ |
2505 | void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf, |
2506 | void *p_cache, |
2507 | int (*f_get_cache)(void *, mbedtls_ssl_session *), |
2508 | int (*f_set_cache)(void *, const mbedtls_ssl_session *)); |
2509 | #endif /* MBEDTLS_SSL_SRV_C */ |
2510 | |
2511 | #if defined(MBEDTLS_SSL_CLI_C) |
2512 | /** |
2513 | * \brief Request resumption of session (client-side only) |
2514 | * Session data is copied from presented session structure. |
2515 | * |
2516 | * \param ssl SSL context |
2517 | * \param session session context |
2518 | * |
2519 | * \return 0 if successful, |
2520 | * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, |
2521 | * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or |
2522 | * arguments are otherwise invalid |
2523 | * |
2524 | * \sa mbedtls_ssl_get_session() |
2525 | */ |
2526 | int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session); |
2527 | #endif /* MBEDTLS_SSL_CLI_C */ |
2528 | |
2529 | /** |
2530 | * \brief Load serialized session data into a session structure. |
2531 | * On client, this can be used for loading saved sessions |
2532 | * before resuming them with mbedtls_ssl_set_session(). |
2533 | * On server, this can be used for alternative implementations |
2534 | * of session cache or session tickets. |
2535 | * |
2536 | * \warning If a peer certificate chain is associated with the session, |
2537 | * the serialized state will only contain the peer's |
2538 | * end-entity certificate and the result of the chain |
2539 | * verification (unless verification was disabled), but not |
2540 | * the rest of the chain. |
2541 | * |
2542 | * \see mbedtls_ssl_session_save() |
2543 | * \see mbedtls_ssl_set_session() |
2544 | * |
2545 | * \param session The session structure to be populated. It must have been |
2546 | * initialised with mbedtls_ssl_session_init() but not |
2547 | * populated yet. |
2548 | * \param buf The buffer holding the serialized session data. It must be a |
2549 | * readable buffer of at least \p len bytes. |
2550 | * \param len The size of the serialized data in bytes. |
2551 | * |
2552 | * \return \c 0 if successful. |
2553 | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. |
2554 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. |
2555 | * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data |
2556 | * was generated in a different version or configuration of |
2557 | * Mbed TLS. |
2558 | * \return Another negative value for other kinds of errors (for |
2559 | * example, unsupported features in the embedded certificate). |
2560 | */ |
2561 | int mbedtls_ssl_session_load(mbedtls_ssl_session *session, |
2562 | const unsigned char *buf, |
2563 | size_t len); |
2564 | |
2565 | /** |
2566 | * \brief Save session structure as serialized data in a buffer. |
2567 | * On client, this can be used for saving session data, |
2568 | * potentially in non-volatile storage, for resuming later. |
2569 | * On server, this can be used for alternative implementations |
2570 | * of session cache or session tickets. |
2571 | * |
2572 | * \see mbedtls_ssl_session_load() |
2573 | * \see mbedtls_ssl_get_session_pointer() |
2574 | * |
2575 | * \param session The session structure to be saved. |
2576 | * \param buf The buffer to write the serialized data to. It must be a |
2577 | * writeable buffer of at least \p buf_len bytes, or may be \c |
2578 | * NULL if \p buf_len is \c 0. |
2579 | * \param buf_len The number of bytes available for writing in \p buf. |
2580 | * \param olen The size in bytes of the data that has been or would have |
2581 | * been written. It must point to a valid \c size_t. |
2582 | * |
2583 | * \note \p olen is updated to the correct value regardless of |
2584 | * whether \p buf_len was large enough. This makes it possible |
2585 | * to determine the necessary size by calling this function |
2586 | * with \p buf set to \c NULL and \p buf_len to \c 0. |
2587 | * |
2588 | * \return \c 0 if successful. |
2589 | * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. |
2590 | */ |
2591 | int mbedtls_ssl_session_save(const mbedtls_ssl_session *session, |
2592 | unsigned char *buf, |
2593 | size_t buf_len, |
2594 | size_t *olen); |
2595 | |
2596 | /** |
2597 | * \brief Get a pointer to the current session structure, for example |
2598 | * to serialize it. |
2599 | * |
2600 | * \warning Ownership of the session remains with the SSL context, and |
2601 | * the returned pointer is only guaranteed to be valid until |
2602 | * the next API call operating on the same \p ssl context. |
2603 | * |
2604 | * \see mbedtls_ssl_session_save() |
2605 | * |
2606 | * \param ssl The SSL context. |
2607 | * |
2608 | * \return A pointer to the current session if successful. |
2609 | * \return \c NULL if no session is active. |
2610 | */ |
2611 | const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer(const mbedtls_ssl_context *ssl); |
2612 | |
2613 | /** |
2614 | * \brief Set the list of allowed ciphersuites and the preference |
2615 | * order. First in the list has the highest preference. |
2616 | * (Overrides all version-specific lists) |
2617 | * |
2618 | * The ciphersuites array is not copied, and must remain |
2619 | * valid for the lifetime of the ssl_config. |
2620 | * |
2621 | * Note: The server uses its own preferences |
2622 | * over the preference of the client unless |
2623 | * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! |
2624 | * |
2625 | * \param conf SSL configuration |
2626 | * \param ciphersuites 0-terminated list of allowed ciphersuites |
2627 | */ |
2628 | void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf, |
2629 | const int *ciphersuites); |
2630 | |
2631 | #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) |
2632 | #define MBEDTLS_SSL_UNEXPECTED_CID_IGNORE 0 |
2633 | #define MBEDTLS_SSL_UNEXPECTED_CID_FAIL 1 |
2634 | /** |
2635 | * \brief Specify the length of Connection IDs for incoming |
2636 | * encrypted DTLS records, as well as the behaviour |
2637 | * on unexpected CIDs. |
2638 | * |
2639 | * By default, the CID length is set to \c 0, |
2640 | * and unexpected CIDs are silently ignored. |
2641 | * |
2642 | * \param conf The SSL configuration to modify. |
2643 | * \param len The length in Bytes of the CID fields in encrypted |
2644 | * DTLS records using the CID mechanism. This must |
2645 | * not be larger than #MBEDTLS_SSL_CID_OUT_LEN_MAX. |
2646 | * \param ignore_other_cids This determines the stack's behaviour when |
2647 | * receiving a record with an unexpected CID. |
2648 | * Possible values are: |
2649 | * - #MBEDTLS_SSL_UNEXPECTED_CID_IGNORE |
2650 | * In this case, the record is silently ignored. |
2651 | * - #MBEDTLS_SSL_UNEXPECTED_CID_FAIL |
2652 | * In this case, the stack fails with the specific |
2653 | * error code #MBEDTLS_ERR_SSL_UNEXPECTED_CID. |
2654 | * |
2655 | * \note The CID specification allows implementations to either |
2656 | * use a common length for all incoming connection IDs or |
2657 | * allow variable-length incoming IDs. Mbed TLS currently |
2658 | * requires a common length for all connections sharing the |
2659 | * same SSL configuration; this allows simpler parsing of |
2660 | * record headers. |
2661 | * |
2662 | * \return \c 0 on success. |
2663 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if \p len |
2664 | * is too large. |
2665 | */ |
2666 | int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf, size_t len, |
2667 | int ignore_other_cids); |
2668 | #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ |
2669 | |
2670 | /** |
2671 | * \brief Set the list of allowed ciphersuites and the |
2672 | * preference order for a specific version of the protocol. |
2673 | * (Only useful on the server side) |
2674 | * |
2675 | * The ciphersuites array is not copied, and must remain |
2676 | * valid for the lifetime of the ssl_config. |
2677 | * |
2678 | * \param conf SSL configuration |
2679 | * \param ciphersuites 0-terminated list of allowed ciphersuites |
2680 | * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 |
2681 | * supported) |
2682 | * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, |
2683 | * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, |
2684 | * MBEDTLS_SSL_MINOR_VERSION_3 supported) |
2685 | * |
2686 | * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 |
2687 | * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 |
2688 | */ |
2689 | void mbedtls_ssl_conf_ciphersuites_for_version(mbedtls_ssl_config *conf, |
2690 | const int *ciphersuites, |
2691 | int major, int minor); |
2692 | |
2693 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
2694 | /** |
2695 | * \brief Set the X.509 security profile used for verification |
2696 | * |
2697 | * \note The restrictions are enforced for all certificates in the |
2698 | * chain. However, signatures in the handshake are not covered |
2699 | * by this setting but by \b mbedtls_ssl_conf_sig_hashes(). |
2700 | * |
2701 | * \param conf SSL configuration |
2702 | * \param profile Profile to use |
2703 | */ |
2704 | void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf, |
2705 | const mbedtls_x509_crt_profile *profile); |
2706 | |
2707 | /** |
2708 | * \brief Set the data required to verify peer certificate |
2709 | * |
2710 | * \note See \c mbedtls_x509_crt_verify() for notes regarding the |
2711 | * parameters ca_chain (maps to trust_ca for that function) |
2712 | * and ca_crl. |
2713 | * |
2714 | * \param conf SSL configuration |
2715 | * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) |
2716 | * \param ca_crl trusted CA CRLs |
2717 | */ |
2718 | void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf, |
2719 | mbedtls_x509_crt *ca_chain, |
2720 | mbedtls_x509_crl *ca_crl); |
2721 | |
2722 | #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) |
2723 | /** |
2724 | * \brief Set the trusted certificate callback. |
2725 | * |
2726 | * This API allows to register the set of trusted certificates |
2727 | * through a callback, instead of a linked list as configured |
2728 | * by mbedtls_ssl_conf_ca_chain(). |
2729 | * |
2730 | * This is useful for example in contexts where a large number |
2731 | * of CAs are used, and the inefficiency of maintaining them |
2732 | * in a linked list cannot be tolerated. It is also useful when |
2733 | * the set of trusted CAs needs to be modified frequently. |
2734 | * |
2735 | * See the documentation of `mbedtls_x509_crt_ca_cb_t` for |
2736 | * more information. |
2737 | * |
2738 | * \param conf The SSL configuration to register the callback with. |
2739 | * \param f_ca_cb The trusted certificate callback to use when verifying |
2740 | * certificate chains. |
2741 | * \param p_ca_cb The context to be passed to \p f_ca_cb (for example, |
2742 | * a reference to a trusted CA database). |
2743 | * |
2744 | * \note This API is incompatible with mbedtls_ssl_conf_ca_chain(): |
2745 | * Any call to this function overwrites the values set through |
2746 | * earlier calls to mbedtls_ssl_conf_ca_chain() or |
2747 | * mbedtls_ssl_conf_ca_cb(). |
2748 | * |
2749 | * \note This API is incompatible with CA indication in |
2750 | * CertificateRequest messages: A server-side SSL context which |
2751 | * is bound to an SSL configuration that uses a CA callback |
2752 | * configured via mbedtls_ssl_conf_ca_cb(), and which requires |
2753 | * client authentication, will send an empty CA list in the |
2754 | * corresponding CertificateRequest message. |
2755 | * |
2756 | * \note This API is incompatible with mbedtls_ssl_set_hs_ca_chain(): |
2757 | * If an SSL context is bound to an SSL configuration which uses |
2758 | * CA callbacks configured via mbedtls_ssl_conf_ca_cb(), then |
2759 | * calls to mbedtls_ssl_set_hs_ca_chain() have no effect. |
2760 | * |
2761 | * \note The use of this API disables the use of restartable ECC |
2762 | * during X.509 CRT signature verification (but doesn't affect |
2763 | * other uses). |
2764 | * |
2765 | * \warning This API is incompatible with the use of CRLs. Any call to |
2766 | * mbedtls_ssl_conf_ca_cb() unsets CRLs configured through |
2767 | * earlier calls to mbedtls_ssl_conf_ca_chain(). |
2768 | * |
2769 | * \warning In multi-threaded environments, the callback \p f_ca_cb |
2770 | * must be thread-safe, and it is the user's responsibility |
2771 | * to guarantee this (for example through a mutex |
2772 | * contained in the callback context pointed to by \p p_ca_cb). |
2773 | */ |
2774 | void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf, |
2775 | mbedtls_x509_crt_ca_cb_t f_ca_cb, |
2776 | void *p_ca_cb); |
2777 | #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ |
2778 | |
2779 | /** |
2780 | * \brief Set own certificate chain and private key |
2781 | * |
2782 | * \note own_cert should contain in order from the bottom up your |
2783 | * certificate chain. The top certificate (self-signed) |
2784 | * can be omitted. |
2785 | * |
2786 | * \note On server, this function can be called multiple times to |
2787 | * provision more than one cert/key pair (eg one ECDSA, one |
2788 | * RSA with SHA-256, one RSA with SHA-1). An adequate |
2789 | * certificate will be selected according to the client's |
2790 | * advertised capabilities. In case multiple certificates are |
2791 | * adequate, preference is given to the one set by the first |
2792 | * call to this function, then second, etc. |
2793 | * |
2794 | * \note On client, only the first call has any effect. That is, |
2795 | * only one client certificate can be provisioned. The |
2796 | * server's preferences in its CertificateRequest message will |
2797 | * be ignored and our only cert will be sent regardless of |
2798 | * whether it matches those preferences - the server can then |
2799 | * decide what it wants to do with it. |
2800 | * |
2801 | * \note The provided \p pk_key needs to match the public key in the |
2802 | * first certificate in \p own_cert, or all handshakes using |
2803 | * that certificate will fail. It is your responsibility |
2804 | * to ensure that; this function will not perform any check. |
2805 | * You may use mbedtls_pk_check_pair() in order to perform |
2806 | * this check yourself, but be aware that this function can |
2807 | * be computationally expensive on some key types. |
2808 | * |
2809 | * \param conf SSL configuration |
2810 | * \param own_cert own public certificate chain |
2811 | * \param pk_key own private key |
2812 | * |
2813 | * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED |
2814 | */ |
2815 | int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf, |
2816 | mbedtls_x509_crt *own_cert, |
2817 | mbedtls_pk_context *pk_key); |
2818 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
2819 | |
2820 | #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) |
2821 | /** |
2822 | * \brief Configure a pre-shared key (PSK) and identity |
2823 | * to be used in PSK-based ciphersuites. |
2824 | * |
2825 | * \note This is mainly useful for clients. Servers will usually |
2826 | * want to use \c mbedtls_ssl_conf_psk_cb() instead. |
2827 | * |
2828 | * \note A PSK set by \c mbedtls_ssl_set_hs_psk() in the PSK callback |
2829 | * takes precedence over a PSK configured by this function. |
2830 | * |
2831 | * \warning Currently, clients can only register a single pre-shared key. |
2832 | * Calling this function or mbedtls_ssl_conf_psk_opaque() more |
2833 | * than once will overwrite values configured in previous calls. |
2834 | * Support for setting multiple PSKs on clients and selecting |
2835 | * one based on the identity hint is not a planned feature, |
2836 | * but feedback is welcomed. |
2837 | * |
2838 | * \param conf The SSL configuration to register the PSK with. |
2839 | * \param psk The pointer to the pre-shared key to use. |
2840 | * \param psk_len The length of the pre-shared key in bytes. |
2841 | * \param psk_identity The pointer to the pre-shared key identity. |
2842 | * \param psk_identity_len The length of the pre-shared key identity |
2843 | * in bytes. |
2844 | * |
2845 | * \note The PSK and its identity are copied internally and |
2846 | * hence need not be preserved by the caller for the lifetime |
2847 | * of the SSL configuration. |
2848 | * |
2849 | * \return \c 0 if successful. |
2850 | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
2851 | */ |
2852 | int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf, |
2853 | const unsigned char *psk, size_t psk_len, |
2854 | const unsigned char *psk_identity, size_t psk_identity_len); |
2855 | |
2856 | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
2857 | /** |
2858 | * \brief Configure an opaque pre-shared key (PSK) and identity |
2859 | * to be used in PSK-based ciphersuites. |
2860 | * |
2861 | * \note This is mainly useful for clients. Servers will usually |
2862 | * want to use \c mbedtls_ssl_conf_psk_cb() instead. |
2863 | * |
2864 | * \note An opaque PSK set by \c mbedtls_ssl_set_hs_psk_opaque() in |
2865 | * the PSK callback takes precedence over an opaque PSK |
2866 | * configured by this function. |
2867 | * |
2868 | * \warning Currently, clients can only register a single pre-shared key. |
2869 | * Calling this function or mbedtls_ssl_conf_psk() more than |
2870 | * once will overwrite values configured in previous calls. |
2871 | * Support for setting multiple PSKs on clients and selecting |
2872 | * one based on the identity hint is not a planned feature, |
2873 | * but feedback is welcomed. |
2874 | * |
2875 | * \param conf The SSL configuration to register the PSK with. |
2876 | * \param psk The identifier of the key slot holding the PSK. |
2877 | * Until \p conf is destroyed or this function is successfully |
2878 | * called again, the key slot \p psk must be populated with a |
2879 | * key of type PSA_ALG_CATEGORY_KEY_DERIVATION whose policy |
2880 | * allows its use for the key derivation algorithm applied |
2881 | * in the handshake. |
2882 | * \param psk_identity The pointer to the pre-shared key identity. |
2883 | * \param psk_identity_len The length of the pre-shared key identity |
2884 | * in bytes. |
2885 | * |
2886 | * \note The PSK identity hint is copied internally and hence need |
2887 | * not be preserved by the caller for the lifetime of the |
2888 | * SSL configuration. |
2889 | * |
2890 | * \return \c 0 if successful. |
2891 | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
2892 | */ |
2893 | int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf, |
2894 | psa_key_id_t psk, |
2895 | const unsigned char *psk_identity, |
2896 | size_t psk_identity_len); |
2897 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
2898 | |
2899 | /** |
2900 | * \brief Set the pre-shared Key (PSK) for the current handshake. |
2901 | * |
2902 | * \note This should only be called inside the PSK callback, |
2903 | * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). |
2904 | * |
2905 | * \note A PSK set by this function takes precedence over a PSK |
2906 | * configured by \c mbedtls_ssl_conf_psk(). |
2907 | * |
2908 | * \param ssl The SSL context to configure a PSK for. |
2909 | * \param psk The pointer to the pre-shared key. |
2910 | * \param psk_len The length of the pre-shared key in bytes. |
2911 | * |
2912 | * \return \c 0 if successful. |
2913 | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
2914 | */ |
2915 | int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl, |
2916 | const unsigned char *psk, size_t psk_len); |
2917 | |
2918 | #if defined(MBEDTLS_USE_PSA_CRYPTO) |
2919 | /** |
2920 | * \brief Set an opaque pre-shared Key (PSK) for the current handshake. |
2921 | * |
2922 | * \note This should only be called inside the PSK callback, |
2923 | * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). |
2924 | * |
2925 | * \note An opaque PSK set by this function takes precedence over an |
2926 | * opaque PSK configured by \c mbedtls_ssl_conf_psk_opaque(). |
2927 | * |
2928 | * \param ssl The SSL context to configure a PSK for. |
2929 | * \param psk The identifier of the key slot holding the PSK. |
2930 | * For the duration of the current handshake, the key slot |
2931 | * must be populated with a key of type |
2932 | * PSA_ALG_CATEGORY_KEY_DERIVATION whose policy allows its |
2933 | * use for the key derivation algorithm |
2934 | * applied in the handshake. |
2935 | * |
2936 | * \return \c 0 if successful. |
2937 | * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. |
2938 | */ |
2939 | int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl, |
2940 | psa_key_id_t psk); |
2941 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ |
2942 | |
2943 | /** |
2944 | * \brief Set the PSK callback (server-side only). |
2945 | * |
2946 | * If set, the PSK callback is called for each |
2947 | * handshake where a PSK-based ciphersuite was negotiated. |
2948 | * The caller provides the identity received and wants to |
2949 | * receive the actual PSK data and length. |
2950 | * |
2951 | * The callback has the following parameters: |
2952 | * - \c void*: The opaque pointer \p p_psk. |
2953 | * - \c mbedtls_ssl_context*: The SSL context to which |
2954 | * the operation applies. |
2955 | * - \c const unsigned char*: The PSK identity |
2956 | * selected by the client. |
2957 | * - \c size_t: The length of the PSK identity |
2958 | * selected by the client. |
2959 | * |
2960 | * If a valid PSK identity is found, the callback should use |
2961 | * \c mbedtls_ssl_set_hs_psk() or |
2962 | * \c mbedtls_ssl_set_hs_psk_opaque() |
2963 | * on the SSL context to set the correct PSK and return \c 0. |
2964 | * Any other return value will result in a denied PSK identity. |
2965 | * |
2966 | * \note A dynamic PSK (i.e. set by the PSK callback) takes |
2967 | * precedence over a static PSK (i.e. set by |
2968 | * \c mbedtls_ssl_conf_psk() or |
2969 | * \c mbedtls_ssl_conf_psk_opaque()). |
2970 | * This means that if you set a PSK callback using this |
2971 | * function, you don't need to set a PSK using |
2972 | * \c mbedtls_ssl_conf_psk() or |
2973 | * \c mbedtls_ssl_conf_psk_opaque()). |
2974 | * |
2975 | * \param conf The SSL configuration to register the callback with. |
2976 | * \param f_psk The callback for selecting and setting the PSK based |
2977 | * in the PSK identity chosen by the client. |
2978 | * \param p_psk A pointer to an opaque structure to be passed to |
2979 | * the callback, for example a PSK store. |
2980 | */ |
2981 | void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, |
2982 | int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, |
2983 | size_t), |
2984 | void *p_psk); |
2985 | #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ |
2986 | |
2987 | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) |
2988 | |
2989 | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
2990 | |
2991 | #if defined(MBEDTLS_DEPRECATED_WARNING) |
2992 | #define MBEDTLS_DEPRECATED __attribute__((deprecated)) |
2993 | #else |
2994 | #define MBEDTLS_DEPRECATED |
2995 | #endif |
2996 | |
2997 | /** |
2998 | * \brief Set the Diffie-Hellman public P and G values, |
2999 | * read as hexadecimal strings (server-side only) |
3000 | * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]) |
3001 | * |
3002 | * \param conf SSL configuration |
3003 | * \param dhm_P Diffie-Hellman-Merkle modulus |
3004 | * \param dhm_G Diffie-Hellman-Merkle generator |
3005 | * |
3006 | * \deprecated Superseded by \c mbedtls_ssl_conf_dh_param_bin. |
3007 | * |
3008 | * \return 0 if successful |
3009 | */ |
3010 | MBEDTLS_DEPRECATED int mbedtls_ssl_conf_dh_param(mbedtls_ssl_config *conf, |
3011 | const char *dhm_P, |
3012 | const char *dhm_G); |
3013 | |
3014 | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
3015 | |
3016 | /** |
3017 | * \brief Set the Diffie-Hellman public P and G values |
3018 | * from big-endian binary presentations. |
3019 | * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN) |
3020 | * |
3021 | * \param conf SSL configuration |
3022 | * \param dhm_P Diffie-Hellman-Merkle modulus in big-endian binary form |
3023 | * \param P_len Length of DHM modulus |
3024 | * \param dhm_G Diffie-Hellman-Merkle generator in big-endian binary form |
3025 | * \param G_len Length of DHM generator |
3026 | * |
3027 | * \return 0 if successful |
3028 | */ |
3029 | int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf, |
3030 | const unsigned char *dhm_P, size_t P_len, |
3031 | const unsigned char *dhm_G, size_t G_len); |
3032 | |
3033 | /** |
3034 | * \brief Set the Diffie-Hellman public P and G values, |
3035 | * read from existing context (server-side only) |
3036 | * |
3037 | * \param conf SSL configuration |
3038 | * \param dhm_ctx Diffie-Hellman-Merkle context |
3039 | * |
3040 | * \return 0 if successful |
3041 | */ |
3042 | int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx); |
3043 | #endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ |
3044 | |
3045 | #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) |
3046 | /** |
3047 | * \brief Set the minimum length for Diffie-Hellman parameters. |
3048 | * (Client-side only.) |
3049 | * (Default: 1024 bits.) |
3050 | * |
3051 | * \param conf SSL configuration |
3052 | * \param bitlen Minimum bit length of the DHM prime |
3053 | */ |
3054 | void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf, |
3055 | unsigned int bitlen); |
3056 | #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ |
3057 | |
3058 | #if defined(MBEDTLS_ECP_C) |
3059 | /** |
3060 | * \brief Set the allowed curves in order of preference. |
3061 | * (Default: all defined curves in order of decreasing size, |
3062 | * except that Montgomery curves come last. This order |
3063 | * is likely to change in a future version.) |
3064 | * |
3065 | * On server: this only affects selection of the ECDHE curve; |
3066 | * the curves used for ECDH and ECDSA are determined by the |
3067 | * list of available certificates instead. |
3068 | * |
3069 | * On client: this affects the list of curves offered for any |
3070 | * use. The server can override our preference order. |
3071 | * |
3072 | * Both sides: limits the set of curves accepted for use in |
3073 | * ECDHE and in the peer's end-entity certificate. |
3074 | * |
3075 | * \note This has no influence on which curves are allowed inside the |
3076 | * certificate chains, see \c mbedtls_ssl_conf_cert_profile() |
3077 | * for that. For the end-entity certificate however, the key |
3078 | * will be accepted only if it is allowed both by this list |
3079 | * and by the cert profile. |
3080 | * |
3081 | * \note This list should be ordered by decreasing preference |
3082 | * (preferred curve first). |
3083 | * |
3084 | * \param conf SSL configuration |
3085 | * \param curves Ordered list of allowed curves, |
3086 | * terminated by MBEDTLS_ECP_DP_NONE. |
3087 | */ |
3088 | void mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf, |
3089 | const mbedtls_ecp_group_id *curves); |
3090 | #endif /* MBEDTLS_ECP_C */ |
3091 | |
3092 | #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) |
3093 | /** |
3094 | * \brief Set the allowed hashes for signatures during the handshake. |
3095 | * (Default: all SHA-2 hashes, largest first. Also SHA-1 if |
3096 | * the compile-time option |
3097 | * `MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE` is enabled.) |
3098 | * |
3099 | * \note This only affects which hashes are offered and can be used |
3100 | * for signatures during the handshake. Hashes for message |
3101 | * authentication and the TLS PRF are controlled by the |
3102 | * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes |
3103 | * used for certificate signature are controlled by the |
3104 | * verification profile, see \c mbedtls_ssl_conf_cert_profile(). |
3105 | * |
3106 | * \note This list should be ordered by decreasing preference |
3107 | * (preferred hash first). |
3108 | * |
3109 | * \param conf SSL configuration |
3110 | * \param hashes Ordered list of allowed signature hashes, |
3111 | * terminated by \c MBEDTLS_MD_NONE. |
3112 | */ |
3113 | void mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf, |
3114 | const int *hashes); |
3115 | #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ |
3116 | |
3117 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
3118 | /** |
3119 | * \brief Set or reset the hostname to check against the received |
3120 | * server certificate. It sets the ServerName TLS extension, |
3121 | * too, if that extension is enabled. (client-side only) |
3122 | * |
3123 | * \param ssl SSL context |
3124 | * \param hostname the server hostname, may be NULL to clear hostname |
3125 | |
3126 | * \note Maximum hostname length MBEDTLS_SSL_MAX_HOST_NAME_LEN. |
3127 | * |
3128 | * \return 0 if successful, MBEDTLS_ERR_SSL_ALLOC_FAILED on |
3129 | * allocation failure, MBEDTLS_ERR_SSL_BAD_INPUT_DATA on |
3130 | * too long input hostname. |
3131 | * |
3132 | * Hostname set to the one provided on success (cleared |
3133 | * when NULL). On allocation failure hostname is cleared. |
3134 | * On too long input failure, old hostname is unchanged. |
3135 | */ |
3136 | int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname); |
3137 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
3138 | |
3139 | #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) |
3140 | /** |
3141 | * \brief Set own certificate and key for the current handshake |
3142 | * |
3143 | * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within |
3144 | * the SNI callback. |
3145 | * |
3146 | * \param ssl SSL context |
3147 | * \param own_cert own public certificate chain |
3148 | * \param pk_key own private key |
3149 | * |
3150 | * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED |
3151 | */ |
3152 | int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl, |
3153 | mbedtls_x509_crt *own_cert, |
3154 | mbedtls_pk_context *pk_key); |
3155 | |
3156 | /** |
3157 | * \brief Set the data required to verify peer certificate for the |
3158 | * current handshake |
3159 | * |
3160 | * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within |
3161 | * the SNI callback. |
3162 | * |
3163 | * \param ssl SSL context |
3164 | * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) |
3165 | * \param ca_crl trusted CA CRLs |
3166 | */ |
3167 | void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl, |
3168 | mbedtls_x509_crt *ca_chain, |
3169 | mbedtls_x509_crl *ca_crl); |
3170 | |
3171 | /** |
3172 | * \brief Set authmode for the current handshake. |
3173 | * |
3174 | * \note Same as \c mbedtls_ssl_conf_authmode() but for use within |
3175 | * the SNI callback. |
3176 | * |
3177 | * \param ssl SSL context |
3178 | * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or |
3179 | * MBEDTLS_SSL_VERIFY_REQUIRED |
3180 | */ |
3181 | void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl, |
3182 | int authmode); |
3183 | |
3184 | /** |
3185 | * \brief Set server side ServerName TLS extension callback |
3186 | * (optional, server-side only). |
3187 | * |
3188 | * If set, the ServerName callback is called whenever the |
3189 | * server receives a ServerName TLS extension from the client |
3190 | * during a handshake. The ServerName callback has the |
3191 | * following parameters: (void *parameter, mbedtls_ssl_context *ssl, |
3192 | * const unsigned char *hostname, size_t len). If a suitable |
3193 | * certificate is found, the callback must set the |
3194 | * certificate(s) and key(s) to use with \c |
3195 | * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), |
3196 | * and may optionally adjust the CA and associated CRL with \c |
3197 | * mbedtls_ssl_set_hs_ca_chain() as well as the client |
3198 | * authentication mode with \c mbedtls_ssl_set_hs_authmode(), |
3199 | * then must return 0. If no matching name is found, the |
3200 | * callback must either set a default cert, or |
3201 | * return non-zero to abort the handshake at this point. |
3202 | * |
3203 | * \param conf SSL configuration |
3204 | * \param f_sni verification function |
3205 | * \param p_sni verification parameter |
3206 | */ |
3207 | void mbedtls_ssl_conf_sni(mbedtls_ssl_config *conf, |
3208 | int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, |
3209 | size_t), |
3210 | void *p_sni); |
3211 | #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ |
3212 | |
3213 | #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) |
3214 | /** |
3215 | * \brief Set the EC J-PAKE password for current handshake. |
3216 | * |
3217 | * \note An internal copy is made, and destroyed as soon as the |
3218 | * handshake is completed, or when the SSL context is reset or |
3219 | * freed. |
3220 | * |
3221 | * \note The SSL context needs to be already set up. The right place |
3222 | * to call this function is between \c mbedtls_ssl_setup() or |
3223 | * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). |
3224 | * |
3225 | * \param ssl SSL context |
3226 | * \param pw EC J-PAKE password (pre-shared secret) |
3227 | * \param pw_len length of pw in bytes |
3228 | * |
3229 | * \return 0 on success, or a negative error code. |
3230 | */ |
3231 | int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl, |
3232 | const unsigned char *pw, |
3233 | size_t pw_len); |
3234 | #endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ |
3235 | |
3236 | #if defined(MBEDTLS_SSL_ALPN) |
3237 | /** |
3238 | * \brief Set the supported Application Layer Protocols. |
3239 | * |
3240 | * \param conf SSL configuration |
3241 | * \param protos Pointer to a NULL-terminated list of supported protocols, |
3242 | * in decreasing preference order. The pointer to the list is |
3243 | * recorded by the library for later reference as required, so |
3244 | * the lifetime of the table must be at least as long as the |
3245 | * lifetime of the SSL configuration structure. |
3246 | * |
3247 | * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. |
3248 | */ |
3249 | int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos); |
3250 | |
3251 | /** |
3252 | * \brief Get the name of the negotiated Application Layer Protocol. |
3253 | * This function should be called after the handshake is |
3254 | * completed. |
3255 | * |
3256 | * \param ssl SSL context |
3257 | * |
3258 | * \return Protocol name, or NULL if no protocol was negotiated. |
3259 | */ |
3260 | const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl); |
3261 | #endif /* MBEDTLS_SSL_ALPN */ |
3262 | |
3263 | #if defined(MBEDTLS_SSL_DTLS_SRTP) |
3264 | #if defined(MBEDTLS_DEBUG_C) |
3265 | static inline const char *mbedtls_ssl_get_srtp_profile_as_string(mbedtls_ssl_srtp_profile profile) |
3266 | { |
3267 | switch (profile) { |
3268 | case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80: |
3269 | return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80" ; |
3270 | case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32: |
3271 | return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32" ; |
3272 | case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80: |
3273 | return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80" ; |
3274 | case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32: |
3275 | return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32" ; |
3276 | default: break; |
3277 | } |
3278 | return "" ; |
3279 | } |
3280 | #endif /* MBEDTLS_DEBUG_C */ |
3281 | /** |
3282 | * \brief Manage support for mki(master key id) value |
3283 | * in use_srtp extension. |
3284 | * MKI is an optional part of SRTP used for key management |
3285 | * and re-keying. See RFC3711 section 3.1 for details. |
3286 | * The default value is |
3287 | * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED. |
3288 | * |
3289 | * \param conf The SSL configuration to manage mki support. |
3290 | * \param support_mki_value Enable or disable mki usage. Values are |
3291 | * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED |
3292 | * or #MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED. |
3293 | */ |
3294 | void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf, |
3295 | int support_mki_value); |
3296 | |
3297 | /** |
3298 | * \brief Set the supported DTLS-SRTP protection profiles. |
3299 | * |
3300 | * \param conf SSL configuration |
3301 | * \param profiles Pointer to a List of MBEDTLS_TLS_SRTP_UNSET terminated |
3302 | * supported protection profiles |
3303 | * in decreasing preference order. |
3304 | * The pointer to the list is recorded by the library |
3305 | * for later reference as required, so the lifetime |
3306 | * of the table must be at least as long as the lifetime |
3307 | * of the SSL configuration structure. |
3308 | * The list must not hold more than |
3309 | * MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH elements |
3310 | * (excluding the terminating MBEDTLS_TLS_SRTP_UNSET). |
3311 | * |
3312 | * \return 0 on success |
3313 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA when the list of |
3314 | * protection profiles is incorrect. |
3315 | */ |
3316 | int mbedtls_ssl_conf_dtls_srtp_protection_profiles |
3317 | (mbedtls_ssl_config *conf, |
3318 | const mbedtls_ssl_srtp_profile *profiles); |
3319 | |
3320 | /** |
3321 | * \brief Set the mki_value for the current DTLS-SRTP session. |
3322 | * |
3323 | * \param ssl SSL context to use. |
3324 | * \param mki_value The MKI value to set. |
3325 | * \param mki_len The length of the MKI value. |
3326 | * |
3327 | * \note This function is relevant on client side only. |
3328 | * The server discovers the mki value during handshake. |
3329 | * A mki value set on server side using this function |
3330 | * is ignored. |
3331 | * |
3332 | * \return 0 on success |
3333 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA |
3334 | * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE |
3335 | */ |
3336 | int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl, |
3337 | unsigned char *mki_value, |
3338 | uint16_t mki_len); |
3339 | /** |
3340 | * \brief Get the negotiated DTLS-SRTP information: |
3341 | * Protection profile and MKI value. |
3342 | * |
3343 | * \warning This function must be called after the handshake is |
3344 | * completed. The value returned by this function must |
3345 | * not be trusted or acted upon before the handshake completes. |
3346 | * |
3347 | * \param ssl The SSL context to query. |
3348 | * \param dtls_srtp_info The negotiated DTLS-SRTP information: |
3349 | * - Protection profile in use. |
3350 | * A direct mapping of the iana defined value for protection |
3351 | * profile on an uint16_t. |
3352 | http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml |
3353 | * #MBEDTLS_TLS_SRTP_UNSET if the use of SRTP was not negotiated |
3354 | * or peer's Hello packet was not parsed yet. |
3355 | * - mki size and value( if size is > 0 ). |
3356 | */ |
3357 | void mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context *ssl, |
3358 | mbedtls_dtls_srtp_info *dtls_srtp_info); |
3359 | #endif /* MBEDTLS_SSL_DTLS_SRTP */ |
3360 | |
3361 | /** |
3362 | * \brief Set the maximum supported version sent from the client side |
3363 | * and/or accepted at the server side |
3364 | * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) |
3365 | * |
3366 | * \note This ignores ciphersuites from higher versions. |
3367 | * |
3368 | * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and |
3369 | * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 |
3370 | * |
3371 | * \param conf SSL configuration |
3372 | * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) |
3373 | * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, |
3374 | * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, |
3375 | * MBEDTLS_SSL_MINOR_VERSION_3 supported) |
3376 | */ |
3377 | void mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf, int major, int minor); |
3378 | |
3379 | /** |
3380 | * \brief Set the minimum accepted SSL/TLS protocol version |
3381 | * (Default: TLS 1.0) |
3382 | * |
3383 | * \note Input outside of the SSL_MAX_XXXXX_VERSION and |
3384 | * SSL_MIN_XXXXX_VERSION range is ignored. |
3385 | * |
3386 | * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. |
3387 | * |
3388 | * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and |
3389 | * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 |
3390 | * |
3391 | * \param conf SSL configuration |
3392 | * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) |
3393 | * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, |
3394 | * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, |
3395 | * MBEDTLS_SSL_MINOR_VERSION_3 supported) |
3396 | */ |
3397 | void mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf, int major, int minor); |
3398 | |
3399 | #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) |
3400 | /** |
3401 | * \brief Set the fallback flag (client-side only). |
3402 | * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). |
3403 | * |
3404 | * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback |
3405 | * connection, that is a connection with max_version set to a |
3406 | * lower value than the value you're willing to use. Such |
3407 | * fallback connections are not recommended but are sometimes |
3408 | * necessary to interoperate with buggy (version-intolerant) |
3409 | * servers. |
3410 | * |
3411 | * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for |
3412 | * non-fallback connections! This would appear to work for a |
3413 | * while, then cause failures when the server is upgraded to |
3414 | * support a newer TLS version. |
3415 | * |
3416 | * \param conf SSL configuration |
3417 | * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK |
3418 | */ |
3419 | void mbedtls_ssl_conf_fallback(mbedtls_ssl_config *conf, char fallback); |
3420 | #endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ |
3421 | |
3422 | #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) |
3423 | /** |
3424 | * \brief Enable or disable Encrypt-then-MAC |
3425 | * (Default: MBEDTLS_SSL_ETM_ENABLED) |
3426 | * |
3427 | * \note This should always be enabled, it is a security |
3428 | * improvement, and should not cause any interoperability |
3429 | * issue (used only if the peer supports it too). |
3430 | * |
3431 | * \param conf SSL configuration |
3432 | * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED |
3433 | */ |
3434 | void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm); |
3435 | #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ |
3436 | |
3437 | #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) |
3438 | /** |
3439 | * \brief Enable or disable Extended Master Secret negotiation. |
3440 | * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) |
3441 | * |
3442 | * \note This should always be enabled, it is a security fix to the |
3443 | * protocol, and should not cause any interoperability issue |
3444 | * (used only if the peer supports it too). |
3445 | * |
3446 | * \param conf SSL configuration |
3447 | * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED |
3448 | */ |
3449 | void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems); |
3450 | #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ |
3451 | |
3452 | #if defined(MBEDTLS_ARC4_C) |
3453 | /** |
3454 | * \brief Disable or enable support for RC4 |
3455 | * (Default: MBEDTLS_SSL_ARC4_DISABLED) |
3456 | * |
3457 | * \warning Use of RC4 in DTLS/TLS has been prohibited by RFC 7465 |
3458 | * for security reasons. Use at your own risk. |
3459 | * |
3460 | * \note This function is deprecated and will be removed in |
3461 | * a future version of the library. |
3462 | * RC4 is disabled by default at compile time and needs to be |
3463 | * actively enabled for use with legacy systems. |
3464 | * |
3465 | * \param conf SSL configuration |
3466 | * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED |
3467 | */ |
3468 | void mbedtls_ssl_conf_arc4_support(mbedtls_ssl_config *conf, char arc4); |
3469 | #endif /* MBEDTLS_ARC4_C */ |
3470 | |
3471 | #if defined(MBEDTLS_SSL_SRV_C) |
3472 | /** |
3473 | * \brief Whether to send a list of acceptable CAs in |
3474 | * CertificateRequest messages. |
3475 | * (Default: do send) |
3476 | * |
3477 | * \param conf SSL configuration |
3478 | * \param cert_req_ca_list MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or |
3479 | * MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED |
3480 | */ |
3481 | void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf, |
3482 | char cert_req_ca_list); |
3483 | #endif /* MBEDTLS_SSL_SRV_C */ |
3484 | |
3485 | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
3486 | /** |
3487 | * \brief Set the maximum fragment length to emit and/or negotiate. |
3488 | * (Typical: the smaller of #MBEDTLS_SSL_IN_CONTENT_LEN and |
3489 | * #MBEDTLS_SSL_OUT_CONTENT_LEN, usually `2^14` bytes) |
3490 | * (Server: set maximum fragment length to emit, |
3491 | * usually negotiated by the client during handshake) |
3492 | * (Client: set maximum fragment length to emit *and* |
3493 | * negotiate with the server during handshake) |
3494 | * (Default: #MBEDTLS_SSL_MAX_FRAG_LEN_NONE) |
3495 | * |
3496 | * \note On the client side, the maximum fragment length extension |
3497 | * *will not* be used, unless the maximum fragment length has |
3498 | * been set via this function to a value different than |
3499 | * #MBEDTLS_SSL_MAX_FRAG_LEN_NONE. |
3500 | * |
3501 | * \note With TLS, this currently only affects ApplicationData (sent |
3502 | * with \c mbedtls_ssl_read()), not handshake messages. |
3503 | * With DTLS, this affects both ApplicationData and handshake. |
3504 | * |
3505 | * \note This sets the maximum length for a record's payload, |
3506 | * excluding record overhead that will be added to it, see |
3507 | * \c mbedtls_ssl_get_record_expansion(). |
3508 | * |
3509 | * \note For DTLS, it is also possible to set a limit for the total |
3510 | * size of datagrams passed to the transport layer, including |
3511 | * record overhead, see \c mbedtls_ssl_set_mtu(). |
3512 | * |
3513 | * \param conf SSL configuration |
3514 | * \param mfl_code Code for maximum fragment length (allowed values: |
3515 | * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, |
3516 | * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) |
3517 | * |
3518 | * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA |
3519 | */ |
3520 | int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf, unsigned char mfl_code); |
3521 | #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ |
3522 | |
3523 | #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) |
3524 | /** |
3525 | * \brief Activate negotiation of truncated HMAC |
3526 | * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) |
3527 | * |
3528 | * \param conf SSL configuration |
3529 | * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or |
3530 | * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) |
3531 | */ |
3532 | void mbedtls_ssl_conf_truncated_hmac(mbedtls_ssl_config *conf, int truncate); |
3533 | #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ |
3534 | |
3535 | #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) |
3536 | /** |
3537 | * \brief Enable / Disable 1/n-1 record splitting |
3538 | * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) |
3539 | * |
3540 | * \note Only affects SSLv3 and TLS 1.0, not higher versions. |
3541 | * Does not affect non-CBC ciphersuites in any version. |
3542 | * |
3543 | * \param conf SSL configuration |
3544 | * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or |
3545 | * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED |
3546 | */ |
3547 | void mbedtls_ssl_conf_cbc_record_splitting(mbedtls_ssl_config *conf, char split); |
3548 | #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ |
3549 | |
3550 | #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) |
3551 | /** |
3552 | * \brief Enable / Disable session tickets (client only). |
3553 | * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) |
3554 | * |
3555 | * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). |
3556 | * |
3557 | * \param conf SSL configuration |
3558 | * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or |
3559 | * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) |
3560 | */ |
3561 | void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets); |
3562 | #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ |
3563 | |
3564 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
3565 | /** |
3566 | * \brief Enable / Disable renegotiation support for connection when |
3567 | * initiated by peer |
3568 | * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) |
3569 | * |
3570 | * \warning It is recommended to always disable renegotiation unless you |
3571 | * know you need it and you know what you're doing. In the |
3572 | * past, there have been several issues associated with |
3573 | * renegotiation or a poor understanding of its properties. |
3574 | * |
3575 | * \note Server-side, enabling renegotiation also makes the server |
3576 | * susceptible to a resource DoS by a malicious client. |
3577 | * |
3578 | * \param conf SSL configuration |
3579 | * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or |
3580 | * MBEDTLS_SSL_RENEGOTIATION_DISABLED) |
3581 | */ |
3582 | void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation); |
3583 | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
3584 | |
3585 | /** |
3586 | * \brief Prevent or allow legacy renegotiation. |
3587 | * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) |
3588 | * |
3589 | * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to |
3590 | * be established even if the peer does not support |
3591 | * secure renegotiation, but does not allow renegotiation |
3592 | * to take place if not secure. |
3593 | * (Interoperable and secure option) |
3594 | * |
3595 | * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations |
3596 | * with non-upgraded peers. Allowing legacy renegotiation |
3597 | * makes the connection vulnerable to specific man in the |
3598 | * middle attacks. (See RFC 5746) |
3599 | * (Most interoperable and least secure option) |
3600 | * |
3601 | * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections |
3602 | * if peer does not support secure renegotiation. Results |
3603 | * in interoperability issues with non-upgraded peers |
3604 | * that do not support renegotiation altogether. |
3605 | * (Most secure option, interoperability issues) |
3606 | * |
3607 | * \param conf SSL configuration |
3608 | * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, |
3609 | * SSL_ALLOW_LEGACY_RENEGOTIATION or |
3610 | * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) |
3611 | */ |
3612 | void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf, int allow_legacy); |
3613 | |
3614 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
3615 | /** |
3616 | * \brief Enforce renegotiation requests. |
3617 | * (Default: enforced, max_records = 16) |
3618 | * |
3619 | * When we request a renegotiation, the peer can comply or |
3620 | * ignore the request. This function allows us to decide |
3621 | * whether to enforce our renegotiation requests by closing |
3622 | * the connection if the peer doesn't comply. |
3623 | * |
3624 | * However, records could already be in transit from the peer |
3625 | * when the request is emitted. In order to increase |
3626 | * reliability, we can accept a number of records before the |
3627 | * expected handshake records. |
3628 | * |
3629 | * The optimal value is highly dependent on the specific usage |
3630 | * scenario. |
3631 | * |
3632 | * \note With DTLS and server-initiated renegotiation, the |
3633 | * HelloRequest is retransmitted every time mbedtls_ssl_read() times |
3634 | * out or receives Application Data, until: |
3635 | * - max_records records have beens seen, if it is >= 0, or |
3636 | * - the number of retransmits that would happen during an |
3637 | * actual handshake has been reached. |
3638 | * Please remember the request might be lost a few times |
3639 | * if you consider setting max_records to a really low value. |
3640 | * |
3641 | * \warning On client, the grace period can only happen during |
3642 | * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() |
3643 | * which always behave as if max_record was 0. The reason is, |
3644 | * if we receive application data from the server, we need a |
3645 | * place to write it, which only happens during mbedtls_ssl_read(). |
3646 | * |
3647 | * \param conf SSL configuration |
3648 | * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to |
3649 | * enforce renegotiation, or a non-negative value to enforce |
3650 | * it but allow for a grace period of max_records records. |
3651 | */ |
3652 | void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf, int max_records); |
3653 | |
3654 | /** |
3655 | * \brief Set record counter threshold for periodic renegotiation. |
3656 | * (Default: 2^48 - 1) |
3657 | * |
3658 | * Renegotiation is automatically triggered when a record |
3659 | * counter (outgoing or incoming) crosses the defined |
3660 | * threshold. The default value is meant to prevent the |
3661 | * connection from being closed when the counter is about to |
3662 | * reached its maximal value (it is not allowed to wrap). |
3663 | * |
3664 | * Lower values can be used to enforce policies such as "keys |
3665 | * must be refreshed every N packets with cipher X". |
3666 | * |
3667 | * The renegotiation period can be disabled by setting |
3668 | * conf->disable_renegotiation to |
3669 | * MBEDTLS_SSL_RENEGOTIATION_DISABLED. |
3670 | * |
3671 | * \note When the configured transport is |
3672 | * MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation |
3673 | * period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM, |
3674 | * the maximum renegotiation period is 2^64 - 1. |
3675 | * |
3676 | * \param conf SSL configuration |
3677 | * \param period The threshold value: a big-endian 64-bit number. |
3678 | */ |
3679 | void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf, |
3680 | const unsigned char period[8]); |
3681 | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
3682 | |
3683 | /** |
3684 | * \brief Check if there is data already read from the |
3685 | * underlying transport but not yet processed. |
3686 | * |
3687 | * \param ssl SSL context |
3688 | * |
3689 | * \return 0 if nothing's pending, 1 otherwise. |
3690 | * |
3691 | * \note This is different in purpose and behaviour from |
3692 | * \c mbedtls_ssl_get_bytes_avail in that it considers |
3693 | * any kind of unprocessed data, not only unread |
3694 | * application data. If \c mbedtls_ssl_get_bytes |
3695 | * returns a non-zero value, this function will |
3696 | * also signal pending data, but the converse does |
3697 | * not hold. For example, in DTLS there might be |
3698 | * further records waiting to be processed from |
3699 | * the current underlying transport's datagram. |
3700 | * |
3701 | * \note If this function returns 1 (data pending), this |
3702 | * does not imply that a subsequent call to |
3703 | * \c mbedtls_ssl_read will provide any data; |
3704 | * e.g., the unprocessed data might turn out |
3705 | * to be an alert or a handshake message. |
3706 | * |
3707 | * \note This function is useful in the following situation: |
3708 | * If the SSL/TLS module successfully returns from an |
3709 | * operation - e.g. a handshake or an application record |
3710 | * read - and you're awaiting incoming data next, you |
3711 | * must not immediately idle on the underlying transport |
3712 | * to have data ready, but you need to check the value |
3713 | * of this function first. The reason is that the desired |
3714 | * data might already be read but not yet processed. |
3715 | * If, in contrast, a previous call to the SSL/TLS module |
3716 | * returned MBEDTLS_ERR_SSL_WANT_READ, it is not necessary |
3717 | * to call this function, as the latter error code entails |
3718 | * that all internal data has been processed. |
3719 | * |
3720 | */ |
3721 | int mbedtls_ssl_check_pending(const mbedtls_ssl_context *ssl); |
3722 | |
3723 | /** |
3724 | * \brief Return the number of application data bytes |
3725 | * remaining to be read from the current record. |
3726 | * |
3727 | * \param ssl SSL context |
3728 | * |
3729 | * \return How many bytes are available in the application |
3730 | * data record read buffer. |
3731 | * |
3732 | * \note When working over a datagram transport, this is |
3733 | * useful to detect the current datagram's boundary |
3734 | * in case \c mbedtls_ssl_read has written the maximal |
3735 | * amount of data fitting into the input buffer. |
3736 | * |
3737 | */ |
3738 | size_t mbedtls_ssl_get_bytes_avail(const mbedtls_ssl_context *ssl); |
3739 | |
3740 | /** |
3741 | * \brief Return the result of the certificate verification |
3742 | * |
3743 | * \param ssl The SSL context to use. |
3744 | * |
3745 | * \return \c 0 if the certificate verification was successful. |
3746 | * \return \c -1u if the result is not available. This may happen |
3747 | * e.g. if the handshake aborts early, or a verification |
3748 | * callback returned a fatal error. |
3749 | * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX |
3750 | * and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h. |
3751 | */ |
3752 | uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl); |
3753 | |
3754 | /** |
3755 | * \brief Return the name of the current ciphersuite |
3756 | * |
3757 | * \param ssl SSL context |
3758 | * |
3759 | * \return a string containing the ciphersuite name |
3760 | */ |
3761 | const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl); |
3762 | |
3763 | /** |
3764 | * \brief Return the current SSL version (SSLv3/TLSv1/etc) |
3765 | * |
3766 | * \param ssl SSL context |
3767 | * |
3768 | * \return a string containing the SSL version |
3769 | */ |
3770 | const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl); |
3771 | |
3772 | /** |
3773 | * \brief Return the (maximum) number of bytes added by the record |
3774 | * layer: header + encryption/MAC overhead (inc. padding) |
3775 | * |
3776 | * \note This function is not available (always returns an error) |
3777 | * when record compression is enabled. |
3778 | * |
3779 | * \param ssl SSL context |
3780 | * |
3781 | * \return Current maximum record expansion in bytes, or |
3782 | * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is |
3783 | * enabled, which makes expansion much less predictable |
3784 | */ |
3785 | int mbedtls_ssl_get_record_expansion(const mbedtls_ssl_context *ssl); |
3786 | |
3787 | #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) |
3788 | /** |
3789 | * \brief Return the maximum fragment length (payload, in bytes) for |
3790 | * the output buffer. For the client, this is the configured |
3791 | * value. For the server, it is the minimum of two - the |
3792 | * configured value and the negotiated one. |
3793 | * |
3794 | * \sa mbedtls_ssl_conf_max_frag_len() |
3795 | * \sa mbedtls_ssl_get_max_record_payload() |
3796 | * |
3797 | * \param ssl SSL context |
3798 | * |
3799 | * \return Current maximum fragment length for the output buffer. |
3800 | */ |
3801 | size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl); |
3802 | |
3803 | /** |
3804 | * \brief Return the maximum fragment length (payload, in bytes) for |
3805 | * the input buffer. This is the negotiated maximum fragment |
3806 | * length, or, if there is none, MBEDTLS_SSL_MAX_CONTENT_LEN. |
3807 | * If it is not defined either, the value is 2^14. This function |
3808 | * works as its predecessor, \c mbedtls_ssl_get_max_frag_len(). |
3809 | * |
3810 | * \sa mbedtls_ssl_conf_max_frag_len() |
3811 | * \sa mbedtls_ssl_get_max_record_payload() |
3812 | * |
3813 | * \param ssl SSL context |
3814 | * |
3815 | * \return Current maximum fragment length for the output buffer. |
3816 | */ |
3817 | size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl); |
3818 | |
3819 | #if !defined(MBEDTLS_DEPRECATED_REMOVED) |
3820 | |
3821 | #if defined(MBEDTLS_DEPRECATED_WARNING) |
3822 | #define MBEDTLS_DEPRECATED __attribute__((deprecated)) |
3823 | #else |
3824 | #define MBEDTLS_DEPRECATED |
3825 | #endif |
3826 | |
3827 | /** |
3828 | * \brief This function is a deprecated approach to getting the max |
3829 | * fragment length. Its an alias for |
3830 | * \c mbedtls_ssl_get_output_max_frag_len(), as the behaviour |
3831 | * is the same. See \c mbedtls_ssl_get_output_max_frag_len() for |
3832 | * more detail. |
3833 | * |
3834 | * \sa mbedtls_ssl_get_input_max_frag_len() |
3835 | * \sa mbedtls_ssl_get_output_max_frag_len() |
3836 | * |
3837 | * \param ssl SSL context |
3838 | * |
3839 | * \return Current maximum fragment length for the output buffer. |
3840 | */ |
3841 | MBEDTLS_DEPRECATED size_t mbedtls_ssl_get_max_frag_len( |
3842 | const mbedtls_ssl_context *ssl); |
3843 | #endif /* MBEDTLS_DEPRECATED_REMOVED */ |
3844 | #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ |
3845 | |
3846 | /** |
3847 | * \brief Return the current maximum outgoing record payload in bytes. |
3848 | * This takes into account the config.h setting \c |
3849 | * MBEDTLS_SSL_OUT_CONTENT_LEN, the configured and negotiated |
3850 | * max fragment length extension if used, and for DTLS the |
3851 | * path MTU as configured and current record expansion. |
3852 | * |
3853 | * \note With DTLS, \c mbedtls_ssl_write() will return an error if |
3854 | * called with a larger length value. |
3855 | * With TLS, \c mbedtls_ssl_write() will fragment the input if |
3856 | * necessary and return the number of bytes written; it is up |
3857 | * to the caller to call \c mbedtls_ssl_write() again in |
3858 | * order to send the remaining bytes if any. |
3859 | * |
3860 | * \note This function is not available (always returns an error) |
3861 | * when record compression is enabled. |
3862 | * |
3863 | * \sa mbedtls_ssl_set_mtu() |
3864 | * \sa mbedtls_ssl_get_output_max_frag_len() |
3865 | * \sa mbedtls_ssl_get_input_max_frag_len() |
3866 | * \sa mbedtls_ssl_get_record_expansion() |
3867 | * |
3868 | * \param ssl SSL context |
3869 | * |
3870 | * \return Current maximum payload for an outgoing record, |
3871 | * or a negative error code. |
3872 | */ |
3873 | int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl); |
3874 | |
3875 | #if defined(MBEDTLS_X509_CRT_PARSE_C) |
3876 | /** |
3877 | * \brief Return the peer certificate from the current connection. |
3878 | * |
3879 | * \param ssl The SSL context to use. This must be initialized and setup. |
3880 | * |
3881 | * \return The current peer certificate, if available. |
3882 | * The returned certificate is owned by the SSL context and |
3883 | * is valid only until the next call to the SSL API. |
3884 | * \return \c NULL if no peer certificate is available. This might |
3885 | * be because the chosen ciphersuite doesn't use CRTs |
3886 | * (PSK-based ciphersuites, for example), or because |
3887 | * #MBEDTLS_SSL_KEEP_PEER_CERTIFICATE has been disabled, |
3888 | * allowing the stack to free the peer's CRT to save memory. |
3889 | * |
3890 | * \note For one-time inspection of the peer's certificate during |
3891 | * the handshake, consider registering an X.509 CRT verification |
3892 | * callback through mbedtls_ssl_conf_verify() instead of calling |
3893 | * this function. Using mbedtls_ssl_conf_verify() also comes at |
3894 | * the benefit of allowing you to influence the verification |
3895 | * process, for example by masking expected and tolerated |
3896 | * verification failures. |
3897 | * |
3898 | * \warning You must not use the pointer returned by this function |
3899 | * after any further call to the SSL API, including |
3900 | * mbedtls_ssl_read() and mbedtls_ssl_write(); this is |
3901 | * because the pointer might change during renegotiation, |
3902 | * which happens transparently to the user. |
3903 | * If you want to use the certificate across API calls, |
3904 | * you must make a copy. |
3905 | */ |
3906 | const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl); |
3907 | #endif /* MBEDTLS_X509_CRT_PARSE_C */ |
3908 | |
3909 | #if defined(MBEDTLS_SSL_CLI_C) |
3910 | /** |
3911 | * \brief Save session in order to resume it later (client-side only) |
3912 | * Session data is copied to presented session structure. |
3913 | * |
3914 | * |
3915 | * \param ssl SSL context |
3916 | * \param session session context |
3917 | * |
3918 | * \return 0 if successful, |
3919 | * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, |
3920 | * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or |
3921 | * arguments are otherwise invalid. |
3922 | * |
3923 | * \note Only the server certificate is copied, and not the full chain, |
3924 | * so you should not attempt to validate the certificate again |
3925 | * by calling \c mbedtls_x509_crt_verify() on it. |
3926 | * Instead, you should use the results from the verification |
3927 | * in the original handshake by calling \c mbedtls_ssl_get_verify_result() |
3928 | * after loading the session again into a new SSL context |
3929 | * using \c mbedtls_ssl_set_session(). |
3930 | * |
3931 | * \note Once the session object is not needed anymore, you should |
3932 | * free it by calling \c mbedtls_ssl_session_free(). |
3933 | * |
3934 | * \sa mbedtls_ssl_set_session() |
3935 | */ |
3936 | int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session); |
3937 | #endif /* MBEDTLS_SSL_CLI_C */ |
3938 | |
3939 | /** |
3940 | * \brief Perform the SSL handshake |
3941 | * |
3942 | * \param ssl SSL context |
3943 | * |
3944 | * \return \c 0 if successful. |
3945 | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
3946 | * if the handshake is incomplete and waiting for data to |
3947 | * be available for reading from or writing to the underlying |
3948 | * transport - in this case you must call this function again |
3949 | * when the underlying transport is ready for the operation. |
3950 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
3951 | * operation is in progress (see |
3952 | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
3953 | * must call this function again when the operation is ready. |
3954 | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
3955 | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
3956 | * in this case you must call this function again to complete |
3957 | * the handshake when you're done attending other tasks. |
3958 | * \return #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED if DTLS is in use |
3959 | * and the client did not demonstrate reachability yet - in |
3960 | * this case you must stop using the context (see below). |
3961 | * \return Another SSL error code - in this case you must stop using |
3962 | * the context (see below). |
3963 | * |
3964 | * \warning If this function returns something other than |
3965 | * \c 0, |
3966 | * #MBEDTLS_ERR_SSL_WANT_READ, |
3967 | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
3968 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
3969 | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, |
3970 | * you must stop using the SSL context for reading or writing, |
3971 | * and either free it or call \c mbedtls_ssl_session_reset() |
3972 | * on it before re-using it for a new connection; the current |
3973 | * connection must be closed. |
3974 | * |
3975 | * \note If DTLS is in use, then you may choose to handle |
3976 | * #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging |
3977 | * purposes, as it is an expected return value rather than an |
3978 | * actual error, but you still need to reset/free the context. |
3979 | * |
3980 | * \note Remarks regarding event-driven DTLS: |
3981 | * If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram |
3982 | * from the underlying transport layer is currently being processed, |
3983 | * and it is safe to idle until the timer or the underlying transport |
3984 | * signal a new event. This is not true for a successful handshake, |
3985 | * in which case the datagram of the underlying transport that is |
3986 | * currently being processed might or might not contain further |
3987 | * DTLS records. |
3988 | * |
3989 | * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto |
3990 | * subsystem must have been initialized by calling |
3991 | * psa_crypto_init() before calling this function. |
3992 | */ |
3993 | int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl); |
3994 | |
3995 | /** |
3996 | * \brief Perform a single step of the SSL handshake |
3997 | * |
3998 | * \note The state of the context (ssl->state) will be at |
3999 | * the next state after this function returns \c 0. Do not |
4000 | * call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. |
4001 | * |
4002 | * \param ssl SSL context |
4003 | * |
4004 | * \return See mbedtls_ssl_handshake(). |
4005 | * |
4006 | * \warning If this function returns something other than \c 0, |
4007 | * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, |
4008 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
4009 | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using |
4010 | * the SSL context for reading or writing, and either free it |
4011 | * or call \c mbedtls_ssl_session_reset() on it before |
4012 | * re-using it for a new connection; the current connection |
4013 | * must be closed. |
4014 | */ |
4015 | int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl); |
4016 | |
4017 | #if defined(MBEDTLS_SSL_RENEGOTIATION) |
4018 | /** |
4019 | * \brief Initiate an SSL renegotiation on the running connection. |
4020 | * Client: perform the renegotiation right now. |
4021 | * Server: request renegotiation, which will be performed |
4022 | * during the next call to mbedtls_ssl_read() if honored by |
4023 | * client. |
4024 | * |
4025 | * \param ssl SSL context |
4026 | * |
4027 | * \return 0 if successful, or any mbedtls_ssl_handshake() return |
4028 | * value except #MBEDTLS_ERR_SSL_CLIENT_RECONNECT that can't |
4029 | * happen during a renegotiation. |
4030 | * |
4031 | * \warning If this function returns something other than \c 0, |
4032 | * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, |
4033 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
4034 | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using |
4035 | * the SSL context for reading or writing, and either free it |
4036 | * or call \c mbedtls_ssl_session_reset() on it before |
4037 | * re-using it for a new connection; the current connection |
4038 | * must be closed. |
4039 | * |
4040 | */ |
4041 | int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl); |
4042 | #endif /* MBEDTLS_SSL_RENEGOTIATION */ |
4043 | |
4044 | /** |
4045 | * \brief Read at most 'len' application data bytes |
4046 | * |
4047 | * \param ssl SSL context |
4048 | * \param buf buffer that will hold the data |
4049 | * \param len maximum number of bytes to read |
4050 | * |
4051 | * \return The (positive) number of bytes read if successful. |
4052 | * \return \c 0 if the read end of the underlying transport was closed |
4053 | * without sending a CloseNotify beforehand, which might happen |
4054 | * because of various reasons (internal error of an underlying |
4055 | * stack, non-conformant peer not sending a CloseNotify and |
4056 | * such) - in this case you must stop using the context |
4057 | * (see below). |
4058 | * \return #MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY if the underlying |
4059 | * transport is still functional, but the peer has |
4060 | * acknowledged to not send anything anymore. |
4061 | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
4062 | * if the handshake is incomplete and waiting for data to |
4063 | * be available for reading from or writing to the underlying |
4064 | * transport - in this case you must call this function again |
4065 | * when the underlying transport is ready for the operation. |
4066 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
4067 | * operation is in progress (see |
4068 | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
4069 | * must call this function again when the operation is ready. |
4070 | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
4071 | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
4072 | * in this case you must call this function again to complete |
4073 | * the handshake when you're done attending other tasks. |
4074 | * \return #MBEDTLS_ERR_SSL_CLIENT_RECONNECT if we're at the server |
4075 | * side of a DTLS connection and the client is initiating a |
4076 | * new connection using the same source port. See below. |
4077 | * \return Another SSL error code - in this case you must stop using |
4078 | * the context (see below). |
4079 | * |
4080 | * \warning If this function returns something other than |
4081 | * a positive value, |
4082 | * #MBEDTLS_ERR_SSL_WANT_READ, |
4083 | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
4084 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, |
4085 | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or |
4086 | * #MBEDTLS_ERR_SSL_CLIENT_RECONNECT, |
4087 | * you must stop using the SSL context for reading or writing, |
4088 | * and either free it or call \c mbedtls_ssl_session_reset() |
4089 | * on it before re-using it for a new connection; the current |
4090 | * connection must be closed. |
4091 | * |
4092 | * \note When this function returns #MBEDTLS_ERR_SSL_CLIENT_RECONNECT |
4093 | * (which can only happen server-side), it means that a client |
4094 | * is initiating a new connection using the same source port. |
4095 | * You can either treat that as a connection close and wait |
4096 | * for the client to resend a ClientHello, or directly |
4097 | * continue with \c mbedtls_ssl_handshake() with the same |
4098 | * context (as it has been reset internally). Either way, you |
4099 | * must make sure this is seen by the application as a new |
4100 | * connection: application state, if any, should be reset, and |
4101 | * most importantly the identity of the client must be checked |
4102 | * again. WARNING: not validating the identity of the client |
4103 | * again, or not transmitting the new identity to the |
4104 | * application layer, would allow authentication bypass! |
4105 | * |
4106 | * \note Remarks regarding event-driven DTLS: |
4107 | * - If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram |
4108 | * from the underlying transport layer is currently being processed, |
4109 | * and it is safe to idle until the timer or the underlying transport |
4110 | * signal a new event. |
4111 | * - This function may return MBEDTLS_ERR_SSL_WANT_READ even if data was |
4112 | * initially available on the underlying transport, as this data may have |
4113 | * been only e.g. duplicated messages or a renegotiation request. |
4114 | * Therefore, you must be prepared to receive MBEDTLS_ERR_SSL_WANT_READ even |
4115 | * when reacting to an incoming-data event from the underlying transport. |
4116 | * - On success, the datagram of the underlying transport that is currently |
4117 | * being processed may contain further DTLS records. You should call |
4118 | * \c mbedtls_ssl_check_pending to check for remaining records. |
4119 | * |
4120 | */ |
4121 | int mbedtls_ssl_read(mbedtls_ssl_context *ssl, unsigned char *buf, size_t len); |
4122 | |
4123 | /** |
4124 | * \brief Try to write exactly 'len' application data bytes |
4125 | * |
4126 | * \warning This function will do partial writes in some cases. If the |
4127 | * return value is non-negative but less than length, the |
4128 | * function must be called again with updated arguments: |
4129 | * buf + ret, len - ret (if ret is the return value) until |
4130 | * it returns a value equal to the last 'len' argument. |
4131 | * |
4132 | * \param ssl SSL context |
4133 | * \param buf buffer holding the data |
4134 | * \param len how many bytes must be written |
4135 | * |
4136 | * \return The (non-negative) number of bytes actually written if |
4137 | * successful (may be less than \p len). |
4138 | * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE |
4139 | * if the handshake is incomplete and waiting for data to |
4140 | * be available for reading from or writing to the underlying |
4141 | * transport - in this case you must call this function again |
4142 | * when the underlying transport is ready for the operation. |
4143 | * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous |
4144 | * operation is in progress (see |
4145 | * mbedtls_ssl_conf_async_private_cb()) - in this case you |
4146 | * must call this function again when the operation is ready. |
4147 | * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic |
4148 | * operation is in progress (see mbedtls_ecp_set_max_ops()) - |
4149 | * in this case you must call this function again to complete |
4150 | * the handshake when you're done attending other tasks. |
4151 | * \return Another SSL error code - in this case you must stop using |
4152 | * the context (see below). |
4153 | * |
4154 | * \warning If this function returns something other than |
4155 | * a non-negative value, |
4156 | * #MBEDTLS_ERR_SSL_WANT_READ, |
4157 | * #MBEDTLS_ERR_SSL_WANT_WRITE, |
4158 | * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or |
4159 | * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, |
4160 | * you must stop using the SSL context for reading or writing, |
4161 | * and either free it or call \c mbedtls_ssl_session_reset() |
4162 | * on it before re-using it for a new connection; the current |
4163 | * connection must be closed. |
4164 | * |
4165 | * \note When this function returns #MBEDTLS_ERR_SSL_WANT_WRITE/READ, |
4166 | * it must be called later with the *same* arguments, |
4167 | * until it returns a value greater that or equal to 0. When |
4168 | * the function returns #MBEDTLS_ERR_SSL_WANT_WRITE there may be |
4169 | * some partial data in the output buffer, however this is not |
4170 | * yet sent. |
4171 | * |
4172 | * \note If the requested length is greater than the maximum |
4173 | * fragment length (either the built-in limit or the one set |
4174 | * or negotiated with the peer), then: |
4175 | * - with TLS, less bytes than requested are written. |
4176 | * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. |
4177 | * \c mbedtls_ssl_get_output_max_frag_len() may be used to |
4178 | * query the active maximum fragment length. |
4179 | * |
4180 | * \note Attempting to write 0 bytes will result in an empty TLS |
4181 | * application record being sent. |
4182 | */ |
4183 | int mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len); |
4184 | |
4185 | /** |
4186 | * \brief Send an alert message |
4187 | * |
4188 | * \param ssl SSL context |
4189 | * \param level The alert level of the message |
4190 | * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) |
4191 | * \param message The alert message (SSL_ALERT_MSG_*) |
4192 | * |
4193 | * \return 0 if successful, or a specific SSL error code. |
4194 | * |
4195 | * \note If this function returns something other than 0 or |
4196 | * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using |
4197 | * the SSL context for reading or writing, and either free it or |
4198 | * call \c mbedtls_ssl_session_reset() on it before re-using it |
4199 | * for a new connection; the current connection must be closed. |
4200 | */ |
4201 | int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, |
4202 | unsigned char level, |
4203 | unsigned char message); |
4204 | /** |
4205 | * \brief Notify the peer that the connection is being closed |
4206 | * |
4207 | * \param ssl SSL context |
4208 | * |
4209 | * \return 0 if successful, or a specific SSL error code. |
4210 | * |
4211 | * \note If this function returns something other than 0 or |
4212 | * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using |
4213 | * the SSL context for reading or writing, and either free it or |
4214 | * call \c mbedtls_ssl_session_reset() on it before re-using it |
4215 | * for a new connection; the current connection must be closed. |
4216 | */ |
4217 | int mbedtls_ssl_close_notify(mbedtls_ssl_context *ssl); |
4218 | |
4219 | /** |
4220 | * \brief Free referenced items in an SSL context and clear memory |
4221 | * |
4222 | * \param ssl SSL context |
4223 | */ |
4224 | void mbedtls_ssl_free(mbedtls_ssl_context *ssl); |
4225 | |
4226 | #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) |
4227 | /** |
4228 | * \brief Save an active connection as serialized data in a buffer. |
4229 | * This allows the freeing or re-using of the SSL context |
4230 | * while still picking up the connection later in a way that |
4231 | * it entirely transparent to the peer. |
4232 | * |
4233 | * \see mbedtls_ssl_context_load() |
4234 | * |
4235 | * \note This feature is currently only available under certain |
4236 | * conditions, see the documentation of the return value |
4237 | * #MBEDTLS_ERR_SSL_BAD_INPUT_DATA for details. |
4238 | * |
4239 | * \note When this function succeeds, it calls |
4240 | * mbedtls_ssl_session_reset() on \p ssl which as a result is |
4241 | * no longer associated with the connection that has been |
4242 | * serialized. This avoids creating copies of the connection |
4243 | * state. You're then free to either re-use the context |
4244 | * structure for a different connection, or call |
4245 | * mbedtls_ssl_free() on it. See the documentation of |
4246 | * mbedtls_ssl_session_reset() for more details. |
4247 | * |
4248 | * \param ssl The SSL context to save. On success, it is no longer |
4249 | * associated with the connection that has been serialized. |
4250 | * \param buf The buffer to write the serialized data to. It must be a |
4251 | * writeable buffer of at least \p buf_len bytes, or may be \c |
4252 | * NULL if \p buf_len is \c 0. |
4253 | * \param buf_len The number of bytes available for writing in \p buf. |
4254 | * \param olen The size in bytes of the data that has been or would have |
4255 | * been written. It must point to a valid \c size_t. |
4256 | * |
4257 | * \note \p olen is updated to the correct value regardless of |
4258 | * whether \p buf_len was large enough. This makes it possible |
4259 | * to determine the necessary size by calling this function |
4260 | * with \p buf set to \c NULL and \p buf_len to \c 0. However, |
4261 | * the value of \p olen is only guaranteed to be correct when |
4262 | * the function returns #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL or |
4263 | * \c 0. If the return value is different, then the value of |
4264 | * \p olen is undefined. |
4265 | * |
4266 | * \return \c 0 if successful. |
4267 | * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. |
4268 | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed |
4269 | * while resetting the context. |
4270 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if a handshake is in |
4271 | * progress, or there is pending data for reading or sending, |
4272 | * or the connection does not use DTLS 1.2 with an AEAD |
4273 | * ciphersuite, or renegotiation is enabled. |
4274 | */ |
4275 | int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl, |
4276 | unsigned char *buf, |
4277 | size_t buf_len, |
4278 | size_t *olen); |
4279 | |
4280 | /** |
4281 | * \brief Load serialized connection data to an SSL context. |
4282 | * |
4283 | * \see mbedtls_ssl_context_save() |
4284 | * |
4285 | * \warning The same serialized data must never be loaded into more |
4286 | * that one context. In order to ensure that, after |
4287 | * successfully loading serialized data to an SSL context, you |
4288 | * should immediately destroy or invalidate all copies of the |
4289 | * serialized data that was loaded. Loading the same data in |
4290 | * more than one context would cause severe security failures |
4291 | * including but not limited to loss of confidentiality. |
4292 | * |
4293 | * \note Before calling this function, the SSL context must be |
4294 | * prepared in one of the two following ways. The first way is |
4295 | * to take a context freshly initialised with |
4296 | * mbedtls_ssl_init() and call mbedtls_ssl_setup() on it with |
4297 | * the same ::mbedtls_ssl_config structure that was used in |
4298 | * the original connection. The second way is to |
4299 | * call mbedtls_ssl_session_reset() on a context that was |
4300 | * previously prepared as above but used in the meantime. |
4301 | * Either way, you must not use the context to perform a |
4302 | * handshake between calling mbedtls_ssl_setup() or |
4303 | * mbedtls_ssl_session_reset() and calling this function. You |
4304 | * may however call other setter functions in that time frame |
4305 | * as indicated in the note below. |
4306 | * |
4307 | * \note Before or after calling this function successfully, you |
4308 | * also need to configure some connection-specific callbacks |
4309 | * and settings before you can use the connection again |
4310 | * (unless they were already set before calling |
4311 | * mbedtls_ssl_session_reset() and the values are suitable for |
4312 | * the present connection). Specifically, you want to call |
4313 | * at least mbedtls_ssl_set_bio() and |
4314 | * mbedtls_ssl_set_timer_cb(). All other SSL setter functions |
4315 | * are not necessary to call, either because they're only used |
4316 | * in handshakes, or because the setting is already saved. You |
4317 | * might choose to call them anyway, for example in order to |
4318 | * share code between the cases of establishing a new |
4319 | * connection and the case of loading an already-established |
4320 | * connection. |
4321 | * |
4322 | * \note If you have new information about the path MTU, you want to |
4323 | * call mbedtls_ssl_set_mtu() after calling this function, as |
4324 | * otherwise this function would overwrite your |
4325 | * newly-configured value with the value that was active when |
4326 | * the context was saved. |
4327 | * |
4328 | * \note When this function returns an error code, it calls |
4329 | * mbedtls_ssl_free() on \p ssl. In this case, you need to |
4330 | * prepare the context with the usual sequence starting with a |
4331 | * call to mbedtls_ssl_init() if you want to use it again. |
4332 | * |
4333 | * \param ssl The SSL context structure to be populated. It must have |
4334 | * been prepared as described in the note above. |
4335 | * \param buf The buffer holding the serialized connection data. It must |
4336 | * be a readable buffer of at least \p len bytes. |
4337 | * \param len The size of the serialized data in bytes. |
4338 | * |
4339 | * \return \c 0 if successful. |
4340 | * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. |
4341 | * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data |
4342 | * comes from a different Mbed TLS version or build. |
4343 | * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. |
4344 | */ |
4345 | int mbedtls_ssl_context_load(mbedtls_ssl_context *ssl, |
4346 | const unsigned char *buf, |
4347 | size_t len); |
4348 | #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ |
4349 | |
4350 | /** |
4351 | * \brief Initialize an SSL configuration context |
4352 | * Just makes the context ready for |
4353 | * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). |
4354 | * |
4355 | * \note You need to call mbedtls_ssl_config_defaults() unless you |
4356 | * manually set all of the relevant fields yourself. |
4357 | * |
4358 | * \param conf SSL configuration context |
4359 | */ |
4360 | void mbedtls_ssl_config_init(mbedtls_ssl_config *conf); |
4361 | |
4362 | /** |
4363 | * \brief Load reasonable default SSL configuration values. |
4364 | * (You need to call mbedtls_ssl_config_init() first.) |
4365 | * |
4366 | * \param conf SSL configuration context |
4367 | * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER |
4368 | * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or |
4369 | * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS |
4370 | * \param preset a MBEDTLS_SSL_PRESET_XXX value |
4371 | * |
4372 | * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. |
4373 | * |
4374 | * \return 0 if successful, or |
4375 | * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. |
4376 | */ |
4377 | int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf, |
4378 | int endpoint, int transport, int preset); |
4379 | |
4380 | /** |
4381 | * \brief Free an SSL configuration context |
4382 | * |
4383 | * \param conf SSL configuration context |
4384 | */ |
4385 | void mbedtls_ssl_config_free(mbedtls_ssl_config *conf); |
4386 | |
4387 | /** |
4388 | * \brief Initialize SSL session structure |
4389 | * |
4390 | * \param session SSL session |
4391 | */ |
4392 | void mbedtls_ssl_session_init(mbedtls_ssl_session *session); |
4393 | |
4394 | /** |
4395 | * \brief Free referenced items in an SSL session including the |
4396 | * peer certificate and clear memory |
4397 | * |
4398 | * \note A session object can be freed even if the SSL context |
4399 | * that was used to retrieve the session is still in use. |
4400 | * |
4401 | * \param session SSL session |
4402 | */ |
4403 | void mbedtls_ssl_session_free(mbedtls_ssl_session *session); |
4404 | |
4405 | /** |
4406 | * \brief TLS-PRF function for key derivation. |
4407 | * |
4408 | * \param prf The tls_prf type function type to be used. |
4409 | * \param secret Secret for the key derivation function. |
4410 | * \param slen Length of the secret. |
4411 | * \param label String label for the key derivation function, |
4412 | * terminated with null character. |
4413 | * \param random Random bytes. |
4414 | * \param rlen Length of the random bytes buffer. |
4415 | * \param dstbuf The buffer holding the derived key. |
4416 | * \param dlen Length of the output buffer. |
4417 | * |
4418 | * \return 0 on success. An SSL specific error on failure. |
4419 | */ |
4420 | int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf, |
4421 | const unsigned char *secret, size_t slen, |
4422 | const char *label, |
4423 | const unsigned char *random, size_t rlen, |
4424 | unsigned char *dstbuf, size_t dlen); |
4425 | |
4426 | #ifdef __cplusplus |
4427 | } |
4428 | #endif |
4429 | |
4430 | #endif /* ssl.h */ |
4431 | |