blob: 025183d4429daab230b76f1b78ccf101158bcb74 [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
Jerry Yucc43c6b2022-01-28 10:24:45 +080024#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080025
Jerry Yubc20bdd2021-08-24 15:59:48 +080026#include <string.h>
27
Jerry Yu56fc07f2021-09-01 17:48:49 +080028#include "mbedtls/debug.h"
29#include "mbedtls/error.h"
Jerry Yue1b9c292021-09-10 10:08:31 +080030#include "mbedtls/platform.h"
Jerry Yua13c7e72021-08-17 10:44:40 +080031
Jerry Yubdc71882021-09-14 19:30:36 +080032#include "ssl_misc.h"
Ronald Cron3d580bf2022-02-18 17:24:56 +010033#include "ssl_client.h"
Jerry Yue1b9c292021-09-10 10:08:31 +080034#include "ssl_tls13_keys.h"
Jerry Yucbd082f2022-08-04 16:55:10 +080035#include "ssl_debug_helpers.h"
Jerry Yubdc71882021-09-14 19:30:36 +080036
Jerry Yubc20bdd2021-08-24 15:59:48 +080037/* Write extensions */
38
Jerry Yu92c6b402021-08-27 16:59:09 +080039/*
40 * ssl_tls13_write_supported_versions_ext():
41 *
42 * struct {
43 * ProtocolVersion versions<2..254>;
44 * } SupportedVersions;
45 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020046MBEDTLS_CHECK_RETURN_CRITICAL
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,
Xiaofei Baid25fab62021-12-02 06:36:27 +000050 size_t *out_len )
Jerry Yu92c6b402021-08-27 16:59:09 +080051{
52 unsigned char *p = buf;
Glenn Strausscd78df62022-04-07 19:07:11 -040053 unsigned char versions_len = ( ssl->handshake->min_tls_version <=
54 MBEDTLS_SSL_VERSION_TLS1_2 ) ? 4 : 2;
Jerry Yu92c6b402021-08-27 16:59:09 +080055
Xiaofei Baid25fab62021-12-02 06:36:27 +000056 *out_len = 0;
Jerry Yu92c6b402021-08-27 16:59:09 +080057
Jerry Yu159c5a02021-08-31 12:51:25 +080058 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported versions extension" ) );
Jerry Yu92c6b402021-08-27 16:59:09 +080059
Jerry Yu388bd0d2021-09-15 18:41:02 +080060 /* Check if we have space to write the extension:
Jerry Yub60e3cf2021-09-08 16:41:02 +080061 * - extension_type (2 bytes)
62 * - extension_data_length (2 bytes)
63 * - versions_length (1 byte )
Ronald Crona77fc272022-03-30 17:20:47 +020064 * - versions (2 or 4 bytes)
Jerry Yu159c5a02021-08-31 12:51:25 +080065 */
Ronald Crona77fc272022-03-30 17:20:47 +020066 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 + versions_len );
Ronald Crondbe87f02022-02-10 14:35:27 +010067
Jerry Yueecfbf02021-08-30 18:32:07 +080068 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0 );
Ronald Crondbe87f02022-02-10 14:35:27 +010069 MBEDTLS_PUT_UINT16_BE( versions_len + 1, p, 2 );
Jerry Yueecfbf02021-08-30 18:32:07 +080070 p += 4;
Jerry Yu92c6b402021-08-27 16:59:09 +080071
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080072 /* Length of versions */
Ronald Crondbe87f02022-02-10 14:35:27 +010073 *p++ = versions_len;
Jerry Yu92c6b402021-08-27 16:59:09 +080074
Jerry Yu0c63af62021-09-02 12:59:12 +080075 /* Write values of supported versions.
Jerry Yu0c63af62021-09-02 12:59:12 +080076 * They are defined by the configuration.
Ronald Crondbe87f02022-02-10 14:35:27 +010077 * Currently, we advertise only TLS 1.3 or both TLS 1.3 and TLS 1.2.
Jerry Yu92c6b402021-08-27 16:59:09 +080078 */
Glenn Strausse3af4cb2022-03-15 03:23:42 -040079 mbedtls_ssl_write_version( p, MBEDTLS_SSL_TRANSPORT_STREAM,
80 MBEDTLS_SSL_VERSION_TLS1_3 );
Ronald Crondbe87f02022-02-10 14:35:27 +010081 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [3:4]" ) );
Jerry Yu92c6b402021-08-27 16:59:09 +080082
Jerry Yu92c6b402021-08-27 16:59:09 +080083
Glenn Strausscd78df62022-04-07 19:07:11 -040084 if( ssl->handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2 )
Ronald Crondbe87f02022-02-10 14:35:27 +010085 {
Glenn Strausse3af4cb2022-03-15 03:23:42 -040086 mbedtls_ssl_write_version( p + 2, MBEDTLS_SSL_TRANSPORT_STREAM,
87 MBEDTLS_SSL_VERSION_TLS1_2 );
Ronald Crondbe87f02022-02-10 14:35:27 +010088 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [3:3]" ) );
89 }
90
91 *out_len = 5 + versions_len;
Jerry Yu4b8f2f72022-10-31 13:31:22 +080092
Jerry Yuc4bf5d62022-10-29 09:08:47 +080093 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
94 ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS );
Jerry Yu4b8f2f72022-10-31 13:31:22 +080095
Jerry Yu92c6b402021-08-27 16:59:09 +080096 return( 0 );
97}
Jerry Yubc20bdd2021-08-24 15:59:48 +080098
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020099MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc068b662021-10-11 22:30:19 +0800100static int ssl_tls13_parse_supported_versions_ext( mbedtls_ssl_context *ssl,
101 const unsigned char *buf,
Jerry Yub85277e2021-10-13 13:36:05 +0800102 const unsigned char *end )
Jerry Yue1b9c292021-09-10 10:08:31 +0800103{
Jerry Yue1b9c292021-09-10 10:08:31 +0800104 ((void) ssl);
105
Ronald Cron98473382022-03-30 20:04:10 +0200106 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end, 2 );
Glenn Strausse3af4cb2022-03-15 03:23:42 -0400107 if( mbedtls_ssl_read_version( buf, ssl->conf->transport ) !=
108 MBEDTLS_SSL_VERSION_TLS1_3 )
Jerry Yue1b9c292021-09-10 10:08:31 +0800109 {
110 MBEDTLS_SSL_DEBUG_MSG( 1, ( "unexpected version" ) );
Jerry Yu4a173382021-10-11 21:45:31 +0800111
112 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
113 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
114 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Jerry Yue1b9c292021-09-10 10:08:31 +0800115 }
116
Ronald Cron98473382022-03-30 20:04:10 +0200117 if( &buf[2] != end )
118 {
119 MBEDTLS_SSL_DEBUG_MSG( 1, ( "supported_versions ext data length incorrect" ) );
120 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
121 MBEDTLS_ERR_SSL_DECODE_ERROR );
122 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
123 }
124
Jerry Yue1b9c292021-09-10 10:08:31 +0800125 return( 0 );
126}
127
lhuang0486cacac2022-01-21 07:34:27 -0800128#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200129MBEDTLS_CHECK_RETURN_CRITICAL
lhuang0486cacac2022-01-21 07:34:27 -0800130static int ssl_tls13_parse_alpn_ext( mbedtls_ssl_context *ssl,
Ronald Cron81a334f2022-05-31 16:04:11 +0200131 const unsigned char *buf, size_t len )
lhuang0486cacac2022-01-21 07:34:27 -0800132{
lhuang0486cacac2022-01-21 07:34:27 -0800133 const unsigned char *p = buf;
134 const unsigned char *end = buf + len;
Ronald Cron81a334f2022-05-31 16:04:11 +0200135 size_t protocol_name_list_len, protocol_name_len;
136 const unsigned char *protocol_name_list_end;
lhuang0486cacac2022-01-21 07:34:27 -0800137
138 /* If we didn't send it, the server shouldn't send it */
139 if( ssl->conf->alpn_list == NULL )
140 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
141
142 /*
143 * opaque ProtocolName<1..2^8-1>;
144 *
145 * struct {
146 * ProtocolName protocol_name_list<2..2^16-1>
147 * } ProtocolNameList;
148 *
149 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
150 */
151
Ronald Cron81a334f2022-05-31 16:04:11 +0200152 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
153 protocol_name_list_len = MBEDTLS_GET_UINT16_BE( p, 0 );
lhuang0486cacac2022-01-21 07:34:27 -0800154 p += 2;
lhuang0486cacac2022-01-21 07:34:27 -0800155
Ronald Cron81a334f2022-05-31 16:04:11 +0200156 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, protocol_name_list_len );
157 protocol_name_list_end = p + protocol_name_list_len;
158
159 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, protocol_name_list_end, 1 );
160 protocol_name_len = *p++;
lhuang0486cacac2022-01-21 07:34:27 -0800161
162 /* Check that the server chosen protocol was in our list and save it */
Ronald Cron81a334f2022-05-31 16:04:11 +0200163 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, protocol_name_list_end, protocol_name_len );
164 for( const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++ )
lhuang0486cacac2022-01-21 07:34:27 -0800165 {
Ronald Cron81a334f2022-05-31 16:04:11 +0200166 if( protocol_name_len == strlen( *alpn ) &&
167 memcmp( p, *alpn, protocol_name_len ) == 0 )
lhuang0486cacac2022-01-21 07:34:27 -0800168 {
169 ssl->alpn_chosen = *alpn;
170 return( 0 );
171 }
172 }
173
174 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
175}
176#endif /* MBEDTLS_SSL_ALPN */
177
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200178MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian16acd4b2022-01-14 07:35:47 +0000179static int ssl_tls13_reset_key_share( mbedtls_ssl_context *ssl )
XiaokangQian647719a2021-12-07 09:16:29 +0000180{
181 uint16_t group_id = ssl->handshake->offered_group_id;
Ronald Cron5b98ac92022-03-15 10:19:18 +0100182
XiaokangQian647719a2021-12-07 09:16:29 +0000183 if( group_id == 0 )
184 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
185
XiaokangQian355e09a2022-01-20 11:14:50 +0000186#if defined(MBEDTLS_ECDH_C)
XiaokangQian647719a2021-12-07 09:16:29 +0000187 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) )
XiaokangQian78b1fa72022-01-19 06:56:30 +0000188 {
Ronald Cron5b98ac92022-03-15 10:19:18 +0100189 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
190 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
191
192 /* Destroy generated private key. */
193 status = psa_destroy_key( ssl->handshake->ecdh_psa_privkey );
194 if( status != PSA_SUCCESS )
195 {
196 ret = psa_ssl_status_to_mbedtls( status );
197 MBEDTLS_SSL_DEBUG_RET( 1, "psa_destroy_key", ret );
198 return( ret );
199 }
200
201 ssl->handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
XiaokangQian78b1fa72022-01-19 06:56:30 +0000202 return( 0 );
203 }
XiaokangQian355e09a2022-01-20 11:14:50 +0000204 else
205#endif /* MBEDTLS_ECDH_C */
206 if( 0 /* other KEMs? */ )
XiaokangQian647719a2021-12-07 09:16:29 +0000207 {
208 /* Do something */
209 }
210
211 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
212}
213
214/*
Jerry Yu56fc07f2021-09-01 17:48:49 +0800215 * Functions for writing key_share extension.
216 */
Ronald Cron766c0cd2022-10-18 12:17:11 +0200217#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200218MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yub60e3cf2021-09-08 16:41:02 +0800219static int ssl_tls13_get_default_group_id( mbedtls_ssl_context *ssl,
220 uint16_t *group_id )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800221{
222 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
223
Jerry Yu56fc07f2021-09-01 17:48:49 +0800224
Jerry Yu56fc07f2021-09-01 17:48:49 +0800225#if defined(MBEDTLS_ECDH_C)
Brett Warren14efd332021-10-06 09:32:11 +0100226 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
Jerry Yu388bd0d2021-09-15 18:41:02 +0800227 /* Pick first available ECDHE group compatible with TLS 1.3 */
Brett Warren14efd332021-10-06 09:32:11 +0100228 if( group_list == NULL )
Jerry Yu388bd0d2021-09-15 18:41:02 +0800229 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
230
Brett Warren14efd332021-10-06 09:32:11 +0100231 for ( ; *group_list != 0; group_list++ )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800232 {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100233 if( ( mbedtls_ssl_get_psa_curve_info_from_tls_id( *group_list,
234 NULL, NULL ) == PSA_SUCCESS ) &&
Brett Warren14efd332021-10-06 09:32:11 +0100235 mbedtls_ssl_tls13_named_group_is_ecdhe( *group_list ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800236 {
Brett Warren14efd332021-10-06 09:32:11 +0100237 *group_id = *group_list;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800238 return( 0 );
239 }
240 }
241#else
242 ((void) ssl);
Jerry Yub60e3cf2021-09-08 16:41:02 +0800243 ((void) group_id);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800244#endif /* MBEDTLS_ECDH_C */
245
246 /*
247 * Add DHE named groups here.
Jerry Yu388bd0d2021-09-15 18:41:02 +0800248 * Pick first available DHE group compatible with TLS 1.3
Jerry Yu56fc07f2021-09-01 17:48:49 +0800249 */
250
251 return( ret );
252}
253
254/*
255 * ssl_tls13_write_key_share_ext
256 *
Jerry Yu388bd0d2021-09-15 18:41:02 +0800257 * Structure of key_share extension in ClientHello:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800258 *
259 * struct {
260 * NamedGroup group;
261 * opaque key_exchange<1..2^16-1>;
262 * } KeyShareEntry;
263 * struct {
264 * KeyShareEntry client_shares<0..2^16-1>;
265 * } KeyShareClientHello;
266 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200267MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu56fc07f2021-09-01 17:48:49 +0800268static int ssl_tls13_write_key_share_ext( mbedtls_ssl_context *ssl,
269 unsigned char *buf,
270 unsigned char *end,
Xiaofei Baid25fab62021-12-02 06:36:27 +0000271 size_t *out_len )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800272{
273 unsigned char *p = buf;
Xiaofei Baieef15042021-11-18 07:29:56 +0000274 unsigned char *client_shares; /* Start of client_shares */
275 size_t client_shares_len; /* Length of client_shares */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800276 uint16_t group_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800277 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
278
Xiaofei Baid25fab62021-12-02 06:36:27 +0000279 *out_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800280
Jerry Yub60e3cf2021-09-08 16:41:02 +0800281 /* Check if we have space for header and length fields:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800282 * - extension_type (2 bytes)
283 * - extension_data_length (2 bytes)
284 * - client_shares_length (2 bytes)
285 */
286 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
287 p += 6;
288
289 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello: adding key share extension" ) );
290
291 /* HRR could already have requested something else. */
292 group_id = ssl->handshake->offered_group_id;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800293 if( !mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) &&
294 !mbedtls_ssl_tls13_named_group_is_dhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800295 {
Jerry Yub60e3cf2021-09-08 16:41:02 +0800296 MBEDTLS_SSL_PROC_CHK( ssl_tls13_get_default_group_id( ssl,
Jerry Yu56fc07f2021-09-01 17:48:49 +0800297 &group_id ) );
298 }
299
300 /*
301 * Dispatch to type-specific key generation function.
302 *
303 * So far, we're only supporting ECDHE. With the introduction
304 * of PQC KEMs, we'll want to have multiple branches, one per
305 * type of KEM, and dispatch to the corresponding crypto. And
306 * only one key share entry is allowed.
307 */
Xiaofei Baieef15042021-11-18 07:29:56 +0000308 client_shares = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800309#if defined(MBEDTLS_ECDH_C)
Jerry Yub60e3cf2021-09-08 16:41:02 +0800310 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group_id ) )
Jerry Yu56fc07f2021-09-01 17:48:49 +0800311 {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800312 /* Pointer to group */
Xiaofei Baieef15042021-11-18 07:29:56 +0000313 unsigned char *group = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800314 /* Length of key_exchange */
Przemyslaw Stekiel4f419e52022-02-10 15:56:26 +0100315 size_t key_exchange_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800316
317 /* Check there is space for header of KeyShareEntry
318 * - group (2 bytes)
319 * - key_exchange_length (2 bytes)
320 */
321 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
322 p += 4;
Jerry Yu89e103c2022-03-30 22:43:29 +0800323 ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
324 ssl, group_id, p, end, &key_exchange_len );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800325 p += key_exchange_len;
326 if( ret != 0 )
327 return( ret );
328
329 /* Write group */
Xiaofei Baieef15042021-11-18 07:29:56 +0000330 MBEDTLS_PUT_UINT16_BE( group_id, group, 0 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800331 /* Write key_exchange_length */
Xiaofei Baieef15042021-11-18 07:29:56 +0000332 MBEDTLS_PUT_UINT16_BE( key_exchange_len, group, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800333 }
334 else
335#endif /* MBEDTLS_ECDH_C */
336 if( 0 /* other KEMs? */ )
337 {
338 /* Do something */
339 }
340 else
341 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
342
Jerry Yub60e3cf2021-09-08 16:41:02 +0800343 /* Length of client_shares */
Xiaofei Baieef15042021-11-18 07:29:56 +0000344 client_shares_len = p - client_shares;
Jerry Yub60e3cf2021-09-08 16:41:02 +0800345 if( client_shares_len == 0)
346 {
347 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No key share defined." ) );
348 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu7c522d42021-09-08 17:55:09 +0800349 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800350 /* Write extension_type */
351 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0 );
352 /* Write extension_data_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800353 MBEDTLS_PUT_UINT16_BE( client_shares_len + 2, buf, 2 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800354 /* Write client_shares_length */
Jerry Yub60e3cf2021-09-08 16:41:02 +0800355 MBEDTLS_PUT_UINT16_BE( client_shares_len, buf, 4 );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800356
357 /* Update offered_group_id field */
358 ssl->handshake->offered_group_id = group_id;
359
360 /* Output the total length of key_share extension. */
Xiaofei Baid25fab62021-12-02 06:36:27 +0000361 *out_len = p - buf;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800362
Xiaofei Baid25fab62021-12-02 06:36:27 +0000363 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, key_share extension", buf, *out_len );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800364
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800365 mbedtls_ssl_tls13_set_hs_sent_ext_mask( ssl, MBEDTLS_TLS_EXT_KEY_SHARE );
Jerry Yu56fc07f2021-09-01 17:48:49 +0800366
367cleanup:
368
369 return( ret );
370}
Ronald Cron766c0cd2022-10-18 12:17:11 +0200371#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
Jerry Yue1b9c292021-09-10 10:08:31 +0800372
XiaokangQiand59be772022-01-24 10:12:51 +0000373/*
374 * ssl_tls13_parse_hrr_key_share_ext()
375 * Parse key_share extension in Hello Retry Request
376 *
377 * struct {
378 * NamedGroup selected_group;
379 * } KeyShareHelloRetryRequest;
380 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200381MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiand9e068e2022-01-18 06:23:32 +0000382static int ssl_tls13_parse_hrr_key_share_ext( mbedtls_ssl_context *ssl,
XiaokangQianb851da82022-01-14 04:03:11 +0000383 const unsigned char *buf,
384 const unsigned char *end )
385{
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400386#if defined(MBEDTLS_ECDH_C)
XiaokangQianb851da82022-01-14 04:03:11 +0000387 const unsigned char *p = buf;
XiaokangQiand59be772022-01-24 10:12:51 +0000388 int selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000389 int found = 0;
390
391 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
392 if( group_list == NULL )
393 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
394
395 MBEDTLS_SSL_DEBUG_BUF( 3, "key_share extension", p, end - buf );
396
397 /* Read selected_group */
XiaokangQianb48894e2022-01-17 02:05:52 +0000398 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQiand59be772022-01-24 10:12:51 +0000399 selected_group = MBEDTLS_GET_UINT16_BE( p, 0 );
400 MBEDTLS_SSL_DEBUG_MSG( 3, ( "selected_group ( %d )", selected_group ) );
XiaokangQianb851da82022-01-14 04:03:11 +0000401
402 /* Upon receipt of this extension in a HelloRetryRequest, the client
403 * MUST first verify that the selected_group field corresponds to a
404 * group which was provided in the "supported_groups" extension in the
405 * original ClientHello.
406 * The supported_group was based on the info in ssl->conf->group_list.
407 *
408 * If the server provided a key share that was not sent in the ClientHello
409 * then the client MUST abort the handshake with an "illegal_parameter" alert.
410 */
XiaokangQiand9e068e2022-01-18 06:23:32 +0000411 for( ; *group_list != 0; group_list++ )
XiaokangQianb851da82022-01-14 04:03:11 +0000412 {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100413 if( ( mbedtls_ssl_get_psa_curve_info_from_tls_id( *group_list,
414 NULL, NULL ) == PSA_ERROR_NOT_SUPPORTED ) ||
415 *group_list != selected_group )
XiaokangQianb851da82022-01-14 04:03:11 +0000416 continue;
417
418 /* We found a match */
419 found = 1;
420 break;
421 }
422
423 /* Client MUST verify that the selected_group field does not
424 * correspond to a group which was provided in the "key_share"
425 * extension in the original ClientHello. If the server sent an
426 * HRR message with a key share already provided in the
427 * ClientHello then the client MUST abort the handshake with
428 * an "illegal_parameter" alert.
429 */
XiaokangQiand59be772022-01-24 10:12:51 +0000430 if( found == 0 || selected_group == ssl->handshake->offered_group_id )
XiaokangQianb851da82022-01-14 04:03:11 +0000431 {
432 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Invalid key share in HRR" ) );
433 MBEDTLS_SSL_PEND_FATAL_ALERT(
434 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
435 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
436 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
437 }
438
439 /* Remember server's preference for next ClientHello */
XiaokangQiand59be772022-01-24 10:12:51 +0000440 ssl->handshake->offered_group_id = selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000441
442 return( 0 );
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400443#else
444 (void) ssl;
445 (void) buf;
446 (void) end;
447 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
448#endif
XiaokangQianb851da82022-01-14 04:03:11 +0000449}
450
Jerry Yue1b9c292021-09-10 10:08:31 +0800451/*
Jerry Yub85277e2021-10-13 13:36:05 +0800452 * ssl_tls13_parse_key_share_ext()
453 * Parse key_share extension in Server Hello
454 *
Jerry Yue1b9c292021-09-10 10:08:31 +0800455 * struct {
456 * KeyShareEntry server_share;
457 * } KeyShareServerHello;
458 * struct {
459 * NamedGroup group;
460 * opaque key_exchange<1..2^16-1>;
461 * } KeyShareEntry;
462 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200463MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4a173382021-10-11 21:45:31 +0800464static int ssl_tls13_parse_key_share_ext( mbedtls_ssl_context *ssl,
Jerry Yue1b9c292021-09-10 10:08:31 +0800465 const unsigned char *buf,
466 const unsigned char *end )
467{
Jerry Yub85277e2021-10-13 13:36:05 +0800468 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +0800469 const unsigned char *p = buf;
Jerry Yu4a173382021-10-11 21:45:31 +0800470 uint16_t group, offered_group;
Jerry Yue1b9c292021-09-10 10:08:31 +0800471
Jerry Yu4a173382021-10-11 21:45:31 +0800472 /* ...
473 * NamedGroup group; (2 bytes)
474 * ...
475 */
476 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
477 group = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yue1b9c292021-09-10 10:08:31 +0800478 p += 2;
479
Jerry Yu4a173382021-10-11 21:45:31 +0800480 /* Check that the chosen group matches the one we offered. */
Jerry Yue1b9c292021-09-10 10:08:31 +0800481 offered_group = ssl->handshake->offered_group_id;
Jerry Yu4a173382021-10-11 21:45:31 +0800482 if( offered_group != group )
Jerry Yue1b9c292021-09-10 10:08:31 +0800483 {
484 MBEDTLS_SSL_DEBUG_MSG( 1,
485 ( "Invalid server key share, our group %u, their group %u",
Jerry Yu4a173382021-10-11 21:45:31 +0800486 (unsigned) offered_group, (unsigned) group ) );
487 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
488 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
489 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yue1b9c292021-09-10 10:08:31 +0800490 }
491
492#if defined(MBEDTLS_ECDH_C)
Jerry Yu4a173382021-10-11 21:45:31 +0800493 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group ) )
Jerry Yue1b9c292021-09-10 10:08:31 +0800494 {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100495 if( mbedtls_ssl_get_psa_curve_info_from_tls_id( group, NULL, NULL )
496 == PSA_ERROR_NOT_SUPPORTED )
Przemyslaw Stekiel9e23ddb2022-02-10 10:32:02 +0100497 {
498 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Invalid TLS curve group id" ) );
499 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
500 }
501
Valerio Setti18c9fed2022-12-30 17:44:24 +0100502 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s",
503 mbedtls_ssl_get_curve_name_from_tls_id( group ) ) );
Przemyslaw Stekiel9e23ddb2022-02-10 10:32:02 +0100504
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000505 ret = mbedtls_ssl_tls13_read_public_ecdhe_share( ssl, p, end - p );
Jerry Yue1b9c292021-09-10 10:08:31 +0800506 if( ret != 0 )
507 return( ret );
508 }
Jerry Yub85277e2021-10-13 13:36:05 +0800509 else
Jerry Yue1b9c292021-09-10 10:08:31 +0800510#endif /* MBEDTLS_ECDH_C */
Jerry Yub85277e2021-10-13 13:36:05 +0800511 if( 0 /* other KEMs? */ )
Jerry Yue1b9c292021-09-10 10:08:31 +0800512 {
513 /* Do something */
514 }
515 else
516 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
517
Jerry Yue1b9c292021-09-10 10:08:31 +0800518 return( ret );
519}
520
XiaokangQiand59be772022-01-24 10:12:51 +0000521/*
522 * ssl_tls13_parse_cookie_ext()
523 * Parse cookie extension in Hello Retry Request
524 *
525 * struct {
526 * opaque cookie<1..2^16-1>;
527 * } Cookie;
528 *
529 * When sending a HelloRetryRequest, the server MAY provide a "cookie"
530 * extension to the client (this is an exception to the usual rule that
531 * the only extensions that may be sent are those that appear in the
532 * ClientHello). When sending the new ClientHello, the client MUST copy
533 * the contents of the extension received in the HelloRetryRequest into
534 * a "cookie" extension in the new ClientHello. Clients MUST NOT use
535 * cookies in their initial ClientHello in subsequent connections.
536 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200537MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian43550bd2022-01-21 04:32:58 +0000538static int ssl_tls13_parse_cookie_ext( mbedtls_ssl_context *ssl,
539 const unsigned char *buf,
540 const unsigned char *end )
541{
XiaokangQian25c9c902022-02-08 10:49:53 +0000542 uint16_t cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000543 const unsigned char *p = buf;
544 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
545
546 /* Retrieve length field of cookie */
547 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
548 cookie_len = MBEDTLS_GET_UINT16_BE( p, 0 );
549 p += 2;
550
551 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, cookie_len );
552 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie extension", p, cookie_len );
553
XiaokangQian9b93c0d2022-02-09 06:02:25 +0000554 mbedtls_free( handshake->cookie );
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800555 handshake->cookie_len = 0;
XiaokangQian9b93c0d2022-02-09 06:02:25 +0000556 handshake->cookie = mbedtls_calloc( 1, cookie_len );
557 if( handshake->cookie == NULL )
XiaokangQian43550bd2022-01-21 04:32:58 +0000558 {
559 MBEDTLS_SSL_DEBUG_MSG( 1,
XiaokangQian25c9c902022-02-08 10:49:53 +0000560 ( "alloc failed ( %ud bytes )",
XiaokangQian43550bd2022-01-21 04:32:58 +0000561 cookie_len ) );
562 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
563 }
564
XiaokangQian9b93c0d2022-02-09 06:02:25 +0000565 memcpy( handshake->cookie, p, cookie_len );
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800566 handshake->cookie_len = cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000567
568 return( 0 );
569}
XiaokangQian43550bd2022-01-21 04:32:58 +0000570
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200571MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian0b64eed2022-01-27 10:36:51 +0000572static int ssl_tls13_write_cookie_ext( mbedtls_ssl_context *ssl,
XiaokangQian233397e2022-02-07 08:32:16 +0000573 unsigned char *buf,
574 unsigned char *end,
XiaokangQian9deb90f2022-02-08 10:31:07 +0000575 size_t *out_len )
XiaokangQian0b64eed2022-01-27 10:36:51 +0000576{
577 unsigned char *p = buf;
XiaokangQian9deb90f2022-02-08 10:31:07 +0000578 *out_len = 0;
XiaokangQianc02768a2022-02-10 07:31:25 +0000579 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000580
XiaokangQianc02768a2022-02-10 07:31:25 +0000581 if( handshake->cookie == NULL )
XiaokangQian0b64eed2022-01-27 10:36:51 +0000582 {
583 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no cookie to send; skip extension" ) );
584 return( 0 );
585 }
586
587 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
XiaokangQianc02768a2022-02-10 07:31:25 +0000588 handshake->cookie,
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800589 handshake->cookie_len );
XiaokangQian0b64eed2022-01-27 10:36:51 +0000590
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800591 MBEDTLS_SSL_CHK_BUF_PTR( p, end, handshake->cookie_len + 6 );
XiaokangQian0b64eed2022-01-27 10:36:51 +0000592
593 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding cookie extension" ) );
594
XiaokangQian0b64eed2022-01-27 10:36:51 +0000595 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_COOKIE, p, 0 );
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800596 MBEDTLS_PUT_UINT16_BE( handshake->cookie_len + 2, p, 2 );
597 MBEDTLS_PUT_UINT16_BE( handshake->cookie_len, p, 4 );
XiaokangQian233397e2022-02-07 08:32:16 +0000598 p += 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000599
600 /* Cookie */
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800601 memcpy( p, handshake->cookie, handshake->cookie_len );
XiaokangQian0b64eed2022-01-27 10:36:51 +0000602
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800603 *out_len = handshake->cookie_len + 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000604
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800605 mbedtls_ssl_tls13_set_hs_sent_ext_mask( ssl, MBEDTLS_TLS_EXT_COOKIE );
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800606
XiaokangQian0b64eed2022-01-27 10:36:51 +0000607 return( 0 );
608}
609
Ronald Cron41a443a2022-10-04 16:38:25 +0200610#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000611/*
612 * ssl_tls13_write_psk_key_exchange_modes_ext() structure:
613 *
614 * enum { psk_ke( 0 ), psk_dhe_ke( 1 ), ( 255 ) } PskKeyExchangeMode;
615 *
616 * struct {
617 * PskKeyExchangeMode ke_modes<1..255>;
618 * } PskKeyExchangeModes;
619 */
XiaokangQian86981952022-07-19 09:51:50 +0000620MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianeb69aee2022-07-05 08:21:43 +0000621static int ssl_tls13_write_psk_key_exchange_modes_ext( mbedtls_ssl_context *ssl,
622 unsigned char *buf,
623 unsigned char *end,
624 size_t *out_len )
625{
XiaokangQianeb69aee2022-07-05 08:21:43 +0000626 unsigned char *p = buf;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000627 int ke_modes_len = 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000628
XiaokangQian008d2bf2022-07-14 07:54:01 +0000629 ((void) ke_modes_len );
XiaokangQianeb69aee2022-07-05 08:21:43 +0000630 *out_len = 0;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000631
XiaokangQianeb69aee2022-07-05 08:21:43 +0000632 /* Skip writing extension if no PSK key exchange mode
XiaokangQian7c12d312022-07-20 07:25:43 +0000633 * is enabled in the config.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000634 */
XiaokangQian86981952022-07-19 09:51:50 +0000635 if( !mbedtls_ssl_conf_tls13_some_psk_enabled( ssl ) )
XiaokangQianeb69aee2022-07-05 08:21:43 +0000636 {
637 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip psk_key_exchange_modes extension" ) );
638 return( 0 );
639 }
640
641 /* Require 7 bytes of data, otherwise fail,
642 * even if extension might be shorter.
643 */
644 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 7 );
645 MBEDTLS_SSL_DEBUG_MSG(
646 3, ( "client hello, adding psk_key_exchange_modes extension" ) );
647
XiaokangQianeb69aee2022-07-05 08:21:43 +0000648 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES, p, 0 );
649
XiaokangQian008d2bf2022-07-14 07:54:01 +0000650 /* Skip extension length (2 bytes) and
651 * ke_modes length (1 byte) for now.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000652 */
653 p += 5;
654
XiaokangQianeb69aee2022-07-05 08:21:43 +0000655 if( mbedtls_ssl_conf_tls13_psk_ephemeral_enabled( ssl ) )
656 {
657 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000658 ke_modes_len++;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000659
660 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Adding PSK-ECDHE key exchange mode" ) );
661 }
662
Ronald Crona709a0f2022-09-27 16:46:11 +0200663 if( mbedtls_ssl_conf_tls13_psk_enabled( ssl ) )
664 {
665 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE;
666 ke_modes_len++;
667
668 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Adding pure PSK key exchange mode" ) );
669 }
670
XiaokangQian008d2bf2022-07-14 07:54:01 +0000671 /* Now write the extension and ke_modes length */
672 MBEDTLS_PUT_UINT16_BE( ke_modes_len + 1, buf, 2 );
673 buf[4] = ke_modes_len;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000674
675 *out_len = p - buf;
Jerry Yu0c354a22022-08-29 15:25:36 +0800676
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800677 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
678 ssl, MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES );
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800679
XiaokangQianeb69aee2022-07-05 08:21:43 +0000680 return ( 0 );
681}
Jerry Yudb8c5fa2022-08-03 12:10:13 +0800682
Jerry Yua99cbfa2022-10-08 11:17:14 +0800683static psa_algorithm_t ssl_tls13_get_ciphersuite_hash_alg( int ciphersuite )
Jerry Yuf7c12592022-09-28 22:09:38 +0800684{
Jerry Yu21f90952022-10-08 10:30:53 +0800685 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = NULL;
686 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
Jerry Yuf7c12592022-09-28 22:09:38 +0800687
Jerry Yua99cbfa2022-10-08 11:17:14 +0800688 if( ciphersuite_info != NULL )
689 return( mbedtls_psa_translate_md( ciphersuite_info->mac ) );
690
Jerry Yu21f90952022-10-08 10:30:53 +0800691 return( PSA_ALG_NONE );
Jerry Yuf7c12592022-09-28 22:09:38 +0800692}
693
Jerry Yuf75364b2022-09-30 10:30:31 +0800694#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Xiaokang Qianb781a232022-11-01 07:39:46 +0000695static int ssl_tls13_has_configured_ticket( mbedtls_ssl_context *ssl )
696{
697 mbedtls_ssl_session *session = ssl->session_negotiate;
698 return( ssl->handshake->resume &&
699 session != NULL && session->ticket != NULL );
700}
701
Xiaokang Qian01323a42022-11-03 02:27:35 +0000702#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qiana3412252022-11-04 10:13:19 +0000703static int ssl_tls13_early_data_has_valid_ticket( mbedtls_ssl_context *ssl )
Xiaokang Qian01323a42022-11-03 02:27:35 +0000704{
705 mbedtls_ssl_session *session = ssl->session_negotiate;
706 return( ssl->handshake->resume &&
Xiaokang Qian01323a42022-11-03 02:27:35 +0000707 session->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
Xiaokang Qianae07cd92022-11-09 08:09:47 +0000708 ( session->ticket_flags &
Xiaokang Qianfe3483f2022-11-09 10:45:23 +0000709 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA ) &&
Xiaokang Qian01323a42022-11-03 02:27:35 +0000710 mbedtls_ssl_tls13_cipher_suite_is_offered(
711 ssl, session->ciphersuite ) );
712}
713#endif
714
Xiaokang Qianb781a232022-11-01 07:39:46 +0000715MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu8b41e892022-09-30 10:00:20 +0800716static int ssl_tls13_ticket_get_identity( mbedtls_ssl_context *ssl,
Jerry Yua99cbfa2022-10-08 11:17:14 +0800717 psa_algorithm_t *hash_alg,
Jerry Yu8b41e892022-09-30 10:00:20 +0800718 const unsigned char **identity,
719 size_t *identity_len )
Jerry Yuf7c12592022-09-28 22:09:38 +0800720{
721 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu8b41e892022-09-30 10:00:20 +0800722
Xiaokang Qianb781a232022-11-01 07:39:46 +0000723 if( !ssl_tls13_has_configured_ticket( ssl ) )
Jerry Yu8b41e892022-09-30 10:00:20 +0800724 return( -1 );
725
Jerry Yua99cbfa2022-10-08 11:17:14 +0800726 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg( session->ciphersuite );
Jerry Yuf7c12592022-09-28 22:09:38 +0800727 *identity = session->ticket;
728 *identity_len = session->ticket_len;
729 return( 0 );
730}
731
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800732MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu8b41e892022-09-30 10:00:20 +0800733static int ssl_tls13_ticket_get_psk( mbedtls_ssl_context *ssl,
Jerry Yua99cbfa2022-10-08 11:17:14 +0800734 psa_algorithm_t *hash_alg,
Jerry Yu8b41e892022-09-30 10:00:20 +0800735 const unsigned char **psk,
736 size_t *psk_len )
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800737{
738
739 mbedtls_ssl_session *session = ssl->session_negotiate;
740
Xiaokang Qianb781a232022-11-01 07:39:46 +0000741 if( !ssl_tls13_has_configured_ticket( ssl ) )
Jerry Yu8b41e892022-09-30 10:00:20 +0800742 return( -1 );
743
Jerry Yua99cbfa2022-10-08 11:17:14 +0800744 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg( session->ciphersuite );
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800745 *psk = session->resumption_key;
746 *psk_len = session->resumption_key_len;
747
748 return( 0 );
749}
Jerry Yuf7c12592022-09-28 22:09:38 +0800750#endif /* MBEDTLS_SSL_SESSION_TICKETS */
751
752MBEDTLS_CHECK_RETURN_CRITICAL
753static int ssl_tls13_psk_get_identity( mbedtls_ssl_context *ssl,
Jerry Yua99cbfa2022-10-08 11:17:14 +0800754 psa_algorithm_t *hash_alg,
Jerry Yuf7c12592022-09-28 22:09:38 +0800755 const unsigned char **identity,
756 size_t *identity_len )
757{
Jerry Yu8b41e892022-09-30 10:00:20 +0800758
Ronald Cron083da8e2022-10-20 15:53:51 +0200759 if( ! mbedtls_ssl_conf_has_static_psk( ssl->conf ) )
Jerry Yu8b41e892022-09-30 10:00:20 +0800760 return( -1 );
Jerry Yuf7c12592022-09-28 22:09:38 +0800761
Jerry Yua99cbfa2022-10-08 11:17:14 +0800762 *hash_alg = PSA_ALG_SHA_256;
Jerry Yuf7c12592022-09-28 22:09:38 +0800763 *identity = ssl->conf->psk_identity;
764 *identity_len = ssl->conf->psk_identity_len;
765 return( 0 );
766}
767
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800768MBEDTLS_CHECK_RETURN_CRITICAL
769static int ssl_tls13_psk_get_psk( mbedtls_ssl_context *ssl,
Jerry Yua99cbfa2022-10-08 11:17:14 +0800770 psa_algorithm_t *hash_alg,
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800771 const unsigned char **psk,
772 size_t *psk_len )
773{
Jerry Yu8b41e892022-09-30 10:00:20 +0800774
Ronald Cron083da8e2022-10-20 15:53:51 +0200775 if( ! mbedtls_ssl_conf_has_static_psk( ssl->conf ) )
Jerry Yu8b41e892022-09-30 10:00:20 +0800776 return( -1 );
777
Jerry Yua99cbfa2022-10-08 11:17:14 +0800778 *hash_alg = PSA_ALG_SHA_256;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800779 *psk = ssl->conf->psk;
780 *psk_len = ssl->conf->psk_len;
781 return( 0 );
782}
783
Jerry Yuf75364b2022-09-30 10:30:31 +0800784static int ssl_tls13_get_configured_psk_count( mbedtls_ssl_context *ssl )
785{
786 int configured_psk_count = 0;
787#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Xiaokang Qianb781a232022-11-01 07:39:46 +0000788 if( ssl_tls13_has_configured_ticket( ssl ) )
Jerry Yuf75364b2022-09-30 10:30:31 +0800789 {
790 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Ticket is configured" ) );
791 configured_psk_count++;
792 }
793#endif
Ronald Crond29e13e2022-10-19 10:33:48 +0200794 if( mbedtls_ssl_conf_has_static_psk( ssl->conf ) )
Jerry Yuf75364b2022-09-30 10:30:31 +0800795 {
796 MBEDTLS_SSL_DEBUG_MSG( 3, ( "PSK is configured" ) );
797 configured_psk_count++;
798 }
799 return( configured_psk_count );
800}
801
Jerry Yuf7c12592022-09-28 22:09:38 +0800802MBEDTLS_CHECK_RETURN_CRITICAL
803static int ssl_tls13_write_identity( mbedtls_ssl_context *ssl,
804 unsigned char *buf,
805 unsigned char *end,
Jerry Yuf75364b2022-09-30 10:30:31 +0800806 const unsigned char *identity,
807 size_t identity_len,
808 uint32_t obfuscated_ticket_age,
809 size_t *out_len )
Jerry Yuf7c12592022-09-28 22:09:38 +0800810{
Jerry Yuf75364b2022-09-30 10:30:31 +0800811 ((void) ssl);
Jerry Yuf7c12592022-09-28 22:09:38 +0800812 *out_len = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800813
814 /*
815 * - identity_len (2 bytes)
816 * - identity (psk_identity_len bytes)
817 * - obfuscated_ticket_age (4 bytes)
818 */
Jerry Yua99cbfa2022-10-08 11:17:14 +0800819 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 6 + identity_len );
Jerry Yuf7c12592022-09-28 22:09:38 +0800820
Jerry Yua99cbfa2022-10-08 11:17:14 +0800821 MBEDTLS_PUT_UINT16_BE( identity_len, buf, 0 );
822 memcpy( buf + 2, identity, identity_len );
823 MBEDTLS_PUT_UINT32_BE( obfuscated_ticket_age, buf, 2 + identity_len );
Jerry Yuf7c12592022-09-28 22:09:38 +0800824
Jerry Yua99cbfa2022-10-08 11:17:14 +0800825 MBEDTLS_SSL_DEBUG_BUF( 4, "write identity", buf, 6 + identity_len );
Jerry Yuf7c12592022-09-28 22:09:38 +0800826
827 *out_len = 6 + identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800828
829 return( 0 );
830}
831
Jerry Yu8b41e892022-09-30 10:00:20 +0800832MBEDTLS_CHECK_RETURN_CRITICAL
833static int ssl_tls13_write_binder( mbedtls_ssl_context *ssl,
834 unsigned char *buf,
835 unsigned char *end,
836 int psk_type,
Jerry Yu6183cc72022-09-30 11:08:57 +0800837 psa_algorithm_t hash_alg,
838 const unsigned char *psk,
839 size_t psk_len,
Jerry Yu8b41e892022-09-30 10:00:20 +0800840 size_t *out_len )
841{
842 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu8b41e892022-09-30 10:00:20 +0800843 unsigned char binder_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800844 unsigned char transcript[ MBEDTLS_TLS1_3_MD_MAX_SIZE ];
Jerry Yu8b41e892022-09-30 10:00:20 +0800845 size_t transcript_len = 0;
846
847 *out_len = 0;
848
Jerry Yu6183cc72022-09-30 11:08:57 +0800849 binder_len = PSA_HASH_LENGTH( hash_alg );
Jerry Yu8b41e892022-09-30 10:00:20 +0800850
851 /*
852 * - binder_len (1 bytes)
853 * - binder (binder_len bytes)
854 */
Jerry Yua99cbfa2022-10-08 11:17:14 +0800855 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 1 + binder_len );
Jerry Yu8b41e892022-09-30 10:00:20 +0800856
Jerry Yua99cbfa2022-10-08 11:17:14 +0800857 buf[0] = binder_len;
Jerry Yu8b41e892022-09-30 10:00:20 +0800858
859 /* Get current state of handshake transcript. */
860 ret = mbedtls_ssl_get_handshake_transcript(
Jerry Yu6183cc72022-09-30 11:08:57 +0800861 ssl, mbedtls_hash_info_md_from_psa( hash_alg ),
Jerry Yu6916e702022-10-10 21:33:51 +0800862 transcript, sizeof( transcript ), &transcript_len );
Jerry Yu8b41e892022-09-30 10:00:20 +0800863 if( ret != 0 )
864 return( ret );
865
Jerry Yu6183cc72022-09-30 11:08:57 +0800866 ret = mbedtls_ssl_tls13_create_psk_binder( ssl, hash_alg,
Jerry Yu8b41e892022-09-30 10:00:20 +0800867 psk, psk_len, psk_type,
Jerry Yua99cbfa2022-10-08 11:17:14 +0800868 transcript, buf + 1 );
Jerry Yu8b41e892022-09-30 10:00:20 +0800869 if( ret != 0 )
870 {
871 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_create_psk_binder", ret );
872 return( ret );
873 }
Jerry Yua99cbfa2022-10-08 11:17:14 +0800874 MBEDTLS_SSL_DEBUG_BUF( 4, "write binder", buf, 1 + binder_len );
Jerry Yu8b41e892022-09-30 10:00:20 +0800875
876 *out_len = 1 + binder_len;
877
Jerry Yu6916e702022-10-10 21:33:51 +0800878 return( 0 );
Jerry Yu8b41e892022-09-30 10:00:20 +0800879}
880
881/*
882 * mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext() structure:
883 *
884 * struct {
885 * opaque identity<1..2^16-1>;
886 * uint32 obfuscated_ticket_age;
887 * } PskIdentity;
888 *
889 * opaque PskBinderEntry<32..255>;
890 *
891 * struct {
892 * PskIdentity identities<7..2^16-1>;
893 * PskBinderEntry binders<33..2^16-1>;
894 * } OfferedPsks;
895 *
896 * struct {
897 * select (Handshake.msg_type) {
898 * case client_hello: OfferedPsks;
899 * ...
900 * };
901 * } PreSharedKeyExtension;
902 *
903 */
XiaokangQian3ad67bf2022-07-21 02:26:21 +0000904int mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext(
Jerry Yuf75364b2022-09-30 10:30:31 +0800905 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end,
906 size_t *out_len, size_t *binders_len )
XiaokangQianeb69aee2022-07-05 08:21:43 +0000907{
Jerry Yuf7c12592022-09-28 22:09:38 +0800908 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf75364b2022-09-30 10:30:31 +0800909 int configured_psk_count = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800910 unsigned char *p = buf;
Jerry Yuf75364b2022-09-30 10:30:31 +0800911 psa_algorithm_t hash_alg;
912 const unsigned char *identity;
913 size_t identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800914 size_t l_binders_len = 0;
Jerry Yuf75364b2022-09-30 10:30:31 +0800915 size_t output_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800916
917 *out_len = 0;
918 *binders_len = 0;
919
920 /* Check if we have any PSKs to offer. If no, skip pre_shared_key */
Jerry Yuf75364b2022-09-30 10:30:31 +0800921 configured_psk_count = ssl_tls13_get_configured_psk_count( ssl );
922 if( configured_psk_count == 0 )
Jerry Yuf7c12592022-09-28 22:09:38 +0800923 {
924 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip pre_shared_key extensions" ) );
925 return( 0 );
926 }
927
928 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Pre-configured PSK number = %d",
Jerry Yuf75364b2022-09-30 10:30:31 +0800929 configured_psk_count ) );
930
Jerry Yuf7c12592022-09-28 22:09:38 +0800931 /* Check if we have space to write the extension, binders included.
932 * - extension_type (2 bytes)
933 * - extension_data_len (2 bytes)
934 * - identities_len (2 bytes)
935 */
936 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
937 p += 6;
938
Jerry Yuf75364b2022-09-30 10:30:31 +0800939#if defined(MBEDTLS_SSL_SESSION_TICKETS)
940 if( ssl_tls13_ticket_get_identity(
941 ssl, &hash_alg, &identity, &identity_len ) == 0 )
Jerry Yuf7c12592022-09-28 22:09:38 +0800942 {
Jerry Yuf75364b2022-09-30 10:30:31 +0800943#if defined(MBEDTLS_HAVE_TIME)
944 mbedtls_time_t now = mbedtls_time( NULL );
945 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu6916e702022-10-10 21:33:51 +0800946 uint32_t obfuscated_ticket_age =
947 (uint32_t)( now - session->ticket_received );
Jerry Yua99cbfa2022-10-08 11:17:14 +0800948
Jerry Yu3e60cad2023-01-10 14:58:08 +0800949 /*
950 * The ticket timestamp is in seconds but the ticket age is in
951 * milliseconds. If the ticket was received at the end of a second and
952 * re-used here just at the beginning of the next second, the computed
953 * age `now - session->ticket_received` is equal to 1s thus 1000 ms
954 * while the actual age could be just a few milliseconds or tens of
955 * milliseconds. If the server has more accurate ticket timestamps
956 * (typically timestamps in milliseconds), as part of the processing of
957 * the ClientHello, it may compute a ticket lifetime smaller than the
958 * one computed here and potentially reject the ticket. To avoid that,
959 * remove one second to the ticket age if possible.
Jerry Yubdb936b2023-01-07 16:07:46 +0800960 */
961 if( obfuscated_ticket_age > 0 )
962 obfuscated_ticket_age -= 1;
963
Jerry Yuf75364b2022-09-30 10:30:31 +0800964 obfuscated_ticket_age *= 1000;
965 obfuscated_ticket_age += session->ticket_age_add;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800966
Jerry Yuf7c12592022-09-28 22:09:38 +0800967 ret = ssl_tls13_write_identity( ssl, p, end,
Jerry Yuf75364b2022-09-30 10:30:31 +0800968 identity, identity_len,
969 obfuscated_ticket_age,
970 &output_len );
Jerry Yua99cbfa2022-10-08 11:17:14 +0800971#else
972 ret = ssl_tls13_write_identity( ssl, p, end, identity, identity_len,
973 0, &output_len );
974#endif /* MBEDTLS_HAVE_TIME */
Jerry Yuf7c12592022-09-28 22:09:38 +0800975 if( ret != 0 )
976 return( ret );
Jerry Yuf7c12592022-09-28 22:09:38 +0800977
Jerry Yuf75364b2022-09-30 10:30:31 +0800978 p += output_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800979 l_binders_len += 1 + PSA_HASH_LENGTH( hash_alg );
Jerry Yuf75364b2022-09-30 10:30:31 +0800980 }
981#endif /* MBEDTLS_SSL_SESSION_TICKETS */
982
983 if( ssl_tls13_psk_get_identity(
984 ssl, &hash_alg, &identity, &identity_len ) == 0 )
Jerry Yuf7c12592022-09-28 22:09:38 +0800985 {
Jerry Yuf75364b2022-09-30 10:30:31 +0800986
Jerry Yua99cbfa2022-10-08 11:17:14 +0800987 ret = ssl_tls13_write_identity( ssl, p, end, identity, identity_len, 0,
Jerry Yuf75364b2022-09-30 10:30:31 +0800988 &output_len );
Jerry Yuf7c12592022-09-28 22:09:38 +0800989 if( ret != 0 )
990 return( ret );
Jerry Yuf75364b2022-09-30 10:30:31 +0800991
Jerry Yuf7c12592022-09-28 22:09:38 +0800992 p += output_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800993 l_binders_len += 1 + PSA_HASH_LENGTH( hash_alg );
Jerry Yuf7c12592022-09-28 22:09:38 +0800994 }
995
996 MBEDTLS_SSL_DEBUG_MSG( 3,
997 ( "client hello, adding pre_shared_key extension, "
998 "omitting PSK binder list" ) );
Jerry Yua99cbfa2022-10-08 11:17:14 +0800999
1000 /* Take into account the two bytes for the length of the binders. */
1001 l_binders_len += 2;
Jerry Yu6916e702022-10-10 21:33:51 +08001002 /* Check if there is enough space for binders */
Jerry Yua99cbfa2022-10-08 11:17:14 +08001003 MBEDTLS_SSL_CHK_BUF_PTR( p, end, l_binders_len );
1004
Jerry Yuf7c12592022-09-28 22:09:38 +08001005 /*
1006 * - extension_type (2 bytes)
1007 * - extension_data_len (2 bytes)
1008 * - identities_len (2 bytes)
1009 */
1010 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_PRE_SHARED_KEY, buf, 0 );
Jerry Yua99cbfa2022-10-08 11:17:14 +08001011 MBEDTLS_PUT_UINT16_BE( p - buf - 4 + l_binders_len , buf, 2 );
Jerry Yuf7c12592022-09-28 22:09:38 +08001012 MBEDTLS_PUT_UINT16_BE( p - buf - 6 , buf, 4 );
1013
Jerry Yua99cbfa2022-10-08 11:17:14 +08001014 *out_len = ( p - buf ) + l_binders_len;
1015 *binders_len = l_binders_len;
Jerry Yuf7c12592022-09-28 22:09:38 +08001016
1017 MBEDTLS_SSL_DEBUG_BUF( 3, "pre_shared_key identities", buf, p - buf );
1018
XiaokangQianeb69aee2022-07-05 08:21:43 +00001019 return( 0 );
1020}
1021
XiaokangQian86981952022-07-19 09:51:50 +00001022int mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext(
Jerry Yu0c6105b2022-08-12 17:26:40 +08001023 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end )
XiaokangQianeb69aee2022-07-05 08:21:43 +00001024{
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001025 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1026 unsigned char *p = buf;
Jerry Yu6183cc72022-09-30 11:08:57 +08001027 psa_algorithm_t hash_alg = PSA_ALG_NONE;
1028 const unsigned char *psk;
1029 size_t psk_len;
1030 size_t output_len;
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001031
1032 /* Check if we have space to write binders_len.
1033 * - binders_len (2 bytes)
1034 */
1035 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1036 p += 2;
1037
Jerry Yu6183cc72022-09-30 11:08:57 +08001038#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1039 if( ssl_tls13_ticket_get_psk( ssl, &hash_alg, &psk, &psk_len ) == 0 )
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001040 {
Jerry Yu6183cc72022-09-30 11:08:57 +08001041
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001042 ret = ssl_tls13_write_binder( ssl, p, end,
1043 MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION,
Jerry Yu6183cc72022-09-30 11:08:57 +08001044 hash_alg, psk, psk_len,
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001045 &output_len );
1046 if( ret != 0 )
1047 return( ret );
1048 p += output_len;
1049 }
Jerry Yu6183cc72022-09-30 11:08:57 +08001050#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001051
Jerry Yu6183cc72022-09-30 11:08:57 +08001052 if( ssl_tls13_psk_get_psk( ssl, &hash_alg, &psk, &psk_len ) == 0 )
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001053 {
Jerry Yu6183cc72022-09-30 11:08:57 +08001054
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001055 ret = ssl_tls13_write_binder( ssl, p, end,
1056 MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL,
Jerry Yu6183cc72022-09-30 11:08:57 +08001057 hash_alg, psk, psk_len,
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001058 &output_len );
1059 if( ret != 0 )
1060 return( ret );
1061 p += output_len;
1062 }
1063
1064 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding PSK binder list." ) );
1065
1066 /*
1067 * - binders_len (2 bytes)
1068 */
1069 MBEDTLS_PUT_UINT16_BE( p - buf - 2, buf, 0 );
1070
1071 MBEDTLS_SSL_DEBUG_BUF( 3, "pre_shared_key binders", buf, p - buf );
XiaokangQianeb69aee2022-07-05 08:21:43 +00001072
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001073 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
1074 ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY );
Jerry Yu0c354a22022-08-29 15:25:36 +08001075
XiaokangQianeb69aee2022-07-05 08:21:43 +00001076 return( 0 );
1077}
Jerry Yu0c6105b2022-08-12 17:26:40 +08001078
1079/*
1080 * struct {
1081 * opaque identity<1..2^16-1>;
1082 * uint32 obfuscated_ticket_age;
1083 * } PskIdentity;
1084 *
1085 * opaque PskBinderEntry<32..255>;
1086 *
1087 * struct {
1088 *
1089 * select (Handshake.msg_type) {
1090 * ...
1091 * case server_hello: uint16 selected_identity;
1092 * };
1093 *
1094 * } PreSharedKeyExtension;
1095 *
1096 */
1097MBEDTLS_CHECK_RETURN_CRITICAL
1098static int ssl_tls13_parse_server_pre_shared_key_ext( mbedtls_ssl_context *ssl,
1099 const unsigned char *buf,
1100 const unsigned char *end )
1101{
Jerry Yua99cbfa2022-10-08 11:17:14 +08001102 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub300e3c2022-09-28 22:12:07 +08001103 int selected_identity;
Jerry Yub300e3c2022-09-28 22:12:07 +08001104 const unsigned char *psk;
1105 size_t psk_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001106 psa_algorithm_t hash_alg;
Jerry Yub300e3c2022-09-28 22:12:07 +08001107
Jerry Yua99cbfa2022-10-08 11:17:14 +08001108 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end, 2 );
Jerry Yub300e3c2022-09-28 22:12:07 +08001109 selected_identity = MBEDTLS_GET_UINT16_BE( buf, 0 );
Jerry Yua99cbfa2022-10-08 11:17:14 +08001110
Jerry Yub300e3c2022-09-28 22:12:07 +08001111 MBEDTLS_SSL_DEBUG_MSG( 3, ( "selected_identity = %d", selected_identity ) );
Jerry Yua99cbfa2022-10-08 11:17:14 +08001112
Jerry Yu4a698342022-09-30 12:22:01 +08001113 if( selected_identity >= ssl_tls13_get_configured_psk_count( ssl ) )
Jerry Yub300e3c2022-09-28 22:12:07 +08001114 {
Jerry Yua99cbfa2022-10-08 11:17:14 +08001115 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Invalid PSK identity." ) );
Jerry Yu4a698342022-09-30 12:22:01 +08001116
1117 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1118 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1119 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Jerry Yub300e3c2022-09-28 22:12:07 +08001120 }
Jerry Yua99cbfa2022-10-08 11:17:14 +08001121
Jerry Yu4a698342022-09-30 12:22:01 +08001122#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Xiaokang Qianecc29482022-11-02 07:52:47 +00001123 if( selected_identity == 0 && ssl_tls13_has_configured_ticket( ssl ) )
Jerry Yub300e3c2022-09-28 22:12:07 +08001124 {
Jerry Yua99cbfa2022-10-08 11:17:14 +08001125 ret = ssl_tls13_ticket_get_psk( ssl, &hash_alg, &psk, &psk_len );
Jerry Yu4a698342022-09-30 12:22:01 +08001126 }
1127 else
1128#endif
Ronald Crond29e13e2022-10-19 10:33:48 +02001129 if( mbedtls_ssl_conf_has_static_psk( ssl->conf ) )
Jerry Yu4a698342022-09-30 12:22:01 +08001130 {
Jerry Yua99cbfa2022-10-08 11:17:14 +08001131 ret = ssl_tls13_psk_get_psk( ssl, &hash_alg, &psk, &psk_len );
Jerry Yub300e3c2022-09-28 22:12:07 +08001132 }
1133 else
1134 {
1135 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1136 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1137 }
Jerry Yub300e3c2022-09-28 22:12:07 +08001138 if( ret != 0 )
1139 return( ret );
1140
1141 ret = mbedtls_ssl_set_hs_psk( ssl, psk, psk_len );
1142 if( ret != 0 )
1143 {
1144 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_set_hs_psk", ret );
Jerry Yu6916e702022-10-10 21:33:51 +08001145 return( ret );
Jerry Yub300e3c2022-09-28 22:12:07 +08001146 }
Jerry Yub300e3c2022-09-28 22:12:07 +08001147
Jerry Yu6916e702022-10-10 21:33:51 +08001148 return( 0 );
Jerry Yu0c6105b2022-08-12 17:26:40 +08001149}
Ronald Cron41a443a2022-10-04 16:38:25 +02001150#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
XiaokangQianeb69aee2022-07-05 08:21:43 +00001151
Ronald Cron3d580bf2022-02-18 17:24:56 +01001152int mbedtls_ssl_tls13_write_client_hello_exts( mbedtls_ssl_context *ssl,
1153 unsigned char *buf,
1154 unsigned char *end,
1155 size_t *out_len )
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001156{
1157 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1158 unsigned char *p = buf;
1159 size_t ext_len;
1160
1161 *out_len = 0;
1162
1163 /* Write supported_versions extension
1164 *
1165 * Supported Versions Extension is mandatory with TLS 1.3.
1166 */
1167 ret = ssl_tls13_write_supported_versions_ext( ssl, p, end, &ext_len );
1168 if( ret != 0 )
1169 return( ret );
1170 p += ext_len;
1171
1172 /* Echo the cookie if the server provided one in its preceding
1173 * HelloRetryRequest message.
1174 */
1175 ret = ssl_tls13_write_cookie_ext( ssl, p, end, &ext_len );
1176 if( ret != 0 )
1177 return( ret );
1178 p += ext_len;
1179
Ronald Cron766c0cd2022-10-18 12:17:11 +02001180#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001181 if( mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
1182 {
1183 ret = ssl_tls13_write_key_share_ext( ssl, p, end, &ext_len );
1184 if( ret != 0 )
1185 return( ret );
1186 p += ext_len;
1187 }
Ronald Cron766c0cd2022-10-18 12:17:11 +02001188#endif
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001189
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001190#if defined(MBEDTLS_SSL_EARLY_DATA)
1191 if( mbedtls_ssl_conf_tls13_some_psk_enabled( ssl ) &&
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00001192 ssl_tls13_early_data_has_valid_ticket( ssl ) &&
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001193 ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED )
1194 {
1195 ret = mbedtls_ssl_tls13_write_early_data_ext( ssl, p, end, &ext_len );
1196 if( ret != 0 )
1197 return( ret );
1198 p += ext_len;
1199
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001200 /* Initializes the status to `rejected`. It will be updated to
1201 * `accepted` if the EncryptedExtension message contain an early data
1202 * indication extension.
Xiaokang Qiana042b842022-11-09 01:59:33 +00001203 */
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001204 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001205 }
1206 else
1207 {
1208 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write early_data extension" ) );
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00001209 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001210 }
1211#endif /* MBEDTLS_SSL_EARLY_DATA */
1212
Ronald Cron41a443a2022-10-04 16:38:25 +02001213#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +00001214 /* For PSK-based key exchange we need the pre_shared_key extension
1215 * and the psk_key_exchange_modes extension.
1216 *
1217 * The pre_shared_key extension MUST be the last extension in the
1218 * ClientHello. Servers MUST check that it is the last extension and
1219 * otherwise fail the handshake with an "illegal_parameter" alert.
1220 *
1221 * Add the psk_key_exchange_modes extension.
1222 */
1223 ret = ssl_tls13_write_psk_key_exchange_modes_ext( ssl, p, end, &ext_len );
1224 if( ret != 0 )
1225 return( ret );
1226 p += ext_len;
Ronald Cron41a443a2022-10-04 16:38:25 +02001227#endif
XiaokangQianeb69aee2022-07-05 08:21:43 +00001228
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001229 *out_len = p - buf;
1230
1231 return( 0 );
1232}
1233
Jerry Yu1bc2c1f2021-09-01 12:57:29 +08001234/*
Jerry Yu4a173382021-10-11 21:45:31 +08001235 * Functions for parsing and processing Server Hello
Jerry Yue1b9c292021-09-10 10:08:31 +08001236 */
Ronald Cronfd6193c2022-04-05 11:04:20 +02001237
Ronald Cronda41b382022-03-30 09:57:11 +02001238/**
1239 * \brief Detect if the ServerHello contains a supported_versions extension
1240 * or not.
1241 *
1242 * \param[in] ssl SSL context
1243 * \param[in] buf Buffer containing the ServerHello message
1244 * \param[in] end End of the buffer containing the ServerHello message
1245 *
1246 * \return 0 if the ServerHello does not contain a supported_versions extension
1247 * \return 1 if the ServerHello contains a supported_versions extension
1248 * \return A negative value if an error occurred while parsing the ServerHello.
1249 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001250MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron9f0fba32022-02-10 16:45:15 +01001251static int ssl_tls13_is_supported_versions_ext_present(
1252 mbedtls_ssl_context *ssl,
1253 const unsigned char *buf,
1254 const unsigned char *end )
1255{
1256 const unsigned char *p = buf;
1257 size_t legacy_session_id_echo_len;
1258 size_t extensions_len;
1259 const unsigned char *extensions_end;
1260
1261 /*
1262 * Check there is enough data to access the legacy_session_id_echo vector
Ronald Cronda41b382022-03-30 09:57:11 +02001263 * length:
1264 * - legacy_version 2 bytes
1265 * - random MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes
1266 * - legacy_session_id_echo length 1 byte
Ronald Cron9f0fba32022-02-10 16:45:15 +01001267 */
1268 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 3 );
1269 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2;
1270 legacy_session_id_echo_len = *p;
1271
1272 /*
1273 * Jump to the extensions, jumping over:
1274 * - legacy_session_id_echo (legacy_session_id_echo_len + 1) bytes
1275 * - cipher_suite 2 bytes
1276 * - legacy_compression_method 1 byte
1277 */
Ronald Cron28271062022-06-10 14:43:55 +02001278 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, legacy_session_id_echo_len + 4 );
Ronald Cron9f0fba32022-02-10 16:45:15 +01001279 p += legacy_session_id_echo_len + 4;
1280
1281 /* Case of no extension */
1282 if( p == end )
1283 return( 0 );
1284
1285 /* ...
1286 * Extension extensions<6..2^16-1>;
1287 * ...
1288 * struct {
1289 * ExtensionType extension_type; (2 bytes)
1290 * opaque extension_data<0..2^16-1>;
1291 * } Extension;
1292 */
1293 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
1294 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
1295 p += 2;
1296
1297 /* Check extensions do not go beyond the buffer of data. */
1298 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
1299 extensions_end = p + extensions_len;
1300
1301 while( p < extensions_end )
1302 {
1303 unsigned int extension_type;
1304 size_t extension_data_len;
1305
1306 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
1307 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
1308 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
1309 p += 4;
1310
1311 if( extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS )
1312 return( 1 );
1313
1314 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
1315 p += extension_data_len;
1316 }
1317
1318 return( 0 );
1319}
1320
Jerry Yu7a186a02021-10-15 18:46:14 +08001321/* Returns a negative value on failure, and otherwise
Ronald Cronfd6193c2022-04-05 11:04:20 +02001322 * - 1 if the last eight bytes of the ServerHello random bytes indicate that
1323 * the server is TLS 1.3 capable but negotiating TLS 1.2 or below.
1324 * - 0 otherwise
1325 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001326MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cronfd6193c2022-04-05 11:04:20 +02001327static int ssl_tls13_is_downgrade_negotiation( mbedtls_ssl_context *ssl,
1328 const unsigned char *buf,
1329 const unsigned char *end )
1330{
1331 /* First seven bytes of the magic downgrade strings, see RFC 8446 4.1.3 */
1332 static const unsigned char magic_downgrade_string[] =
1333 { 0x44, 0x4F, 0x57, 0x4E, 0x47, 0x52, 0x44 };
1334 const unsigned char *last_eight_bytes_of_random;
1335 unsigned char last_byte_of_random;
1336
1337 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2 );
1338 last_eight_bytes_of_random = buf + 2 + MBEDTLS_SERVER_HELLO_RANDOM_LEN - 8;
1339
1340 if( memcmp( last_eight_bytes_of_random,
1341 magic_downgrade_string,
1342 sizeof( magic_downgrade_string ) ) == 0 )
1343 {
1344 last_byte_of_random = last_eight_bytes_of_random[7];
1345 return( last_byte_of_random == 0 ||
1346 last_byte_of_random == 1 );
1347 }
1348
1349 return( 0 );
1350}
1351
1352/* Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001353 * - SSL_SERVER_HELLO or
1354 * - SSL_SERVER_HELLO_HRR
XiaokangQian51eff222021-12-10 10:33:56 +00001355 * to indicate which message is expected and to be parsed next.
1356 */
Ronald Cron828aff62022-05-31 12:04:31 +02001357#define SSL_SERVER_HELLO 0
1358#define SSL_SERVER_HELLO_HRR 1
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001359MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yub85277e2021-10-13 13:36:05 +08001360static int ssl_server_hello_is_hrr( mbedtls_ssl_context *ssl,
1361 const unsigned char *buf,
1362 const unsigned char *end )
Jerry Yue1b9c292021-09-10 10:08:31 +08001363{
Jerry Yue1b9c292021-09-10 10:08:31 +08001364
1365 /* Check whether this message is a HelloRetryRequest ( HRR ) message.
1366 *
Jerry Yu4a173382021-10-11 21:45:31 +08001367 * Server Hello and HRR are only distinguished by Random set to the
Jerry Yue1b9c292021-09-10 10:08:31 +08001368 * special value of the SHA-256 of "HelloRetryRequest".
1369 *
1370 * struct {
1371 * ProtocolVersion legacy_version = 0x0303;
1372 * Random random;
1373 * opaque legacy_session_id_echo<0..32>;
1374 * CipherSuite cipher_suite;
1375 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001376 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001377 * } ServerHello;
1378 *
1379 */
Jerry Yu93a13f22022-04-11 23:00:01 +08001380 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end,
1381 2 + sizeof( mbedtls_ssl_tls13_hello_retry_request_magic ) );
Jerry Yu4a173382021-10-11 21:45:31 +08001382
Jerry Yu93a13f22022-04-11 23:00:01 +08001383 if( memcmp( buf + 2, mbedtls_ssl_tls13_hello_retry_request_magic,
1384 sizeof( mbedtls_ssl_tls13_hello_retry_request_magic ) ) == 0 )
Jerry Yue1b9c292021-09-10 10:08:31 +08001385 {
Ronald Cron828aff62022-05-31 12:04:31 +02001386 return( SSL_SERVER_HELLO_HRR );
Jerry Yue1b9c292021-09-10 10:08:31 +08001387 }
1388
Ronald Cron828aff62022-05-31 12:04:31 +02001389 return( SSL_SERVER_HELLO );
Jerry Yue1b9c292021-09-10 10:08:31 +08001390}
1391
Ronald Cron828aff62022-05-31 12:04:31 +02001392/*
Jerry Yu745bb612021-10-13 22:01:04 +08001393 * Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001394 * - SSL_SERVER_HELLO or
1395 * - SSL_SERVER_HELLO_HRR or
1396 * - SSL_SERVER_HELLO_TLS1_2
Jerry Yu745bb612021-10-13 22:01:04 +08001397 */
Ronald Cron828aff62022-05-31 12:04:31 +02001398#define SSL_SERVER_HELLO_TLS1_2 2
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001399MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron828aff62022-05-31 12:04:31 +02001400static int ssl_tls13_preprocess_server_hello( mbedtls_ssl_context *ssl,
Ronald Crondb5dfa12022-05-31 11:44:38 +02001401 const unsigned char *buf,
1402 const unsigned char *end )
Jerry Yue1b9c292021-09-10 10:08:31 +08001403{
Jerry Yu4a173382021-10-11 21:45:31 +08001404 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Ronald Cron5afb9042022-05-31 12:11:39 +02001405 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yue1b9c292021-09-10 10:08:31 +08001406
Ronald Cron9f0fba32022-02-10 16:45:15 +01001407 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_is_supported_versions_ext_present(
Ronald Crondb5dfa12022-05-31 11:44:38 +02001408 ssl, buf, end ) );
Jerry Yua66fece2022-07-13 14:30:29 +08001409
Ronald Cron9f0fba32022-02-10 16:45:15 +01001410 if( ret == 0 )
1411 {
Ronald Cronfd6193c2022-04-05 11:04:20 +02001412 MBEDTLS_SSL_PROC_CHK_NEG(
Ronald Crondb5dfa12022-05-31 11:44:38 +02001413 ssl_tls13_is_downgrade_negotiation( ssl, buf, end ) );
Ronald Cronfd6193c2022-04-05 11:04:20 +02001414
1415 /* If the server is negotiating TLS 1.2 or below and:
1416 * . we did not propose TLS 1.2 or
1417 * . the server responded it is TLS 1.3 capable but negotiating a lower
1418 * version of the protocol and thus we are under downgrade attack
1419 * abort the handshake with an "illegal parameter" alert.
Ronald Cron9f0fba32022-02-10 16:45:15 +01001420 */
Ronald Cron5afb9042022-05-31 12:11:39 +02001421 if( handshake->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2 || ret )
Ronald Cron9f0fba32022-02-10 16:45:15 +01001422 {
1423 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1424 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1425 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1426 }
1427
1428 ssl->keep_current_message = 1;
Glenn Strauss60bfe602022-03-14 19:04:24 -04001429 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001430 mbedtls_ssl_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
Ronald Crondb5dfa12022-05-31 11:44:38 +02001431 buf, (size_t)(end - buf) );
Ronald Cron9f0fba32022-02-10 16:45:15 +01001432
1433 if( mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
1434 {
1435 ret = ssl_tls13_reset_key_share( ssl );
1436 if( ret != 0 )
1437 return( ret );
1438 }
1439
Ronald Cron828aff62022-05-31 12:04:31 +02001440 return( SSL_SERVER_HELLO_TLS1_2 );
Ronald Cron9f0fba32022-02-10 16:45:15 +01001441 }
1442
Jerry Yua66fece2022-07-13 14:30:29 +08001443#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1444 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
1445 ssl->session_negotiate->tls_version = ssl->tls_version;
1446#endif /* MBEDTLS_SSL_SESSION_TICKETS */
1447
Jerry Yu50e00e32022-10-31 14:45:01 +08001448 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Ronald Cron5afb9042022-05-31 12:11:39 +02001449
Ronald Crondb5dfa12022-05-31 11:44:38 +02001450 ret = ssl_server_hello_is_hrr( ssl, buf, end );
Jerry Yub85277e2021-10-13 13:36:05 +08001451 switch( ret )
Jerry Yue1b9c292021-09-10 10:08:31 +08001452 {
Ronald Cron828aff62022-05-31 12:04:31 +02001453 case SSL_SERVER_HELLO:
Jerry Yu745bb612021-10-13 22:01:04 +08001454 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received ServerHello message" ) );
1455 break;
Ronald Cron828aff62022-05-31 12:04:31 +02001456 case SSL_SERVER_HELLO_HRR:
Jerry Yu745bb612021-10-13 22:01:04 +08001457 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received HelloRetryRequest message" ) );
XiaokangQian16acd4b2022-01-14 07:35:47 +00001458 /* If a client receives a second
1459 * HelloRetryRequest in the same connection (i.e., where the ClientHello
1460 * was itself in response to a HelloRetryRequest), it MUST abort the
1461 * handshake with an "unexpected_message" alert.
1462 */
Ronald Cron5afb9042022-05-31 12:11:39 +02001463 if( handshake->hello_retry_request_count > 0 )
XiaokangQian16acd4b2022-01-14 07:35:47 +00001464 {
1465 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Multiple HRRs received" ) );
1466 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
1467 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
1468 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
1469 }
XiaokangQian2b01dc32022-01-21 02:53:13 +00001470 /*
1471 * Clients must abort the handshake with an "illegal_parameter"
1472 * alert if the HelloRetryRequest would not result in any change
1473 * in the ClientHello.
1474 * In a PSK only key exchange that what we expect.
1475 */
1476 if( ! mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
1477 {
1478 MBEDTLS_SSL_DEBUG_MSG( 1,
1479 ( "Unexpected HRR in pure PSK key exchange." ) );
1480 MBEDTLS_SSL_PEND_FATAL_ALERT(
1481 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1482 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1483 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1484 }
XiaokangQian16acd4b2022-01-14 07:35:47 +00001485
Ronald Cron5afb9042022-05-31 12:11:39 +02001486 handshake->hello_retry_request_count++;
XiaokangQian16acd4b2022-01-14 07:35:47 +00001487
Jerry Yu745bb612021-10-13 22:01:04 +08001488 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001489 }
1490
1491cleanup:
1492
1493 return( ret );
1494}
1495
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001496MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4a173382021-10-11 21:45:31 +08001497static int ssl_tls13_check_server_hello_session_id_echo( mbedtls_ssl_context *ssl,
1498 const unsigned char **buf,
1499 const unsigned char *end )
Jerry Yue1b9c292021-09-10 10:08:31 +08001500{
1501 const unsigned char *p = *buf;
Jerry Yu4a173382021-10-11 21:45:31 +08001502 size_t legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001503
Jerry Yude4fb2c2021-09-19 18:05:08 +08001504 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
Jerry Yu4a173382021-10-11 21:45:31 +08001505 legacy_session_id_echo_len = *p++ ;
Jerry Yue1b9c292021-09-10 10:08:31 +08001506
Jerry Yu4a173382021-10-11 21:45:31 +08001507 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, legacy_session_id_echo_len );
Jerry Yue1b9c292021-09-10 10:08:31 +08001508
1509 /* legacy_session_id_echo */
Jerry Yu4a173382021-10-11 21:45:31 +08001510 if( ssl->session_negotiate->id_len != legacy_session_id_echo_len ||
1511 memcmp( ssl->session_negotiate->id, p , legacy_session_id_echo_len ) != 0 )
Jerry Yue1b9c292021-09-10 10:08:31 +08001512 {
Jerry Yue1b9c292021-09-10 10:08:31 +08001513 MBEDTLS_SSL_DEBUG_BUF( 3, "Expected Session ID",
1514 ssl->session_negotiate->id,
1515 ssl->session_negotiate->id_len );
1516 MBEDTLS_SSL_DEBUG_BUF( 3, "Received Session ID", p,
Jerry Yu4a173382021-10-11 21:45:31 +08001517 legacy_session_id_echo_len );
1518
1519 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1520 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1521
Jerry Yue1b9c292021-09-10 10:08:31 +08001522 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1523 }
1524
Jerry Yu4a173382021-10-11 21:45:31 +08001525 p += legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001526 *buf = p;
1527
1528 MBEDTLS_SSL_DEBUG_BUF( 3, "Session ID", ssl->session_negotiate->id,
Jerry Yu4a173382021-10-11 21:45:31 +08001529 ssl->session_negotiate->id_len );
Jerry Yue1b9c292021-09-10 10:08:31 +08001530 return( 0 );
1531}
1532
Jerry Yue1b9c292021-09-10 10:08:31 +08001533/* Parse ServerHello message and configure context
1534 *
1535 * struct {
1536 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1537 * Random random;
1538 * opaque legacy_session_id_echo<0..32>;
1539 * CipherSuite cipher_suite;
1540 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001541 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001542 * } ServerHello;
1543 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001544MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc068b662021-10-11 22:30:19 +08001545static int ssl_tls13_parse_server_hello( mbedtls_ssl_context *ssl,
1546 const unsigned char *buf,
XiaokangQiand9e068e2022-01-18 06:23:32 +00001547 const unsigned char *end,
1548 int is_hrr )
Jerry Yue1b9c292021-09-10 10:08:31 +08001549{
Jerry Yub85277e2021-10-13 13:36:05 +08001550 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +08001551 const unsigned char *p = buf;
XiaokangQian355e09a2022-01-20 11:14:50 +00001552 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yub85277e2021-10-13 13:36:05 +08001553 size_t extensions_len;
1554 const unsigned char *extensions_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001555 uint16_t cipher_suite;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001556 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
XiaokangQianb119a352022-01-26 03:29:10 +00001557 int fatal_alert = 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001558 uint32_t allowed_extensions_mask;
Jerry Yu50e00e32022-10-31 14:45:01 +08001559 int hs_msg_type = is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST :
1560 MBEDTLS_SSL_HS_SERVER_HELLO;
Jerry Yue1b9c292021-09-10 10:08:31 +08001561
1562 /*
1563 * Check there is space for minimal fields
1564 *
1565 * - legacy_version ( 2 bytes)
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001566 * - random (MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes)
Jerry Yue1b9c292021-09-10 10:08:31 +08001567 * - legacy_session_id_echo ( 1 byte ), minimum size
1568 * - cipher_suite ( 2 bytes)
1569 * - legacy_compression_method ( 1 byte )
1570 */
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001571 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 6 );
Jerry Yue1b9c292021-09-10 10:08:31 +08001572
1573 MBEDTLS_SSL_DEBUG_BUF( 4, "server hello", p, end - p );
Jerry Yue1b9c292021-09-10 10:08:31 +08001574 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", p, 2 );
1575
Jerry Yu4a173382021-10-11 21:45:31 +08001576 /* ...
Jerry Yub85277e2021-10-13 13:36:05 +08001577 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
Jerry Yu4a173382021-10-11 21:45:31 +08001578 * ...
1579 * with ProtocolVersion defined as:
1580 * uint16 ProtocolVersion;
1581 */
Glenn Strausse3af4cb2022-03-15 03:23:42 -04001582 if( mbedtls_ssl_read_version( p, ssl->conf->transport ) !=
1583 MBEDTLS_SSL_VERSION_TLS1_2 )
Jerry Yue1b9c292021-09-10 10:08:31 +08001584 {
1585 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Unsupported version of TLS." ) );
1586 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1587 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
XiaokangQiand59be772022-01-24 10:12:51 +00001588 ret = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1589 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001590 }
1591 p += 2;
Jerry Yue1b9c292021-09-10 10:08:31 +08001592
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001593 /* ...
Jerry Yu4a173382021-10-11 21:45:31 +08001594 * Random random;
1595 * ...
1596 * with Random defined as:
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001597 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu4a173382021-10-11 21:45:31 +08001598 */
XiaokangQian53f20b72022-01-18 10:47:33 +00001599 if( !is_hrr )
1600 {
XiaokangQian355e09a2022-01-20 11:14:50 +00001601 memcpy( &handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN], p,
XiaokangQian53f20b72022-01-18 10:47:33 +00001602 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
1603 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes",
1604 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN );
1605 }
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001606 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
Jerry Yue1b9c292021-09-10 10:08:31 +08001607
Jerry Yu4a173382021-10-11 21:45:31 +08001608 /* ...
1609 * opaque legacy_session_id_echo<0..32>;
1610 * ...
1611 */
1612 if( ssl_tls13_check_server_hello_session_id_echo( ssl, &p, end ) != 0 )
Jerry Yue1b9c292021-09-10 10:08:31 +08001613 {
XiaokangQian52da5582022-01-26 09:49:29 +00001614 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001615 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001616 }
1617
Jerry Yu4a173382021-10-11 21:45:31 +08001618 /* ...
1619 * CipherSuite cipher_suite;
1620 * ...
1621 * with CipherSuite defined as:
1622 * uint8 CipherSuite[2];
1623 */
1624 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
Jerry Yue1b9c292021-09-10 10:08:31 +08001625 cipher_suite = MBEDTLS_GET_UINT16_BE( p, 0 );
1626 p += 2;
1627
Jerry Yu4a173382021-10-11 21:45:31 +08001628
XiaokangQian355e09a2022-01-20 11:14:50 +00001629 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
Jerry Yu4a173382021-10-11 21:45:31 +08001630 /*
Ronald Cronba120bb2022-03-30 22:09:48 +02001631 * Check whether this ciphersuite is valid and offered.
Jerry Yu4a173382021-10-11 21:45:31 +08001632 */
Glenn Strauss60bfe602022-03-14 19:04:24 -04001633 if( ( mbedtls_ssl_validate_ciphersuite( ssl, ciphersuite_info,
1634 ssl->tls_version,
1635 ssl->tls_version ) != 0 ) ||
XiaokangQian08037552022-04-20 07:16:41 +00001636 !mbedtls_ssl_tls13_cipher_suite_is_offered( ssl, cipher_suite ) )
Jerry Yue1b9c292021-09-10 10:08:31 +08001637 {
XiaokangQian52da5582022-01-26 09:49:29 +00001638 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +08001639 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001640 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00001641 * If we received an HRR before and that the proposed selected
1642 * ciphersuite in this server hello is not the same as the one
1643 * proposed in the HRR, we abort the handshake and send an
1644 * "illegal_parameter" alert.
XiaokangQian53f20b72022-01-18 10:47:33 +00001645 */
XiaokangQian355e09a2022-01-20 11:14:50 +00001646 else if( ( !is_hrr ) && ( handshake->hello_retry_request_count > 0 ) &&
1647 ( cipher_suite != ssl->session_negotiate->ciphersuite ) )
XiaokangQian53f20b72022-01-18 10:47:33 +00001648 {
XiaokangQian52da5582022-01-26 09:49:29 +00001649 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQian355e09a2022-01-20 11:14:50 +00001650 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001651
XiaokangQian52da5582022-01-26 09:49:29 +00001652 if( fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER )
XiaokangQian355e09a2022-01-20 11:14:50 +00001653 {
1654 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid ciphersuite(%04x) parameter",
1655 cipher_suite ) );
XiaokangQiand59be772022-01-24 10:12:51 +00001656 goto cleanup;
XiaokangQian53f20b72022-01-18 10:47:33 +00001657 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001658
Jerry Yu4a173382021-10-11 21:45:31 +08001659 /* Configure ciphersuites */
1660 mbedtls_ssl_optimize_checksum( ssl, ciphersuite_info );
1661
XiaokangQian355e09a2022-01-20 11:14:50 +00001662 handshake->ciphersuite_info = ciphersuite_info;
Jerry Yue1b9c292021-09-10 10:08:31 +08001663 ssl->session_negotiate->ciphersuite = cipher_suite;
1664
Jerry Yue1b9c292021-09-10 10:08:31 +08001665 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: ( %04x ) - %s",
1666 cipher_suite, ciphersuite_info->name ) );
1667
1668#if defined(MBEDTLS_HAVE_TIME)
1669 ssl->session_negotiate->start = time( NULL );
1670#endif /* MBEDTLS_HAVE_TIME */
1671
Jerry Yu4a173382021-10-11 21:45:31 +08001672 /* ...
1673 * uint8 legacy_compression_method = 0;
1674 * ...
Jerry Yue1b9c292021-09-10 10:08:31 +08001675 */
Jerry Yude4fb2c2021-09-19 18:05:08 +08001676 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
Thomas Daubney31e03a82022-07-25 15:59:25 +01001677 if( p[0] != MBEDTLS_SSL_COMPRESS_NULL )
Jerry Yue1b9c292021-09-10 10:08:31 +08001678 {
Jerry Yub85277e2021-10-13 13:36:05 +08001679 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad legacy compression method" ) );
XiaokangQian52da5582022-01-26 09:49:29 +00001680 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001681 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001682 }
1683 p++;
1684
Jerry Yub85277e2021-10-13 13:36:05 +08001685 /* ...
1686 * Extension extensions<6..2^16-1>;
1687 * ...
Jerry Yu4a173382021-10-11 21:45:31 +08001688 * struct {
1689 * ExtensionType extension_type; (2 bytes)
1690 * opaque extension_data<0..2^16-1>;
1691 * } Extension;
1692 */
Jerry Yude4fb2c2021-09-19 18:05:08 +08001693 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
Jerry Yu4a173382021-10-11 21:45:31 +08001694 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yue1b9c292021-09-10 10:08:31 +08001695 p += 2;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001696
Jerry Yu4a173382021-10-11 21:45:31 +08001697 /* Check extensions do not go beyond the buffer of data. */
1698 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
1699 extensions_end = p + extensions_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001700
Jerry Yu4a173382021-10-11 21:45:31 +08001701 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello extensions", p, extensions_len );
Jerry Yue1b9c292021-09-10 10:08:31 +08001702
Jerry Yu50e00e32022-10-31 14:45:01 +08001703 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu0c354a22022-08-29 15:25:36 +08001704 allowed_extensions_mask = is_hrr ?
Jerry Yu2c5363e2022-08-04 17:42:49 +08001705 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_HRR :
1706 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_SH;
1707
Jerry Yu4a173382021-10-11 21:45:31 +08001708 while( p < extensions_end )
Jerry Yue1b9c292021-09-10 10:08:31 +08001709 {
1710 unsigned int extension_type;
1711 size_t extension_data_len;
XiaokangQian43550bd2022-01-21 04:32:58 +00001712 const unsigned char *extension_data_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001713
Jerry Yu4a173382021-10-11 21:45:31 +08001714 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
Jerry Yue1b9c292021-09-10 10:08:31 +08001715 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
1716 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
1717 p += 4;
1718
Jerry Yu4a173382021-10-11 21:45:31 +08001719 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
XiaokangQian43550bd2022-01-21 04:32:58 +00001720 extension_data_end = p + extension_data_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001721
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001722 ret = mbedtls_ssl_tls13_check_received_extension(
Jerry Yu50e00e32022-10-31 14:45:01 +08001723 ssl, hs_msg_type, extension_type, allowed_extensions_mask );
Jerry Yu0c354a22022-08-29 15:25:36 +08001724 if( ret != 0 )
1725 return( ret );
Jerry Yu2c5363e2022-08-04 17:42:49 +08001726
Jerry Yue1b9c292021-09-10 10:08:31 +08001727 switch( extension_type )
1728 {
XiaokangQianb851da82022-01-14 04:03:11 +00001729 case MBEDTLS_TLS_EXT_COOKIE:
1730
XiaokangQian43550bd2022-01-21 04:32:58 +00001731 ret = ssl_tls13_parse_cookie_ext( ssl,
1732 p, extension_data_end );
1733 if( ret != 0 )
XiaokangQianb851da82022-01-14 04:03:11 +00001734 {
XiaokangQian43550bd2022-01-21 04:32:58 +00001735 MBEDTLS_SSL_DEBUG_RET( 1,
1736 "ssl_tls13_parse_cookie_ext",
1737 ret );
XiaokangQiand59be772022-01-24 10:12:51 +00001738 goto cleanup;
XiaokangQianb851da82022-01-14 04:03:11 +00001739 }
XiaokangQianb851da82022-01-14 04:03:11 +00001740 break;
XiaokangQianb851da82022-01-14 04:03:11 +00001741
Jerry Yue1b9c292021-09-10 10:08:31 +08001742 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
Jerry Yuc068b662021-10-11 22:30:19 +08001743 ret = ssl_tls13_parse_supported_versions_ext( ssl,
Jerry Yub85277e2021-10-13 13:36:05 +08001744 p,
XiaokangQian43550bd2022-01-21 04:32:58 +00001745 extension_data_end );
Jerry Yue1b9c292021-09-10 10:08:31 +08001746 if( ret != 0 )
XiaokangQiand59be772022-01-24 10:12:51 +00001747 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001748 break;
1749
Ronald Cron41a443a2022-10-04 16:38:25 +02001750#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yue1b9c292021-09-10 10:08:31 +08001751 case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
XiaokangQianeb69aee2022-07-05 08:21:43 +00001752 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found pre_shared_key extension" ) );
Jerry Yu4a173382021-10-11 21:45:31 +08001753
XiaokangQian86981952022-07-19 09:51:50 +00001754 if( ( ret = ssl_tls13_parse_server_pre_shared_key_ext(
XiaokangQian008d2bf2022-07-14 07:54:01 +00001755 ssl, p, extension_data_end ) ) != 0 )
XiaokangQianeb69aee2022-07-05 08:21:43 +00001756 {
1757 MBEDTLS_SSL_DEBUG_RET(
XiaokangQian86981952022-07-19 09:51:50 +00001758 1, ( "ssl_tls13_parse_server_pre_shared_key_ext" ), ret );
XiaokangQianeb69aee2022-07-05 08:21:43 +00001759 return( ret );
1760 }
1761 break;
Ronald Cron41a443a2022-10-04 16:38:25 +02001762#endif
Jerry Yue1b9c292021-09-10 10:08:31 +08001763
Jerry Yue1b9c292021-09-10 10:08:31 +08001764 case MBEDTLS_TLS_EXT_KEY_SHARE:
1765 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found key_shares extension" ) );
XiaokangQiand59be772022-01-24 10:12:51 +00001766 if( ! mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
1767 {
XiaokangQian52da5582022-01-26 09:49:29 +00001768 fatal_alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT;
XiaokangQiand59be772022-01-24 10:12:51 +00001769 goto cleanup;
1770 }
1771
XiaokangQian53f20b72022-01-18 10:47:33 +00001772 if( is_hrr )
XiaokangQiand9e068e2022-01-18 06:23:32 +00001773 ret = ssl_tls13_parse_hrr_key_share_ext( ssl,
XiaokangQian43550bd2022-01-21 04:32:58 +00001774 p, extension_data_end );
XiaokangQian53f20b72022-01-18 10:47:33 +00001775 else
XiaokangQianb851da82022-01-14 04:03:11 +00001776 ret = ssl_tls13_parse_key_share_ext( ssl,
XiaokangQian43550bd2022-01-21 04:32:58 +00001777 p, extension_data_end );
XiaokangQianb851da82022-01-14 04:03:11 +00001778 if( ret != 0 )
Jerry Yue1b9c292021-09-10 10:08:31 +08001779 {
1780 MBEDTLS_SSL_DEBUG_RET( 1,
Jerry Yu4a173382021-10-11 21:45:31 +08001781 "ssl_tls13_parse_key_share_ext",
Jerry Yue1b9c292021-09-10 10:08:31 +08001782 ret );
XiaokangQiand59be772022-01-24 10:12:51 +00001783 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001784 }
1785 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001786
1787 default:
Jerry Yu9872eb22022-08-29 13:42:01 +08001788 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1789 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001790 }
1791
1792 p += extension_data_len;
1793 }
1794
Jerry Yu97be6a92022-11-09 22:43:31 +08001795 MBEDTLS_SSL_PRINT_EXTS( 3, hs_msg_type, handshake->received_extensions );
Jerry Yu2c5363e2022-08-04 17:42:49 +08001796
XiaokangQiand59be772022-01-24 10:12:51 +00001797cleanup:
1798
XiaokangQian52da5582022-01-26 09:49:29 +00001799 if( fatal_alert == MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT )
XiaokangQiand59be772022-01-24 10:12:51 +00001800 {
1801 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
1802 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
1803 ret = MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
1804 }
XiaokangQian52da5582022-01-26 09:49:29 +00001805 else if ( fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER )
XiaokangQiand59be772022-01-24 10:12:51 +00001806 {
1807 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1808 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1809 ret = MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1810 }
1811 return( ret );
Jerry Yue1b9c292021-09-10 10:08:31 +08001812}
1813
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001814#if defined(MBEDTLS_DEBUG_C)
1815static const char *ssl_tls13_get_kex_mode_str(int mode)
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001816{
1817 switch( mode )
1818 {
1819 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK:
1820 return "psk";
1821 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL:
1822 return "ephemeral";
1823 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL:
1824 return "psk_ephemeral";
1825 default:
1826 return "unknown mode";
1827 }
1828}
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001829#endif /* MBEDTLS_DEBUG_C */
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001830
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001831MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian355e09a2022-01-20 11:14:50 +00001832static int ssl_tls13_postprocess_server_hello( mbedtls_ssl_context *ssl )
Jerry Yue1b9c292021-09-10 10:08:31 +08001833{
Jerry Yub85277e2021-10-13 13:36:05 +08001834 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub85277e2021-10-13 13:36:05 +08001835 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yu0b177842021-09-05 19:41:30 +08001836
Jerry Yub85277e2021-10-13 13:36:05 +08001837 /* Determine the key exchange mode:
1838 * 1) If both the pre_shared_key and key_share extensions were received
1839 * then the key exchange mode is PSK with EPHEMERAL.
1840 * 2) If only the pre_shared_key extension was received then the key
1841 * exchange mode is PSK-only.
1842 * 3) If only the key_share extension was received then the key
1843 * exchange mode is EPHEMERAL-only.
Jerry Yu0b177842021-09-05 19:41:30 +08001844 */
Jerry Yu0c354a22022-08-29 15:25:36 +08001845 switch( handshake->received_extensions &
Jerry Yu50e00e32022-10-31 14:45:01 +08001846 ( MBEDTLS_SSL_EXT_MASK( PRE_SHARED_KEY ) | MBEDTLS_SSL_EXT_MASK( KEY_SHARE ) ) )
Jerry Yu0b177842021-09-05 19:41:30 +08001847 {
Jerry Yu745bb612021-10-13 22:01:04 +08001848 /* Only the pre_shared_key extension was received */
Jerry Yu50e00e32022-10-31 14:45:01 +08001849 case MBEDTLS_SSL_EXT_MASK( PRE_SHARED_KEY ):
Ronald Cron79907712022-07-20 17:05:29 +02001850 handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
Jerry Yu745bb612021-10-13 22:01:04 +08001851 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001852
Jerry Yu745bb612021-10-13 22:01:04 +08001853 /* Only the key_share extension was received */
Jerry Yu50e00e32022-10-31 14:45:01 +08001854 case MBEDTLS_SSL_EXT_MASK( KEY_SHARE ):
Ronald Cron79907712022-07-20 17:05:29 +02001855 handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001856 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001857
Jerry Yu745bb612021-10-13 22:01:04 +08001858 /* Both the pre_shared_key and key_share extensions were received */
Jerry Yu50e00e32022-10-31 14:45:01 +08001859 case ( MBEDTLS_SSL_EXT_MASK( PRE_SHARED_KEY ) | MBEDTLS_SSL_EXT_MASK( KEY_SHARE ) ):
Ronald Cron79907712022-07-20 17:05:29 +02001860 handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001861 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001862
Jerry Yu745bb612021-10-13 22:01:04 +08001863 /* Neither pre_shared_key nor key_share extension was received */
1864 default:
1865 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Unknown key exchange." ) );
1866 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1867 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001868 }
1869
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001870 if( !mbedtls_ssl_conf_tls13_check_kex_modes( ssl, handshake->key_exchange_mode ) )
1871 {
1872 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1873 MBEDTLS_SSL_DEBUG_MSG( 2,
Xiaokang Qianca343ae2022-09-28 02:07:54 +00001874 ( "Key exchange mode(%s) is not supported.",
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001875 ssl_tls13_get_kex_mode_str( handshake->key_exchange_mode ) ) );
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001876 goto cleanup;
1877 }
1878
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001879 MBEDTLS_SSL_DEBUG_MSG( 3,
Xiaokang Qianca343ae2022-09-28 02:07:54 +00001880 ( "Selected key exchange mode: %s",
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001881 ssl_tls13_get_kex_mode_str( handshake->key_exchange_mode ) ) );
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001882
Jerry Yu0b177842021-09-05 19:41:30 +08001883 /* Start the TLS 1.3 key schedule: Set the PSK and derive early secret.
1884 *
1885 * TODO: We don't have to do this in case we offered 0-RTT and the
1886 * server accepted it. In this case, we could skip generating
1887 * the early secret. */
Xiaofei Bai746f9482021-11-12 08:53:56 +00001888 ret = mbedtls_ssl_tls13_key_schedule_stage_early( ssl );
Jerry Yu0b177842021-09-05 19:41:30 +08001889 if( ret != 0 )
1890 {
Jerry Yue110d252022-05-05 10:19:22 +08001891 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_key_schedule_stage_early",
Jerry Yu0b177842021-09-05 19:41:30 +08001892 ret );
Jerry Yu4a173382021-10-11 21:45:31 +08001893 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001894 }
1895
Jerry Yuf86eb752022-05-06 11:16:55 +08001896 ret = mbedtls_ssl_tls13_compute_handshake_transform( ssl );
Jerry Yu0b177842021-09-05 19:41:30 +08001897 if( ret != 0 )
1898 {
Jerry Yuf86eb752022-05-06 11:16:55 +08001899 MBEDTLS_SSL_DEBUG_RET( 1,
1900 "mbedtls_ssl_tls13_compute_handshake_transform",
Jerry Yuc068b662021-10-11 22:30:19 +08001901 ret );
Jerry Yu4a173382021-10-11 21:45:31 +08001902 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001903 }
1904
Jerry Yue110d252022-05-05 10:19:22 +08001905 mbedtls_ssl_set_inbound_transform( ssl, handshake->transform_handshake );
Jerry Yu0b177842021-09-05 19:41:30 +08001906 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Switch to handshake keys for inbound traffic" ) );
1907 ssl->session_in = ssl->session_negotiate;
1908
Jerry Yu4a173382021-10-11 21:45:31 +08001909cleanup:
Jerry Yu4a173382021-10-11 21:45:31 +08001910 if( ret != 0 )
1911 {
Jerry Yu4a173382021-10-11 21:45:31 +08001912 MBEDTLS_SSL_PEND_FATAL_ALERT(
1913 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1914 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1915 }
Jerry Yue110d252022-05-05 10:19:22 +08001916
Jerry Yu4a173382021-10-11 21:45:31 +08001917 return( ret );
Jerry Yue1b9c292021-09-10 10:08:31 +08001918}
1919
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001920MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian355e09a2022-01-20 11:14:50 +00001921static int ssl_tls13_postprocess_hrr( mbedtls_ssl_context *ssl )
XiaokangQian647719a2021-12-07 09:16:29 +00001922{
1923 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1924
XiaokangQian78b1fa72022-01-19 06:56:30 +00001925 mbedtls_ssl_session_reset_msg_layer( ssl, 0 );
XiaokangQian647719a2021-12-07 09:16:29 +00001926
XiaokangQian78b1fa72022-01-19 06:56:30 +00001927 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00001928 * We are going to re-generate a shared secret corresponding to the group
1929 * selected by the server, which is different from the group for which we
1930 * generated a shared secret in the first client hello.
1931 * Thus, reset the shared secret.
XiaokangQian51eff222021-12-10 10:33:56 +00001932 */
XiaokangQian16acd4b2022-01-14 07:35:47 +00001933 ret = ssl_tls13_reset_key_share( ssl );
XiaokangQian647719a2021-12-07 09:16:29 +00001934 if( ret != 0 )
1935 return( ret );
1936
1937 return( 0 );
1938}
1939
Jerry Yue1b9c292021-09-10 10:08:31 +08001940/*
Jerry Yu4a173382021-10-11 21:45:31 +08001941 * Wait and parse ServerHello handshake message.
Jerry Yu687101b2021-09-14 16:03:56 +08001942 * Handler for MBEDTLS_SSL_SERVER_HELLO
1943 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001944MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00001945static int ssl_tls13_process_server_hello( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08001946{
Jerry Yu4a173382021-10-11 21:45:31 +08001947 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian647719a2021-12-07 09:16:29 +00001948 unsigned char *buf = NULL;
1949 size_t buf_len = 0;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001950 int is_hrr = 0;
Jerry Yue1b9c292021-09-10 10:08:31 +08001951
1952 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> %s", __func__ ) );
1953
Ronald Crondb5dfa12022-05-31 11:44:38 +02001954 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg( ssl,
1955 MBEDTLS_SSL_HS_SERVER_HELLO,
1956 &buf, &buf_len ) );
1957
Ronald Cron828aff62022-05-31 12:04:31 +02001958 ret = ssl_tls13_preprocess_server_hello( ssl, buf, buf + buf_len );
XiaokangQiand9e068e2022-01-18 06:23:32 +00001959 if( ret < 0 )
XiaokangQian16acd4b2022-01-14 07:35:47 +00001960 goto cleanup;
1961 else
Ronald Cron828aff62022-05-31 12:04:31 +02001962 is_hrr = ( ret == SSL_SERVER_HELLO_HRR );
XiaokangQiand59be772022-01-24 10:12:51 +00001963
Ronald Cron828aff62022-05-31 12:04:31 +02001964 if( ret == SSL_SERVER_HELLO_TLS1_2 )
Ronald Cron9f0fba32022-02-10 16:45:15 +01001965 {
1966 ret = 0;
1967 goto cleanup;
1968 }
1969
XiaokangQianb851da82022-01-14 04:03:11 +00001970 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_server_hello( ssl, buf,
XiaokangQiand9e068e2022-01-18 06:23:32 +00001971 buf + buf_len,
1972 is_hrr ) );
1973 if( is_hrr )
XiaokangQian647719a2021-12-07 09:16:29 +00001974 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_reset_transcript_for_hrr( ssl ) );
1975
Ronald Cron8f6d39a2022-03-10 18:56:50 +01001976 mbedtls_ssl_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
1977 buf, buf_len );
XiaokangQian647719a2021-12-07 09:16:29 +00001978
XiaokangQiand9e068e2022-01-18 06:23:32 +00001979 if( is_hrr )
Ronald Cronfb508b82022-05-31 14:49:55 +02001980 {
XiaokangQian355e09a2022-01-20 11:14:50 +00001981 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_hrr( ssl ) );
Ronald Cronfb508b82022-05-31 14:49:55 +02001982#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1983 /* If not offering early data, the client sends a dummy CCS record
1984 * immediately before its second flight. This may either be before
1985 * its second ClientHello or before its encrypted handshake flight.
1986 */
1987 mbedtls_ssl_handshake_set_state( ssl,
1988 MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO );
1989#else
1990 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
1991#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1992 }
XiaokangQiand9e068e2022-01-18 06:23:32 +00001993 else
Ronald Cronfb508b82022-05-31 14:49:55 +02001994 {
XiaokangQian355e09a2022-01-20 11:14:50 +00001995 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_server_hello( ssl ) );
Ronald Cronfb508b82022-05-31 14:49:55 +02001996 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
1997 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001998
1999cleanup:
XiaokangQiana9090612022-01-27 03:48:27 +00002000 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= %s ( %s )", __func__,
2001 is_hrr?"HelloRetryRequest":"ServerHello" ) );
Jerry Yue1b9c292021-09-10 10:08:31 +08002002 return( ret );
Jerry Yu687101b2021-09-14 16:03:56 +08002003}
2004
2005/*
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002006 *
Ronald Cron9d6a5452022-05-30 16:05:38 +02002007 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002008 *
2009 * The EncryptedExtensions message contains any extensions which
2010 * should be protected, i.e., any which are not needed to establish
2011 * the cryptographic context.
Jerry Yu687101b2021-09-14 16:03:56 +08002012 */
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002013
XiaokangQian08da26c2021-10-09 10:12:11 +00002014/* Parse EncryptedExtensions message
2015 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002016 * Extension extensions<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002017 * } EncryptedExtensions;
2018 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002019MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian97799ac2021-10-11 10:05:54 +00002020static int ssl_tls13_parse_encrypted_extensions( mbedtls_ssl_context *ssl,
2021 const unsigned char *buf,
2022 const unsigned char *end )
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002023{
2024 int ret = 0;
XiaokangQian08da26c2021-10-09 10:12:11 +00002025 size_t extensions_len;
XiaokangQian140f0452021-10-08 08:05:53 +00002026 const unsigned char *p = buf;
XiaokangQian8db25ff2021-10-13 05:56:18 +00002027 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002028 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002029
XiaokangQian08da26c2021-10-09 10:12:11 +00002030 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian97799ac2021-10-11 10:05:54 +00002031 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian08da26c2021-10-09 10:12:11 +00002032 p += 2;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002033
XiaokangQian97799ac2021-10-11 10:05:54 +00002034 MBEDTLS_SSL_DEBUG_BUF( 3, "encrypted extensions", p, extensions_len );
XiaokangQian8db25ff2021-10-13 05:56:18 +00002035 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
Ronald Cronc8083592022-05-31 16:24:05 +02002036 extensions_end = p + extensions_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002037
Jerry Yu9eba7502022-10-31 13:46:16 +08002038 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yucbd082f2022-08-04 16:55:10 +08002039
XiaokangQian8db25ff2021-10-13 05:56:18 +00002040 while( p < extensions_end )
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002041 {
XiaokangQian08da26c2021-10-09 10:12:11 +00002042 unsigned int extension_type;
2043 size_t extension_data_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002044
XiaokangQian08da26c2021-10-09 10:12:11 +00002045 /*
2046 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002047 * ExtensionType extension_type; (2 bytes)
2048 * opaque extension_data<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002049 * } Extension;
2050 */
XiaokangQian8db25ff2021-10-13 05:56:18 +00002051 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
XiaokangQian08da26c2021-10-09 10:12:11 +00002052 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
2053 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
2054 p += 4;
2055
XiaokangQian8db25ff2021-10-13 05:56:18 +00002056 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002057
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002058 ret = mbedtls_ssl_tls13_check_received_extension(
Jerry Yu0c354a22022-08-29 15:25:36 +08002059 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, extension_type,
2060 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_EE );
2061 if( ret != 0 )
2062 return( ret );
Jerry Yucbd082f2022-08-04 16:55:10 +08002063
XiaokangQian08da26c2021-10-09 10:12:11 +00002064 switch( extension_type )
2065 {
lhuang0486cacac2022-01-21 07:34:27 -08002066#if defined(MBEDTLS_SSL_ALPN)
2067 case MBEDTLS_TLS_EXT_ALPN:
2068 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
2069
2070 if( ( ret = ssl_tls13_parse_alpn_ext( ssl, p, (size_t)extension_data_len ) ) != 0 )
2071 {
2072 return( ret );
2073 }
2074
2075 break;
2076#endif /* MBEDTLS_SSL_ALPN */
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002077
2078#if defined(MBEDTLS_SSL_EARLY_DATA)
2079 case MBEDTLS_TLS_EXT_EARLY_DATA:
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002080
2081 if( extension_data_len != 0 )
2082 {
2083 /* The message must be empty. */
2084 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2085 MBEDTLS_ERR_SSL_DECODE_ERROR );
2086 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
2087 }
2088
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002089 break;
2090#endif /* MBEDTLS_SSL_EARLY_DATA */
2091
XiaokangQian08da26c2021-10-09 10:12:11 +00002092 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002093 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu9eba7502022-10-31 13:46:16 +08002094 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2095 extension_type, "( ignored )" );
Jerry Yucbd082f2022-08-04 16:55:10 +08002096 break;
XiaokangQian08da26c2021-10-09 10:12:11 +00002097 }
2098
XiaokangQian08da26c2021-10-09 10:12:11 +00002099 p += extension_data_len;
XiaokangQian97799ac2021-10-11 10:05:54 +00002100 }
XiaokangQian08da26c2021-10-09 10:12:11 +00002101
Jerry Yu7de2ff02022-11-08 21:43:46 +08002102 MBEDTLS_SSL_PRINT_EXTS( 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
Jerry Yu97be6a92022-11-09 22:43:31 +08002103 handshake->received_extensions );
Jerry Yucbd082f2022-08-04 16:55:10 +08002104
XiaokangQian97799ac2021-10-11 10:05:54 +00002105 /* Check that we consumed all the message. */
XiaokangQian7b2d4ef2021-10-13 10:19:02 +00002106 if( p != end )
XiaokangQian97799ac2021-10-11 10:05:54 +00002107 {
2108 MBEDTLS_SSL_DEBUG_MSG( 1, ( "EncryptedExtension lengths misaligned" ) );
Jerry Yu7aa71862021-10-28 21:41:30 +08002109 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
XiaokangQian7b2d4ef2021-10-13 10:19:02 +00002110 MBEDTLS_ERR_SSL_DECODE_ERROR );
XiaokangQian97799ac2021-10-11 10:05:54 +00002111 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002112 }
2113
2114 return( ret );
2115}
2116
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002117MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron9d6a5452022-05-30 16:05:38 +02002118static int ssl_tls13_process_encrypted_extensions( mbedtls_ssl_context *ssl )
2119{
2120 int ret;
2121 unsigned char *buf;
2122 size_t buf_len;
2123
2124 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse encrypted extensions" ) );
2125
2126 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg( ssl,
2127 MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2128 &buf, &buf_len ) );
2129
2130 /* Process the message contents */
2131 MBEDTLS_SSL_PROC_CHK(
2132 ssl_tls13_parse_encrypted_extensions( ssl, buf, buf + buf_len ) );
2133
Xiaokang Qianb157e912022-11-23 08:12:26 +00002134#if defined(MBEDTLS_SSL_EARLY_DATA)
2135 if( ssl->handshake->received_extensions &
2136 MBEDTLS_SSL_EXT_MASK( EARLY_DATA ) )
2137 {
2138 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED;
2139 }
2140#endif
2141
Ronald Cron9d6a5452022-05-30 16:05:38 +02002142 mbedtls_ssl_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2143 buf, buf_len );
2144
Ronald Cron928cbd32022-10-04 16:14:26 +02002145#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Ronald Cron79907712022-07-20 17:05:29 +02002146 if( mbedtls_ssl_tls13_key_exchange_mode_with_psk( ssl ) )
Ronald Cronfb508b82022-05-31 14:49:55 +02002147 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2148 else
2149 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST );
2150#else
2151 ((void) ssl);
2152 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2153#endif
Ronald Cron9d6a5452022-05-30 16:05:38 +02002154
2155cleanup:
2156
2157 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse encrypted extensions" ) );
2158 return( ret );
2159
2160}
2161
Ronald Cron928cbd32022-10-04 16:14:26 +02002162#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu687101b2021-09-14 16:03:56 +08002163/*
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002164 * STATE HANDLING: CertificateRequest
2165 *
Jerry Yud2674312021-10-29 10:08:19 +08002166 */
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002167#define SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST 0
2168#define SSL_CERTIFICATE_REQUEST_SKIP 1
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002169/* Coordination:
2170 * Deals with the ambiguity of not knowing if a CertificateRequest
2171 * will be sent. Returns a negative code on failure, or
2172 * - SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST
2173 * - SSL_CERTIFICATE_REQUEST_SKIP
2174 * indicating if a Certificate Request is expected or not.
2175 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002176MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002177static int ssl_tls13_certificate_request_coordinate( mbedtls_ssl_context *ssl )
Jerry Yud2674312021-10-29 10:08:19 +08002178{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002179 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yud2674312021-10-29 10:08:19 +08002180
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002181 if( ( ret = mbedtls_ssl_read_record( ssl, 0 ) ) != 0 )
Jerry Yud2674312021-10-29 10:08:19 +08002182 {
2183 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2184 return( ret );
2185 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002186 ssl->keep_current_message = 1;
Jerry Yud2674312021-10-29 10:08:19 +08002187
2188 if( ( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) &&
2189 ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST ) )
2190 {
Ronald Cron19385882022-06-15 16:26:13 +02002191 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got a certificate request" ) );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002192 return( SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST );
Jerry Yud2674312021-10-29 10:08:19 +08002193 }
2194
Ronald Cron19385882022-06-15 16:26:13 +02002195 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got no certificate request" ) );
2196
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002197 return( SSL_CERTIFICATE_REQUEST_SKIP );
2198}
2199
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002200/*
2201 * ssl_tls13_parse_certificate_request()
2202 * Parse certificate request
2203 * struct {
2204 * opaque certificate_request_context<0..2^8-1>;
2205 * Extension extensions<2..2^16-1>;
2206 * } CertificateRequest;
2207 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002208MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002209static int ssl_tls13_parse_certificate_request( mbedtls_ssl_context *ssl,
2210 const unsigned char *buf,
2211 const unsigned char *end )
2212{
2213 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2214 const unsigned char *p = buf;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002215 size_t certificate_request_context_len = 0;
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002216 size_t extensions_len = 0;
2217 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002218 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002219
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002220 /* ...
2221 * opaque certificate_request_context<0..2^8-1>
2222 * ...
2223 */
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002224 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
2225 certificate_request_context_len = (size_t) p[0];
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002226 p += 1;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002227
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002228 if( certificate_request_context_len > 0 )
2229 {
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002230 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, certificate_request_context_len );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002231 MBEDTLS_SSL_DEBUG_BUF( 3, "Certificate Request Context",
2232 p, certificate_request_context_len );
2233
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002234 handshake->certificate_request_context =
Xiaofei Bai6d42bb42022-01-28 08:52:13 +00002235 mbedtls_calloc( 1, certificate_request_context_len );
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002236 if( handshake->certificate_request_context == NULL )
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002237 {
2238 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
2239 return ( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2240 }
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002241 memcpy( handshake->certificate_request_context, p,
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002242 certificate_request_context_len );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002243 p += certificate_request_context_len;
2244 }
2245
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002246 /* ...
2247 * Extension extensions<2..2^16-1>;
2248 * ...
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002249 */
2250 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
2251 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
2252 p += 2;
2253
2254 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
2255 extensions_end = p + extensions_len;
2256
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002257 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yuc55a6af2022-08-04 17:01:21 +08002258
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002259 while( p < extensions_end )
2260 {
2261 unsigned int extension_type;
2262 size_t extension_data_len;
2263
2264 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
2265 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
2266 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
2267 p += 4;
2268
2269 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
2270
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002271 ret = mbedtls_ssl_tls13_check_received_extension(
Jerry Yu0c354a22022-08-29 15:25:36 +08002272 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, extension_type,
2273 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR );
2274 if( ret != 0 )
2275 return( ret );
Jerry Yuc55a6af2022-08-04 17:01:21 +08002276
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002277 switch( extension_type )
2278 {
2279 case MBEDTLS_TLS_EXT_SIG_ALG:
2280 MBEDTLS_SSL_DEBUG_MSG( 3,
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002281 ( "found signature algorithms extension" ) );
Gabor Mezei078e8032022-04-27 21:17:56 +02002282 ret = mbedtls_ssl_parse_sig_alg_ext( ssl, p,
Gabor Mezei696956d2022-05-13 16:27:29 +02002283 p + extension_data_len );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002284 if( ret != 0 )
2285 return( ret );
Jerry Yuc55a6af2022-08-04 17:01:21 +08002286
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002287 break;
2288
2289 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002290 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002291 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2292 extension_type, "( ignored )" );
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002293 break;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002294 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002295
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002296 p += extension_data_len;
2297 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002298
Jerry Yu7de2ff02022-11-08 21:43:46 +08002299 MBEDTLS_SSL_PRINT_EXTS( 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
Jerry Yu97be6a92022-11-09 22:43:31 +08002300 handshake->received_extensions );
Jerry Yuc55a6af2022-08-04 17:01:21 +08002301
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002302 /* Check that we consumed all the message. */
2303 if( p != end )
2304 {
2305 MBEDTLS_SSL_DEBUG_MSG( 1,
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002306 ( "CertificateRequest misaligned" ) );
2307 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002308 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002309
Jerry Yu0c354a22022-08-29 15:25:36 +08002310 /* RFC 8446 section 4.3.2
Jerry Yuc55a6af2022-08-04 17:01:21 +08002311 *
2312 * The "signature_algorithms" extension MUST be specified
2313 */
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002314 if( ( handshake->received_extensions & MBEDTLS_SSL_EXT_MASK( SIG_ALG ) ) == 0 )
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002315 {
Xiaofei Bai6d42bb42022-01-28 08:52:13 +00002316 MBEDTLS_SSL_DEBUG_MSG( 3,
2317 ( "no signature algorithms extension found" ) );
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002318 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002319 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002320
Jerry Yu7840f812022-01-29 10:26:51 +08002321 ssl->handshake->client_auth = 1;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002322 return( 0 );
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002323
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002324decode_error:
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002325 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2326 MBEDTLS_ERR_SSL_DECODE_ERROR );
2327 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002328}
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002329
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002330/*
2331 * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST
2332 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002333MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002334static int ssl_tls13_process_certificate_request( mbedtls_ssl_context *ssl )
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002335{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002336 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002337
2338 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
2339
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002340 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_certificate_request_coordinate( ssl ) );
2341
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002342 if( ret == SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST )
2343 {
2344 unsigned char *buf;
2345 size_t buf_len;
2346
2347 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg( ssl,
2348 MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2349 &buf, &buf_len ) );
2350
2351 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_certificate_request( ssl,
2352 buf, buf + buf_len ) );
2353
Ronald Cron8f6d39a2022-03-10 18:56:50 +01002354 mbedtls_ssl_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2355 buf, buf_len );
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002356 }
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002357 else if( ret == SSL_CERTIFICATE_REQUEST_SKIP )
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002358 {
Xiaofei Baif6d36962022-01-16 14:54:35 +00002359 ret = 0;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002360 }
2361 else
2362 {
2363 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002364 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2365 goto cleanup;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002366 }
2367
Jerry Yud2674312021-10-29 10:08:19 +08002368 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_CERTIFICATE );
2369
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002370cleanup:
2371
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002372 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
2373 return( ret );
Jerry Yud2674312021-10-29 10:08:19 +08002374}
2375
2376/*
Jerry Yu687101b2021-09-14 16:03:56 +08002377 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
2378 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002379MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00002380static int ssl_tls13_process_server_certificate( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002381{
Xiaofei Bai947571e2021-09-29 09:12:03 +00002382 int ret;
2383
2384 ret = mbedtls_ssl_tls13_process_certificate( ssl );
Xiaofei Baif93cbd22021-10-29 02:39:30 +00002385 if( ret != 0 )
Xiaofei Bai947571e2021-09-29 09:12:03 +00002386 return( ret );
2387
Jerry Yu687101b2021-09-14 16:03:56 +08002388 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY );
2389 return( 0 );
2390}
2391
2392/*
2393 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
2394 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002395MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00002396static int ssl_tls13_process_certificate_verify( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002397{
Jerry Yu30b071c2021-09-12 20:16:03 +08002398 int ret;
2399
2400 ret = mbedtls_ssl_tls13_process_certificate_verify( ssl );
2401 if( ret != 0 )
2402 return( ret );
2403
Jerry Yu687101b2021-09-14 16:03:56 +08002404 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2405 return( 0 );
2406}
Ronald Cron928cbd32022-10-04 16:14:26 +02002407#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Ronald Crond4c64022021-12-06 09:06:46 +01002408
Jerry Yu687101b2021-09-14 16:03:56 +08002409/*
2410 * Handler for MBEDTLS_SSL_SERVER_FINISHED
2411 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002412MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00002413static int ssl_tls13_process_server_finished( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002414{
XiaokangQianac0385c2021-11-03 06:40:11 +00002415 int ret;
2416
XiaokangQianc5c39d52021-11-09 11:55:10 +00002417 ret = mbedtls_ssl_tls13_process_finished_message( ssl );
XiaokangQianac0385c2021-11-03 06:40:11 +00002418 if( ret != 0 )
2419 return( ret );
2420
Jerry Yue3d67cb2022-05-19 15:33:10 +08002421 ret = mbedtls_ssl_tls13_compute_application_transform( ssl );
2422 if( ret != 0 )
2423 {
2424 MBEDTLS_SSL_PEND_FATAL_ALERT(
2425 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2426 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
2427 return( ret );
2428 }
2429
Ronald Cron49ad6192021-11-24 16:25:31 +01002430#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2431 mbedtls_ssl_handshake_set_state(
2432 ssl,
2433 MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED );
2434#else
Jerry Yuca133a32022-02-15 14:22:05 +08002435 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
Jerry Yu566c7812022-01-26 15:41:22 +08002436#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Ronald Cron49ad6192021-11-24 16:25:31 +01002437
XiaokangQianac0385c2021-11-03 06:40:11 +00002438 return( 0 );
Jerry Yu687101b2021-09-14 16:03:56 +08002439}
2440
2441/*
Jerry Yu566c7812022-01-26 15:41:22 +08002442 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE
2443 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002444MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu566c7812022-01-26 15:41:22 +08002445static int ssl_tls13_write_client_certificate( mbedtls_ssl_context *ssl )
2446{
Ronald Cron7a94aca2022-03-09 07:44:27 +01002447 int non_empty_certificate_msg = 0;
2448
Jerry Yu5cc35062022-01-28 16:16:08 +08002449 MBEDTLS_SSL_DEBUG_MSG( 1,
2450 ( "Switch to handshake traffic keys for outbound traffic" ) );
Jerry Yu566c7812022-01-26 15:41:22 +08002451 mbedtls_ssl_set_outbound_transform( ssl, ssl->handshake->transform_handshake );
Jerry Yu5cc35062022-01-28 16:16:08 +08002452
Ronald Cron928cbd32022-10-04 16:14:26 +02002453#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002454 if( ssl->handshake->client_auth )
Ronald Cron7a94aca2022-03-09 07:44:27 +01002455 {
2456 int ret = mbedtls_ssl_tls13_write_certificate( ssl );
2457 if( ret != 0 )
2458 return( ret );
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002459
Ronald Cron7a94aca2022-03-09 07:44:27 +01002460 if( mbedtls_ssl_own_cert( ssl ) != NULL )
2461 non_empty_certificate_msg = 1;
2462 }
2463 else
2464 {
XiaokangQian23c5be62022-06-07 02:04:34 +00002465 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip write certificate" ) );
Ronald Cron7a94aca2022-03-09 07:44:27 +01002466 }
Ronald Cron9df7c802022-03-08 18:38:54 +01002467#endif
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002468
Ronald Cron7a94aca2022-03-09 07:44:27 +01002469 if( non_empty_certificate_msg )
2470 {
2471 mbedtls_ssl_handshake_set_state( ssl,
2472 MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY );
2473 }
2474 else
Ronald Cron19385882022-06-15 16:26:13 +02002475 {
2476 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip write certificate verify" ) );
Ronald Cron7a94aca2022-03-09 07:44:27 +01002477 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Ronald Cron19385882022-06-15 16:26:13 +02002478 }
Ronald Cron7a94aca2022-03-09 07:44:27 +01002479
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002480 return( 0 );
Jerry Yu566c7812022-01-26 15:41:22 +08002481}
2482
Ronald Cron928cbd32022-10-04 16:14:26 +02002483#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002484/*
2485 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY
2486 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002487MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu566c7812022-01-26 15:41:22 +08002488static int ssl_tls13_write_client_certificate_verify( mbedtls_ssl_context *ssl )
2489{
Ronald Crona8b38872022-03-09 07:59:25 +01002490 int ret = mbedtls_ssl_tls13_write_certificate_verify( ssl );
2491
2492 if( ret == 0 )
2493 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
2494
2495 return( ret );
Jerry Yu566c7812022-01-26 15:41:22 +08002496}
Ronald Cron928cbd32022-10-04 16:14:26 +02002497#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08002498
2499/*
Jerry Yu687101b2021-09-14 16:03:56 +08002500 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
2501 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002502MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian74af2a82021-09-22 07:40:30 +00002503static int ssl_tls13_write_client_finished( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002504{
XiaokangQian0fa66432021-11-15 03:33:57 +00002505 int ret;
2506
2507 ret = mbedtls_ssl_tls13_write_finished_message( ssl );
2508 if( ret != 0 )
2509 return( ret );
2510
Jerry Yu466dda82022-09-13 11:20:20 +08002511 ret = mbedtls_ssl_tls13_compute_resumption_master_secret( ssl );
Jerry Yue3d67cb2022-05-19 15:33:10 +08002512 if( ret != 0 )
2513 {
2514 MBEDTLS_SSL_DEBUG_RET( 1,
Jerry Yu466dda82022-09-13 11:20:20 +08002515 "mbedtls_ssl_tls13_compute_resumption_master_secret ", ret );
Jerry Yue3d67cb2022-05-19 15:33:10 +08002516 return ( ret );
2517 }
2518
XiaokangQian0fa66432021-11-15 03:33:57 +00002519 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_FLUSH_BUFFERS );
2520 return( 0 );
Jerry Yu687101b2021-09-14 16:03:56 +08002521}
2522
2523/*
2524 * Handler for MBEDTLS_SSL_FLUSH_BUFFERS
2525 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002526MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00002527static int ssl_tls13_flush_buffers( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002528{
Jerry Yu378254d2021-10-30 21:44:47 +08002529 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
Jerry Yuad8d0ba2021-09-28 17:58:26 +08002530 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP );
Jerry Yu687101b2021-09-14 16:03:56 +08002531 return( 0 );
2532}
2533
2534/*
2535 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
2536 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002537MBEDTLS_CHECK_RETURN_CRITICAL
Xiaofei Bai746f9482021-11-12 08:53:56 +00002538static int ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl )
Jerry Yu687101b2021-09-14 16:03:56 +08002539{
Jerry Yu378254d2021-10-30 21:44:47 +08002540
2541 mbedtls_ssl_tls13_handshake_wrapup( ssl );
2542
2543 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
2544 return( 0 );
Jerry Yu687101b2021-09-14 16:03:56 +08002545}
2546
Jerry Yuf8a49942022-07-07 11:32:32 +00002547#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2548
Jerry Yua0446a02022-07-13 11:22:55 +08002549MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuaf2c0c82022-07-12 05:47:21 +00002550static int ssl_tls13_parse_new_session_ticket_exts( mbedtls_ssl_context *ssl,
2551 const unsigned char *buf,
2552 const unsigned char *end )
Jerry Yuf8a49942022-07-07 11:32:32 +00002553{
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002554 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yuaf2c0c82022-07-12 05:47:21 +00002555 const unsigned char *p = buf;
Jerry Yuf8a49942022-07-07 11:32:32 +00002556
Jerry Yuf8a49942022-07-07 11:32:32 +00002557
Jerry Yuedab6372022-10-31 14:37:31 +08002558 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002559
Jerry Yuf8a49942022-07-07 11:32:32 +00002560 while( p < end )
2561 {
2562 unsigned int extension_type;
2563 size_t extension_data_len;
Jerry Yu0c354a22022-08-29 15:25:36 +08002564 int ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002565
Jerry Yuf8a49942022-07-07 11:32:32 +00002566 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 4 );
2567 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
2568 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
2569 p += 4;
2570
2571 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extension_data_len );
Jerry Yuf8a49942022-07-07 11:32:32 +00002572
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002573 ret = mbedtls_ssl_tls13_check_received_extension(
Jerry Yuedab6372022-10-31 14:37:31 +08002574 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, extension_type,
2575 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_NST );
Jerry Yu0c354a22022-08-29 15:25:36 +08002576 if( ret != 0 )
2577 return( ret );
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002578
Jerry Yuf8a49942022-07-07 11:32:32 +00002579 switch( extension_type )
2580 {
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002581#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002582 case MBEDTLS_TLS_EXT_EARLY_DATA:
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002583 if( extension_data_len != 4 )
2584 {
2585 MBEDTLS_SSL_PEND_FATAL_ALERT(
2586 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2587 MBEDTLS_ERR_SSL_DECODE_ERROR );
2588 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
2589 }
2590 if( ssl->session != NULL )
2591 {
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002592 ssl->session->ticket_flags |=
Xiaokang Qianfe3483f2022-11-09 10:45:23 +00002593 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA;
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002594 }
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002595 break;
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002596#endif /* MBEDTLS_SSL_EARLY_DATA */
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002597
Jerry Yuf8a49942022-07-07 11:32:32 +00002598 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002599 MBEDTLS_SSL_PRINT_EXT(
Jerry Yuedab6372022-10-31 14:37:31 +08002600 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2601 extension_type, "( ignored )" );
Jerry Yuf8a49942022-07-07 11:32:32 +00002602 break;
2603 }
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002604
Jerry Yuf8a49942022-07-07 11:32:32 +00002605 p += extension_data_len;
2606 }
2607
Jerry Yu7de2ff02022-11-08 21:43:46 +08002608 MBEDTLS_SSL_PRINT_EXTS( 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
Jerry Yu97be6a92022-11-09 22:43:31 +08002609 handshake->received_extensions );
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002610
Jerry Yuf8a49942022-07-07 11:32:32 +00002611 return( 0 );
2612}
2613
2614/*
Jerry Yu08aed4d2022-07-20 10:36:12 +08002615 * From RFC8446, page 74
2616 *
Jerry Yuf8a49942022-07-07 11:32:32 +00002617 * struct {
2618 * uint32 ticket_lifetime;
2619 * uint32 ticket_age_add;
2620 * opaque ticket_nonce<0..255>;
2621 * opaque ticket<1..2^16-1>;
2622 * Extension extensions<0..2^16-2>;
2623 * } NewSessionTicket;
2624 *
2625 */
Jerry Yua0446a02022-07-13 11:22:55 +08002626MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf8a49942022-07-07 11:32:32 +00002627static int ssl_tls13_parse_new_session_ticket( mbedtls_ssl_context *ssl,
2628 unsigned char *buf,
Jerry Yucb3b1392022-07-12 06:09:38 +00002629 unsigned char *end,
2630 unsigned char **ticket_nonce,
2631 size_t *ticket_nonce_len )
Jerry Yuf8a49942022-07-07 11:32:32 +00002632{
2633 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2634 unsigned char *p = buf;
2635 mbedtls_ssl_session *session = ssl->session;
Jerry Yuf8a49942022-07-07 11:32:32 +00002636 size_t ticket_len;
2637 unsigned char *ticket;
2638 size_t extensions_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002639
Jerry Yucb3b1392022-07-12 06:09:38 +00002640 *ticket_nonce = NULL;
2641 *ticket_nonce_len = 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002642 /*
2643 * ticket_lifetime 4 bytes
2644 * ticket_age_add 4 bytes
Jerry Yu08aed4d2022-07-20 10:36:12 +08002645 * ticket_nonce_len 1 byte
Jerry Yuf8a49942022-07-07 11:32:32 +00002646 */
Jerry Yucb3b1392022-07-12 06:09:38 +00002647 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 9 );
Jerry Yuf8a49942022-07-07 11:32:32 +00002648
2649 session->ticket_lifetime = MBEDTLS_GET_UINT32_BE( p, 0 );
Jerry Yuf8a49942022-07-07 11:32:32 +00002650 MBEDTLS_SSL_DEBUG_MSG( 3,
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002651 ( "ticket_lifetime: %u",
Jerry Yuf8a49942022-07-07 11:32:32 +00002652 ( unsigned int )session->ticket_lifetime ) );
2653
Jerry Yucb3b1392022-07-12 06:09:38 +00002654 session->ticket_age_add = MBEDTLS_GET_UINT32_BE( p, 4 );
Jerry Yuf8a49942022-07-07 11:32:32 +00002655 MBEDTLS_SSL_DEBUG_MSG( 3,
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002656 ( "ticket_age_add: %u",
Jerry Yuf8a49942022-07-07 11:32:32 +00002657 ( unsigned int )session->ticket_age_add ) );
2658
Jerry Yucb3b1392022-07-12 06:09:38 +00002659 *ticket_nonce_len = p[8];
2660 p += 9;
2661
2662 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, *ticket_nonce_len );
2663 *ticket_nonce = p;
2664 MBEDTLS_SSL_DEBUG_BUF( 3, "ticket_nonce:", *ticket_nonce, *ticket_nonce_len );
2665 p += *ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002666
2667 /* Ticket */
Jerry Yucb3b1392022-07-12 06:09:38 +00002668 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
Jerry Yuf8a49942022-07-07 11:32:32 +00002669 ticket_len = MBEDTLS_GET_UINT16_BE( p, 0 );
2670 p += 2;
2671 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, ticket_len );
Jerry Yuf8a49942022-07-07 11:32:32 +00002672 MBEDTLS_SSL_DEBUG_BUF( 3, "received ticket", p, ticket_len ) ;
2673
2674 /* Check if we previously received a ticket already. */
2675 if( session->ticket != NULL || session->ticket_len > 0 )
2676 {
2677 mbedtls_free( session->ticket );
2678 session->ticket = NULL;
2679 session->ticket_len = 0;
2680 }
2681
2682 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
2683 {
2684 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
2685 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2686 }
2687 memcpy( ticket, p, ticket_len );
2688 p += ticket_len;
2689 session->ticket = ticket;
2690 session->ticket_len = ticket_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002691
Jerry Yucb3b1392022-07-12 06:09:38 +00002692 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
Jerry Yuf8a49942022-07-07 11:32:32 +00002693 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
2694 p += 2;
2695 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
2696
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002697 MBEDTLS_SSL_DEBUG_BUF( 3, "ticket extension", p, extensions_len );
Jerry Yuf8a49942022-07-07 11:32:32 +00002698
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002699 ret = ssl_tls13_parse_new_session_ticket_exts( ssl, p, p + extensions_len );
Jerry Yuf8a49942022-07-07 11:32:32 +00002700 if( ret != 0 )
2701 {
2702 MBEDTLS_SSL_DEBUG_RET( 1,
Jerry Yuaf2c0c82022-07-12 05:47:21 +00002703 "ssl_tls13_parse_new_session_ticket_exts",
Jerry Yuf8a49942022-07-07 11:32:32 +00002704 ret );
2705 return( ret );
2706 }
Jerry Yucb3b1392022-07-12 06:09:38 +00002707
Jerry Yudb8c5fa2022-08-03 12:10:13 +08002708 /* session has been updated, allow export */
2709 session->exported = 0;
2710
Jerry Yucb3b1392022-07-12 06:09:38 +00002711 return( 0 );
2712}
2713
Jerry Yua0446a02022-07-13 11:22:55 +08002714MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yucb3b1392022-07-12 06:09:38 +00002715static int ssl_tls13_postprocess_new_session_ticket( mbedtls_ssl_context *ssl,
2716 unsigned char *ticket_nonce,
2717 size_t ticket_nonce_len )
2718{
2719 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2720 mbedtls_ssl_session *session = ssl->session;
2721 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2722 psa_algorithm_t psa_hash_alg;
2723 int hash_length;
2724
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002725#if defined(MBEDTLS_HAVE_TIME)
2726 /* Store ticket creation time */
Jerry Yu08aed4d2022-07-20 10:36:12 +08002727 session->ticket_received = mbedtls_time( NULL );
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002728#endif
2729
Jerry Yuf8a49942022-07-07 11:32:32 +00002730 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( session->ciphersuite );
2731 if( ciphersuite_info == NULL )
2732 {
2733 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2734 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2735 }
2736
2737 psa_hash_alg = mbedtls_psa_translate_md( ciphersuite_info->mac );
2738 hash_length = PSA_HASH_LENGTH( psa_hash_alg );
Jerry Yu3afdf362022-07-20 17:34:14 +08002739 if( hash_length == -1 ||
2740 ( size_t )hash_length > sizeof( session->resumption_key ) )
2741 {
Jerry Yuf8a49942022-07-07 11:32:32 +00002742 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu3afdf362022-07-20 17:34:14 +08002743 }
2744
Jerry Yuf8a49942022-07-07 11:32:32 +00002745
2746 MBEDTLS_SSL_DEBUG_BUF( 3, "resumption_master_secret",
2747 session->app_secrets.resumption_master_secret,
2748 hash_length );
2749
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002750 /* Compute resumption key
Jerry Yuf8a49942022-07-07 11:32:32 +00002751 *
2752 * HKDF-Expand-Label( resumption_master_secret,
2753 * "resumption", ticket_nonce, Hash.length )
2754 */
2755 ret = mbedtls_ssl_tls13_hkdf_expand_label(
2756 psa_hash_alg,
2757 session->app_secrets.resumption_master_secret,
2758 hash_length,
2759 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( resumption ),
2760 ticket_nonce,
2761 ticket_nonce_len,
Jerry Yu0a430c82022-07-20 11:02:48 +08002762 session->resumption_key,
Jerry Yuf8a49942022-07-07 11:32:32 +00002763 hash_length );
2764
2765 if( ret != 0 )
2766 {
2767 MBEDTLS_SSL_DEBUG_RET( 2,
2768 "Creating the ticket-resumed PSK failed",
2769 ret );
2770 return( ret );
2771 }
2772
Jerry Yu0a430c82022-07-20 11:02:48 +08002773 session->resumption_key_len = hash_length;
Jerry Yuf8a49942022-07-07 11:32:32 +00002774
2775 MBEDTLS_SSL_DEBUG_BUF( 3, "Ticket-resumed PSK",
Jerry Yu0a430c82022-07-20 11:02:48 +08002776 session->resumption_key,
2777 session->resumption_key_len );
Jerry Yuf8a49942022-07-07 11:32:32 +00002778
Jerry Yuf8a49942022-07-07 11:32:32 +00002779 return( 0 );
2780}
2781
2782/*
Jerry Yua8d3c502022-10-30 14:51:23 +08002783 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yuf8a49942022-07-07 11:32:32 +00002784 */
Jerry Yua0446a02022-07-13 11:22:55 +08002785MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf8a49942022-07-07 11:32:32 +00002786static int ssl_tls13_process_new_session_ticket( mbedtls_ssl_context *ssl )
2787{
2788 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2789 unsigned char *buf;
2790 size_t buf_len;
Jerry Yucb3b1392022-07-12 06:09:38 +00002791 unsigned char *ticket_nonce;
2792 size_t ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002793
2794 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
2795
2796 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg(
2797 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2798 &buf, &buf_len ) );
2799
Jerry Yucb3b1392022-07-12 06:09:38 +00002800 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_new_session_ticket(
2801 ssl, buf, buf + buf_len,
2802 &ticket_nonce, &ticket_nonce_len ) );
Jerry Yuf8a49942022-07-07 11:32:32 +00002803
Jerry Yucb3b1392022-07-12 06:09:38 +00002804 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_new_session_ticket(
2805 ssl, ticket_nonce, ticket_nonce_len ) );
Jerry Yuf8a49942022-07-07 11:32:32 +00002806
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002807 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
2808
Jerry Yuf8a49942022-07-07 11:32:32 +00002809cleanup:
2810
2811 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2812 return( ret );
2813}
2814#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2815
Jerry Yu92c6b402021-08-27 16:59:09 +08002816int mbedtls_ssl_tls13_handshake_client_step( mbedtls_ssl_context *ssl )
Jerry Yubc20bdd2021-08-24 15:59:48 +08002817{
Jerry Yu92c6b402021-08-27 16:59:09 +08002818 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +08002819
Jerry Yu92c6b402021-08-27 16:59:09 +08002820 switch( ssl->state )
2821 {
Jerry Yu92c6b402021-08-27 16:59:09 +08002822 case MBEDTLS_SSL_HELLO_REQUEST:
Jerry Yuddda0502022-12-01 19:43:12 +08002823 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
2824 break;
2825
Jerry Yu92c6b402021-08-27 16:59:09 +08002826 case MBEDTLS_SSL_CLIENT_HELLO:
Ronald Cron3d580bf2022-02-18 17:24:56 +01002827 ret = mbedtls_ssl_write_client_hello( ssl );
Jerry Yu92c6b402021-08-27 16:59:09 +08002828 break;
2829
2830 case MBEDTLS_SSL_SERVER_HELLO:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002831 ret = ssl_tls13_process_server_hello( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002832 break;
2833
2834 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
XiaokangQian97799ac2021-10-11 10:05:54 +00002835 ret = ssl_tls13_process_encrypted_extensions( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002836 break;
2837
Ronald Cron928cbd32022-10-04 16:14:26 +02002838#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yud2674312021-10-29 10:08:19 +08002839 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
2840 ret = ssl_tls13_process_certificate_request( ssl );
2841 break;
2842
Jerry Yu687101b2021-09-14 16:03:56 +08002843 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002844 ret = ssl_tls13_process_server_certificate( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002845 break;
2846
2847 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002848 ret = ssl_tls13_process_certificate_verify( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002849 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002850#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu687101b2021-09-14 16:03:56 +08002851
2852 case MBEDTLS_SSL_SERVER_FINISHED:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002853 ret = ssl_tls13_process_server_finished( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002854 break;
2855
Jerry Yu566c7812022-01-26 15:41:22 +08002856 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
2857 ret = ssl_tls13_write_client_certificate( ssl );
2858 break;
2859
Ronald Cron928cbd32022-10-04 16:14:26 +02002860#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002861 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
2862 ret = ssl_tls13_write_client_certificate_verify( ssl );
2863 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002864#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08002865
Jerry Yu687101b2021-09-14 16:03:56 +08002866 case MBEDTLS_SSL_CLIENT_FINISHED:
XiaokangQian74af2a82021-09-22 07:40:30 +00002867 ret = ssl_tls13_write_client_finished( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002868 break;
2869
2870 case MBEDTLS_SSL_FLUSH_BUFFERS:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002871 ret = ssl_tls13_flush_buffers( ssl );
Jerry Yu687101b2021-09-14 16:03:56 +08002872 break;
2873
2874 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Xiaofei Bai746f9482021-11-12 08:53:56 +00002875 ret = ssl_tls13_handshake_wrapup( ssl );
Jerry Yu92c6b402021-08-27 16:59:09 +08002876 break;
2877
Ronald Cron49ad6192021-11-24 16:25:31 +01002878 /*
2879 * Injection of dummy-CCS's for middlebox compatibility
2880 */
2881#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
XiaokangQian0b56a8f2021-12-22 02:39:32 +00002882 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
Ronald Cron9f55f632022-02-02 16:02:47 +01002883 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
2884 if( ret == 0 )
2885 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
2886 break;
2887
2888 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
2889 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
2890 if( ret == 0 )
2891 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
Ronald Cron49ad6192021-11-24 16:25:31 +01002892 break;
2893#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2894
Jerry Yuf8a49942022-07-07 11:32:32 +00002895#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yua8d3c502022-10-30 14:51:23 +08002896 case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET:
Jerry Yuf8a49942022-07-07 11:32:32 +00002897 ret = ssl_tls13_process_new_session_ticket( ssl );
2898 if( ret != 0 )
2899 break;
2900 ret = MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET;
2901 break;
2902#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2903
Jerry Yu92c6b402021-08-27 16:59:09 +08002904 default:
2905 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2906 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2907 }
2908
2909 return( ret );
2910}
Jerry Yu65dd2cc2021-08-18 16:38:40 +08002911
Jerry Yufb4b6472022-01-27 15:03:26 +08002912#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08002913
Jerry Yufb4b6472022-01-27 15:03:26 +08002914