blob: 80386c80d35bebe53f4baa8eae09947c3747ff85 [file] [log] [blame]
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08001/*
2 * TLS 1.3 client-side functions
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * This file is part of mbed TLS ( https://tls.mbed.org )
20 */
21
22#include "common.h"
23
24#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
25
26#if defined(MBEDTLS_SSL_CLI_C)
27
Jerry Yubc20bdd2021-08-24 15:59:48 +080028#include <string.h>
29
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080030#include "ssl_misc.h"
Jerry Yua13c7e72021-08-17 10:44:40 +080031#include <mbedtls/debug.h>
32
Jerry Yu08906d02021-08-31 11:05:27 +080033#define CLIENT_HELLO_RANDOM_LEN 32
34#define CLIENT_HELLO_LEGACY_VERSION_LEN 2
Jerry Yu65dd2cc2021-08-18 16:38:40 +080035
Jerry Yubc20bdd2021-08-24 15:59:48 +080036/* Write extensions */
37
Jerry Yu92c6b402021-08-27 16:59:09 +080038/*
39 * ssl_tls13_write_supported_versions_ext():
40 *
41 * struct {
42 * ProtocolVersion versions<2..254>;
43 * } SupportedVersions;
44 */
Jerry Yuf4436812021-08-26 22:59:56 +080045static int ssl_tls13_write_supported_versions_ext( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080046 unsigned char *buf,
47 unsigned char *end,
48 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +080049{
50 unsigned char *p = buf;
51
52 *olen = 0;
53
54 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported version extension" ) );
55
56 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 7 );
57
Jerry Yueecfbf02021-08-30 18:32:07 +080058 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +080059
60 /* total length */
61 MBEDTLS_PUT_UINT16_BE( 3, p, 2);
Jerry Yueecfbf02021-08-30 18:32:07 +080062 p += 4;
Jerry Yu92c6b402021-08-27 16:59:09 +080063
64 /* length of next field */
65 *p++ = 0x2;
66
67 /* This implementation only supports a single TLS version, and only
68 * advertises a single value.
69 */
Jerry Yueecfbf02021-08-30 18:32:07 +080070 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
71 ssl->conf->max_minor_ver,
72 ssl->conf->transport, p );
Jerry Yu92c6b402021-08-27 16:59:09 +080073
74 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [%d:%d]",
Jerry Yueecfbf02021-08-30 18:32:07 +080075 ssl->conf->max_major_ver,
76 ssl->conf->max_minor_ver ) );
Jerry Yu92c6b402021-08-27 16:59:09 +080077
78 *olen = 7;
79
80 return( 0 );
81}
Jerry Yubc20bdd2021-08-24 15:59:48 +080082
83#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
84
Jerry Yuf4436812021-08-26 22:59:56 +080085static int ssl_tls13_write_supported_groups_ext( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080086 unsigned char *buf,
87 unsigned char *end,
88 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +080089{
90 ((void) ssl);
91 ((void) buf);
92 ((void) end);
93 ((void) olen);
94 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
95}
Jerry Yubc20bdd2021-08-24 15:59:48 +080096
Jerry Yuf4436812021-08-26 22:59:56 +080097static int ssl_tls13_write_key_shares_ext( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080098 unsigned char *buf,
99 unsigned char *end,
100 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +0800101{
102 ((void) ssl);
103 ((void) buf);
104 ((void) end);
105 ((void) olen);
106 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
107}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800108
109#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
110
Jerry Yu92c6b402021-08-27 16:59:09 +0800111/* Functions for ClientHello */
112
Jerry Yu08906d02021-08-31 11:05:27 +0800113static int ssl_tls13_write_client_hello_body( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +0800114 unsigned char *buf,
115 size_t buflen,
116 size_t *len_with_binders )
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800117{
Jerry Yuc4d22442021-08-27 20:04:33 +0800118 /* Extensions */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800119
120 /* extension_start
121 * Used during extension writing where the
122 * buffer pointer to the beginning of the
123 * extension list must be kept to write
124 * the total extension list size in the end.
125 */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800126 int ret;
Jerry Yueecfbf02021-08-30 18:32:07 +0800127 unsigned char *extension_start;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800128 size_t cur_ext_len; /* Size of the current extension */
129 size_t total_ext_len; /* Size of list of extensions */
130
Jerry Yubc20bdd2021-08-24 15:59:48 +0800131 /* Buffer management */
Jerry Yueecfbf02021-08-30 18:32:07 +0800132 unsigned char *start = buf;
133 unsigned char *end = buf + buflen;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800134
135 /* Ciphersuite-related variables */
Jerry Yueecfbf02021-08-30 18:32:07 +0800136 const int *ciphersuites;
137 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yue885b762021-08-26 17:32:34 +0800138 /* ciphersuite_start points to the start of
139 the ciphersuite list, i.e. to the length field*/
Jerry Yueecfbf02021-08-30 18:32:07 +0800140 unsigned char *ciphersuite_start;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800141 size_t ciphersuite_count;
142
143 /* Keeping track of the included extensions */
144 ssl->handshake->extensions_present = MBEDTLS_SSL_EXT_NONE;
145
Jerry Yubc20bdd2021-08-24 15:59:48 +0800146 /* NOTE:
147 * Even for DTLS 1.3, we are writing a TLS handshake header here.
148 * The actual DTLS 1.3 handshake header is inserted in
149 * the record writing routine mbedtls_ssl_write_record().
150 *
151 * For cTLS the length, and the version field
152 * are elided. The random bytes are shorter.
153 */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800154
155 if( ssl->conf->max_major_ver == 0 )
156 {
157 MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
158 "consider using mbedtls_ssl_config_defaults()" ) );
159 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
160 }
161
162 ssl->major_ver = ssl->conf->min_major_ver;
163 ssl->minor_ver = ssl->conf->min_minor_ver;
164
165 /* For TLS 1.3 we use the legacy version number {0x03, 0x03}
166 * instead of the true version number.
167 *
168 * For DTLS 1.3 we use the legacy version number
169 * {254,253}.
170 *
171 * In cTLS the version number is elided.
172 */
Jerry Yu08906d02021-08-31 11:05:27 +0800173 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, CLIENT_HELLO_LEGACY_VERSION_LEN );
Jerry Yu2ac64192021-08-26 18:38:58 +0800174 MBEDTLS_PUT_UINT16_BE( 0x0303, buf, 0);
Jerry Yu08906d02021-08-31 11:05:27 +0800175 buf += CLIENT_HELLO_LEGACY_VERSION_LEN;
176 buflen -= CLIENT_HELLO_LEGACY_VERSION_LEN;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800177
178 /* Write random bytes */
Jerry Yu08906d02021-08-31 11:05:27 +0800179 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, CLIENT_HELLO_RANDOM_LEN );
180 memcpy( buf, ssl->handshake->randbytes, CLIENT_HELLO_RANDOM_LEN );
Jerry Yue885b762021-08-26 17:32:34 +0800181 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes",
Jerry Yu08906d02021-08-31 11:05:27 +0800182 buf, CLIENT_HELLO_RANDOM_LEN );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800183
Jerry Yu08906d02021-08-31 11:05:27 +0800184 buf += CLIENT_HELLO_RANDOM_LEN;
185 buflen -= CLIENT_HELLO_RANDOM_LEN;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800186
187 /* Versions of TLS before TLS 1.3 supported a
188 * "session resumption" feature which has been merged with pre-shared
189 * keys in this version. A client which has a
190 * cached session ID set by a pre-TLS 1.3 server SHOULD set this
191 * field to that value. In compatibility mode,
192 * this field MUST be non-empty, so a client not offering a
193 * pre-TLS 1.3 session MUST generate a new 32-byte value. This value
194 * need not be random but SHOULD be unpredictable to avoid
195 * implementations fixating on a specific value ( also known as
196 * ossification ). Otherwise, it MUST be set as a zero-length vector
197 * ( i.e., a zero-valued single byte length field ).
198 */
199 if( buflen < 1 )
200 {
201 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small to hold ClientHello" ) );
202 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
203 }
204
205 *buf++ = 0; /* session id length set to zero */
206 buflen -= 1;
207
208 /*
209 * Ciphersuite list
210 *
211 * This is a list of the symmetric cipher options supported by
212 * the client, specifically the record protection algorithm
213 * ( including secret key length ) and a hash to be used with
214 * HKDF, in descending order of client preference.
215 */
216 ciphersuites = ssl->conf->ciphersuite_list;
217
218 if( buflen < 2 /* for ciphersuite list length */ )
219 {
220 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small to hold ClientHello" ) );
221 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
222 }
223
224 /* Skip writing ciphersuite length for now */
225 ciphersuite_count = 0;
226 ciphersuite_start = buf;
227 buf += 2;
228 buflen -= 2;
229
Jerry Yue885b762021-08-26 17:32:34 +0800230 for ( size_t i = 0; ciphersuites[i] != 0; i++ )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800231 {
232 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
233
234 if( ciphersuite_info == NULL )
235 continue;
236
237 if( ciphersuite_info->min_minor_ver != MBEDTLS_SSL_MINOR_VERSION_4 ||
238 ciphersuite_info->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_4 )
239 continue;
240
241 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x, %s",
Jerry Yue885b762021-08-26 17:32:34 +0800242 (unsigned int) ciphersuites[i],
243 ciphersuite_info->name ) );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800244
245 ciphersuite_count++;
246
247 if( buflen < 2 /* for ciphersuite list length */ )
248 {
249 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small to hold ClientHello" ) );
250 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
251 }
252
Jerry Yu2ac64192021-08-26 18:38:58 +0800253 MBEDTLS_PUT_UINT16_BE( ciphersuites[i], buf, 0);
Jerry Yubc20bdd2021-08-24 15:59:48 +0800254
Jerry Yu2ac64192021-08-26 18:38:58 +0800255 buf += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800256 buflen -= 2;
257
258 }
259
260 /* write ciphersuite length now */
Jerry Yueecfbf02021-08-30 18:32:07 +0800261 MBEDTLS_PUT_UINT16_BE( ciphersuite_count*2, ciphersuite_start, 0 );
Jerry Yu2ac64192021-08-26 18:38:58 +0800262 ciphersuite_start += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800263
Jerry Yue885b762021-08-26 17:32:34 +0800264 MBEDTLS_SSL_DEBUG_MSG( 3,
265 ( "client hello, got %" MBEDTLS_PRINTF_SIZET " ciphersuites",
266 ciphersuite_count ) );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800267
268 /* For every TLS 1.3 ClientHello, this vector MUST contain exactly
269 * one byte set to zero, which corresponds to the 'null' compression
270 * method in prior versions of TLS.
271 *
272 * For cTLS this field is elided.
273 */
274 if( buflen < 2 /* for ciphersuite list length */ )
275 {
276 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small to hold ClientHello" ) );
277 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
278 }
279
280 *buf++ = 1;
281 *buf++ = MBEDTLS_SSL_COMPRESS_NULL;
282
283 buflen -= 2;
284
285 /* First write extensions, then the total length */
286 extension_start = buf;
287 total_ext_len = 0;
288 buf += 2;
289
290 /* Supported Versions Extension is mandatory with TLS 1.3.
291 *
292 * For cTLS we only need to provide it if there is more than one version
293 * and currently there is only one.
294 */
Jerry Yu92c6b402021-08-27 16:59:09 +0800295 ret = ssl_tls13_write_supported_versions_ext( ssl, buf, end, &cur_ext_len );
296 if( ret != 0 )
297 return( ret );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800298 total_ext_len += cur_ext_len;
299 buf += cur_ext_len;
300
301#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
302 /* The supported_groups and the key_share extensions are
303 * REQUIRED for ECDHE ciphersuites.
304 */
Jerry Yuf4436812021-08-26 22:59:56 +0800305 ret = ssl_tls13_write_supported_groups_ext( ssl, buf, end, &cur_ext_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800306 if( ret != 0 )
307 return( ret );
308
309 total_ext_len += cur_ext_len;
310 buf += cur_ext_len;
311
312 /* The supported_signature_algorithms extension is REQUIRED for
313 * certificate authenticated ciphersuites. */
Jerry Yue41dec02021-08-31 10:57:07 +0800314 ret = mbedtls_ssl_tls13_write_sig_alg_ext( ssl, buf, end, &cur_ext_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800315 if( ret != 0 )
316 return( ret );
317
318 total_ext_len += cur_ext_len;
319 buf += cur_ext_len;
320
321 /* We need to send the key shares under three conditions:
322 * 1 ) A certificate-based ciphersuite is being offered. In this case
323 * supported_groups and supported_signature extensions have been successfully added.
324 * 2 ) A PSK-based ciphersuite with ECDHE is offered. In this case the
325 * psk_key_exchange_modes has been added as the last extension.
326 * 3 ) Or, in case all ciphers are supported ( which includes #1 and #2 from above )
327 */
328
Jerry Yuf4436812021-08-26 22:59:56 +0800329 ret = ssl_tls13_write_key_shares_ext( ssl, buf, end, &cur_ext_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800330 if( ret != 0 )
331 return( ret );
332
333 total_ext_len += cur_ext_len;
334 buf += cur_ext_len;
335#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
336
337 /* Add more extensions here */
338
339 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %" MBEDTLS_PRINTF_SIZET ,
340 total_ext_len ) );
341
342 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", extension_start, total_ext_len );
343
344 /* Write extension length */
Jerry Yueecfbf02021-08-30 18:32:07 +0800345 MBEDTLS_PUT_UINT16_BE( total_ext_len, extension_start, 0 );
Jerry Yu2ac64192021-08-26 18:38:58 +0800346 extension_start += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800347
Jerry Yubc20bdd2021-08-24 15:59:48 +0800348 *len_with_binders = ( extension_start + total_ext_len ) - start;
349 return( 0 );
350}
351
Jerry Yu92c6b402021-08-27 16:59:09 +0800352static int ssl_tls13_finalize_client_hello( mbedtls_ssl_context* ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800353{
Jerry Yu92c6b402021-08-27 16:59:09 +0800354 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_HELLO );
355 return( 0 );
356}
Jerry Yuef6b36b2021-08-24 16:29:02 +0800357
Jerry Yu92c6b402021-08-27 16:59:09 +0800358static int ssl_tls13_prepare_client_hello( mbedtls_ssl_context *ssl )
359{
360 int ret;
Jerry Yuef6b36b2021-08-24 16:29:02 +0800361
Jerry Yu92c6b402021-08-27 16:59:09 +0800362 if( ssl->conf->f_rng == NULL )
363 {
364 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided" ) );
365 return( MBEDTLS_ERR_SSL_NO_RNG );
366 }
Jerry Yuef6b36b2021-08-24 16:29:02 +0800367
Jerry Yu92c6b402021-08-27 16:59:09 +0800368 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng,
369 ssl->handshake->randbytes,
Jerry Yu08906d02021-08-31 11:05:27 +0800370 CLIENT_HELLO_RANDOM_LEN ) ) != 0 )
Jerry Yu92c6b402021-08-27 16:59:09 +0800371 {
372 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
373 return( ret );
374 }
Jerry Yu6f13f642021-08-26 17:18:15 +0800375
376 return( 0 );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800377}
378
Jerry Yu92c6b402021-08-27 16:59:09 +0800379/*
380 * ClientHello Main entry point.
381 * orchestrates the other functions.
382 */
383static int ssl_tls13_write_client_hello( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800384{
Jerry Yu92c6b402021-08-27 16:59:09 +0800385 int ret = 0;
386 unsigned char *buf;
387 size_t buf_len, msg_len;
388
389 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
390
391 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_client_hello, ( ssl ) );
392
393 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg,
394 ( ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
395 &buf, &buf_len ) );
396
Jerry Yu08906d02021-08-31 11:05:27 +0800397 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_client_hello_body,
Jerry Yu92c6b402021-08-27 16:59:09 +0800398 ( ssl, buf, buf_len, &msg_len ) );
399
400 mbedtls_ssl_tls13_add_hs_hdr_to_checksum( ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
401 msg_len );
402 ssl->handshake->update_checksum( ssl, buf, 0 );
403
404 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_client_hello, ( ssl ) );
405 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg,
406 ( ssl, buf_len, msg_len ) );
407
408cleanup:
409
410 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
411 return ret;
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800412}
413
Jerry Yu92c6b402021-08-27 16:59:09 +0800414int mbedtls_ssl_tls13_handshake_client_step( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800415{
Jerry Yu92c6b402021-08-27 16:59:09 +0800416 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +0800417
Jerry Yu92c6b402021-08-27 16:59:09 +0800418 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
419 {
420 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Handshake completed but ssl->handshake is NULL.\n" ) );
421 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
422 }
423
424 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
425
426 switch( ssl->state )
427 {
428 /*
429 * ssl->state is initialized as HELLO_REQUEST. It is same
430 * with CLIENT_HELLO status
431 */
432 case MBEDTLS_SSL_HELLO_REQUEST:
433 case MBEDTLS_SSL_CLIENT_HELLO:
434 ret = ssl_tls13_write_client_hello( ssl );
435 break;
436
437 case MBEDTLS_SSL_SERVER_HELLO:
438 // Stop here : we haven't finished whole flow
439 ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
440 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
441 break;
442
443 default:
444 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
445 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
446 }
447
448 return( ret );
449}
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800450
Jerry Yu3cc4c2a2021-08-06 16:29:08 +0800451#endif /* MBEDTLS_SSL_CLI_C */
452
453#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */