blob: 2eb9a739050de1163557d39ab07ccb03dc87c35e [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 Yu56fc07f2021-09-01 17:48:49 +080030#include "mbedtls/debug.h"
31#include "mbedtls/error.h"
Jerry Yua13c7e72021-08-17 10:44:40 +080032
Jerry Yubdc71882021-09-14 19:30:36 +080033#include "ssl_misc.h"
34#include "ecdh_misc.h"
35
Jerry Yu08906d02021-08-31 11:05:27 +080036#define CLIENT_HELLO_RANDOM_LEN 32
Jerry Yu65dd2cc2021-08-18 16:38:40 +080037
Jerry Yubc20bdd2021-08-24 15:59:48 +080038/* Write extensions */
39
Jerry Yu92c6b402021-08-27 16:59:09 +080040/*
41 * ssl_tls13_write_supported_versions_ext():
42 *
43 * struct {
44 * ProtocolVersion versions<2..254>;
45 * } SupportedVersions;
46 */
Jerry Yuf4436812021-08-26 22:59:56 +080047static int ssl_tls13_write_supported_versions_ext( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080048 unsigned char *buf,
49 unsigned char *end,
50 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +080051{
52 unsigned char *p = buf;
53
54 *olen = 0;
55
Jerry Yu159c5a02021-08-31 12:51:25 +080056 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported versions extension" ) );
Jerry Yu92c6b402021-08-27 16:59:09 +080057
Jerry Yu388bd0d2021-09-15 18:41:02 +080058 /* Check if we have space to write the extension:
Jerry Yub60e3cf2021-09-08 16:41:02 +080059 * - extension_type (2 bytes)
60 * - extension_data_length (2 bytes)
61 * - versions_length (1 byte )
62 * - versions (2 bytes)
Jerry Yu159c5a02021-08-31 12:51:25 +080063 */
Jerry Yu92c6b402021-08-27 16:59:09 +080064 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 7 );
65
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080066 /* Write extension_type */
Jerry Yueecfbf02021-08-30 18:32:07 +080067 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +080068
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080069 /* Write extension_data_length */
Jerry Yub7ab3362021-08-31 16:16:19 +080070 MBEDTLS_PUT_UINT16_BE( 3, p, 2 );
Jerry Yueecfbf02021-08-30 18:32:07 +080071 p += 4;
Jerry Yu92c6b402021-08-27 16:59:09 +080072
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080073 /* Length of versions */
Jerry Yu92c6b402021-08-27 16:59:09 +080074 *p++ = 0x2;
75
Jerry Yu0c63af62021-09-02 12:59:12 +080076 /* Write values of supported versions.
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080077 *
Jerry Yu0c63af62021-09-02 12:59:12 +080078 * They are defined by the configuration.
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080079 *
Jerry Yu0c63af62021-09-02 12:59:12 +080080 * Currently, only one version is advertised.
Jerry Yu92c6b402021-08-27 16:59:09 +080081 */
Jerry Yueecfbf02021-08-30 18:32:07 +080082 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
83 ssl->conf->max_minor_ver,
84 ssl->conf->transport, p );
Jerry Yu92c6b402021-08-27 16:59:09 +080085
86 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [%d:%d]",
Jerry Yueecfbf02021-08-30 18:32:07 +080087 ssl->conf->max_major_ver,
88 ssl->conf->max_minor_ver ) );
Jerry Yu92c6b402021-08-27 16:59:09 +080089
90 *olen = 7;
91
92 return( 0 );
93}
Jerry Yubc20bdd2021-08-24 15:59:48 +080094
95#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
96
Jerry Yu6b64fe32021-09-01 17:05:13 +080097/*
98 * Functions for writing supported_groups extension.
99 *
100 * Stucture of supported_groups:
101 * enum {
102 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
103 * x25519(0x001D), x448(0x001E),
104 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
105 * ffdhe6144(0x0103), ffdhe8192(0x0104),
106 * ffdhe_private_use(0x01FC..0x01FF),
107 * ecdhe_private_use(0xFE00..0xFEFF),
108 * (0xFFFF)
109 * } NamedGroup;
110 * struct {
111 * NamedGroup named_group_list<2..2^16-1>;
112 * } NamedGroupList;
113 */
Jerry Yu6b64fe32021-09-01 17:05:13 +0800114#if defined(MBEDTLS_ECDH_C)
115/*
116 * In versions of TLS prior to TLS 1.3, this extension was named
117 * 'elliptic_curves' and only contained elliptic curve groups.
118 */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800119static int ssl_tls13_write_named_group_list_ecdhe( mbedtls_ssl_context *ssl,
120 unsigned char *buf,
121 unsigned char *end,
122 size_t *olen )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800123{
124 unsigned char *p = buf;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800125
126 *olen = 0;
127
Jerry Yu7c522d42021-09-08 17:55:09 +0800128 if( ssl->conf->curve_list == NULL )
129 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
130
Jerry Yu6b64fe32021-09-01 17:05:13 +0800131 for ( const mbedtls_ecp_group_id *grp_id = ssl->conf->curve_list;
132 *grp_id != MBEDTLS_ECP_DP_NONE;
133 grp_id++ )
134 {
135 const mbedtls_ecp_curve_info *info;
136 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
137 if( info == NULL )
138 continue;
Jerry Yu7c522d42021-09-08 17:55:09 +0800139
Jerry Yub60e3cf2021-09-08 16:41:02 +0800140 if( !mbedtls_ssl_tls13_named_group_is_ecdhe( info->tls_id ) )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800141 continue;
142
143 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2);
144 MBEDTLS_PUT_UINT16_BE( info->tls_id, p, 0 );
145 p += 2;
146
147 MBEDTLS_SSL_DEBUG_MSG( 3, ( "NamedGroup: %s ( %x )",
148 mbedtls_ecp_curve_info_from_tls_id( info->tls_id )->name,
149 info->tls_id ) );
150 }
151
152 *olen = p - buf;
153
154 return( 0 );
155}
156#else
Jerry Yub60e3cf2021-09-08 16:41:02 +0800157static int ssl_tls13_write_named_group_list_ecdhe( mbedtls_ssl_context *ssl,
158 unsigned char *buf,
159 unsigned char *end,
160 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +0800161{
162 ((void) ssl);
163 ((void) buf);
164 ((void) end);
Jerry Yu75336352021-09-01 15:59:36 +0800165 *olen = 0;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800166 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
167}
168#endif /* MBEDTLS_ECDH_C */
169
Jerry Yub60e3cf2021-09-08 16:41:02 +0800170static int ssl_tls13_write_named_group_list_dhe( mbedtls_ssl_context *ssl,
171 unsigned char *buf,
172 unsigned char *end,
173 size_t *olen )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800174{
175 ((void) ssl);
176 ((void) buf);
177 ((void) end);
178 *olen = 0;
179 MBEDTLS_SSL_DEBUG_MSG( 3, ( "write_named_group_dhe is not implemented" ) );
180 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
181}
182
Jerry Yu6b64fe32021-09-01 17:05:13 +0800183static int ssl_tls13_write_supported_groups_ext( mbedtls_ssl_context *ssl,
184 unsigned char *buf,
185 unsigned char *end,
186 size_t *olen )
187{
188 unsigned char *p = buf ;
Jerry Yu72fc69b2021-09-10 10:23:24 +0800189 unsigned char *named_group_list_ptr; /* Start of named_group_list */
190 size_t named_group_list_len; /* Length of named_group_list */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800191 size_t output_len = 0;
192 int ret_ecdhe, ret_dhe;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800193
194 *olen = 0;
195
196 if( !mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
197 return( 0 );
198
199 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_groups extension" ) );
200
Jerry Yub60e3cf2021-09-08 16:41:02 +0800201 /* Check if we have space for header and length fields:
202 * - extension_type (2 bytes)
203 * - extension_data_length (2 bytes)
204 * - named_group_list_length (2 bytes)
205 */
Jerry Yu6b64fe32021-09-01 17:05:13 +0800206 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
207 p += 6;
208
Jerry Yu72fc69b2021-09-10 10:23:24 +0800209 named_group_list_ptr = p;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800210 ret_ecdhe = ssl_tls13_write_named_group_list_ecdhe( ssl, p, end, &output_len );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800211 if( ret_ecdhe != 0 )
212 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800213 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_named_group_list_ecdhe", ret_ecdhe );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800214 }
Jerry Yub60e3cf2021-09-08 16:41:02 +0800215 p += output_len;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800216
Jerry Yub60e3cf2021-09-08 16:41:02 +0800217 ret_dhe = ssl_tls13_write_named_group_list_dhe( ssl, p, end, &output_len );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800218 if( ret_dhe != 0 )
219 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800220 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_named_group_list_dhe", ret_dhe );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800221 }
Jerry Yub60e3cf2021-09-08 16:41:02 +0800222 p += output_len;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800223
Jerry Yu388bd0d2021-09-15 18:41:02 +0800224 /* Both ECDHE and DHE failed. */
Jerry Yu6b64fe32021-09-01 17:05:13 +0800225 if( ret_ecdhe != 0 && ret_dhe != 0 )
226 {
227 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Both ECDHE and DHE groups are fail. " ) );
228 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
229 }
230
231 /* Length of named_group_list*/
Jerry Yu72fc69b2021-09-10 10:23:24 +0800232 named_group_list_len = p - named_group_list_ptr;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800233 if( named_group_list_len == 0 )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800234 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800235 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No group available." ) );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800236 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
237 }
238
239 /* Write extension_type */
240 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_GROUPS, buf, 0 );
241 /* Write extension_data_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800242 MBEDTLS_PUT_UINT16_BE( named_group_list_len + 2, buf, 2 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800243 /* Write length of named_group_list */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800244 MBEDTLS_PUT_UINT16_BE( named_group_list_len, buf, 4 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800245
Jerry Yub60e3cf2021-09-08 16:41:02 +0800246 MBEDTLS_SSL_DEBUG_BUF( 3, "Supported groups extension", buf + 4, named_group_list_len + 2 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800247
248 *olen = p - buf;
249
250 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_GROUPS;
251
Jerry Yub60e3cf2021-09-08 16:41:02 +0800252 return( 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +0800253}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800254
Jerry Yu56fc07f2021-09-01 17:48:49 +0800255/*
256 * Functions for writing key_share extension.
257 */
258#if defined(MBEDTLS_ECDH_C)
Jerry Yu7c522d42021-09-08 17:55:09 +0800259static int ssl_tls13_generate_and_write_ecdh_key_exchange(
Jerry Yub60e3cf2021-09-08 16:41:02 +0800260 mbedtls_ssl_context *ssl,
261 uint16_t named_group,
262 unsigned char *buf,
263 unsigned char *end,
264 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +0800265{
Jerry Yu56fc07f2021-09-01 17:48:49 +0800266 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800267 const mbedtls_ecp_curve_info *curve_info =
268 mbedtls_ecp_curve_info_from_tls_id( named_group );
269
270 if( curve_info == NULL )
271 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
272
273 MBEDTLS_SSL_DEBUG_MSG( 3, ( "offer curve %s", curve_info->name ) );
274
Jerry Yudd1fb9e2021-09-15 11:10:15 +0800275 if( ( ret = mbedtls_ecdh_setup_no_everest( &ssl->handshake->ecdh_ctx,
276 curve_info->grp_id ) ) != 0 )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800277 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800278 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_setup_no_everest", ret );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800279 return( ret );
280 }
281
282 ret = mbedtls_ecdh_tls13_make_params( &ssl->handshake->ecdh_ctx, olen,
283 buf, end - buf,
284 ssl->conf->f_rng, ssl->conf->p_rng );
285 if( ret != 0 )
286 {
287 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_tls13_make_params", ret );
288 return( ret );
289 }
290
291 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
292 MBEDTLS_DEBUG_ECDH_Q );
Jerry Yu75336352021-09-01 15:59:36 +0800293 return( 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +0800294}
Jerry Yu56fc07f2021-09-01 17:48:49 +0800295#endif /* MBEDTLS_ECDH_C */
296
Jerry Yub60e3cf2021-09-08 16:41:02 +0800297static int ssl_tls13_get_default_group_id( mbedtls_ssl_context *ssl,
298 uint16_t *group_id )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800299{
300 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
301
Jerry Yu56fc07f2021-09-01 17:48:49 +0800302
Jerry Yu56fc07f2021-09-01 17:48:49 +0800303#if defined(MBEDTLS_ECDH_C)
Jerry Yu388bd0d2021-09-15 18:41:02 +0800304 /* Pick first available ECDHE group compatible with TLS 1.3 */
305 if( ssl->conf->curve_list == NULL )
306 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
307
308 for ( const mbedtls_ecp_group_id *grp_id = ssl->conf->curve_list;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800309 *grp_id != MBEDTLS_ECP_DP_NONE;
310 grp_id++ )
311 {
312 const mbedtls_ecp_curve_info *info;
313 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Jerry Yu388bd0d2021-09-15 18:41:02 +0800314 if( info != NULL &&
315 mbedtls_ssl_tls13_named_group_is_ecdhe( info->tls_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800316 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800317 *group_id = info->tls_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800318 return( 0 );
319 }
320 }
321#else
322 ((void) ssl);
Jerry Yub60e3cf2021-09-08 16:41:02 +0800323 ((void) group_id);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800324#endif /* MBEDTLS_ECDH_C */
325
326 /*
327 * Add DHE named groups here.
Jerry Yu388bd0d2021-09-15 18:41:02 +0800328 * Pick first available DHE group compatible with TLS 1.3
Jerry Yu56fc07f2021-09-01 17:48:49 +0800329 */
330
331 return( ret );
332}
333
334/*
335 * ssl_tls13_write_key_share_ext
336 *
Jerry Yu388bd0d2021-09-15 18:41:02 +0800337 * Structure of key_share extension in ClientHello:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800338 *
339 * struct {
340 * NamedGroup group;
341 * opaque key_exchange<1..2^16-1>;
342 * } KeyShareEntry;
343 * struct {
344 * KeyShareEntry client_shares<0..2^16-1>;
345 * } KeyShareClientHello;
346 */
347static int ssl_tls13_write_key_share_ext( mbedtls_ssl_context *ssl,
348 unsigned char *buf,
349 unsigned char *end,
350 size_t *olen )
351{
352 unsigned char *p = buf;
353 unsigned char *client_shares_ptr; /* Start of client_shares */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800354 size_t client_shares_len; /* Length of client_shares */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800355 uint16_t group_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800356 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
357
358 *olen = 0;
359
360 if( !mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
361 return( 0 );
362
Jerry Yub60e3cf2021-09-08 16:41:02 +0800363 /* Check if we have space for header and length fields:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800364 * - extension_type (2 bytes)
365 * - extension_data_length (2 bytes)
366 * - client_shares_length (2 bytes)
367 */
368 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
369 p += 6;
370
371 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello: adding key share extension" ) );
372
373 /* HRR could already have requested something else. */
374 group_id = ssl->handshake->offered_group_id;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800375 if( !mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) &&
376 !mbedtls_ssl_tls13_named_group_is_dhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800377 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800378 MBEDTLS_SSL_PROC_CHK( ssl_tls13_get_default_group_id( ssl,
Jerry Yu56fc07f2021-09-01 17:48:49 +0800379 &group_id ) );
380 }
381
382 /*
383 * Dispatch to type-specific key generation function.
384 *
385 * So far, we're only supporting ECDHE. With the introduction
386 * of PQC KEMs, we'll want to have multiple branches, one per
387 * type of KEM, and dispatch to the corresponding crypto. And
388 * only one key share entry is allowed.
389 */
390 client_shares_ptr = p;
391#if defined(MBEDTLS_ECDH_C)
Jerry Yub60e3cf2021-09-08 16:41:02 +0800392 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800393 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800394 /* Pointer to group */
395 unsigned char *group_ptr = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800396 /* Length of key_exchange */
397 size_t key_exchange_len;
398
399 /* Check there is space for header of KeyShareEntry
400 * - group (2 bytes)
401 * - key_exchange_length (2 bytes)
402 */
403 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
404 p += 4;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800405 ret = ssl_tls13_generate_and_write_ecdh_key_exchange( ssl, group_id,
406 p, end,
407 &key_exchange_len );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800408 p += key_exchange_len;
409 if( ret != 0 )
410 return( ret );
411
412 /* Write group */
Jerry Yu388bd0d2021-09-15 18:41:02 +0800413 MBEDTLS_PUT_UINT16_BE( group_id, group_ptr, 0 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800414 /* Write key_exchange_length */
Jerry Yu388bd0d2021-09-15 18:41:02 +0800415 MBEDTLS_PUT_UINT16_BE( key_exchange_len, group_ptr, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800416 }
417 else
418#endif /* MBEDTLS_ECDH_C */
419 if( 0 /* other KEMs? */ )
420 {
421 /* Do something */
422 }
423 else
424 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
425
Jerry Yub60e3cf2021-09-08 16:41:02 +0800426 /* Length of client_shares */
427 client_shares_len = p - client_shares_ptr;
428 if( client_shares_len == 0)
429 {
430 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No key share defined." ) );
431 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu7c522d42021-09-08 17:55:09 +0800432 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800433 /* Write extension_type */
434 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0 );
435 /* Write extension_data_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800436 MBEDTLS_PUT_UINT16_BE( client_shares_len + 2, buf, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800437 /* Write client_shares_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800438 MBEDTLS_PUT_UINT16_BE( client_shares_len, buf, 4 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800439
440 /* Update offered_group_id field */
441 ssl->handshake->offered_group_id = group_id;
442
443 /* Output the total length of key_share extension. */
444 *olen = p - buf;
445
446 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, key_share extension", buf, *olen );
447
448 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_KEY_SHARE;
449
450cleanup:
451
452 return( ret );
453}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800454
455#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
456
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800457/* Write cipher_suites
Jerry Yu6a643102021-08-31 14:40:36 +0800458 * CipherSuite cipher_suites<2..2^16-2>;
459 */
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800460static int ssl_tls13_write_client_hello_cipher_suites(
Jerry Yu6a643102021-08-31 14:40:36 +0800461 mbedtls_ssl_context *ssl,
462 unsigned char *buf,
463 unsigned char *end,
464 size_t *olen )
465{
Jerry Yufec982e2021-09-07 17:26:06 +0800466 unsigned char *p = buf;
Jerry Yu0c63af62021-09-02 12:59:12 +0800467 const int *ciphersuite_list;
Jerry Yubbe09522021-09-06 21:17:54 +0800468 unsigned char *cipher_suites_ptr; /* Start of the cipher_suites list */
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800469 size_t cipher_suites_len;
Jerry Yu92c6b402021-08-27 16:59:09 +0800470
Jerry Yu6a643102021-08-31 14:40:36 +0800471 *olen = 0 ;
472
473 /*
474 * Ciphersuite list
475 *
476 * This is a list of the symmetric cipher options supported by
477 * the client, specifically the record protection algorithm
478 * ( including secret key length ) and a hash to be used with
479 * HKDF, in descending order of client preference.
480 */
Jerry Yu0c63af62021-09-02 12:59:12 +0800481 ciphersuite_list = ssl->conf->ciphersuite_list;
Jerry Yu6a643102021-08-31 14:40:36 +0800482
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800483 /* Check there is space for the cipher suite list length (2 bytes). */
Jerry Yu4e388282021-09-06 21:28:08 +0800484 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
485 p += 2;
Jerry Yu6a643102021-08-31 14:40:36 +0800486
Jerry Yu0c63af62021-09-02 12:59:12 +0800487 /* Write cipher_suites */
Jerry Yu4e388282021-09-06 21:28:08 +0800488 cipher_suites_ptr = p;
Jerry Yu0c63af62021-09-02 12:59:12 +0800489 for ( size_t i = 0; ciphersuite_list[i] != 0; i++ )
Jerry Yu6a643102021-08-31 14:40:36 +0800490 {
Jerry Yu0c63af62021-09-02 12:59:12 +0800491 int cipher_suite = ciphersuite_list[i];
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800492 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu6a643102021-08-31 14:40:36 +0800493
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800494 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
Jerry Yu6a643102021-08-31 14:40:36 +0800495 if( ciphersuite_info == NULL )
496 continue;
Jerry Yudbfb7bd2021-09-04 09:58:58 +0800497 if( !( MBEDTLS_SSL_MINOR_VERSION_4 >= ciphersuite_info->min_minor_ver &&
498 MBEDTLS_SSL_MINOR_VERSION_4 <= ciphersuite_info->max_minor_ver ) )
Jerry Yu6a643102021-08-31 14:40:36 +0800499 continue;
500
501 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x, %s",
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800502 (unsigned int) cipher_suite,
Jerry Yu6a643102021-08-31 14:40:36 +0800503 ciphersuite_info->name ) );
504
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800505 /* Check there is space for the cipher suite identifier (2 bytes). */
Jerry Yubbe09522021-09-06 21:17:54 +0800506 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
507 MBEDTLS_PUT_UINT16_BE( cipher_suite, p, 0 );
508 p += 2;
Jerry Yu6a643102021-08-31 14:40:36 +0800509 }
510
Jerry Yu0c63af62021-09-02 12:59:12 +0800511 /* Write the cipher_suites length in number of bytes */
Jerry Yubbe09522021-09-06 21:17:54 +0800512 cipher_suites_len = p - cipher_suites_ptr;
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800513 MBEDTLS_PUT_UINT16_BE( cipher_suites_len, buf, 0 );
Jerry Yu6a643102021-08-31 14:40:36 +0800514 MBEDTLS_SSL_DEBUG_MSG( 3,
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800515 ( "client hello, got %" MBEDTLS_PRINTF_SIZET " cipher suites",
516 cipher_suites_len/2 ) );
Jerry Yu6a643102021-08-31 14:40:36 +0800517
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800518 /* Output the total length of cipher_suites field. */
Jerry Yubbe09522021-09-06 21:17:54 +0800519 *olen = p - buf;
Jerry Yuf171e832021-08-31 18:31:09 +0800520
Jerry Yu6a643102021-08-31 14:40:36 +0800521 return( 0 );
522}
523
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800524/*
525 * Structure of ClientHello message:
526 *
527 * struct {
528 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
529 * Random random;
530 * opaque legacy_session_id<0..32>;
531 * CipherSuite cipher_suites<2..2^16-2>;
532 * opaque legacy_compression_methods<1..2^8-1>;
533 * Extension extensions<8..2^16-1>;
534 * } ClientHello;
535 */
Jerry Yu08906d02021-08-31 11:05:27 +0800536static int ssl_tls13_write_client_hello_body( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +0800537 unsigned char *buf,
Jerry Yuef387d72021-09-02 13:59:41 +0800538 unsigned char *end,
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800539 size_t *olen )
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800540{
Jerry Yubc20bdd2021-08-24 15:59:48 +0800541
Jerry Yubc20bdd2021-08-24 15:59:48 +0800542 int ret;
Jerry Yu8c02bb42021-09-03 21:09:22 +0800543 unsigned char *extensions_len_ptr; /* Pointer to extensions length */
Jerry Yu790656a2021-09-01 15:51:48 +0800544 size_t output_len; /* Length of buffer used by function */
545 size_t extensions_len; /* Length of the list of extensions*/
Jerry Yubc20bdd2021-08-24 15:59:48 +0800546
Jerry Yubc20bdd2021-08-24 15:59:48 +0800547 /* Buffer management */
Jerry Yubbe09522021-09-06 21:17:54 +0800548 unsigned char *p = buf;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800549
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800550 *olen = 0;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800551
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800552 /* No validation needed here. It has been done by ssl_conf_check() */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800553 ssl->major_ver = ssl->conf->min_major_ver;
554 ssl->minor_ver = ssl->conf->min_minor_ver;
555
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800556 /*
557 * Write legacy_version
Jerry Yu6a643102021-08-31 14:40:36 +0800558 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800559 *
560 * For TLS 1.3 we use the legacy version number {0x03, 0x03}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800561 * instead of the true version number.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800562 */
Jerry Yufec982e2021-09-07 17:26:06 +0800563 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yubbe09522021-09-06 21:17:54 +0800564 MBEDTLS_PUT_UINT16_BE( 0x0303, p, 0 );
Jerry Yufec982e2021-09-07 17:26:06 +0800565 p += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800566
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800567 /* Write the random bytes ( random ).*/
Jerry Yubbe09522021-09-06 21:17:54 +0800568 MBEDTLS_SSL_CHK_BUF_PTR( p, end, CLIENT_HELLO_RANDOM_LEN );
569 memcpy( p, ssl->handshake->randbytes, CLIENT_HELLO_RANDOM_LEN );
Jerry Yue885b762021-08-26 17:32:34 +0800570 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes",
Jerry Yubbe09522021-09-06 21:17:54 +0800571 p, CLIENT_HELLO_RANDOM_LEN );
572 p += CLIENT_HELLO_RANDOM_LEN;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800573
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800574 /*
575 * Write legacy_session_id
576 *
577 * Versions of TLS before TLS 1.3 supported a "session resumption" feature
578 * which has been merged with pre-shared keys in this version. A client
579 * which has a cached session ID set by a pre-TLS 1.3 server SHOULD set
580 * this field to that value. In compatibility mode, this field MUST be
581 * non-empty, so a client not offering a pre-TLS 1.3 session MUST generate
582 * a new 32-byte value. This value need not be random but SHOULD be
583 * unpredictable to avoid implementations fixating on a specific value
584 * ( also known as ossification ). Otherwise, it MUST be set as a zero-length
585 * vector ( i.e., a zero-valued single byte length field ).
Jerry Yubc20bdd2021-08-24 15:59:48 +0800586 */
Jerry Yubbe09522021-09-06 21:17:54 +0800587 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
588 *p++ = 0; /* session id length set to zero */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800589
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800590 /* Write cipher_suites */
Jerry Yubbe09522021-09-06 21:17:54 +0800591 ret = ssl_tls13_write_client_hello_cipher_suites( ssl, p, end, &output_len );
Jerry Yudbfb7bd2021-09-04 09:58:58 +0800592 if( ret != 0 )
Jerry Yu6a643102021-08-31 14:40:36 +0800593 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800594 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800595
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800596 /* Write legacy_compression_methods
597 *
598 * For every TLS 1.3 ClientHello, this vector MUST contain exactly
Jerry Yubc20bdd2021-08-24 15:59:48 +0800599 * one byte set to zero, which corresponds to the 'null' compression
600 * method in prior versions of TLS.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800601 */
Jerry Yubbe09522021-09-06 21:17:54 +0800602 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
603 *p++ = 1;
604 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800605
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800606 /* Write extensions */
607
608 /* Keeping track of the included extensions */
609 ssl->handshake->extensions_present = MBEDTLS_SSL_EXT_NONE;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800610
611 /* First write extensions, then the total length */
Jerry Yubbe09522021-09-06 21:17:54 +0800612 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
613 extensions_len_ptr = p;
614 p += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800615
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800616 /* Write supported_versions extension
Jerry Yubc20bdd2021-08-24 15:59:48 +0800617 *
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800618 * Supported Versions Extension is mandatory with TLS 1.3.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800619 */
Jerry Yubbe09522021-09-06 21:17:54 +0800620 ret = ssl_tls13_write_supported_versions_ext( ssl, p, end, &output_len );
Jerry Yu92c6b402021-08-27 16:59:09 +0800621 if( ret != 0 )
622 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800623 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800624
625#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800626 /* Write supported_groups extension
627 *
628 * It is REQUIRED for ECDHE cipher_suites.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800629 */
Jerry Yubbe09522021-09-06 21:17:54 +0800630 ret = ssl_tls13_write_supported_groups_ext( ssl, p, end, &output_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800631 if( ret != 0 )
632 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800633 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800634
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800635 /* Write key_share extension
636 *
637 * We need to send the key shares under three conditions:
Jerry Yu159c5a02021-08-31 12:51:25 +0800638 * 1) A certificate-based ciphersuite is being offered. In this case
639 * supported_groups and supported_signature extensions have been
640 * successfully added.
641 * 2) A PSK-based ciphersuite with ECDHE is offered. In this case the
Jerry Yubc20bdd2021-08-24 15:59:48 +0800642 * psk_key_exchange_modes has been added as the last extension.
Jerry Yu159c5a02021-08-31 12:51:25 +0800643 * 3) Or, in case all ciphers are supported ( which includes #1 and #2
644 * from above )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800645 */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800646 ret = ssl_tls13_write_key_share_ext( ssl, p, end, &output_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800647 if( ret != 0 )
648 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800649 p += output_len;
Jerry Yu6a643102021-08-31 14:40:36 +0800650
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800651 /* Write signature_algorithms extension
652 *
653 * It is REQUIRED for certificate authenticated cipher_suites.
654 */
Jerry Yubbe09522021-09-06 21:17:54 +0800655 ret = mbedtls_ssl_tls13_write_sig_alg_ext( ssl, p, end, &output_len );
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800656 if( ret != 0 )
657 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800658 p += output_len;
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800659
Jerry Yubc20bdd2021-08-24 15:59:48 +0800660#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
661
662 /* Add more extensions here */
663
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800664 /* Write the length of the list of extensions. */
Jerry Yubbe09522021-09-06 21:17:54 +0800665 extensions_len = p - extensions_len_ptr - 2;
Jerry Yu790656a2021-09-01 15:51:48 +0800666 MBEDTLS_PUT_UINT16_BE( extensions_len, extensions_len_ptr, 0 );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800667 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %" MBEDTLS_PRINTF_SIZET ,
Jerry Yu790656a2021-09-01 15:51:48 +0800668 extensions_len ) );
669 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", extensions_len_ptr, extensions_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800670
Jerry Yubbe09522021-09-06 21:17:54 +0800671 *olen = p - buf;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800672 return( 0 );
673}
674
Jerry Yu335aca92021-09-12 20:18:56 +0800675static int ssl_tls13_finalize_client_hello( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800676{
Jerry Yu92c6b402021-08-27 16:59:09 +0800677 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_HELLO );
678 return( 0 );
679}
Jerry Yuef6b36b2021-08-24 16:29:02 +0800680
Jerry Yu92c6b402021-08-27 16:59:09 +0800681static int ssl_tls13_prepare_client_hello( mbedtls_ssl_context *ssl )
682{
683 int ret;
Jerry Yuef6b36b2021-08-24 16:29:02 +0800684
Jerry Yu92c6b402021-08-27 16:59:09 +0800685 if( ssl->conf->f_rng == NULL )
686 {
687 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided" ) );
688 return( MBEDTLS_ERR_SSL_NO_RNG );
689 }
Jerry Yuef6b36b2021-08-24 16:29:02 +0800690
Jerry Yu92c6b402021-08-27 16:59:09 +0800691 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng,
692 ssl->handshake->randbytes,
Jerry Yu08906d02021-08-31 11:05:27 +0800693 CLIENT_HELLO_RANDOM_LEN ) ) != 0 )
Jerry Yu92c6b402021-08-27 16:59:09 +0800694 {
Jerry Yu8c02bb42021-09-03 21:09:22 +0800695 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Jerry Yu92c6b402021-08-27 16:59:09 +0800696 return( ret );
697 }
Jerry Yu6f13f642021-08-26 17:18:15 +0800698
699 return( 0 );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800700}
701
Jerry Yu92c6b402021-08-27 16:59:09 +0800702/*
Jerry Yu159c5a02021-08-31 12:51:25 +0800703 * Write ClientHello handshake message.
Jerry Yu687101b2021-09-14 16:03:56 +0800704 * Handler for MBEDTLS_SSL_CLIENT_HELLO
Jerry Yu92c6b402021-08-27 16:59:09 +0800705 */
706static int ssl_tls13_write_client_hello( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800707{
Jerry Yu92c6b402021-08-27 16:59:09 +0800708 int ret = 0;
709 unsigned char *buf;
710 size_t buf_len, msg_len;
711
712 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
713
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800714 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_client_hello( ssl ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800715
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800716 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg(
717 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
718 &buf, &buf_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800719
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800720 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_client_hello_body( ssl, buf,
Jerry Yuef387d72021-09-02 13:59:41 +0800721 buf + buf_len,
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800722 &msg_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800723
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800724 mbedtls_ssl_tls13_add_hs_hdr_to_checksum( ssl,
725 MBEDTLS_SSL_HS_CLIENT_HELLO,
Jerry Yu0c63af62021-09-02 12:59:12 +0800726 msg_len );
727 ssl->handshake->update_checksum( ssl, buf, msg_len );
Jerry Yu92c6b402021-08-27 16:59:09 +0800728
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800729 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_client_hello( ssl ) );
730 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg( ssl,
731 buf_len,
732 msg_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800733
734cleanup:
735
736 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
737 return ret;
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800738}
739
Jerry Yu687101b2021-09-14 16:03:56 +0800740/*
741 * Handler for MBEDTLS_SSL_SERVER_HELLO
742 */
743static int ssl_tls1_3_read_server_hello( mbedtls_ssl_context *ssl )
744{
745 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
746 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
747 return( 0 );
748}
749
750/*
751 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
752 */
753static int ssl_tls1_3_read_encrypted_extensions( mbedtls_ssl_context *ssl )
754{
755 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
756 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST );
757 return( 0 );
758}
759
760/*
761 * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST
762 */
763static int ssl_tls1_3_read_certificate_request( mbedtls_ssl_context *ssl )
764{
765 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
766 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_CERTIFICATE );
767 return( 0 );
768}
769
770/*
771 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
772 */
773static int ssl_tls1_3_read_server_certificate( mbedtls_ssl_context *ssl )
774{
775 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
776 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY );
777 return( 0 );
778}
779
780/*
781 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
782 */
783static int ssl_tls1_3_read_certificate_verify( mbedtls_ssl_context *ssl )
784{
785 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
786 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
787 return( 0 );
788}
789
790/*
791 * Handler for MBEDTLS_SSL_SERVER_FINISHED
792 */
793static int ssl_tls1_3_read_server_finished( mbedtls_ssl_context *ssl )
794{
Jerry Yu687101b2021-09-14 16:03:56 +0800795 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yu435756f2021-09-24 13:44:29 +0800796 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
Jerry Yu687101b2021-09-14 16:03:56 +0800797 return( 0 );
798}
799
800/*
801 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE
802 */
803static int ssl_tls1_3_write_client_certificate( mbedtls_ssl_context *ssl )
804{
805 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY );
806 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
807 return( 0 );
808}
809
810/*
811 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY
812 */
813static int ssl_tls1_3_write_client_certificate_verify( mbedtls_ssl_context *ssl )
814{
815 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
816 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
817 return( 0 );
818}
819
820/*
821 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
822 */
823static int ssl_tls1_3_write_client_finished( mbedtls_ssl_context *ssl )
824{
825 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_FLUSH_BUFFERS );
826 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
827 return( 0 );
828}
829
830/*
831 * Handler for MBEDTLS_SSL_FLUSH_BUFFERS
832 */
833static int ssl_tls1_3_flush_buffers( mbedtls_ssl_context *ssl )
834{
835 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP );
836 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
837 return( 0 );
838}
839
840/*
841 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
842 */
843static int ssl_tls1_3_handshake_wrapup( mbedtls_ssl_context *ssl )
844{
845 ((void) ssl);
846 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
847 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
848}
849
Jerry Yu92c6b402021-08-27 16:59:09 +0800850int mbedtls_ssl_tls13_handshake_client_step( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800851{
Jerry Yu92c6b402021-08-27 16:59:09 +0800852 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +0800853
Jerry Yu92c6b402021-08-27 16:59:09 +0800854 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
855
856 switch( ssl->state )
857 {
858 /*
Jerry Yu0c63af62021-09-02 12:59:12 +0800859 * ssl->state is initialized as HELLO_REQUEST. It is the same
860 * as CLIENT_HELLO state.
Jerry Yu92c6b402021-08-27 16:59:09 +0800861 */
862 case MBEDTLS_SSL_HELLO_REQUEST:
863 case MBEDTLS_SSL_CLIENT_HELLO:
864 ret = ssl_tls13_write_client_hello( ssl );
865 break;
866
867 case MBEDTLS_SSL_SERVER_HELLO:
Jerry Yu687101b2021-09-14 16:03:56 +0800868 ret = ssl_tls1_3_read_server_hello( ssl );
869 break;
870
871 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
872 ret = ssl_tls1_3_read_encrypted_extensions( ssl );
873 break;
874
875 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
876 ret = ssl_tls1_3_read_certificate_request( ssl );
877 break;
878
879 case MBEDTLS_SSL_SERVER_CERTIFICATE:
880 ret = ssl_tls1_3_read_server_certificate( ssl );
881 break;
882
883 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
884 ret = ssl_tls1_3_read_certificate_verify( ssl );
885 break;
886
887 case MBEDTLS_SSL_SERVER_FINISHED:
888 ret = ssl_tls1_3_read_server_finished( ssl );
889 break;
890
891 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
892 ret = ssl_tls1_3_write_client_certificate( ssl );
893 break;
894
895 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
896 ret = ssl_tls1_3_write_client_certificate_verify( ssl );
897 break;
898
899 case MBEDTLS_SSL_CLIENT_FINISHED:
900 ret = ssl_tls1_3_write_client_finished( ssl );
901 break;
902
903 case MBEDTLS_SSL_FLUSH_BUFFERS:
904 ret = ssl_tls1_3_flush_buffers( ssl );
905 break;
906
907 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
908 ret = ssl_tls1_3_handshake_wrapup( ssl );
Jerry Yu92c6b402021-08-27 16:59:09 +0800909 break;
910
911 default:
912 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
913 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
914 }
915
916 return( ret );
917}
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800918
Jerry Yu3cc4c2a2021-08-06 16:29:08 +0800919#endif /* MBEDTLS_SSL_CLI_C */
920
921#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */