blob: 8fe2232ec5330eb9f7df0f1d2ec4a664deeeae77 [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,
Brett Warren14efd332021-10-06 09:32:11 +0100120 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
Brett Warren14efd332021-10-06 09:32:11 +0100128 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
129
130 if( group_list == NULL )
Jerry Yu7c522d42021-09-08 17:55:09 +0800131 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
132
Brett Warren14efd332021-10-06 09:32:11 +0100133 for ( ; *group_list != 0; group_list++ )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800134 {
135 const mbedtls_ecp_curve_info *info;
Brett Warren14efd332021-10-06 09:32:11 +0100136 info = mbedtls_ecp_curve_info_from_tls_id( *group_list );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800137 if( info == NULL )
138 continue;
Jerry Yu7c522d42021-09-08 17:55:09 +0800139
Brett Warren14efd332021-10-06 09:32:11 +0100140 if( !mbedtls_ssl_tls13_named_group_is_ecdhe( *group_list ) )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800141 continue;
142
143 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2);
Brett Warren14efd332021-10-06 09:32:11 +0100144 MBEDTLS_PUT_UINT16_BE( *group_list, p, 0 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800145 p += 2;
146
147 MBEDTLS_SSL_DEBUG_MSG( 3, ( "NamedGroup: %s ( %x )",
Brett Warren14efd332021-10-06 09:32:11 +0100148 info->name, *group_list ) );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800149 }
150
151 *olen = p - buf;
152
153 return( 0 );
154}
155#else
Jerry Yub60e3cf2021-09-08 16:41:02 +0800156static int ssl_tls13_write_named_group_list_ecdhe( mbedtls_ssl_context *ssl,
157 unsigned char *buf,
158 unsigned char *end,
159 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +0800160{
161 ((void) ssl);
162 ((void) buf);
163 ((void) end);
Jerry Yu75336352021-09-01 15:59:36 +0800164 *olen = 0;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800165 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
166}
167#endif /* MBEDTLS_ECDH_C */
168
Jerry Yub60e3cf2021-09-08 16:41:02 +0800169static int ssl_tls13_write_named_group_list_dhe( mbedtls_ssl_context *ssl,
170 unsigned char *buf,
171 unsigned char *end,
172 size_t *olen )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800173{
174 ((void) ssl);
175 ((void) buf);
176 ((void) end);
177 *olen = 0;
178 MBEDTLS_SSL_DEBUG_MSG( 3, ( "write_named_group_dhe is not implemented" ) );
179 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
180}
181
Jerry Yu6b64fe32021-09-01 17:05:13 +0800182static int ssl_tls13_write_supported_groups_ext( mbedtls_ssl_context *ssl,
183 unsigned char *buf,
184 unsigned char *end,
185 size_t *olen )
186{
187 unsigned char *p = buf ;
Jerry Yu72fc69b2021-09-10 10:23:24 +0800188 unsigned char *named_group_list_ptr; /* Start of named_group_list */
189 size_t named_group_list_len; /* Length of named_group_list */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800190 size_t output_len = 0;
191 int ret_ecdhe, ret_dhe;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800192
193 *olen = 0;
194
195 if( !mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
196 return( 0 );
197
198 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_groups extension" ) );
199
Jerry Yub60e3cf2021-09-08 16:41:02 +0800200 /* Check if we have space for header and length fields:
201 * - extension_type (2 bytes)
202 * - extension_data_length (2 bytes)
203 * - named_group_list_length (2 bytes)
204 */
Jerry Yu6b64fe32021-09-01 17:05:13 +0800205 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
206 p += 6;
207
Jerry Yu72fc69b2021-09-10 10:23:24 +0800208 named_group_list_ptr = p;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800209 ret_ecdhe = ssl_tls13_write_named_group_list_ecdhe( ssl, p, end, &output_len );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800210 if( ret_ecdhe != 0 )
211 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800212 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_named_group_list_ecdhe", ret_ecdhe );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800213 }
Jerry Yub60e3cf2021-09-08 16:41:02 +0800214 p += output_len;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800215
Jerry Yub60e3cf2021-09-08 16:41:02 +0800216 ret_dhe = ssl_tls13_write_named_group_list_dhe( ssl, p, end, &output_len );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800217 if( ret_dhe != 0 )
218 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800219 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_named_group_list_dhe", ret_dhe );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800220 }
Jerry Yub60e3cf2021-09-08 16:41:02 +0800221 p += output_len;
Jerry Yu6b64fe32021-09-01 17:05:13 +0800222
Jerry Yu388bd0d2021-09-15 18:41:02 +0800223 /* Both ECDHE and DHE failed. */
Jerry Yu6b64fe32021-09-01 17:05:13 +0800224 if( ret_ecdhe != 0 && ret_dhe != 0 )
225 {
226 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Both ECDHE and DHE groups are fail. " ) );
227 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
228 }
229
230 /* Length of named_group_list*/
Jerry Yu72fc69b2021-09-10 10:23:24 +0800231 named_group_list_len = p - named_group_list_ptr;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800232 if( named_group_list_len == 0 )
Jerry Yu6b64fe32021-09-01 17:05:13 +0800233 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800234 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No group available." ) );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800235 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
236 }
237
238 /* Write extension_type */
239 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_GROUPS, buf, 0 );
240 /* Write extension_data_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800241 MBEDTLS_PUT_UINT16_BE( named_group_list_len + 2, buf, 2 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800242 /* Write length of named_group_list */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800243 MBEDTLS_PUT_UINT16_BE( named_group_list_len, buf, 4 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800244
Jerry Yub60e3cf2021-09-08 16:41:02 +0800245 MBEDTLS_SSL_DEBUG_BUF( 3, "Supported groups extension", buf + 4, named_group_list_len + 2 );
Jerry Yu6b64fe32021-09-01 17:05:13 +0800246
247 *olen = p - buf;
248
249 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_GROUPS;
250
Jerry Yub60e3cf2021-09-08 16:41:02 +0800251 return( 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +0800252}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800253
Jerry Yu56fc07f2021-09-01 17:48:49 +0800254/*
255 * Functions for writing key_share extension.
256 */
257#if defined(MBEDTLS_ECDH_C)
Jerry Yu7c522d42021-09-08 17:55:09 +0800258static int ssl_tls13_generate_and_write_ecdh_key_exchange(
Jerry Yub60e3cf2021-09-08 16:41:02 +0800259 mbedtls_ssl_context *ssl,
260 uint16_t named_group,
261 unsigned char *buf,
262 unsigned char *end,
263 size_t *olen )
Jerry Yu92c6b402021-08-27 16:59:09 +0800264{
Jerry Yu56fc07f2021-09-01 17:48:49 +0800265 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800266 const mbedtls_ecp_curve_info *curve_info =
267 mbedtls_ecp_curve_info_from_tls_id( named_group );
268
269 if( curve_info == NULL )
270 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
271
272 MBEDTLS_SSL_DEBUG_MSG( 3, ( "offer curve %s", curve_info->name ) );
273
Jerry Yudd1fb9e2021-09-15 11:10:15 +0800274 if( ( ret = mbedtls_ecdh_setup_no_everest( &ssl->handshake->ecdh_ctx,
275 curve_info->grp_id ) ) != 0 )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800276 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800277 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_setup_no_everest", ret );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800278 return( ret );
279 }
280
281 ret = mbedtls_ecdh_tls13_make_params( &ssl->handshake->ecdh_ctx, olen,
282 buf, end - buf,
283 ssl->conf->f_rng, ssl->conf->p_rng );
284 if( ret != 0 )
285 {
286 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_tls13_make_params", ret );
287 return( ret );
288 }
289
290 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
291 MBEDTLS_DEBUG_ECDH_Q );
Jerry Yu75336352021-09-01 15:59:36 +0800292 return( 0 );
Jerry Yu92c6b402021-08-27 16:59:09 +0800293}
Jerry Yu56fc07f2021-09-01 17:48:49 +0800294#endif /* MBEDTLS_ECDH_C */
295
Jerry Yub60e3cf2021-09-08 16:41:02 +0800296static int ssl_tls13_get_default_group_id( mbedtls_ssl_context *ssl,
297 uint16_t *group_id )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800298{
299 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
300
Jerry Yu56fc07f2021-09-01 17:48:49 +0800301
Jerry Yu56fc07f2021-09-01 17:48:49 +0800302#if defined(MBEDTLS_ECDH_C)
Brett Warren14efd332021-10-06 09:32:11 +0100303 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
Jerry Yu388bd0d2021-09-15 18:41:02 +0800304 /* Pick first available ECDHE group compatible with TLS 1.3 */
Brett Warren14efd332021-10-06 09:32:11 +0100305 if( group_list == NULL )
Jerry Yu388bd0d2021-09-15 18:41:02 +0800306 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
307
Brett Warren14efd332021-10-06 09:32:11 +0100308 for ( ; *group_list != 0; group_list++ )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800309 {
310 const mbedtls_ecp_curve_info *info;
Brett Warren14efd332021-10-06 09:32:11 +0100311 info = mbedtls_ecp_curve_info_from_tls_id( *group_list );
Jerry Yu388bd0d2021-09-15 18:41:02 +0800312 if( info != NULL &&
Brett Warren14efd332021-10-06 09:32:11 +0100313 mbedtls_ssl_tls13_named_group_is_ecdhe( *group_list ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800314 {
Brett Warren14efd332021-10-06 09:32:11 +0100315 *group_id = *group_list;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800316 return( 0 );
317 }
318 }
319#else
320 ((void) ssl);
Jerry Yub60e3cf2021-09-08 16:41:02 +0800321 ((void) group_id);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800322#endif /* MBEDTLS_ECDH_C */
323
324 /*
325 * Add DHE named groups here.
Jerry Yu388bd0d2021-09-15 18:41:02 +0800326 * Pick first available DHE group compatible with TLS 1.3
Jerry Yu56fc07f2021-09-01 17:48:49 +0800327 */
328
329 return( ret );
330}
331
332/*
333 * ssl_tls13_write_key_share_ext
334 *
Jerry Yu388bd0d2021-09-15 18:41:02 +0800335 * Structure of key_share extension in ClientHello:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800336 *
337 * struct {
338 * NamedGroup group;
339 * opaque key_exchange<1..2^16-1>;
340 * } KeyShareEntry;
341 * struct {
342 * KeyShareEntry client_shares<0..2^16-1>;
343 * } KeyShareClientHello;
344 */
345static int ssl_tls13_write_key_share_ext( mbedtls_ssl_context *ssl,
346 unsigned char *buf,
347 unsigned char *end,
348 size_t *olen )
349{
350 unsigned char *p = buf;
351 unsigned char *client_shares_ptr; /* Start of client_shares */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800352 size_t client_shares_len; /* Length of client_shares */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800353 uint16_t group_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800354 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
355
356 *olen = 0;
357
358 if( !mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
359 return( 0 );
360
Jerry Yub60e3cf2021-09-08 16:41:02 +0800361 /* Check if we have space for header and length fields:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800362 * - extension_type (2 bytes)
363 * - extension_data_length (2 bytes)
364 * - client_shares_length (2 bytes)
365 */
366 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
367 p += 6;
368
369 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello: adding key share extension" ) );
370
371 /* HRR could already have requested something else. */
372 group_id = ssl->handshake->offered_group_id;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800373 if( !mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) &&
374 !mbedtls_ssl_tls13_named_group_is_dhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800375 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800376 MBEDTLS_SSL_PROC_CHK( ssl_tls13_get_default_group_id( ssl,
Jerry Yu56fc07f2021-09-01 17:48:49 +0800377 &group_id ) );
378 }
379
380 /*
381 * Dispatch to type-specific key generation function.
382 *
383 * So far, we're only supporting ECDHE. With the introduction
384 * of PQC KEMs, we'll want to have multiple branches, one per
385 * type of KEM, and dispatch to the corresponding crypto. And
386 * only one key share entry is allowed.
387 */
388 client_shares_ptr = p;
389#if defined(MBEDTLS_ECDH_C)
Jerry Yub60e3cf2021-09-08 16:41:02 +0800390 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800391 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800392 /* Pointer to group */
393 unsigned char *group_ptr = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800394 /* Length of key_exchange */
395 size_t key_exchange_len;
396
397 /* Check there is space for header of KeyShareEntry
398 * - group (2 bytes)
399 * - key_exchange_length (2 bytes)
400 */
401 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
402 p += 4;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800403 ret = ssl_tls13_generate_and_write_ecdh_key_exchange( ssl, group_id,
404 p, end,
405 &key_exchange_len );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800406 p += key_exchange_len;
407 if( ret != 0 )
408 return( ret );
409
410 /* Write group */
Jerry Yu388bd0d2021-09-15 18:41:02 +0800411 MBEDTLS_PUT_UINT16_BE( group_id, group_ptr, 0 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800412 /* Write key_exchange_length */
Jerry Yu388bd0d2021-09-15 18:41:02 +0800413 MBEDTLS_PUT_UINT16_BE( key_exchange_len, group_ptr, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800414 }
415 else
416#endif /* MBEDTLS_ECDH_C */
417 if( 0 /* other KEMs? */ )
418 {
419 /* Do something */
420 }
421 else
422 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
423
Jerry Yub60e3cf2021-09-08 16:41:02 +0800424 /* Length of client_shares */
425 client_shares_len = p - client_shares_ptr;
426 if( client_shares_len == 0)
427 {
428 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No key share defined." ) );
429 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu7c522d42021-09-08 17:55:09 +0800430 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800431 /* Write extension_type */
432 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0 );
433 /* Write extension_data_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800434 MBEDTLS_PUT_UINT16_BE( client_shares_len + 2, buf, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800435 /* Write client_shares_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800436 MBEDTLS_PUT_UINT16_BE( client_shares_len, buf, 4 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800437
438 /* Update offered_group_id field */
439 ssl->handshake->offered_group_id = group_id;
440
441 /* Output the total length of key_share extension. */
442 *olen = p - buf;
443
444 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, key_share extension", buf, *olen );
445
446 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_KEY_SHARE;
447
448cleanup:
449
450 return( ret );
451}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800452
453#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
454
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800455/* Write cipher_suites
Jerry Yu6a643102021-08-31 14:40:36 +0800456 * CipherSuite cipher_suites<2..2^16-2>;
457 */
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800458static int ssl_tls13_write_client_hello_cipher_suites(
Jerry Yu6a643102021-08-31 14:40:36 +0800459 mbedtls_ssl_context *ssl,
460 unsigned char *buf,
461 unsigned char *end,
462 size_t *olen )
463{
Jerry Yufec982e2021-09-07 17:26:06 +0800464 unsigned char *p = buf;
Jerry Yu0c63af62021-09-02 12:59:12 +0800465 const int *ciphersuite_list;
Jerry Yubbe09522021-09-06 21:17:54 +0800466 unsigned char *cipher_suites_ptr; /* Start of the cipher_suites list */
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800467 size_t cipher_suites_len;
Jerry Yu92c6b402021-08-27 16:59:09 +0800468
Jerry Yu6a643102021-08-31 14:40:36 +0800469 *olen = 0 ;
470
471 /*
472 * Ciphersuite list
473 *
474 * This is a list of the symmetric cipher options supported by
475 * the client, specifically the record protection algorithm
476 * ( including secret key length ) and a hash to be used with
477 * HKDF, in descending order of client preference.
478 */
Jerry Yu0c63af62021-09-02 12:59:12 +0800479 ciphersuite_list = ssl->conf->ciphersuite_list;
Jerry Yu6a643102021-08-31 14:40:36 +0800480
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800481 /* Check there is space for the cipher suite list length (2 bytes). */
Jerry Yu4e388282021-09-06 21:28:08 +0800482 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
483 p += 2;
Jerry Yu6a643102021-08-31 14:40:36 +0800484
Jerry Yu0c63af62021-09-02 12:59:12 +0800485 /* Write cipher_suites */
Jerry Yu4e388282021-09-06 21:28:08 +0800486 cipher_suites_ptr = p;
Jerry Yu0c63af62021-09-02 12:59:12 +0800487 for ( size_t i = 0; ciphersuite_list[i] != 0; i++ )
Jerry Yu6a643102021-08-31 14:40:36 +0800488 {
Jerry Yu0c63af62021-09-02 12:59:12 +0800489 int cipher_suite = ciphersuite_list[i];
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800490 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu6a643102021-08-31 14:40:36 +0800491
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800492 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
Jerry Yu6a643102021-08-31 14:40:36 +0800493 if( ciphersuite_info == NULL )
494 continue;
Jerry Yudbfb7bd2021-09-04 09:58:58 +0800495 if( !( MBEDTLS_SSL_MINOR_VERSION_4 >= ciphersuite_info->min_minor_ver &&
496 MBEDTLS_SSL_MINOR_VERSION_4 <= ciphersuite_info->max_minor_ver ) )
Jerry Yu6a643102021-08-31 14:40:36 +0800497 continue;
498
499 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x, %s",
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800500 (unsigned int) cipher_suite,
Jerry Yu6a643102021-08-31 14:40:36 +0800501 ciphersuite_info->name ) );
502
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800503 /* Check there is space for the cipher suite identifier (2 bytes). */
Jerry Yubbe09522021-09-06 21:17:54 +0800504 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
505 MBEDTLS_PUT_UINT16_BE( cipher_suite, p, 0 );
506 p += 2;
Jerry Yu6a643102021-08-31 14:40:36 +0800507 }
508
Jerry Yu0c63af62021-09-02 12:59:12 +0800509 /* Write the cipher_suites length in number of bytes */
Jerry Yubbe09522021-09-06 21:17:54 +0800510 cipher_suites_len = p - cipher_suites_ptr;
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800511 MBEDTLS_PUT_UINT16_BE( cipher_suites_len, buf, 0 );
Jerry Yu6a643102021-08-31 14:40:36 +0800512 MBEDTLS_SSL_DEBUG_MSG( 3,
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800513 ( "client hello, got %" MBEDTLS_PRINTF_SIZET " cipher suites",
514 cipher_suites_len/2 ) );
Jerry Yu6a643102021-08-31 14:40:36 +0800515
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800516 /* Output the total length of cipher_suites field. */
Jerry Yubbe09522021-09-06 21:17:54 +0800517 *olen = p - buf;
Jerry Yuf171e832021-08-31 18:31:09 +0800518
Jerry Yu6a643102021-08-31 14:40:36 +0800519 return( 0 );
520}
521
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800522/*
523 * Structure of ClientHello message:
524 *
525 * struct {
526 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
527 * Random random;
528 * opaque legacy_session_id<0..32>;
529 * CipherSuite cipher_suites<2..2^16-2>;
530 * opaque legacy_compression_methods<1..2^8-1>;
531 * Extension extensions<8..2^16-1>;
532 * } ClientHello;
533 */
Jerry Yu08906d02021-08-31 11:05:27 +0800534static int ssl_tls13_write_client_hello_body( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +0800535 unsigned char *buf,
Jerry Yuef387d72021-09-02 13:59:41 +0800536 unsigned char *end,
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800537 size_t *olen )
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800538{
Jerry Yubc20bdd2021-08-24 15:59:48 +0800539
Jerry Yubc20bdd2021-08-24 15:59:48 +0800540 int ret;
Jerry Yu8c02bb42021-09-03 21:09:22 +0800541 unsigned char *extensions_len_ptr; /* Pointer to extensions length */
Jerry Yu790656a2021-09-01 15:51:48 +0800542 size_t output_len; /* Length of buffer used by function */
543 size_t extensions_len; /* Length of the list of extensions*/
Jerry Yubc20bdd2021-08-24 15:59:48 +0800544
Jerry Yubc20bdd2021-08-24 15:59:48 +0800545 /* Buffer management */
Jerry Yubbe09522021-09-06 21:17:54 +0800546 unsigned char *p = buf;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800547
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800548 *olen = 0;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800549
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800550 /* No validation needed here. It has been done by ssl_conf_check() */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800551 ssl->major_ver = ssl->conf->min_major_ver;
552 ssl->minor_ver = ssl->conf->min_minor_ver;
553
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800554 /*
555 * Write legacy_version
Jerry Yu6a643102021-08-31 14:40:36 +0800556 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800557 *
558 * For TLS 1.3 we use the legacy version number {0x03, 0x03}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800559 * instead of the true version number.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800560 */
Jerry Yufec982e2021-09-07 17:26:06 +0800561 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yubbe09522021-09-06 21:17:54 +0800562 MBEDTLS_PUT_UINT16_BE( 0x0303, p, 0 );
Jerry Yufec982e2021-09-07 17:26:06 +0800563 p += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800564
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800565 /* Write the random bytes ( random ).*/
Jerry Yubbe09522021-09-06 21:17:54 +0800566 MBEDTLS_SSL_CHK_BUF_PTR( p, end, CLIENT_HELLO_RANDOM_LEN );
567 memcpy( p, ssl->handshake->randbytes, CLIENT_HELLO_RANDOM_LEN );
Jerry Yue885b762021-08-26 17:32:34 +0800568 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes",
Jerry Yubbe09522021-09-06 21:17:54 +0800569 p, CLIENT_HELLO_RANDOM_LEN );
570 p += CLIENT_HELLO_RANDOM_LEN;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800571
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800572 /*
573 * Write legacy_session_id
574 *
575 * Versions of TLS before TLS 1.3 supported a "session resumption" feature
576 * which has been merged with pre-shared keys in this version. A client
577 * which has a cached session ID set by a pre-TLS 1.3 server SHOULD set
578 * this field to that value. In compatibility mode, this field MUST be
579 * non-empty, so a client not offering a pre-TLS 1.3 session MUST generate
580 * a new 32-byte value. This value need not be random but SHOULD be
581 * unpredictable to avoid implementations fixating on a specific value
582 * ( also known as ossification ). Otherwise, it MUST be set as a zero-length
583 * vector ( i.e., a zero-valued single byte length field ).
Jerry Yubc20bdd2021-08-24 15:59:48 +0800584 */
Jerry Yubbe09522021-09-06 21:17:54 +0800585 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
586 *p++ = 0; /* session id length set to zero */
Jerry Yubc20bdd2021-08-24 15:59:48 +0800587
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800588 /* Write cipher_suites */
Jerry Yubbe09522021-09-06 21:17:54 +0800589 ret = ssl_tls13_write_client_hello_cipher_suites( ssl, p, end, &output_len );
Jerry Yudbfb7bd2021-09-04 09:58:58 +0800590 if( ret != 0 )
Jerry Yu6a643102021-08-31 14:40:36 +0800591 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800592 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800593
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800594 /* Write legacy_compression_methods
595 *
596 * For every TLS 1.3 ClientHello, this vector MUST contain exactly
Jerry Yubc20bdd2021-08-24 15:59:48 +0800597 * one byte set to zero, which corresponds to the 'null' compression
598 * method in prior versions of TLS.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800599 */
Jerry Yubbe09522021-09-06 21:17:54 +0800600 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
601 *p++ = 1;
602 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800603
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800604 /* Write extensions */
605
606 /* Keeping track of the included extensions */
607 ssl->handshake->extensions_present = MBEDTLS_SSL_EXT_NONE;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800608
609 /* First write extensions, then the total length */
Jerry Yubbe09522021-09-06 21:17:54 +0800610 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
611 extensions_len_ptr = p;
612 p += 2;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800613
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800614 /* Write supported_versions extension
Jerry Yubc20bdd2021-08-24 15:59:48 +0800615 *
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800616 * Supported Versions Extension is mandatory with TLS 1.3.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800617 */
Jerry Yubbe09522021-09-06 21:17:54 +0800618 ret = ssl_tls13_write_supported_versions_ext( ssl, p, end, &output_len );
Jerry Yu92c6b402021-08-27 16:59:09 +0800619 if( ret != 0 )
620 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800621 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800622
623#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800624 /* Write supported_groups extension
625 *
626 * It is REQUIRED for ECDHE cipher_suites.
Jerry Yubc20bdd2021-08-24 15:59:48 +0800627 */
Jerry Yubbe09522021-09-06 21:17:54 +0800628 ret = ssl_tls13_write_supported_groups_ext( ssl, p, end, &output_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800629 if( ret != 0 )
630 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800631 p += output_len;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800632
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800633 /* Write key_share extension
634 *
635 * We need to send the key shares under three conditions:
Jerry Yu159c5a02021-08-31 12:51:25 +0800636 * 1) A certificate-based ciphersuite is being offered. In this case
637 * supported_groups and supported_signature extensions have been
638 * successfully added.
639 * 2) A PSK-based ciphersuite with ECDHE is offered. In this case the
Jerry Yubc20bdd2021-08-24 15:59:48 +0800640 * psk_key_exchange_modes has been added as the last extension.
Jerry Yu159c5a02021-08-31 12:51:25 +0800641 * 3) Or, in case all ciphers are supported ( which includes #1 and #2
642 * from above )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800643 */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800644 ret = ssl_tls13_write_key_share_ext( ssl, p, end, &output_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800645 if( ret != 0 )
646 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800647 p += output_len;
Jerry Yu6a643102021-08-31 14:40:36 +0800648
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800649 /* Write signature_algorithms extension
650 *
651 * It is REQUIRED for certificate authenticated cipher_suites.
652 */
Jerry Yubbe09522021-09-06 21:17:54 +0800653 ret = mbedtls_ssl_tls13_write_sig_alg_ext( ssl, p, end, &output_len );
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800654 if( ret != 0 )
655 return( ret );
Jerry Yubbe09522021-09-06 21:17:54 +0800656 p += output_len;
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800657
Jerry Yubc20bdd2021-08-24 15:59:48 +0800658#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
659
660 /* Add more extensions here */
661
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800662 /* Write the length of the list of extensions. */
Jerry Yubbe09522021-09-06 21:17:54 +0800663 extensions_len = p - extensions_len_ptr - 2;
Jerry Yu790656a2021-09-01 15:51:48 +0800664 MBEDTLS_PUT_UINT16_BE( extensions_len, extensions_len_ptr, 0 );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800665 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %" MBEDTLS_PRINTF_SIZET ,
Jerry Yu790656a2021-09-01 15:51:48 +0800666 extensions_len ) );
667 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", extensions_len_ptr, extensions_len );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800668
Jerry Yubbe09522021-09-06 21:17:54 +0800669 *olen = p - buf;
Jerry Yubc20bdd2021-08-24 15:59:48 +0800670 return( 0 );
671}
672
Jerry Yu335aca92021-09-12 20:18:56 +0800673static int ssl_tls13_finalize_client_hello( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800674{
Jerry Yu92c6b402021-08-27 16:59:09 +0800675 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_HELLO );
676 return( 0 );
677}
Jerry Yuef6b36b2021-08-24 16:29:02 +0800678
Jerry Yu92c6b402021-08-27 16:59:09 +0800679static int ssl_tls13_prepare_client_hello( mbedtls_ssl_context *ssl )
680{
681 int ret;
Jerry Yuef6b36b2021-08-24 16:29:02 +0800682
Jerry Yu92c6b402021-08-27 16:59:09 +0800683 if( ssl->conf->f_rng == NULL )
684 {
685 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided" ) );
686 return( MBEDTLS_ERR_SSL_NO_RNG );
687 }
Jerry Yuef6b36b2021-08-24 16:29:02 +0800688
Jerry Yu92c6b402021-08-27 16:59:09 +0800689 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng,
690 ssl->handshake->randbytes,
Jerry Yu08906d02021-08-31 11:05:27 +0800691 CLIENT_HELLO_RANDOM_LEN ) ) != 0 )
Jerry Yu92c6b402021-08-27 16:59:09 +0800692 {
Jerry Yu8c02bb42021-09-03 21:09:22 +0800693 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Jerry Yu92c6b402021-08-27 16:59:09 +0800694 return( ret );
695 }
Jerry Yu6f13f642021-08-26 17:18:15 +0800696
697 return( 0 );
Jerry Yubc20bdd2021-08-24 15:59:48 +0800698}
699
Jerry Yu92c6b402021-08-27 16:59:09 +0800700/*
Jerry Yu159c5a02021-08-31 12:51:25 +0800701 * Write ClientHello handshake message.
Jerry Yu687101b2021-09-14 16:03:56 +0800702 * Handler for MBEDTLS_SSL_CLIENT_HELLO
Jerry Yu92c6b402021-08-27 16:59:09 +0800703 */
704static int ssl_tls13_write_client_hello( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800705{
Jerry Yu92c6b402021-08-27 16:59:09 +0800706 int ret = 0;
707 unsigned char *buf;
708 size_t buf_len, msg_len;
709
710 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
711
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800712 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_client_hello( ssl ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800713
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800714 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg(
715 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
716 &buf, &buf_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800717
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800718 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_client_hello_body( ssl, buf,
Jerry Yuef387d72021-09-02 13:59:41 +0800719 buf + buf_len,
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800720 &msg_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800721
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800722 mbedtls_ssl_tls13_add_hs_hdr_to_checksum( ssl,
723 MBEDTLS_SSL_HS_CLIENT_HELLO,
Jerry Yu0c63af62021-09-02 12:59:12 +0800724 msg_len );
725 ssl->handshake->update_checksum( ssl, buf, msg_len );
Jerry Yu92c6b402021-08-27 16:59:09 +0800726
Jerry Yu2c0fbf32021-09-02 13:53:46 +0800727 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_client_hello( ssl ) );
728 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg( ssl,
729 buf_len,
730 msg_len ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800731
732cleanup:
733
734 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
735 return ret;
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800736}
737
Jerry Yu687101b2021-09-14 16:03:56 +0800738/*
739 * Handler for MBEDTLS_SSL_SERVER_HELLO
740 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800741static int ssl_tls1_3_process_server_hello( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800742{
743 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
744 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
745 return( 0 );
746}
747
748/*
749 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
750 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800751static int ssl_tls1_3_process_encrypted_extensions( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800752{
753 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
754 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST );
755 return( 0 );
756}
757
758/*
759 * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST
760 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800761static int ssl_tls1_3_process_certificate_request( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800762{
763 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
764 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_CERTIFICATE );
765 return( 0 );
766}
767
768/*
769 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
770 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800771static int ssl_tls1_3_process_server_certificate( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800772{
773 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
774 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY );
775 return( 0 );
776}
777
778/*
779 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
780 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800781static int ssl_tls1_3_process_certificate_verify( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800782{
783 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
784 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
785 return( 0 );
786}
787
788/*
789 * Handler for MBEDTLS_SSL_SERVER_FINISHED
790 */
Jerry Yu860b4ee2021-09-27 13:16:13 +0800791static int ssl_tls1_3_process_server_finished( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +0800792{
Jerry Yu687101b2021-09-14 16:03:56 +0800793 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yu435756f2021-09-24 13:44:29 +0800794 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
Jerry Yu687101b2021-09-14 16:03:56 +0800795 return( 0 );
796}
797
798/*
799 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE
800 */
801static int ssl_tls1_3_write_client_certificate( mbedtls_ssl_context *ssl )
802{
Jerry Yu687101b2021-09-14 16:03:56 +0800803 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yuad8d0ba2021-09-28 17:58:26 +0800804 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY );
Jerry Yu687101b2021-09-14 16:03:56 +0800805 return( 0 );
806}
807
808/*
809 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY
810 */
811static int ssl_tls1_3_write_client_certificate_verify( mbedtls_ssl_context *ssl )
812{
Jerry Yu687101b2021-09-14 16:03:56 +0800813 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yuad8d0ba2021-09-28 17:58:26 +0800814 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Jerry Yu687101b2021-09-14 16:03:56 +0800815 return( 0 );
816}
817
818/*
819 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
820 */
821static int ssl_tls1_3_write_client_finished( mbedtls_ssl_context *ssl )
822{
Jerry Yu687101b2021-09-14 16:03:56 +0800823 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yuad8d0ba2021-09-28 17:58:26 +0800824 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_FLUSH_BUFFERS );
Jerry Yu687101b2021-09-14 16:03:56 +0800825 return( 0 );
826}
827
828/*
829 * Handler for MBEDTLS_SSL_FLUSH_BUFFERS
830 */
831static int ssl_tls1_3_flush_buffers( mbedtls_ssl_context *ssl )
832{
Jerry Yu687101b2021-09-14 16:03:56 +0800833 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
Jerry Yuad8d0ba2021-09-28 17:58:26 +0800834 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP );
Jerry Yu687101b2021-09-14 16:03:56 +0800835 return( 0 );
836}
837
838/*
839 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
840 */
841static int ssl_tls1_3_handshake_wrapup( mbedtls_ssl_context *ssl )
842{
843 ((void) ssl);
844 MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) );
845 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
846}
847
Jerry Yu92c6b402021-08-27 16:59:09 +0800848int mbedtls_ssl_tls13_handshake_client_step( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +0800849{
Jerry Yu92c6b402021-08-27 16:59:09 +0800850 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +0800851
Jerry Yu6e81b272021-09-27 11:16:17 +0800852 MBEDTLS_SSL_DEBUG_MSG( 2, ( "tls1_3 client state: %d", ssl->state ) );
Jerry Yu92c6b402021-08-27 16:59:09 +0800853
854 switch( ssl->state )
855 {
856 /*
Jerry Yu0c63af62021-09-02 12:59:12 +0800857 * ssl->state is initialized as HELLO_REQUEST. It is the same
858 * as CLIENT_HELLO state.
Jerry Yu92c6b402021-08-27 16:59:09 +0800859 */
860 case MBEDTLS_SSL_HELLO_REQUEST:
861 case MBEDTLS_SSL_CLIENT_HELLO:
862 ret = ssl_tls13_write_client_hello( ssl );
863 break;
864
865 case MBEDTLS_SSL_SERVER_HELLO:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800866 ret = ssl_tls1_3_process_server_hello( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800867 break;
868
869 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800870 ret = ssl_tls1_3_process_encrypted_extensions( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800871 break;
872
873 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800874 ret = ssl_tls1_3_process_certificate_request( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800875 break;
876
877 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800878 ret = ssl_tls1_3_process_server_certificate( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800879 break;
880
881 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800882 ret = ssl_tls1_3_process_certificate_verify( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800883 break;
884
885 case MBEDTLS_SSL_SERVER_FINISHED:
Jerry Yu860b4ee2021-09-27 13:16:13 +0800886 ret = ssl_tls1_3_process_server_finished( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +0800887 break;
888
889 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
890 ret = ssl_tls1_3_write_client_certificate( ssl );
891 break;
892
893 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
894 ret = ssl_tls1_3_write_client_certificate_verify( ssl );
895 break;
896
897 case MBEDTLS_SSL_CLIENT_FINISHED:
898 ret = ssl_tls1_3_write_client_finished( ssl );
899 break;
900
901 case MBEDTLS_SSL_FLUSH_BUFFERS:
902 ret = ssl_tls1_3_flush_buffers( ssl );
903 break;
904
905 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
906 ret = ssl_tls1_3_handshake_wrapup( ssl );
Jerry Yu92c6b402021-08-27 16:59:09 +0800907 break;
908
909 default:
910 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
911 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
912 }
913
914 return( ret );
915}
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800916
Jerry Yu3cc4c2a2021-08-06 16:29:08 +0800917#endif /* MBEDTLS_SSL_CLI_C */
918
919#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */