blob: fc5ceebf04429c375f3d4753d131efbb0a7a44ea [file] [log] [blame]
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08001/*
Jerry Yub9930e72021-08-06 17:11:51 +08002 * TLS 1.3 server-side functions
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08003 *
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
20#include "common.h"
21
Jerry Yufb4b6472022-01-27 15:03:26 +080022#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080023
Jerry Yu687101b2021-09-14 16:03:56 +080024#include "mbedtls/debug.h"
Xiaofei Baicba64af2022-02-15 10:00:56 +000025#include "mbedtls/error.h"
26#include "mbedtls/platform.h"
Jerry Yu3bf2c642022-03-30 22:02:12 +080027
Xiaofei Bai9ca09d42022-02-14 12:57:18 +000028#include "ssl_misc.h"
29#include "ssl_tls13_keys.h"
30#include "ssl_debug_helpers.h"
31
XiaokangQian7807f9f2022-02-15 10:04:37 +000032#if defined(MBEDTLS_ECP_C)
33#include "mbedtls/ecp.h"
XiaokangQian7807f9f2022-02-15 10:04:37 +000034#endif /* MBEDTLS_ECP_C */
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080035
XiaokangQiana9c58412022-02-17 09:41:26 +000036#if defined(MBEDTLS_PLATFORM_C)
37#include "mbedtls/platform.h"
38#else
39#include <stdlib.h>
40#define mbedtls_calloc calloc
41#define mbedtls_free free
42#endif /* MBEDTLS_PLATFORM_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +000043
Jerry Yu4d3841a2022-04-16 12:37:19 +080044#include "ssl_misc.h"
45#include "ssl_tls13_keys.h"
46#include "ssl_debug_helpers.h"
47
Jerry Yue19e3b92022-07-08 12:04:51 +000048#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
49/* From RFC 8446:
50 *
51 * enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;
52 * struct {
53 * PskKeyExchangeMode ke_modes<1..255>;
54 * } PskKeyExchangeModes;
55 */
56static int ssl_tls13_parse_key_exchange_modes_ext( mbedtls_ssl_context *ssl,
57 const unsigned char *buf,
58 const unsigned char *end)
59{
60 size_t ke_modes_len;
61 int ke_modes = 0;
62
63 /* Read PSK mode list length (1 Byte) */
64 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end, 1 );
65 ke_modes_len = *buf++;
66 /* Currently, there are only two PSK modes, so even without looking
67 * at the content, something's wrong if the list has more than 2 items. */
68 if( ke_modes_len > 2 )
69 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
70
71 MBEDTLS_SSL_CHK_BUF_READ_PTR( buf, end, ke_modes_len );
72
73 while( ke_modes_len-- != 0 )
74 {
75 switch( *buf++ )
76 {
77 case MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE:
78 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
79 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Found PSK KEX MODE" ) );
80 break;
81 case MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE:
82 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
83 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Found PSK_EPHEMERAL KEX MODE" ) );
84 break;
85 default:
86 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
87 }
88 }
89
90 ssl->handshake->tls13_kex_modes = ke_modes;
91 return( 0 );
92}
93#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
94
XiaokangQian7807f9f2022-02-15 10:04:37 +000095/* From RFC 8446:
96 * struct {
XiaokangQiancfd925f2022-04-14 07:10:37 +000097 * ProtocolVersion versions<2..254>;
XiaokangQian7807f9f2022-02-15 10:04:37 +000098 * } SupportedVersions;
99 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200100MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian7807f9f2022-02-15 10:04:37 +0000101static int ssl_tls13_parse_supported_versions_ext( mbedtls_ssl_context *ssl,
102 const unsigned char *buf,
103 const unsigned char *end )
104{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000105 const unsigned char *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000106 size_t versions_len;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000107 const unsigned char *versions_end;
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000108 uint16_t tls_version;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000109 int tls13_supported = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000110
111 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000112 versions_len = p[0];
XiaokangQian7807f9f2022-02-15 10:04:37 +0000113 p += 1;
114
XiaokangQian4080a7f2022-04-11 09:55:18 +0000115 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, versions_len );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000116 versions_end = p + versions_len;
117 while( p < versions_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000118 {
XiaokangQiancfd925f2022-04-14 07:10:37 +0000119 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, versions_end, 2 );
XiaokangQiande333912022-04-20 08:49:42 +0000120 tls_version = mbedtls_ssl_read_version( p, ssl->conf->transport );
XiaokangQianb67384d2022-04-19 00:02:38 +0000121 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000122
123 /* In this implementation we only support TLS 1.3 and DTLS 1.3. */
XiaokangQiande333912022-04-20 08:49:42 +0000124 if( tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000125 {
126 tls13_supported = 1;
127 break;
128 }
XiaokangQian7807f9f2022-02-15 10:04:37 +0000129 }
130
XiaokangQianb67384d2022-04-19 00:02:38 +0000131 if( !tls13_supported )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000132 {
XiaokangQian7807f9f2022-02-15 10:04:37 +0000133 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS 1.3 is not supported by the client" ) );
134
135 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
136 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
137 return( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
138 }
139
XiaokangQiande333912022-04-20 08:49:42 +0000140 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Negotiated version. Supported is [%04x]",
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000141 (unsigned int)tls_version ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000142
XiaokangQian7807f9f2022-02-15 10:04:37 +0000143 return( 0 );
144}
145
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000146#if defined(MBEDTLS_ECDH_C)
XiaokangQiane8ff3502022-04-22 02:34:40 +0000147/*
XiaokangQian7807f9f2022-02-15 10:04:37 +0000148 *
149 * From RFC 8446:
150 * enum {
151 * ... (0xFFFF)
152 * } NamedGroup;
153 * struct {
154 * NamedGroup named_group_list<2..2^16-1>;
155 * } NamedGroupList;
156 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200157MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc1be19f2022-04-23 16:11:39 +0800158static int ssl_tls13_parse_supported_groups_ext( mbedtls_ssl_context *ssl,
159 const unsigned char *buf,
160 const unsigned char *end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000161{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000162 const unsigned char *p = buf;
XiaokangQian84823772022-04-19 07:57:30 +0000163 size_t named_group_list_len;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000164 const unsigned char *named_group_list_end;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000165
166 MBEDTLS_SSL_DEBUG_BUF( 3, "supported_groups extension", p, end - buf );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000167 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000168 named_group_list_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000169 p += 2;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000170 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, named_group_list_len );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000171 named_group_list_end = p + named_group_list_len;
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000172 ssl->handshake->hrr_selected_group = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000173
XiaokangQian08037552022-04-20 07:16:41 +0000174 while( p < named_group_list_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000175 {
XiaokangQian08037552022-04-20 07:16:41 +0000176 uint16_t named_group;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000177 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, named_group_list_end, 2 );
XiaokangQian08037552022-04-20 07:16:41 +0000178 named_group = MBEDTLS_GET_UINT16_BE( p, 0 );
179 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000180
Jerry Yuc1be19f2022-04-23 16:11:39 +0800181 MBEDTLS_SSL_DEBUG_MSG( 2,
182 ( "got named group: %s(%04x)",
183 mbedtls_ssl_named_group_to_str( named_group ),
184 named_group ) );
XiaokangQian08037552022-04-20 07:16:41 +0000185
186 if( ! mbedtls_ssl_named_group_is_offered( ssl, named_group ) ||
187 ! mbedtls_ssl_named_group_is_supported( named_group ) ||
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000188 ssl->handshake->hrr_selected_group != 0 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000189 {
XiaokangQian08037552022-04-20 07:16:41 +0000190 continue;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000191 }
192
Jerry Yuc1be19f2022-04-23 16:11:39 +0800193 MBEDTLS_SSL_DEBUG_MSG( 2,
194 ( "add named group %s(%04x) into received list.",
195 mbedtls_ssl_named_group_to_str( named_group ),
196 named_group ) );
197
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000198 ssl->handshake->hrr_selected_group = named_group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000199 }
200
201 return( 0 );
202
203}
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000204#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000205
XiaokangQian08037552022-04-20 07:16:41 +0000206#define SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH 1
207
XiaokangQian88408882022-04-02 10:15:03 +0000208#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000209/*
210 * ssl_tls13_parse_key_shares_ext() verifies whether the information in the
XiaokangQiane8ff3502022-04-22 02:34:40 +0000211 * extension is correct and stores the first acceptable key share and its associated group.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000212 *
213 * Possible return values are:
214 * - 0: Successful processing of the client provided key share extension.
XiaokangQian08037552022-04-20 07:16:41 +0000215 * - SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH: The key shares provided by the client
XiaokangQian7807f9f2022-02-15 10:04:37 +0000216 * does not match a group supported by the server. A HelloRetryRequest will
217 * be needed.
XiaokangQiane8ff3502022-04-22 02:34:40 +0000218 * - A negative value for fatal errors.
Jerry Yuc1be19f2022-04-23 16:11:39 +0800219 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200220MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian7807f9f2022-02-15 10:04:37 +0000221static int ssl_tls13_parse_key_shares_ext( mbedtls_ssl_context *ssl,
222 const unsigned char *buf,
223 const unsigned char *end )
224{
XiaokangQianb67384d2022-04-19 00:02:38 +0000225 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000226 unsigned char const *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000227 unsigned char const *client_shares_end;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800228 size_t client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000229
230 /* From RFC 8446:
231 *
232 * struct {
233 * KeyShareEntry client_shares<0..2^16-1>;
234 * } KeyShareClientHello;
235 *
236 */
237
XiaokangQian7807f9f2022-02-15 10:04:37 +0000238 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000239 client_shares_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000240 p += 2;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000241 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, client_shares_len );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000242
243 ssl->handshake->offered_group_id = 0;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000244 client_shares_end = p + client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000245
246 /* We try to find a suitable key share entry and copy it to the
247 * handshake context. Later, we have to find out whether we can do
248 * something with the provided key share or whether we have to
XiaokangQianc5763b52022-04-02 03:34:37 +0000249 * dismiss it and send a HelloRetryRequest message.
250 */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000251
Jerry Yuc1be19f2022-04-23 16:11:39 +0800252 while( p < client_shares_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000253 {
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000254 uint16_t group;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800255 size_t key_exchange_len;
Jerry Yu086edc22022-05-05 10:50:38 +0800256 const unsigned char *key_exchange;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000257
258 /*
259 * struct {
260 * NamedGroup group;
261 * opaque key_exchange<1..2^16-1>;
262 * } KeyShareEntry;
263 */
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000264 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, client_shares_end, 4 );
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000265 group = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yuc1be19f2022-04-23 16:11:39 +0800266 key_exchange_len = MBEDTLS_GET_UINT16_BE( p, 2 );
267 p += 4;
Jerry Yu086edc22022-05-05 10:50:38 +0800268 key_exchange = p;
XiaokangQianb67384d2022-04-19 00:02:38 +0000269 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, client_shares_end, key_exchange_len );
Jerry Yu086edc22022-05-05 10:50:38 +0800270 p += key_exchange_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000271
272 /* Continue parsing even if we have already found a match,
XiaokangQianc5763b52022-04-02 03:34:37 +0000273 * for input validation purposes.
274 */
XiaokangQian060d8672022-04-21 09:24:56 +0000275 if( ! mbedtls_ssl_named_group_is_offered( ssl, group ) ||
Jerry Yuc1be19f2022-04-23 16:11:39 +0800276 ! mbedtls_ssl_named_group_is_supported( group ) ||
277 ssl->handshake->offered_group_id != 0 )
XiaokangQian060d8672022-04-21 09:24:56 +0000278 {
279 continue;
280 }
XiaokangQian060d8672022-04-21 09:24:56 +0000281
XiaokangQian7807f9f2022-02-15 10:04:37 +0000282 /*
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000283 * For now, we only support ECDHE groups.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000284 */
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000285 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group ) )
286 {
Jerry Yuc1be19f2022-04-23 16:11:39 +0800287 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH group: %s (%04x)",
288 mbedtls_ssl_named_group_to_str( group ),
289 group ) );
XiaokangQian318dc762022-04-20 09:43:51 +0000290 ret = mbedtls_ssl_tls13_read_public_ecdhe_share(
Jerry Yu086edc22022-05-05 10:50:38 +0800291 ssl, key_exchange - 2, key_exchange_len + 2 );
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000292 if( ret != 0 )
293 return( ret );
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000294
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000295 }
296 else
XiaokangQian7807f9f2022-02-15 10:04:37 +0000297 {
298 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Unrecognized NamedGroup %u",
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000299 (unsigned) group ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000300 continue;
301 }
302
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000303 ssl->handshake->offered_group_id = group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000304 }
305
Jerry Yuc1be19f2022-04-23 16:11:39 +0800306
307 if( ssl->handshake->offered_group_id == 0 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000308 {
309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching key share" ) );
XiaokangQian08037552022-04-20 07:16:41 +0000310 return( SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000311 }
312 return( 0 );
313}
XiaokangQian88408882022-04-02 10:15:03 +0000314#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000315
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000316#if defined(MBEDTLS_DEBUG_C)
XiaokangQian4080a7f2022-04-11 09:55:18 +0000317static void ssl_tls13_debug_print_client_hello_exts( mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000318{
XiaokangQian3207a322022-02-23 03:15:27 +0000319 ((void) ssl);
320
XiaokangQian7807f9f2022-02-15 10:04:37 +0000321 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Extensions:" ) );
XiaokangQianb67384d2022-04-19 00:02:38 +0000322 MBEDTLS_SSL_DEBUG_MSG( 3,
323 ( "- KEY_SHARE_EXTENSION ( %s )",
324 ( ( ssl->handshake->extensions_present
325 & MBEDTLS_SSL_EXT_KEY_SHARE ) > 0 ) ? "TRUE" : "FALSE" ) );
326 MBEDTLS_SSL_DEBUG_MSG( 3,
327 ( "- PSK_KEY_EXCHANGE_MODES_EXTENSION ( %s )",
328 ( ( ssl->handshake->extensions_present
329 & MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES ) > 0 ) ?
330 "TRUE" : "FALSE" ) );
331 MBEDTLS_SSL_DEBUG_MSG( 3,
332 ( "- PRE_SHARED_KEY_EXTENSION ( %s )",
333 ( ( ssl->handshake->extensions_present
334 & MBEDTLS_SSL_EXT_PRE_SHARED_KEY ) > 0 ) ? "TRUE" : "FALSE" ) );
335 MBEDTLS_SSL_DEBUG_MSG( 3,
336 ( "- SIGNATURE_ALGORITHM_EXTENSION ( %s )",
337 ( ( ssl->handshake->extensions_present
338 & MBEDTLS_SSL_EXT_SIG_ALG ) > 0 ) ? "TRUE" : "FALSE" ) );
339 MBEDTLS_SSL_DEBUG_MSG( 3,
340 ( "- SUPPORTED_GROUPS_EXTENSION ( %s )",
341 ( ( ssl->handshake->extensions_present
342 & MBEDTLS_SSL_EXT_SUPPORTED_GROUPS ) >0 ) ?
343 "TRUE" : "FALSE" ) );
344 MBEDTLS_SSL_DEBUG_MSG( 3,
345 ( "- SUPPORTED_VERSION_EXTENSION ( %s )",
346 ( ( ssl->handshake->extensions_present
347 & MBEDTLS_SSL_EXT_SUPPORTED_VERSIONS ) > 0 ) ?
348 "TRUE" : "FALSE" ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000349#if defined ( MBEDTLS_SSL_SERVER_NAME_INDICATION )
XiaokangQianb67384d2022-04-19 00:02:38 +0000350 MBEDTLS_SSL_DEBUG_MSG( 3,
351 ( "- SERVERNAME_EXTENSION ( %s )",
352 ( ( ssl->handshake->extensions_present
353 & MBEDTLS_SSL_EXT_SERVERNAME ) > 0 ) ?
354 "TRUE" : "FALSE" ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000355#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQianacb39922022-06-17 10:18:48 +0000356#if defined ( MBEDTLS_SSL_ALPN )
357 MBEDTLS_SSL_DEBUG_MSG( 3,
358 ( "- ALPN_EXTENSION ( %s )",
359 ( ( ssl->handshake->extensions_present
360 & MBEDTLS_SSL_EXT_ALPN ) > 0 ) ?
361 "TRUE" : "FALSE" ) );
362#endif /* MBEDTLS_SSL_ALPN */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000363}
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000364#endif /* MBEDTLS_DEBUG_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000365
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200366MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian4080a7f2022-04-11 09:55:18 +0000367static int ssl_tls13_client_hello_has_exts( mbedtls_ssl_context *ssl,
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000368 int exts_mask )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000369{
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000370 int masked = ssl->handshake->extensions_present & exts_mask;
371 return( masked == exts_mask );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000372}
373
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200374MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianb67384d2022-04-19 00:02:38 +0000375static int ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(
376 mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000377{
XiaokangQian4080a7f2022-04-11 09:55:18 +0000378 return( ssl_tls13_client_hello_has_exts( ssl,
XiaokangQian7807f9f2022-02-15 10:04:37 +0000379 MBEDTLS_SSL_EXT_SUPPORTED_GROUPS |
380 MBEDTLS_SSL_EXT_KEY_SHARE |
381 MBEDTLS_SSL_EXT_SIG_ALG ) );
382}
383
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200384MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianb67384d2022-04-19 00:02:38 +0000385static int ssl_tls13_check_ephemeral_key_exchange( mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000386{
387 if( !mbedtls_ssl_conf_tls13_ephemeral_enabled( ssl ) )
388 return( 0 );
389
XiaokangQianb67384d2022-04-19 00:02:38 +0000390 if( !ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange( ssl ) )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000391 return( 0 );
392
XiaokangQianb67384d2022-04-19 00:02:38 +0000393 ssl->handshake->tls13_kex_modes =
394 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000395 return( 1 );
396}
397
XiaokangQian81802f42022-06-10 13:25:22 +0000398#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
399 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
XiaokangQian23c5be62022-06-07 02:04:34 +0000400/*
XiaokangQianfb665a82022-06-15 03:57:21 +0000401 * Pick best ( private key, certificate chain ) pair based on the signature
402 * algorithms supported by the client.
XiaokangQian23c5be62022-06-07 02:04:34 +0000403 */
Ronald Cronce7d76e2022-07-08 18:56:49 +0200404MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian07aad072022-06-14 05:35:09 +0000405static int ssl_tls13_pick_key_cert( mbedtls_ssl_context *ssl )
XiaokangQian23c5be62022-06-07 02:04:34 +0000406{
XiaokangQianfb665a82022-06-15 03:57:21 +0000407 mbedtls_ssl_key_cert *key_cert, *key_cert_list;
XiaokangQian81802f42022-06-10 13:25:22 +0000408 const uint16_t *sig_alg = ssl->handshake->received_sig_algs;
XiaokangQian23c5be62022-06-07 02:04:34 +0000409
410#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
411 if( ssl->handshake->sni_key_cert != NULL )
XiaokangQianfb665a82022-06-15 03:57:21 +0000412 key_cert_list = ssl->handshake->sni_key_cert;
XiaokangQian23c5be62022-06-07 02:04:34 +0000413 else
414#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQianfb665a82022-06-15 03:57:21 +0000415 key_cert_list = ssl->conf->key_cert;
XiaokangQian23c5be62022-06-07 02:04:34 +0000416
XiaokangQianfb665a82022-06-15 03:57:21 +0000417 if( key_cert_list == NULL )
XiaokangQian23c5be62022-06-07 02:04:34 +0000418 {
419 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) );
420 return( -1 );
421 }
422
XiaokangQian81802f42022-06-10 13:25:22 +0000423 for( ; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++ )
XiaokangQian23c5be62022-06-07 02:04:34 +0000424 {
XiaokangQianfb665a82022-06-15 03:57:21 +0000425 for( key_cert = key_cert_list; key_cert != NULL;
426 key_cert = key_cert->next )
XiaokangQian23c5be62022-06-07 02:04:34 +0000427 {
XiaokangQianfb665a82022-06-15 03:57:21 +0000428 MBEDTLS_SSL_DEBUG_CRT( 3, "certificate (chain) candidate",
429 key_cert->cert );
XiaokangQian81802f42022-06-10 13:25:22 +0000430
431 /*
432 * This avoids sending the client a cert it'll reject based on
433 * keyUsage or other extensions.
434 */
435 if( mbedtls_x509_crt_check_key_usage(
XiaokangQianfb665a82022-06-15 03:57:21 +0000436 key_cert->cert, MBEDTLS_X509_KU_DIGITAL_SIGNATURE ) != 0 ||
XiaokangQian81802f42022-06-10 13:25:22 +0000437 mbedtls_x509_crt_check_extended_key_usage(
XiaokangQianfb665a82022-06-15 03:57:21 +0000438 key_cert->cert, MBEDTLS_OID_SERVER_AUTH,
439 MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH ) ) != 0 )
XiaokangQian81802f42022-06-10 13:25:22 +0000440 {
441 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: "
XiaokangQianfb665a82022-06-15 03:57:21 +0000442 "(extended) key usage extension" ) );
XiaokangQian81802f42022-06-10 13:25:22 +0000443 continue;
444 }
XiaokangQian23c5be62022-06-07 02:04:34 +0000445
Jerry Yucc539102022-06-27 16:27:35 +0800446 MBEDTLS_SSL_DEBUG_MSG( 3,
447 ( "ssl_tls13_pick_key_cert:"
448 "check signature algorithm %s [%04x]",
449 mbedtls_ssl_sig_alg_to_str( *sig_alg ),
450 *sig_alg ) );
Jerry Yufb526692022-06-19 11:22:49 +0800451 if( mbedtls_ssl_tls13_check_sig_alg_cert_key_match(
Jerry Yud099cf02022-06-19 13:47:00 +0800452 *sig_alg, &key_cert->cert->pk ) )
XiaokangQian81802f42022-06-10 13:25:22 +0000453 {
XiaokangQianfb665a82022-06-15 03:57:21 +0000454 ssl->handshake->key_cert = key_cert;
Jerry Yucc539102022-06-27 16:27:35 +0800455 MBEDTLS_SSL_DEBUG_MSG( 3,
456 ( "ssl_tls13_pick_key_cert:"
457 "selected signature algorithm"
458 " %s [%04x]",
459 mbedtls_ssl_sig_alg_to_str( *sig_alg ),
460 *sig_alg ) );
XiaokangQianfb665a82022-06-15 03:57:21 +0000461 MBEDTLS_SSL_DEBUG_CRT(
XiaokangQian75fe8c72022-06-15 09:42:45 +0000462 3, "selected certificate (chain)",
XiaokangQianfb665a82022-06-15 03:57:21 +0000463 ssl->handshake->key_cert->cert );
XiaokangQian81802f42022-06-10 13:25:22 +0000464 return( 0 );
465 }
XiaokangQian81802f42022-06-10 13:25:22 +0000466 }
XiaokangQian23c5be62022-06-07 02:04:34 +0000467 }
468
Jerry Yu9d3e2fa2022-06-27 22:14:01 +0800469 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ssl_tls13_pick_key_cert:"
470 "no suitable certificate found" ) );
XiaokangQian23c5be62022-06-07 02:04:34 +0000471 return( -1 );
472}
XiaokangQian81802f42022-06-10 13:25:22 +0000473#endif /* MBEDTLS_X509_CRT_PARSE_C &&
474 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
XiaokangQian23c5be62022-06-07 02:04:34 +0000475
XiaokangQian4080a7f2022-04-11 09:55:18 +0000476/*
XiaokangQianed582dd2022-04-13 08:21:05 +0000477 *
478 * STATE HANDLING: ClientHello
479 *
XiaokangQianb67384d2022-04-19 00:02:38 +0000480 * There are three possible classes of outcomes when parsing the ClientHello:
XiaokangQianed582dd2022-04-13 08:21:05 +0000481 *
XiaokangQianb67384d2022-04-19 00:02:38 +0000482 * 1) The ClientHello was well-formed and matched the server's configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +0000483 *
484 * In this case, the server progresses to sending its ServerHello.
485 *
XiaokangQianb67384d2022-04-19 00:02:38 +0000486 * 2) The ClientHello was well-formed but didn't match the server's
487 * configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +0000488 *
489 * For example, the client might not have offered a key share which
490 * the server supports, or the server might require a cookie.
491 *
492 * In this case, the server sends a HelloRetryRequest.
493 *
XiaokangQianb67384d2022-04-19 00:02:38 +0000494 * 3) The ClientHello was ill-formed
XiaokangQianed582dd2022-04-13 08:21:05 +0000495 *
496 * In this case, we abort the handshake.
497 *
498 */
499
500/*
XiaokangQian4080a7f2022-04-11 09:55:18 +0000501 * Structure of this message:
502 *
XiaokangQiane8ff3502022-04-22 02:34:40 +0000503 * uint16 ProtocolVersion;
504 * opaque Random[32];
505 * uint8 CipherSuite[2]; // Cryptographic suite selector
XiaokangQian4080a7f2022-04-11 09:55:18 +0000506 *
XiaokangQiane8ff3502022-04-22 02:34:40 +0000507 * struct {
508 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
509 * Random random;
510 * opaque legacy_session_id<0..32>;
511 * CipherSuite cipher_suites<2..2^16-2>;
512 * opaque legacy_compression_methods<1..2^8-1>;
513 * Extension extensions<8..2^16-1>;
514 * } ClientHello;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000515 */
XiaokangQianed582dd2022-04-13 08:21:05 +0000516
517#define SSL_CLIENT_HELLO_OK 0
518#define SSL_CLIENT_HELLO_HRR_REQUIRED 1
519
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200520MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian4080a7f2022-04-11 09:55:18 +0000521static int ssl_tls13_parse_client_hello( mbedtls_ssl_context *ssl,
522 const unsigned char *buf,
523 const unsigned char *end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000524{
XiaokangQianb67384d2022-04-19 00:02:38 +0000525 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
526 const unsigned char *p = buf;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000527 size_t legacy_session_id_len;
XiaokangQian060d8672022-04-21 09:24:56 +0000528 const unsigned char *cipher_suites;
XiaokangQian318dc762022-04-20 09:43:51 +0000529 size_t cipher_suites_len;
XiaokangQian060d8672022-04-21 09:24:56 +0000530 const unsigned char *cipher_suites_end;
XiaokangQianb67384d2022-04-19 00:02:38 +0000531 size_t extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000532 const unsigned char *extensions_end;
Jerry Yu49ca9282022-05-05 11:05:22 +0800533 int hrr_required = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000534
XiaokangQian7807f9f2022-02-15 10:04:37 +0000535 const mbedtls_ssl_ciphersuite_t* ciphersuite_info;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000536
537 ssl->handshake->extensions_present = MBEDTLS_SSL_EXT_NONE;
538
539 /*
XiaokangQianb67384d2022-04-19 00:02:38 +0000540 * ClientHello layout:
XiaokangQian7807f9f2022-02-15 10:04:37 +0000541 * 0 . 1 protocol version
XiaokangQiane8ff3502022-04-22 02:34:40 +0000542 * 2 . 33 random bytes
XiaokangQianc5763b52022-04-02 03:34:37 +0000543 * 34 . 34 session id length ( 1 byte )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000544 * 35 . 34+x session id
XiaokangQian7807f9f2022-02-15 10:04:37 +0000545 * .. . .. ciphersuite list length ( 2 bytes )
546 * .. . .. ciphersuite list
547 * .. . .. compression alg. list length ( 1 byte )
548 * .. . .. compression alg. list
549 * .. . .. extensions length ( 2 bytes, optional )
550 * .. . .. extensions ( optional )
551 */
552
XiaokangQianb67384d2022-04-19 00:02:38 +0000553 /*
bootstrap-prime6dbbf442022-05-17 19:30:44 -0400554 * Minimal length ( with everything empty and extensions omitted ) is
XiaokangQian7807f9f2022-02-15 10:04:37 +0000555 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
556 * read at least up to session id length without worrying.
557 */
558 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 38 );
559
560 /* ...
561 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
562 * ...
563 * with ProtocolVersion defined as:
564 * uint16 ProtocolVersion;
565 */
XiaokangQiande333912022-04-20 08:49:42 +0000566 if( mbedtls_ssl_read_version( p, ssl->conf->transport ) !=
567 MBEDTLS_SSL_VERSION_TLS1_2 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000568 {
569 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Unsupported version of TLS." ) );
570 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
571 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
XiaokangQianb67384d2022-04-19 00:02:38 +0000572 return ( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000573 }
574 p += 2;
575
576 /*
XiaokangQianf8ceb942022-04-15 11:43:27 +0000577 * Only support TLS 1.3 currently, temporarily set the version.
578 */
XiaokangQiande333912022-04-20 08:49:42 +0000579 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
XiaokangQianf8ceb942022-04-15 11:43:27 +0000580
Jerry Yuc1be19f2022-04-23 16:11:39 +0800581 /* ...
582 * Random random;
583 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +0000584 * with Random defined as:
585 * opaque Random[32];
XiaokangQian7807f9f2022-02-15 10:04:37 +0000586 */
XiaokangQian4080a7f2022-04-11 09:55:18 +0000587 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes",
XiaokangQian08037552022-04-20 07:16:41 +0000588 p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000589
XiaokangQian08037552022-04-20 07:16:41 +0000590 memcpy( &ssl->handshake->randbytes[0], p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN );
591 p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000592
Jerry Yuc1be19f2022-04-23 16:11:39 +0800593 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +0000594 * opaque legacy_session_id<0..32>;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800595 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +0000596 */
XiaokangQian4080a7f2022-04-11 09:55:18 +0000597 legacy_session_id_len = p[0];
XiaokangQianc5763b52022-04-02 03:34:37 +0000598 p++;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000599
XiaokangQianb67384d2022-04-19 00:02:38 +0000600 if( legacy_session_id_len > sizeof( ssl->session_negotiate->id ) )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000601 {
602 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
603 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
604 }
605
XiaokangQian4080a7f2022-04-11 09:55:18 +0000606 ssl->session_negotiate->id_len = legacy_session_id_len;
XiaokangQianed582dd2022-04-13 08:21:05 +0000607 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id",
XiaokangQiane8ff3502022-04-22 02:34:40 +0000608 p, legacy_session_id_len );
XiaokangQianb67384d2022-04-19 00:02:38 +0000609 /*
610 * Check we have enough data for the legacy session identifier
611 * and the ciphersuite list length.
612 */
613 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, legacy_session_id_len + 2 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000614
XiaokangQianed582dd2022-04-13 08:21:05 +0000615 memcpy( &ssl->session_negotiate->id[0], p, legacy_session_id_len );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000616 p += legacy_session_id_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000617
XiaokangQian7807f9f2022-02-15 10:04:37 +0000618 cipher_suites_len = MBEDTLS_GET_UINT16_BE( p, 0 );
619 p += 2;
620
XiaokangQianb67384d2022-04-19 00:02:38 +0000621 /* Check we have enough data for the ciphersuite list, the legacy
622 * compression methods and the length of the extensions.
623 */
624 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, cipher_suites_len + 2 + 2 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000625
Jerry Yuc1be19f2022-04-23 16:11:39 +0800626 /* ...
XiaokangQian08037552022-04-20 07:16:41 +0000627 * CipherSuite cipher_suites<2..2^16-2>;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800628 * ...
XiaokangQian08037552022-04-20 07:16:41 +0000629 * with CipherSuite defined as:
630 * uint8 CipherSuite[2];
631 */
XiaokangQian060d8672022-04-21 09:24:56 +0000632 cipher_suites = p;
633 cipher_suites_end = p + cipher_suites_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000634 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
635 p, cipher_suites_len );
XiaokangQian17f974c2022-04-19 09:57:41 +0000636 /*
637 * Search for a matching ciphersuite
638 */
XiaokangQian318dc762022-04-20 09:43:51 +0000639 int ciphersuite_match = 0;
XiaokangQian060d8672022-04-21 09:24:56 +0000640 for ( ; p < cipher_suites_end; p += 2 )
XiaokangQian17f974c2022-04-19 09:57:41 +0000641 {
XiaokangQiane8ff3502022-04-22 02:34:40 +0000642 uint16_t cipher_suite;
643 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, cipher_suites_end, 2 );
644 cipher_suite = MBEDTLS_GET_UINT16_BE( p, 0 );
645 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
XiaokangQian08037552022-04-20 07:16:41 +0000646 /*
XiaokangQiane8ff3502022-04-22 02:34:40 +0000647 * Check whether this ciphersuite is valid and offered.
648 */
XiaokangQian08037552022-04-20 07:16:41 +0000649 if( ( mbedtls_ssl_validate_ciphersuite(
Jerry Yuc1be19f2022-04-23 16:11:39 +0800650 ssl, ciphersuite_info, ssl->tls_version,
651 ssl->tls_version ) != 0 ) ||
652 ! mbedtls_ssl_tls13_cipher_suite_is_offered( ssl, cipher_suite ) )
653 {
XiaokangQian08037552022-04-20 07:16:41 +0000654 continue;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800655 }
XiaokangQian7807f9f2022-02-15 10:04:37 +0000656
XiaokangQian08037552022-04-20 07:16:41 +0000657 ssl->session_negotiate->ciphersuite = cipher_suite;
658 ssl->handshake->ciphersuite_info = ciphersuite_info;
XiaokangQian318dc762022-04-20 09:43:51 +0000659 ciphersuite_match = 1;
XiaokangQian17f974c2022-04-19 09:57:41 +0000660
XiaokangQian08037552022-04-20 07:16:41 +0000661 break;
XiaokangQian17f974c2022-04-19 09:57:41 +0000662
XiaokangQian17f974c2022-04-19 09:57:41 +0000663 }
664
Jerry Yuc1be19f2022-04-23 16:11:39 +0800665 if( ! ciphersuite_match )
XiaokangQian318dc762022-04-20 09:43:51 +0000666 {
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000667 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
668 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
669 return ( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
XiaokangQian318dc762022-04-20 09:43:51 +0000670 }
XiaokangQian17f974c2022-04-19 09:57:41 +0000671
672 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s",
673 ciphersuite_info->name ) );
674
XiaokangQian060d8672022-04-21 09:24:56 +0000675 p = cipher_suites + cipher_suites_len;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800676
XiaokangQian4080a7f2022-04-11 09:55:18 +0000677 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +0000678 * opaque legacy_compression_methods<1..2^8-1>;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000679 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +0000680 */
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000681 if( p[0] != 1 || p[1] != MBEDTLS_SSL_COMPRESS_NULL )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000682 {
XiaokangQian4080a7f2022-04-11 09:55:18 +0000683 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad legacy compression method" ) );
684 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
685 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
686 return ( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000687 }
XiaokangQianb67384d2022-04-19 00:02:38 +0000688 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000689
Jerry Yuc1be19f2022-04-23 16:11:39 +0800690 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +0000691 * Extension extensions<8..2^16-1>;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800692 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +0000693 * with Extension defined as:
694 * struct {
695 * ExtensionType extension_type;
696 * opaque extension_data<0..2^16-1>;
697 * } Extension;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000698 */
XiaokangQian4080a7f2022-04-11 09:55:18 +0000699 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000700 p += 2;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000701 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
XiaokangQiane8ff3502022-04-22 02:34:40 +0000702 extensions_end = p + extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000703
XiaokangQian4080a7f2022-04-11 09:55:18 +0000704 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", p, extensions_len );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000705
706 while( p < extensions_end )
707 {
708 unsigned int extension_type;
709 size_t extension_data_len;
710 const unsigned char *extension_data_end;
711
XiaokangQian318dc762022-04-20 09:43:51 +0000712 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000713 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
714 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
715 p += 4;
716
717 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
718 extension_data_end = p + extension_data_len;
719
720 switch( extension_type )
721 {
XiaokangQian40a35232022-05-07 09:02:40 +0000722#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
723 case MBEDTLS_TLS_EXT_SERVERNAME:
724 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
XiaokangQian9b2b7712022-05-17 02:57:00 +0000725 ret = mbedtls_ssl_parse_server_name_ext( ssl, p,
726 extension_data_end );
XiaokangQian40a35232022-05-07 09:02:40 +0000727 if( ret != 0 )
728 {
729 MBEDTLS_SSL_DEBUG_RET(
730 1, "mbedtls_ssl_parse_servername_ext", ret );
731 return( ret );
732 }
733 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SERVERNAME;
734 break;
735#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
736
XiaokangQianb67384d2022-04-19 00:02:38 +0000737#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000738 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
739 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported group extension" ) );
740
741 /* Supported Groups Extension
742 *
743 * When sent by the client, the "supported_groups" extension
744 * indicates the named groups which the client supports,
745 * ordered from most preferred to least preferred.
746 */
Jerry Yuc1be19f2022-04-23 16:11:39 +0800747 ret = ssl_tls13_parse_supported_groups_ext(
748 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000749 if( ret != 0 )
750 {
751 MBEDTLS_SSL_DEBUG_RET( 1,
752 "mbedtls_ssl_parse_supported_groups_ext", ret );
753 return( ret );
754 }
755
756 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_GROUPS;
757 break;
XiaokangQianb67384d2022-04-19 00:02:38 +0000758#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000759
XiaokangQian88408882022-04-02 10:15:03 +0000760#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000761 case MBEDTLS_TLS_EXT_KEY_SHARE:
762 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found key share extension" ) );
763
764 /*
765 * Key Share Extension
766 *
767 * When sent by the client, the "key_share" extension
768 * contains the endpoint's cryptographic parameters for
769 * ECDHE/DHE key establishment methods.
770 */
Jerry Yuc1be19f2022-04-23 16:11:39 +0800771 ret = ssl_tls13_parse_key_shares_ext(
772 ssl, p, extension_data_end );
XiaokangQian08037552022-04-20 07:16:41 +0000773 if( ret == SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000774 {
XiaokangQianed582dd2022-04-13 08:21:05 +0000775 MBEDTLS_SSL_DEBUG_MSG( 2, ( "HRR needed " ) );
Jerry Yu49ca9282022-05-05 11:05:22 +0800776 hrr_required = 1;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000777 }
778
Jerry Yu582dd062022-04-22 21:59:01 +0800779 if( ret < 0 )
780 {
781 MBEDTLS_SSL_DEBUG_RET(
782 1, "ssl_tls13_parse_key_shares_ext", ret );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000783 return( ret );
Jerry Yu582dd062022-04-22 21:59:01 +0800784 }
XiaokangQian7807f9f2022-02-15 10:04:37 +0000785
786 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_KEY_SHARE;
787 break;
XiaokangQian88408882022-04-02 10:15:03 +0000788#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000789
790 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
791 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported versions extension" ) );
792
793 ret = ssl_tls13_parse_supported_versions_ext(
Jerry Yuc1be19f2022-04-23 16:11:39 +0800794 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000795 if( ret != 0 )
796 {
797 MBEDTLS_SSL_DEBUG_RET( 1,
798 ( "ssl_tls13_parse_supported_versions_ext" ), ret );
799 return( ret );
800 }
801 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_VERSIONS;
802 break;
803
Jerry Yue19e3b92022-07-08 12:04:51 +0000804#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
805 case MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES:
806 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found psk key exchange modes extension" ) );
807
808 ret = ssl_tls13_parse_key_exchange_modes_ext(
809 ssl, p, extension_data_end );
810 if( ret != 0 )
811 {
812 MBEDTLS_SSL_DEBUG_RET(
813 1, "ssl_tls13_parse_key_exchange_modes_ext", ret );
814 return( ret );
815 }
816
817 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES;
818 break;
819#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
820
XiaokangQianacb39922022-06-17 10:18:48 +0000821#if defined(MBEDTLS_SSL_ALPN)
822 case MBEDTLS_TLS_EXT_ALPN:
823 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
824
825 ret = mbedtls_ssl_parse_alpn_ext( ssl, p, extension_data_end );
826 if( ret != 0 )
827 {
828 MBEDTLS_SSL_DEBUG_RET(
829 1, ( "mbedtls_ssl_parse_alpn_ext" ), ret );
830 return( ret );
831 }
832 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_ALPN;
833 break;
834#endif /* MBEDTLS_SSL_ALPN */
835
XiaokangQian7807f9f2022-02-15 10:04:37 +0000836#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
837 case MBEDTLS_TLS_EXT_SIG_ALG:
838 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
839
Gabor Mezei078e8032022-04-27 21:17:56 +0200840 ret = mbedtls_ssl_parse_sig_alg_ext(
Jerry Yuc1be19f2022-04-23 16:11:39 +0800841 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000842 if( ret != 0 )
843 {
844 MBEDTLS_SSL_DEBUG_MSG( 1,
845 ( "ssl_parse_supported_signature_algorithms_server_ext ( %d )",
846 ret ) );
847 return( ret );
848 }
849 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SIG_ALG;
850 break;
851#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
852
853 default:
854 MBEDTLS_SSL_DEBUG_MSG( 3,
855 ( "unknown extension found: %ud ( ignoring )",
856 extension_type ) );
857 }
858
859 p += extension_data_len;
860 }
861
862 /* Update checksum with either
863 * - The entire content of the CH message, if no PSK extension is present
864 * - The content up to but excluding the PSK extension, if present.
865 */
XiaokangQian3f84d5d2022-04-19 06:36:17 +0000866 mbedtls_ssl_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
XiaokangQianc4b8c992022-04-07 11:31:38 +0000867 buf, p - buf );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000868
869 /* List all the extensions we have received */
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000870#if defined(MBEDTLS_DEBUG_C)
XiaokangQian4080a7f2022-04-11 09:55:18 +0000871 ssl_tls13_debug_print_client_hello_exts( ssl );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000872#endif /* MBEDTLS_DEBUG_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000873
XiaokangQian75fe8c72022-06-15 09:42:45 +0000874 return( hrr_required ? SSL_CLIENT_HELLO_HRR_REQUIRED : SSL_CLIENT_HELLO_OK );
875}
876
877/* Update the handshake state machine */
878
Ronald Cronce7d76e2022-07-08 18:56:49 +0200879MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian75fe8c72022-06-15 09:42:45 +0000880static int ssl_tls13_postprocess_client_hello( mbedtls_ssl_context* ssl )
881{
882 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
883
XiaokangQian7807f9f2022-02-15 10:04:37 +0000884 /*
XiaokangQianb67384d2022-04-19 00:02:38 +0000885 * Here we only support the ephemeral or (EC)DHE key echange mode
XiaokangQian7807f9f2022-02-15 10:04:37 +0000886 */
XiaokangQianb67384d2022-04-19 00:02:38 +0000887 if( !ssl_tls13_check_ephemeral_key_exchange( ssl ) )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000888 {
889 MBEDTLS_SSL_DEBUG_MSG(
890 1,
891 ( "ClientHello message misses mandatory extensions." ) );
892 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_MISSING_EXTENSION ,
893 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
894 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
895 }
896
XiaokangQianfb665a82022-06-15 03:57:21 +0000897 /*
898 * Server certificate selection
899 */
900 if( ssl->conf->f_cert_cb && ( ret = ssl->conf->f_cert_cb( ssl ) ) != 0 )
901 {
902 MBEDTLS_SSL_DEBUG_RET( 1, "f_cert_cb", ret );
903 return( ret );
904 }
905#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
906 ssl->handshake->sni_name = NULL;
907 ssl->handshake->sni_name_len = 0;
908#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000909
XiaokangQian7807f9f2022-02-15 10:04:37 +0000910 ret = mbedtls_ssl_tls13_key_schedule_stage_early( ssl );
911 if( ret != 0 )
912 {
913 MBEDTLS_SSL_DEBUG_RET( 1,
914 "mbedtls_ssl_tls1_3_key_schedule_stage_early", ret );
915 return( ret );
916 }
917
XiaokangQian7807f9f2022-02-15 10:04:37 +0000918 return( 0 );
919
920}
921
922/*
XiaokangQianed582dd2022-04-13 08:21:05 +0000923 * Main entry point from the state machine; orchestrates the otherfunctions.
924 */
925
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200926MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianed582dd2022-04-13 08:21:05 +0000927static int ssl_tls13_process_client_hello( mbedtls_ssl_context *ssl )
928{
929
XiaokangQian08037552022-04-20 07:16:41 +0000930 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianed582dd2022-04-13 08:21:05 +0000931 unsigned char* buf = NULL;
932 size_t buflen = 0;
Jerry Yu4ca91402022-05-09 15:50:57 +0800933 int parse_client_hello_ret;
934
XiaokangQianed582dd2022-04-13 08:21:05 +0000935 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
936
XiaokangQianed582dd2022-04-13 08:21:05 +0000937 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg(
938 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
939 &buf, &buflen ) );
940
941 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_parse_client_hello( ssl, buf,
942 buf + buflen ) );
Jerry Yuf41553b2022-05-09 22:20:30 +0800943 parse_client_hello_ret = ret; /* Store return value of parse_client_hello,
944 * only SSL_CLIENT_HELLO_OK or
945 * SSL_CLIENT_HELLO_HRR_REQUIRED at this
946 * stage as negative error codes are handled
947 * by MBEDTLS_SSL_PROC_CHK_NEG. */
Jerry Yu4ca91402022-05-09 15:50:57 +0800948
XiaokangQiancfd925f2022-04-14 07:10:37 +0000949 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_client_hello( ssl ) );
Jerry Yu582dd062022-04-22 21:59:01 +0800950
Jerry Yu4ca91402022-05-09 15:50:57 +0800951 if( parse_client_hello_ret == SSL_CLIENT_HELLO_OK )
952 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_HELLO );
953 else
954 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HELLO_RETRY_REQUEST );
XiaokangQianed582dd2022-04-13 08:21:05 +0000955
956cleanup:
957
958 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
959 return( ret );
960}
961
962/*
Jerry Yu1c3e6882022-04-20 21:23:40 +0800963 * Handler for MBEDTLS_SSL_SERVER_HELLO
Jerry Yu5b64ae92022-03-30 17:15:02 +0800964 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200965MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf4b27e42022-03-30 17:32:21 +0800966static int ssl_tls13_prepare_server_hello( mbedtls_ssl_context *ssl )
967{
Jerry Yu637a3f12022-04-20 21:37:58 +0800968 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
969 unsigned char *server_randbytes =
Jerry Yu3bf2c642022-03-30 22:02:12 +0800970 ssl->handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
Jerry Yuf4b27e42022-03-30 17:32:21 +0800971 if( ssl->conf->f_rng == NULL )
972 {
973 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided" ) );
974 return( MBEDTLS_ERR_SSL_NO_RNG );
975 }
976
Jerry Yu637a3f12022-04-20 21:37:58 +0800977 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, server_randbytes,
Jerry Yuf4b27e42022-03-30 17:32:21 +0800978 MBEDTLS_SERVER_HELLO_RANDOM_LEN ) ) != 0 )
979 {
980 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
981 return( ret );
982 }
983
Jerry Yu637a3f12022-04-20 21:37:58 +0800984 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", server_randbytes,
Jerry Yuf4b27e42022-03-30 17:32:21 +0800985 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
986
987#if defined(MBEDTLS_HAVE_TIME)
988 ssl->session_negotiate->start = time( NULL );
989#endif /* MBEDTLS_HAVE_TIME */
990
991 return( ret );
992}
993
Jerry Yu3bf2c642022-03-30 22:02:12 +0800994/*
Jerry Yue74e04a2022-04-21 09:23:16 +0800995 * ssl_tls13_write_server_hello_supported_versions_ext ():
Jerry Yu3bf2c642022-03-30 22:02:12 +0800996 *
997 * struct {
Jerry Yufb9f54d2022-04-06 10:08:34 +0800998 * ProtocolVersion selected_version;
Jerry Yu3bf2c642022-03-30 22:02:12 +0800999 * } SupportedVersions;
1000 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001001MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue74e04a2022-04-21 09:23:16 +08001002static int ssl_tls13_write_server_hello_supported_versions_ext(
1003 mbedtls_ssl_context *ssl,
1004 unsigned char *buf,
1005 unsigned char *end,
1006 size_t *out_len )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001007{
Jerry Yu3bf2c642022-03-30 22:02:12 +08001008 *out_len = 0;
1009
Jerry Yu955ddd72022-04-22 22:27:33 +08001010 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, write selected version" ) );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001011
1012 /* Check if we have space to write the extension:
1013 * - extension_type (2 bytes)
1014 * - extension_data_length (2 bytes)
Jerry Yu349a6132022-04-14 20:52:56 +08001015 * - selected_version (2 bytes)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001016 */
Jerry Yu349a6132022-04-14 20:52:56 +08001017 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 6 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001018
Jerry Yu349a6132022-04-14 20:52:56 +08001019 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, buf, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001020
Jerry Yu349a6132022-04-14 20:52:56 +08001021 MBEDTLS_PUT_UINT16_BE( 2, buf, 2 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001022
Jerry Yu349a6132022-04-14 20:52:56 +08001023 mbedtls_ssl_write_version( buf + 4,
1024 ssl->conf->transport,
1025 ssl->tls_version );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001026
1027 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [%04x]",
1028 ssl->tls_version ) );
1029
Jerry Yu349a6132022-04-14 20:52:56 +08001030 *out_len = 6;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001031
1032 return( 0 );
1033}
1034
Jerry Yud9436a12022-04-20 22:28:09 +08001035
Jerry Yu3bf2c642022-03-30 22:02:12 +08001036
1037/* Generate and export a single key share. For hybrid KEMs, this can
1038 * be called multiple times with the different components of the hybrid. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001039MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu955ddd72022-04-22 22:27:33 +08001040static int ssl_tls13_generate_and_write_key_share( mbedtls_ssl_context *ssl,
1041 uint16_t named_group,
1042 unsigned char *buf,
1043 unsigned char *end,
1044 size_t *out_len )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001045{
1046 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu955ddd72022-04-22 22:27:33 +08001047
1048 *out_len = 0;
1049
Jerry Yu89e103c2022-03-30 22:43:29 +08001050#if defined(MBEDTLS_ECDH_C)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001051 if( mbedtls_ssl_tls13_named_group_is_ecdhe( named_group ) )
1052 {
Jerry Yu89e103c2022-03-30 22:43:29 +08001053 ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
1054 ssl, named_group, buf, end, out_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001055 if( ret != 0 )
1056 {
Jerry Yu89e103c2022-03-30 22:43:29 +08001057 MBEDTLS_SSL_DEBUG_RET(
1058 1, "mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange",
1059 ret );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001060 return( ret );
1061 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08001062 }
Jerry Yu89e103c2022-03-30 22:43:29 +08001063 else
1064#endif /* MBEDTLS_ECDH_C */
1065 if( 0 /* Other kinds of KEMs */ )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001066 {
1067 }
1068 else
1069 {
Jerry Yu955ddd72022-04-22 22:27:33 +08001070 ((void) ssl);
1071 ((void) named_group);
1072 ((void) buf);
1073 ((void) end);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001074 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1075 }
1076
1077 return( ret );
1078}
1079
1080/*
1081 * ssl_tls13_write_key_share_ext
1082 *
1083 * Structure of key_share extension in ServerHello:
1084 *
Jerry Yu1c3e6882022-04-20 21:23:40 +08001085 * struct {
1086 * NamedGroup group;
1087 * opaque key_exchange<1..2^16-1>;
1088 * } KeyShareEntry;
1089 * struct {
1090 * KeyShareEntry server_share;
1091 * } KeyShareServerHello;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001092 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001093MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu3bf2c642022-03-30 22:02:12 +08001094static int ssl_tls13_write_key_share_ext( mbedtls_ssl_context *ssl,
1095 unsigned char *buf,
1096 unsigned char *end,
1097 size_t *out_len )
1098{
Jerry Yu955ddd72022-04-22 22:27:33 +08001099 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001100 unsigned char *p = buf;
Jerry Yu57d48412022-04-20 21:50:42 +08001101 uint16_t group = ssl->handshake->offered_group_id;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001102 unsigned char *server_share = buf + 4;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001103 size_t key_exchange_length;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001104
1105 *out_len = 0;
1106
1107 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding key share extension" ) );
1108
1109 /* Check if we have space for header and length fields:
1110 * - extension_type (2 bytes)
1111 * - extension_data_length (2 bytes)
1112 * - group (2 bytes)
1113 * - key_exchange_length (2 bytes)
1114 */
1115 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 8 );
Jerry Yu57d48412022-04-20 21:50:42 +08001116 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, p, 0 );
1117 MBEDTLS_PUT_UINT16_BE( group, server_share, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001118 p += 8;
Jerry Yu57d48412022-04-20 21:50:42 +08001119
Jerry Yu3bf2c642022-03-30 22:02:12 +08001120 /* When we introduce PQC-ECDHE hybrids, we'll want to call this
1121 * function multiple times. */
Jerry Yu955ddd72022-04-22 22:27:33 +08001122 ret = ssl_tls13_generate_and_write_key_share(
Jerry Yue65d8012022-04-23 10:34:35 +08001123 ssl, group, server_share + 4, end, &key_exchange_length );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001124 if( ret != 0 )
1125 return( ret );
1126 p += key_exchange_length;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001127
Jerry Yu955ddd72022-04-22 22:27:33 +08001128 MBEDTLS_PUT_UINT16_BE( key_exchange_length, server_share + 2, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001129
Jerry Yu57d48412022-04-20 21:50:42 +08001130 MBEDTLS_PUT_UINT16_BE( p - server_share, buf, 2 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001131
Jerry Yu57d48412022-04-20 21:50:42 +08001132 *out_len = p - buf;
Jerry Yu955ddd72022-04-22 22:27:33 +08001133
Jerry Yu3bf2c642022-03-30 22:02:12 +08001134 return( 0 );
1135}
Jerry Yud9436a12022-04-20 22:28:09 +08001136
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001137MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001138static int ssl_tls13_write_hrr_key_share_ext( mbedtls_ssl_context *ssl,
1139 unsigned char *buf,
1140 unsigned char *end,
1141 size_t *out_len )
1142{
1143 uint16_t selected_group = ssl->handshake->hrr_selected_group;
1144 /* key_share Extension
1145 *
1146 * struct {
1147 * select (Handshake.msg_type) {
1148 * ...
1149 * case hello_retry_request:
1150 * NamedGroup selected_group;
1151 * ...
1152 * };
1153 * } KeyShare;
1154 */
1155
1156 *out_len = 0;
1157
Jerry Yub0ac10b2022-05-05 11:10:08 +08001158 /*
1159 * For a pure PSK key exchange, there is no group to agree upon. The purpose
1160 * of the HRR is then to transmit a cookie to force the client to demonstrate
1161 * reachability at their apparent network address (primarily useful for DTLS).
1162 */
1163 if( ! mbedtls_ssl_tls13_some_ephemeral_enabled( ssl ) )
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001164 return( 0 );
1165
1166 /* We should only send the key_share extension if the client's initial
1167 * key share was not acceptable. */
1168 if( ssl->handshake->offered_group_id != 0 )
1169 {
1170 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Skip key_share extension in HRR" ) );
1171 return( 0 );
1172 }
1173
1174 if( selected_group == 0 )
1175 {
1176 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching named group found" ) );
1177 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1178 }
1179
Jerry Yub0ac10b2022-05-05 11:10:08 +08001180 /* Check if we have enough space:
1181 * - extension_type (2 bytes)
1182 * - extension_data_length (2 bytes)
1183 * - selected_group (2 bytes)
1184 */
Ronald Cron154d1b62022-06-01 15:33:26 +02001185 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 6 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001186
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001187 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001188 MBEDTLS_PUT_UINT16_BE( 2, buf, 2 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001189 MBEDTLS_PUT_UINT16_BE( selected_group, buf, 4 );
1190
1191 MBEDTLS_SSL_DEBUG_MSG( 3,
1192 ( "HRR selected_group: %s (%x)",
1193 mbedtls_ssl_named_group_to_str( selected_group ),
1194 selected_group ) );
1195
1196 *out_len = 6;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001197
Jerry Yub0ac10b2022-05-05 11:10:08 +08001198 return( 0 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001199}
Jerry Yu3bf2c642022-03-30 22:02:12 +08001200
1201/*
1202 * Structure of ServerHello message:
1203 *
1204 * struct {
1205 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
1206 * Random random;
1207 * opaque legacy_session_id_echo<0..32>;
1208 * CipherSuite cipher_suite;
1209 * uint8 legacy_compression_method = 0;
1210 * Extension extensions<6..2^16-1>;
1211 * } ServerHello;
1212 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001213MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu3bf2c642022-03-30 22:02:12 +08001214static int ssl_tls13_write_server_hello_body( mbedtls_ssl_context *ssl,
Jerry Yu56404d72022-03-30 17:36:13 +08001215 unsigned char *buf,
1216 unsigned char *end,
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001217 size_t *out_len,
1218 int is_hrr )
Jerry Yu56404d72022-03-30 17:36:13 +08001219{
Jerry Yu955ddd72022-04-22 22:27:33 +08001220 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001221 unsigned char *p = buf;
Jerry Yud9436a12022-04-20 22:28:09 +08001222 unsigned char *p_extensions_len;
Jerry Yufbe3e642022-04-25 19:31:51 +08001223 size_t output_len;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001224
1225 *out_len = 0;
1226
Jerry Yucfc04b32022-04-21 09:31:58 +08001227 /* ...
1228 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1229 * ...
1230 * with ProtocolVersion defined as:
1231 * uint16 ProtocolVersion;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001232 */
1233 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1234 MBEDTLS_PUT_UINT16_BE( 0x0303, p, 0 );
1235 p += 2;
1236
Jerry Yu1c3e6882022-04-20 21:23:40 +08001237 /* ...
1238 * Random random;
1239 * ...
Jerry Yucfc04b32022-04-21 09:31:58 +08001240 * with Random defined as:
1241 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu1c3e6882022-04-20 21:23:40 +08001242 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08001243 MBEDTLS_SSL_CHK_BUF_PTR( p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001244 if( is_hrr )
1245 {
1246 memcpy( p, mbedtls_ssl_tls13_hello_retry_request_magic,
Jerry Yufbe3e642022-04-25 19:31:51 +08001247 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001248 }
1249 else
1250 {
1251 memcpy( p, &ssl->handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN],
Jerry Yufbe3e642022-04-25 19:31:51 +08001252 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001253 }
Jerry Yu955ddd72022-04-22 22:27:33 +08001254 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes",
Jerry Yu3bf2c642022-03-30 22:02:12 +08001255 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN );
1256 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
1257
Jerry Yucfc04b32022-04-21 09:31:58 +08001258 /* ...
1259 * opaque legacy_session_id_echo<0..32>;
1260 * ...
Jerry Yu3bf2c642022-03-30 22:02:12 +08001261 */
1262 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 + ssl->session_negotiate->id_len );
1263 *p++ = (unsigned char)ssl->session_negotiate->id_len;
1264 if( ssl->session_negotiate->id_len > 0 )
1265 {
1266 memcpy( p, &ssl->session_negotiate->id[0],
1267 ssl->session_negotiate->id_len );
1268 p += ssl->session_negotiate->id_len;
Jerry Yu955ddd72022-04-22 22:27:33 +08001269
Jerry Yu3bf2c642022-03-30 22:02:12 +08001270 MBEDTLS_SSL_DEBUG_BUF( 3, "session id", ssl->session_negotiate->id,
1271 ssl->session_negotiate->id_len );
1272 }
1273
Jerry Yucfc04b32022-04-21 09:31:58 +08001274 /* ...
1275 * CipherSuite cipher_suite;
1276 * ...
1277 * with CipherSuite defined as:
1278 * uint8 CipherSuite[2];
Jerry Yu3bf2c642022-03-30 22:02:12 +08001279 */
1280 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1281 MBEDTLS_PUT_UINT16_BE( ssl->session_negotiate->ciphersuite, p, 0 );
1282 p += 2;
1283 MBEDTLS_SSL_DEBUG_MSG( 3,
1284 ( "server hello, chosen ciphersuite: %s ( id=%d )",
1285 mbedtls_ssl_get_ciphersuite_name(
1286 ssl->session_negotiate->ciphersuite ),
1287 ssl->session_negotiate->ciphersuite ) );
1288
Jerry Yucfc04b32022-04-21 09:31:58 +08001289 /* ...
1290 * uint8 legacy_compression_method = 0;
1291 * ...
1292 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08001293 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
1294 *p++ = 0x0;
1295
Jerry Yucfc04b32022-04-21 09:31:58 +08001296 /* ...
1297 * Extension extensions<6..2^16-1>;
1298 * ...
1299 * struct {
1300 * ExtensionType extension_type; (2 bytes)
1301 * opaque extension_data<0..2^16-1>;
1302 * } Extension;
1303 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08001304 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yud9436a12022-04-20 22:28:09 +08001305 p_extensions_len = p;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001306 p += 2;
1307
Jerry Yue74e04a2022-04-21 09:23:16 +08001308 if( ( ret = ssl_tls13_write_server_hello_supported_versions_ext(
Jerry Yu3bf2c642022-03-30 22:02:12 +08001309 ssl, p, end, &output_len ) ) != 0 )
1310 {
Jerry Yu955ddd72022-04-22 22:27:33 +08001311 MBEDTLS_SSL_DEBUG_RET(
1312 1, "ssl_tls13_write_server_hello_supported_versions_ext", ret );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001313 return( ret );
1314 }
1315 p += output_len;
1316
Jerry Yu3bf2c642022-03-30 22:02:12 +08001317 if( mbedtls_ssl_conf_tls13_some_ephemeral_enabled( ssl ) )
1318 {
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001319 if( is_hrr )
1320 ret = ssl_tls13_write_hrr_key_share_ext( ssl, p, end, &output_len );
1321 else
1322 ret = ssl_tls13_write_key_share_ext( ssl, p, end, &output_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001323 if( ret != 0 )
1324 return( ret );
1325 p += output_len;
1326 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08001327
Jerry Yud9436a12022-04-20 22:28:09 +08001328 MBEDTLS_PUT_UINT16_BE( p - p_extensions_len - 2, p_extensions_len, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001329
Jerry Yud9436a12022-04-20 22:28:09 +08001330 MBEDTLS_SSL_DEBUG_BUF( 4, "server hello extensions",
1331 p_extensions_len, p - p_extensions_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001332
Jerry Yud9436a12022-04-20 22:28:09 +08001333 *out_len = p - buf;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001334
Jerry Yud9436a12022-04-20 22:28:09 +08001335 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello", buf, *out_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001336
1337 return( ret );
Jerry Yu56404d72022-03-30 17:36:13 +08001338}
1339
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001340MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue110d252022-05-05 10:19:22 +08001341static int ssl_tls13_finalize_write_server_hello( mbedtls_ssl_context *ssl )
1342{
1343 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf86eb752022-05-06 11:16:55 +08001344 ret = mbedtls_ssl_tls13_compute_handshake_transform( ssl );
Jerry Yue110d252022-05-05 10:19:22 +08001345 if( ret != 0 )
1346 {
Jerry Yuf86eb752022-05-06 11:16:55 +08001347 MBEDTLS_SSL_DEBUG_RET( 1,
1348 "mbedtls_ssl_tls13_compute_handshake_transform",
Jerry Yue110d252022-05-05 10:19:22 +08001349 ret );
1350 return( ret );
1351 }
1352
Jerry Yue110d252022-05-05 10:19:22 +08001353 return( ret );
1354}
1355
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001356MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu5b64ae92022-03-30 17:15:02 +08001357static int ssl_tls13_write_server_hello( mbedtls_ssl_context *ssl )
1358{
Jerry Yu637a3f12022-04-20 21:37:58 +08001359 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf4b27e42022-03-30 17:32:21 +08001360 unsigned char *buf;
1361 size_t buf_len, msg_len;
1362
1363 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
1364
Jerry Yuf4b27e42022-03-30 17:32:21 +08001365 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_server_hello( ssl ) );
1366
Jerry Yu3bf2c642022-03-30 22:02:12 +08001367 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
Jerry Yuf4b27e42022-03-30 17:32:21 +08001368 MBEDTLS_SSL_HS_SERVER_HELLO, &buf, &buf_len ) );
1369
Jerry Yu3bf2c642022-03-30 22:02:12 +08001370 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_server_hello_body( ssl, buf,
1371 buf + buf_len,
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001372 &msg_len,
1373 0 ) );
Jerry Yuf4b27e42022-03-30 17:32:21 +08001374
Jerry Yu3bf2c642022-03-30 22:02:12 +08001375 mbedtls_ssl_add_hs_msg_to_checksum(
Jerry Yuf4b27e42022-03-30 17:32:21 +08001376 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len );
1377
Jerry Yu3bf2c642022-03-30 22:02:12 +08001378 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
Jerry Yuf4b27e42022-03-30 17:32:21 +08001379 ssl, buf_len, msg_len ) );
Jerry Yu637a3f12022-04-20 21:37:58 +08001380
Jerry Yue110d252022-05-05 10:19:22 +08001381 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_write_server_hello( ssl ) );
1382
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001383#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1384 /* The server sends a dummy change_cipher_spec record immediately
1385 * after its first handshake message. This may either be after
1386 * a ServerHello or a HelloRetryRequest.
1387 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02001388 mbedtls_ssl_handshake_set_state(
1389 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001390#else
Jerry Yu637a3f12022-04-20 21:37:58 +08001391 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001392#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yue110d252022-05-05 10:19:22 +08001393
Jerry Yuf4b27e42022-03-30 17:32:21 +08001394cleanup:
1395
1396 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
1397 return( ret );
Jerry Yu5b64ae92022-03-30 17:15:02 +08001398}
1399
Jerry Yu23d1a252022-05-12 18:08:59 +08001400
1401/*
1402 * Handler for MBEDTLS_SSL_HELLO_RETRY_REQUEST
1403 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001404MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron7b840462022-06-01 17:05:53 +02001405static int ssl_tls13_prepare_hello_retry_request( mbedtls_ssl_context *ssl )
Jerry Yu23d1a252022-05-12 18:08:59 +08001406{
1407 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1408 if( ssl->handshake->hello_retry_request_count > 0 )
1409 {
1410 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Too many HRRs" ) );
1411 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1412 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1413 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1414 }
1415
1416 /*
1417 * Create stateless transcript hash for HRR
1418 */
1419 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Reset transcript for HRR" ) );
1420 ret = mbedtls_ssl_reset_transcript_for_hrr( ssl );
1421 if( ret != 0 )
1422 {
1423 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_reset_transcript_for_hrr", ret );
1424 return( ret );
1425 }
1426 mbedtls_ssl_session_reset_msg_layer( ssl, 0 );
1427
1428 return( 0 );
1429}
1430
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001431MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu23d1a252022-05-12 18:08:59 +08001432static int ssl_tls13_write_hello_retry_request( mbedtls_ssl_context *ssl )
1433{
1434 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1435 unsigned char *buf;
1436 size_t buf_len, msg_len;
1437
1438 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello retry request" ) );
1439
Ronald Cron7b840462022-06-01 17:05:53 +02001440 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_hello_retry_request( ssl ) );
Jerry Yu23d1a252022-05-12 18:08:59 +08001441
1442 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg(
1443 ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
1444 &buf, &buf_len ) );
1445
1446 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_server_hello_body( ssl, buf,
1447 buf + buf_len,
1448 &msg_len,
1449 1 ) );
1450 mbedtls_ssl_add_hs_msg_to_checksum(
1451 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len );
1452
1453
1454 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg( ssl, buf_len,
1455 msg_len ) );
1456
1457 ssl->handshake->hello_retry_request_count++;
1458
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001459#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1460 /* The server sends a dummy change_cipher_spec record immediately
1461 * after its first handshake message. This may either be after
1462 * a ServerHello or a HelloRetryRequest.
1463 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02001464 mbedtls_ssl_handshake_set_state(
Gabor Mezeif7044ea2022-06-28 16:01:49 +02001465 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001466#else
Jerry Yu23d1a252022-05-12 18:08:59 +08001467 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001468#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yu23d1a252022-05-12 18:08:59 +08001469
1470cleanup:
1471 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello retry request" ) );
1472 return( ret );
1473}
1474
Jerry Yu5b64ae92022-03-30 17:15:02 +08001475/*
Jerry Yu4d3841a2022-04-16 12:37:19 +08001476 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
1477 */
Jerry Yu4d3841a2022-04-16 12:37:19 +08001478
1479/*
1480 * struct {
1481 * Extension extensions<0..2 ^ 16 - 1>;
1482 * } EncryptedExtensions;
1483 *
1484 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001485MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d3841a2022-04-16 12:37:19 +08001486static int ssl_tls13_write_encrypted_extensions_body( mbedtls_ssl_context *ssl,
1487 unsigned char *buf,
1488 unsigned char *end,
1489 size_t *out_len )
1490{
XiaokangQianacb39922022-06-17 10:18:48 +00001491 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu4d3841a2022-04-16 12:37:19 +08001492 unsigned char *p = buf;
1493 size_t extensions_len = 0;
Jerry Yu8937eb42022-05-03 12:12:14 +08001494 unsigned char *p_extensions_len;
XiaokangQianacb39922022-06-17 10:18:48 +00001495 size_t output_len;
Jerry Yu9da5e5a2022-05-03 15:46:09 +08001496
Jerry Yu4d3841a2022-04-16 12:37:19 +08001497 *out_len = 0;
1498
1499 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yu8937eb42022-05-03 12:12:14 +08001500 p_extensions_len = p;
Jerry Yu4d3841a2022-04-16 12:37:19 +08001501 p += 2;
1502
Jerry Yu8937eb42022-05-03 12:12:14 +08001503 ((void) ssl);
XiaokangQianacb39922022-06-17 10:18:48 +00001504 ((void) ret);
1505 ((void) output_len);
1506
1507#if defined(MBEDTLS_SSL_ALPN)
1508 ret = mbedtls_ssl_write_alpn_ext( ssl, p, end, &output_len );
1509 if( ret != 0 )
1510 return( ret );
XiaokangQian95d5f542022-06-24 02:29:26 +00001511 p += output_len;
XiaokangQianacb39922022-06-17 10:18:48 +00001512#endif /* MBEDTLS_SSL_ALPN */
Jerry Yu4d3841a2022-04-16 12:37:19 +08001513
Jerry Yu8937eb42022-05-03 12:12:14 +08001514 extensions_len = ( p - p_extensions_len ) - 2;
1515 MBEDTLS_PUT_UINT16_BE( extensions_len, p_extensions_len, 0 );
1516
1517 *out_len = p - buf;
Jerry Yu4d3841a2022-04-16 12:37:19 +08001518
1519 MBEDTLS_SSL_DEBUG_BUF( 4, "encrypted extensions", buf, *out_len );
1520
1521 return( 0 );
1522}
1523
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001524MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d3841a2022-04-16 12:37:19 +08001525static int ssl_tls13_write_encrypted_extensions( mbedtls_ssl_context *ssl )
1526{
1527 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1528 unsigned char *buf;
Jerry Yu39730a72022-05-03 12:14:04 +08001529 size_t buf_len, msg_len;
Jerry Yu4d3841a2022-04-16 12:37:19 +08001530
Gabor Mezei54719122022-06-28 11:34:56 +02001531 mbedtls_ssl_set_outbound_transform( ssl,
1532 ssl->handshake->transform_handshake );
1533 MBEDTLS_SSL_DEBUG_MSG(
1534 3, ( "switching to handshake transform for outbound data" ) );
1535
Jerry Yuab452cc2022-04-28 15:27:08 +08001536 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write encrypted extensions" ) );
Jerry Yu4d3841a2022-04-16 12:37:19 +08001537
Jerry Yu4d3841a2022-04-16 12:37:19 +08001538 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
1539 MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, &buf, &buf_len ) );
1540
1541 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_encrypted_extensions_body(
1542 ssl, buf, buf + buf_len, &msg_len ) );
1543
1544 mbedtls_ssl_add_hs_msg_to_checksum(
1545 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, buf, msg_len );
1546
Jerry Yu4d3841a2022-04-16 12:37:19 +08001547 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
1548 ssl, buf_len, msg_len ) );
1549
Jerry Yu8937eb42022-05-03 12:12:14 +08001550#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1551 if( mbedtls_ssl_tls13_some_psk_enabled( ssl ) )
1552 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
1553 else
XiaokangQiana987e1d2022-05-07 01:25:58 +00001554 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST );
Jerry Yu8937eb42022-05-03 12:12:14 +08001555#else
1556 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
1557#endif
1558
Jerry Yu4d3841a2022-04-16 12:37:19 +08001559cleanup:
1560
Jerry Yuab452cc2022-04-28 15:27:08 +08001561 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write encrypted extensions" ) );
Jerry Yu4d3841a2022-04-16 12:37:19 +08001562 return( ret );
1563}
1564
XiaokangQiancec9ae62022-05-06 07:28:50 +00001565#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
XiaokangQiana987e1d2022-05-07 01:25:58 +00001566#define SSL_CERTIFICATE_REQUEST_SEND_REQUEST 0
1567#define SSL_CERTIFICATE_REQUEST_SKIP 1
1568/* Coordination:
1569 * Check whether a CertificateRequest message should be written.
1570 * Returns a negative code on failure, or
1571 * - SSL_CERTIFICATE_REQUEST_SEND_REQUEST
1572 * - SSL_CERTIFICATE_REQUEST_SKIP
1573 * indicating if the writing of the CertificateRequest
1574 * should be skipped or not.
1575 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001576MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiana987e1d2022-05-07 01:25:58 +00001577static int ssl_tls13_certificate_request_coordinate( mbedtls_ssl_context *ssl )
1578{
1579 int authmode;
1580
XiaokangQian40a35232022-05-07 09:02:40 +00001581#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1582 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
1583 authmode = ssl->handshake->sni_authmode;
1584 else
1585#endif
XiaokangQiana987e1d2022-05-07 01:25:58 +00001586 authmode = ssl->conf->authmode;
1587
1588 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
1589 return( SSL_CERTIFICATE_REQUEST_SKIP );
1590
XiaokangQianc3017f62022-05-13 05:55:41 +00001591 ssl->handshake->certificate_request_sent = 1;
XiaokangQian189ded22022-05-10 08:12:17 +00001592
XiaokangQiana987e1d2022-05-07 01:25:58 +00001593 return( SSL_CERTIFICATE_REQUEST_SEND_REQUEST );
1594}
1595
XiaokangQiancec9ae62022-05-06 07:28:50 +00001596/*
1597 * struct {
1598 * opaque certificate_request_context<0..2^8-1>;
1599 * Extension extensions<2..2^16-1>;
1600 * } CertificateRequest;
1601 *
1602 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001603MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiancec9ae62022-05-06 07:28:50 +00001604static int ssl_tls13_write_certificate_request_body( mbedtls_ssl_context *ssl,
1605 unsigned char *buf,
1606 const unsigned char *end,
1607 size_t *out_len )
1608{
1609 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1610 unsigned char *p = buf;
XiaokangQianec6efb92022-05-06 09:53:10 +00001611 size_t output_len = 0;
XiaokangQiancec9ae62022-05-06 07:28:50 +00001612 unsigned char *p_extensions_len;
1613
1614 *out_len = 0;
1615
1616 /* Check if we have enough space:
1617 * - certificate_request_context (1 byte)
1618 * - extensions length (2 bytes)
1619 */
1620 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 3 );
1621
1622 /*
1623 * Write certificate_request_context
1624 */
1625 /*
1626 * We use a zero length context for the normal handshake
1627 * messages. For post-authentication handshake messages
1628 * this request context would be set to a non-zero value.
1629 */
1630 *p++ = 0x0;
1631
1632 /*
1633 * Write extensions
1634 */
1635 /* The extensions must contain the signature_algorithms. */
1636 p_extensions_len = p;
1637 p += 2;
XiaokangQianec6efb92022-05-06 09:53:10 +00001638 ret = mbedtls_ssl_write_sig_alg_ext( ssl, p, end, &output_len );
XiaokangQiancec9ae62022-05-06 07:28:50 +00001639 if( ret != 0 )
1640 return( ret );
1641
XiaokangQianec6efb92022-05-06 09:53:10 +00001642 p += output_len;
XiaokangQianaad9b0a2022-05-09 01:11:21 +00001643 MBEDTLS_PUT_UINT16_BE( p - p_extensions_len - 2, p_extensions_len, 0 );
XiaokangQiancec9ae62022-05-06 07:28:50 +00001644
1645 *out_len = p - buf;
1646
1647 return( 0 );
1648}
1649
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001650MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiancec9ae62022-05-06 07:28:50 +00001651static int ssl_tls13_write_certificate_request( mbedtls_ssl_context *ssl )
1652{
1653 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1654
1655 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1656
1657 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_certificate_request_coordinate( ssl ) );
1658
1659 if( ret == SSL_CERTIFICATE_REQUEST_SEND_REQUEST )
1660 {
1661 unsigned char *buf;
1662 size_t buf_len, msg_len;
1663
1664 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
1665 MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, &buf, &buf_len ) );
1666
1667 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_certificate_request_body(
1668 ssl, buf, buf + buf_len, &msg_len ) );
1669
1670 mbedtls_ssl_add_hs_msg_to_checksum(
1671 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, buf, msg_len );
1672
1673 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
1674 ssl, buf_len, msg_len ) );
1675 }
1676 else if( ret == SSL_CERTIFICATE_REQUEST_SKIP )
1677 {
1678 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
1679 ret = 0;
1680 }
1681 else
1682 {
1683 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1684 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1685 goto cleanup;
1686 }
1687
1688 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_CERTIFICATE );
1689cleanup:
1690
1691 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
1692 return( ret );
1693}
XiaokangQiancec9ae62022-05-06 07:28:50 +00001694
Jerry Yu4d3841a2022-04-16 12:37:19 +08001695/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08001696 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
Jerry Yu83da34e2022-04-16 13:59:52 +08001697 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001698MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08001699static int ssl_tls13_write_server_certificate( mbedtls_ssl_context *ssl )
Jerry Yu83da34e2022-04-16 13:59:52 +08001700{
Jerry Yu5a26f302022-05-10 20:46:40 +08001701 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianfb665a82022-06-15 03:57:21 +00001702
1703#if defined(MBEDTLS_X509_CRT_PARSE_C)
1704 if( ( ssl_tls13_pick_key_cert( ssl ) != 0 ) ||
1705 mbedtls_ssl_own_cert( ssl ) == NULL )
Jerry Yu5a26f302022-05-10 20:46:40 +08001706 {
Jerry Yub89125b2022-05-13 15:45:49 +08001707 MBEDTLS_SSL_DEBUG_MSG( 2, ( "No certificate available." ) );
Jerry Yu5a26f302022-05-10 20:46:40 +08001708 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1709 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08001710 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu5a26f302022-05-10 20:46:40 +08001711 }
XiaokangQianfb665a82022-06-15 03:57:21 +00001712#endif /* MBEDTLS_X509_CRT_PARSE_C */
Jerry Yu5a26f302022-05-10 20:46:40 +08001713
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08001714 ret = mbedtls_ssl_tls13_write_certificate( ssl );
1715 if( ret != 0 )
Jerry Yu1bff7112022-04-16 14:29:11 +08001716 return( ret );
Jerry Yu1bff7112022-04-16 14:29:11 +08001717 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY );
1718 return( 0 );
Jerry Yu83da34e2022-04-16 13:59:52 +08001719}
1720
1721/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08001722 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
Jerry Yu83da34e2022-04-16 13:59:52 +08001723 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001724MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08001725static int ssl_tls13_write_certificate_verify( mbedtls_ssl_context *ssl )
Jerry Yu83da34e2022-04-16 13:59:52 +08001726{
Jerry Yu4ff9e142022-04-16 14:57:49 +08001727 int ret = mbedtls_ssl_tls13_write_certificate_verify( ssl );
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08001728 if( ret != 0 )
Jerry Yu4ff9e142022-04-16 14:57:49 +08001729 return( ret );
Jerry Yu4ff9e142022-04-16 14:57:49 +08001730 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
1731 return( 0 );
Jerry Yu83da34e2022-04-16 13:59:52 +08001732}
Jerry Yu5a26f302022-05-10 20:46:40 +08001733#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08001734
1735/*
Jerry Yud6e253d2022-05-18 13:59:24 +08001736 * Handler for MBEDTLS_SSL_SERVER_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08001737 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001738MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08001739static int ssl_tls13_write_server_finished( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08001740{
Jerry Yud6e253d2022-05-18 13:59:24 +08001741 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu27bdc7c2022-04-16 13:33:27 +08001742
1743 ret = mbedtls_ssl_tls13_write_finished_message( ssl );
1744 if( ret != 0 )
1745 return( ret );
1746
Jerry Yue3d67cb2022-05-19 15:33:10 +08001747 ret = mbedtls_ssl_tls13_compute_application_transform( ssl );
1748 if( ret != 0 )
1749 {
1750 MBEDTLS_SSL_PEND_FATAL_ALERT(
1751 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1752 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1753 return( ret );
1754 }
XiaokangQianc3017f62022-05-13 05:55:41 +00001755
Ronald Cron63dc4632022-05-31 14:41:53 +02001756 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Switch to handshake keys for inbound traffic" ) );
1757 mbedtls_ssl_set_inbound_transform( ssl, ssl->handshake->transform_handshake );
XiaokangQian189ded22022-05-10 08:12:17 +00001758
Ronald Cron63dc4632022-05-31 14:41:53 +02001759 if( ssl->handshake->certificate_request_sent )
1760 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
XiaokangQian189ded22022-05-10 08:12:17 +00001761 else
Ronald Cron19385882022-06-15 16:26:13 +02001762 {
1763 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate" ) );
1764 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate verify" ) );
XiaokangQian189ded22022-05-10 08:12:17 +00001765 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Ronald Cron19385882022-06-15 16:26:13 +02001766 }
Ronald Cron63dc4632022-05-31 14:41:53 +02001767
Jerry Yu27bdc7c2022-04-16 13:33:27 +08001768 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08001769}
1770
1771/*
Jerry Yud6e253d2022-05-18 13:59:24 +08001772 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08001773 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001774MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08001775static int ssl_tls13_process_client_finished( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08001776{
Jerry Yud6e253d2022-05-18 13:59:24 +08001777 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1778
Jerry Yuff226982022-04-16 16:52:57 +08001779 ret = mbedtls_ssl_tls13_process_finished_message( ssl );
1780 if( ret != 0 )
1781 return( ret );
1782
Jerry Yue3d67cb2022-05-19 15:33:10 +08001783 ret = mbedtls_ssl_tls13_generate_resumption_master_secret( ssl );
1784 if( ret != 0 )
1785 {
1786 MBEDTLS_SSL_DEBUG_RET( 1,
1787 "mbedtls_ssl_tls13_generate_resumption_master_secret ", ret );
1788 }
1789
Jerry Yu03ed50b2022-04-16 17:13:30 +08001790 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP );
Jerry Yuff226982022-04-16 16:52:57 +08001791 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08001792}
1793
1794/*
Jerry Yud6e253d2022-05-18 13:59:24 +08001795 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
Jerry Yu69dd8d42022-04-16 12:51:26 +08001796 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001797MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08001798static int ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08001799{
Jerry Yu03ed50b2022-04-16 17:13:30 +08001800 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
1801
Jerry Yu03ed50b2022-04-16 17:13:30 +08001802 mbedtls_ssl_tls13_handshake_wrapup( ssl );
1803 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
1804 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08001805}
1806
1807/*
XiaokangQiane8ff3502022-04-22 02:34:40 +00001808 * TLS 1.3 State Machine -- server side
XiaokangQian7807f9f2022-02-15 10:04:37 +00001809 */
Jerry Yu27561932021-08-27 17:07:38 +08001810int mbedtls_ssl_tls13_handshake_server_step( mbedtls_ssl_context *ssl )
Jerry Yub9930e72021-08-06 17:11:51 +08001811{
XiaokangQian08037552022-04-20 07:16:41 +00001812 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001813
1814 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
1815 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1816
Jerry Yue3b34122021-09-28 17:53:35 +08001817 MBEDTLS_SSL_DEBUG_MSG( 2, ( "tls13 server state: %s(%d)",
1818 mbedtls_ssl_states_str( ssl->state ),
1819 ssl->state ) );
Jerry Yu6e81b272021-09-27 11:16:17 +08001820
XiaokangQian7807f9f2022-02-15 10:04:37 +00001821 switch( ssl->state )
1822 {
1823 /* start state */
1824 case MBEDTLS_SSL_HELLO_REQUEST:
XiaokangQian7807f9f2022-02-15 10:04:37 +00001825 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
XiaokangQian08037552022-04-20 07:16:41 +00001826 ret = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001827 break;
1828
XiaokangQian7807f9f2022-02-15 10:04:37 +00001829 case MBEDTLS_SSL_CLIENT_HELLO:
XiaokangQian4080a7f2022-04-11 09:55:18 +00001830 ret = ssl_tls13_process_client_hello( ssl );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001831 if( ret != 0 )
XiaokangQian4080a7f2022-04-11 09:55:18 +00001832 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_process_client_hello", ret );
Jerry Yuf41553b2022-05-09 22:20:30 +08001833 break;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001834
Jerry Yuf41553b2022-05-09 22:20:30 +08001835 case MBEDTLS_SSL_HELLO_RETRY_REQUEST:
1836 ret = ssl_tls13_write_hello_retry_request( ssl );
1837 if( ret != 0 )
1838 {
1839 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_hello_retry_request", ret );
1840 return( ret );
1841 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001842 break;
1843
Jerry Yu5b64ae92022-03-30 17:15:02 +08001844 case MBEDTLS_SSL_SERVER_HELLO:
1845 ret = ssl_tls13_write_server_hello( ssl );
1846 break;
1847
Xiaofei Baicba64af2022-02-15 10:00:56 +00001848 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Jerry Yu4d3841a2022-04-16 12:37:19 +08001849 ret = ssl_tls13_write_encrypted_extensions( ssl );
Xiaofei Baicba64af2022-02-15 10:00:56 +00001850 if( ret != 0 )
1851 {
Jerry Yu4d3841a2022-04-16 12:37:19 +08001852 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_encrypted_extensions", ret );
1853 return( ret );
Xiaofei Baicba64af2022-02-15 10:00:56 +00001854 }
Jerry Yu48330562022-05-06 21:35:44 +08001855 break;
Jerry Yu6a2cd9e2022-05-05 11:14:19 +08001856
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00001857#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1858 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Xiaofei Bai5ee73d82022-03-14 02:48:30 +00001859 ret = ssl_tls13_write_certificate_request( ssl );
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00001860 break;
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00001861
Jerry Yu83da34e2022-04-16 13:59:52 +08001862 case MBEDTLS_SSL_SERVER_CERTIFICATE:
1863 ret = ssl_tls13_write_server_certificate( ssl );
1864 break;
1865
1866 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
1867 ret = ssl_tls13_write_certificate_verify( ssl );
1868 break;
Jerry Yu5a26f302022-05-10 20:46:40 +08001869#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08001870
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001871 /*
1872 * Injection of dummy-CCS's for middlebox compatibility
1873 */
1874#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Gabor Mezeif7044ea2022-06-28 16:01:49 +02001875 case MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST:
Gabor Mezei7b39bf12022-05-24 16:04:14 +02001876 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
1877 if( ret == 0 )
1878 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
1879 break;
1880
1881 case MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO:
1882 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
1883 if( ret == 0 )
1884 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
1885 break;
1886#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1887
Jerry Yu69dd8d42022-04-16 12:51:26 +08001888 case MBEDTLS_SSL_SERVER_FINISHED:
1889 ret = ssl_tls13_write_server_finished( ssl );
1890 break;
1891
1892 case MBEDTLS_SSL_CLIENT_FINISHED:
1893 ret = ssl_tls13_process_client_finished( ssl );
1894 break;
1895
Jerry Yu69dd8d42022-04-16 12:51:26 +08001896 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
1897 ret = ssl_tls13_handshake_wrapup( ssl );
1898 break;
1899
XiaokangQian6b916b12022-04-25 07:29:34 +00001900 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
1901 ret = mbedtls_ssl_tls13_process_certificate( ssl );
Ronald Cron209cae92022-06-07 10:30:19 +02001902 if( ret == 0 )
XiaokangQian6b916b12022-04-25 07:29:34 +00001903 {
Ronald Cron209cae92022-06-07 10:30:19 +02001904 if( ssl->session_negotiate->peer_cert != NULL )
1905 {
1906 mbedtls_ssl_handshake_set_state(
1907 ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY );
1908 }
1909 else
Ronald Cron19385882022-06-15 16:26:13 +02001910 {
1911 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate verify" ) );
Ronald Cron209cae92022-06-07 10:30:19 +02001912 mbedtls_ssl_handshake_set_state(
1913 ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Ronald Cron19385882022-06-15 16:26:13 +02001914 }
XiaokangQian6b916b12022-04-25 07:29:34 +00001915 }
1916 break;
1917
1918 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
1919 ret = mbedtls_ssl_tls13_process_certificate_verify( ssl );
1920 if( ret == 0 )
1921 {
1922 mbedtls_ssl_handshake_set_state(
1923 ssl, MBEDTLS_SSL_CLIENT_FINISHED );
1924 }
1925 break;
1926
XiaokangQian7807f9f2022-02-15 10:04:37 +00001927 default:
1928 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
XiaokangQian060d8672022-04-21 09:24:56 +00001929 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001930 }
1931
1932 return( ret );
Jerry Yub9930e72021-08-06 17:11:51 +08001933}
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08001934
Jerry Yufb4b6472022-01-27 15:03:26 +08001935#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_3 */