blob: 08f48b87350fa5573fc7db21ed5918e9414612e8 [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 Yu1c105562022-07-10 06:32:38 +000027#include "mbedtls/constant_time.h"
Jerry Yu3bf2c642022-03-30 22:02:12 +080028
Xiaofei Bai9ca09d42022-02-14 12:57:18 +000029#include "ssl_misc.h"
30#include "ssl_tls13_keys.h"
31#include "ssl_debug_helpers.h"
32
XiaokangQian7807f9f2022-02-15 10:04:37 +000033#if defined(MBEDTLS_ECP_C)
34#include "mbedtls/ecp.h"
XiaokangQian7807f9f2022-02-15 10:04:37 +000035#endif /* MBEDTLS_ECP_C */
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080036
XiaokangQiana9c58412022-02-17 09:41:26 +000037#if defined(MBEDTLS_PLATFORM_C)
38#include "mbedtls/platform.h"
39#else
40#include <stdlib.h>
41#define mbedtls_calloc calloc
42#define mbedtls_free free
43#endif /* MBEDTLS_PLATFORM_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +000044
Jerry Yu4d3841a2022-04-16 12:37:19 +080045#include "ssl_misc.h"
46#include "ssl_tls13_keys.h"
47#include "ssl_debug_helpers.h"
48
Jerry Yuf35ba382022-08-23 17:58:26 +080049
Jerry Yuc5a23a02022-08-25 10:51:44 +080050static const mbedtls_ssl_ciphersuite_t *ssl_tls13_validate_peer_ciphersuite(
Jerry Yuf35ba382022-08-23 17:58:26 +080051 mbedtls_ssl_context *ssl,
Jerry Yuc5a23a02022-08-25 10:51:44 +080052 unsigned int cipher_suite )
Jerry Yuf35ba382022-08-23 17:58:26 +080053{
54 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
55 if( ! mbedtls_ssl_tls13_cipher_suite_is_offered( ssl, cipher_suite ) )
56 return( NULL );
57
58 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
59 if( ( mbedtls_ssl_validate_ciphersuite( ssl, ciphersuite_info,
60 ssl->tls_version,
61 ssl->tls_version ) != 0 ) )
62 {
63 return( NULL );
64 }
65 return( ciphersuite_info );
66}
67
Jerry Yue19e3b92022-07-08 12:04:51 +000068#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
69/* From RFC 8446:
70 *
71 * enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;
72 * struct {
73 * PskKeyExchangeMode ke_modes<1..255>;
74 * } PskKeyExchangeModes;
75 */
Jerry Yu6e74a7e2022-07-20 20:49:32 +080076MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue19e3b92022-07-08 12:04:51 +000077static int ssl_tls13_parse_key_exchange_modes_ext( mbedtls_ssl_context *ssl,
78 const unsigned char *buf,
Jerry Yu299e31f2022-07-13 23:06:36 +080079 const unsigned char *end )
Jerry Yue19e3b92022-07-08 12:04:51 +000080{
Jerry Yu299e31f2022-07-13 23:06:36 +080081 const unsigned char *p = buf;
Jerry Yue19e3b92022-07-08 12:04:51 +000082 size_t ke_modes_len;
83 int ke_modes = 0;
84
Jerry Yu854dd9e2022-07-15 14:28:27 +080085 /* Read ke_modes length (1 Byte) */
Jerry Yu299e31f2022-07-13 23:06:36 +080086 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
87 ke_modes_len = *p++;
Jerry Yue19e3b92022-07-08 12:04:51 +000088 /* Currently, there are only two PSK modes, so even without looking
89 * at the content, something's wrong if the list has more than 2 items. */
90 if( ke_modes_len > 2 )
Jerry Yu299e31f2022-07-13 23:06:36 +080091 {
92 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
93 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Jerry Yue19e3b92022-07-08 12:04:51 +000094 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu299e31f2022-07-13 23:06:36 +080095 }
Jerry Yue19e3b92022-07-08 12:04:51 +000096
Jerry Yu299e31f2022-07-13 23:06:36 +080097 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, ke_modes_len );
Jerry Yue19e3b92022-07-08 12:04:51 +000098
99 while( ke_modes_len-- != 0 )
100 {
Jerry Yu299e31f2022-07-13 23:06:36 +0800101 switch( *p++ )
Jerry Yue19e3b92022-07-08 12:04:51 +0000102 {
103 case MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE:
104 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
105 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Found PSK KEX MODE" ) );
106 break;
107 case MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE:
108 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
109 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Found PSK_EPHEMERAL KEX MODE" ) );
110 break;
111 default:
Jerry Yu299e31f2022-07-13 23:06:36 +0800112 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
113 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Jerry Yue19e3b92022-07-08 12:04:51 +0000114 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
115 }
116 }
117
118 ssl->handshake->tls13_kex_modes = ke_modes;
119 return( 0 );
120}
Jerry Yu1c105562022-07-10 06:32:38 +0000121
Jerry Yue9d4fc02022-08-20 19:21:15 +0800122#define SSL_TLS1_3_OFFERED_PSK_NOT_MATCH 1
123#define SSL_TLS1_3_OFFERED_PSK_MATCH 0
Jerry Yu95699e72022-08-21 19:22:23 +0800124
125#if defined(MBEDTLS_SSL_SESSION_TICKETS)
126
127MBEDTLS_CHECK_RETURN_CRITICAL
128static int ssl_tls13_offered_psks_check_identity_match_ticket(
129 mbedtls_ssl_context *ssl,
Jerry Yu95699e72022-08-21 19:22:23 +0800130 const unsigned char *identity,
131 size_t identity_len,
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800132 uint32_t obfuscated_ticket_age,
133 mbedtls_ssl_session *session )
Jerry Yu95699e72022-08-21 19:22:23 +0800134{
Jerry Yufd310eb2022-09-06 09:16:35 +0800135 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu95699e72022-08-21 19:22:23 +0800136 unsigned char *ticket_buffer;
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800137#if defined(MBEDTLS_HAVE_TIME)
138 mbedtls_time_t now;
Jerry Yuacff8232022-09-14 14:35:11 +0800139 uint64_t age_in_s;
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800140 int64_t age_diff_in_ms;
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800141#endif
Jerry Yu95699e72022-08-21 19:22:23 +0800142
143 ((void) obfuscated_ticket_age);
144
145 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> check_identity_match_ticket" ) );
146
Jerry Yufd310eb2022-09-06 09:16:35 +0800147 /* Ticket parser is not configured, Skip */
148 if( ssl->conf->f_ticket_parse == NULL || identity_len == 0 )
Jerry Yu95699e72022-08-21 19:22:23 +0800149 return( 0 );
Jerry Yu95699e72022-08-21 19:22:23 +0800150
Jerry Yu4746b102022-09-13 11:11:48 +0800151 /* We create a copy of the encrypted ticket since the ticket parsing
152 * function is allowed to use its input buffer as an output buffer
153 * (in-place decryption). We do, however, need the original buffer for
154 * computing the PSK binder value.
Jerry Yu95699e72022-08-21 19:22:23 +0800155 */
156 ticket_buffer = mbedtls_calloc( 1, identity_len );
157 if( ticket_buffer == NULL )
158 {
159 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
160 return ( MBEDTLS_ERR_SSL_ALLOC_FAILED );
161 }
162 memcpy( ticket_buffer, identity, identity_len );
163
164 if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket,
165 session,
166 ticket_buffer, identity_len ) ) != 0 )
167 {
168 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
169 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) );
170 else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED )
171 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) );
172 else
173 MBEDTLS_SSL_DEBUG_RET( 1, "ticket_parse", ret );
174 }
175
176 /* We delete the temporary buffer */
177 mbedtls_free( ticket_buffer );
178
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800179 if( ret != 0 )
180 goto exit;
181
182 ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;
183#if defined(MBEDTLS_HAVE_TIME)
184 now = mbedtls_time( NULL );
185
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800186 if( now < session->start )
Jerry Yu95699e72022-08-21 19:22:23 +0800187 {
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800188 MBEDTLS_SSL_DEBUG_MSG(
Jerry Yua99cbfa2022-10-08 11:17:14 +0800189 3, ( "Ticket expired: Invalid ticket start time "
190 "( now=%" MBEDTLS_PRINTF_LONGLONG
191 ", start=%" MBEDTLS_PRINTF_LONGLONG " )",
192 (long long)now, (long long)session->start ) );
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800193 goto exit;
194 }
Jerry Yu95699e72022-08-21 19:22:23 +0800195
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800196 age_in_s = (uint64_t)( now - session->start );
Jerry Yu95699e72022-08-21 19:22:23 +0800197
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800198 /* RFC 8446 section 4.6.1
199 *
200 * Servers MUST NOT use any value greater than 604800 seconds (7 days).
201 *
202 * RFC 8446 section 4.2.11.1
203 *
204 * Clients MUST NOT attempt to use tickets which have ages greater than
205 * the "ticket_lifetime" value which was provided with the ticket.
206 *
207 * For time being, the age MUST be less than 604800 seconds (7 days).
208 */
209 if( age_in_s > 604800 )
210 {
211 MBEDTLS_SSL_DEBUG_MSG(
212 3, ( "Ticket expired: Ticket age exceed limitation ticket_age=%lu",
213 (long unsigned int)age_in_s ) );
214 goto exit;
215 }
Jerry Yu95699e72022-08-21 19:22:23 +0800216
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800217 /* RFC 8446 section 4.2.10
218 *
219 * For PSKs provisioned via NewSessionTicket, a server MUST validate that
220 * the ticket age for the selected PSK identity (computed by subtracting
221 * ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2^32) is
222 * within a small tolerance of the time since the ticket was issued.
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800223 *
Jerry Yu0a55cc62022-09-15 16:15:06 +0800224 * NOTE: When `now == session->start`, `age_diff_in_ms` may be negative
225 * as the age units are different on the server (s) and in the
226 * client (ms) side. Add a -1000 ms tolerance window to take this
227 * into account.
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800228 */
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800229 age_diff_in_ms = age_in_s * 1000;
230 age_diff_in_ms -= ( obfuscated_ticket_age - session->ticket_age_add );
231 if( age_diff_in_ms <= -1000 ||
232 age_diff_in_ms > MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE )
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800233 {
234 MBEDTLS_SSL_DEBUG_MSG(
235 3, ( "Ticket expired: Ticket age outside tolerance window "
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800236 "( diff=%d )", (int)age_diff_in_ms ) );
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800237 goto exit;
238 }
239
240 ret = 0;
Jerry Yu95699e72022-08-21 19:22:23 +0800241
242#endif /* MBEDTLS_HAVE_TIME */
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800243
244exit:
245 if( ret != 0 )
246 mbedtls_ssl_session_free( session );
Jerry Yu95699e72022-08-21 19:22:23 +0800247
248 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= check_identity_match_ticket" ) );
249 return( ret );
250}
251#endif /* MBEDTLS_SSL_SESSION_TICKETS */
252
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800253MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu1c105562022-07-10 06:32:38 +0000254static int ssl_tls13_offered_psks_check_identity_match(
255 mbedtls_ssl_context *ssl,
256 const unsigned char *identity,
Jerry Yu5725f1c2022-08-21 17:27:16 +0800257 size_t identity_len,
Jerry Yu95699e72022-08-21 19:22:23 +0800258 uint32_t obfuscated_ticket_age,
Jerry Yu4746b102022-09-13 11:11:48 +0800259 int *psk_type,
260 mbedtls_ssl_session *session )
Jerry Yu1c105562022-07-10 06:32:38 +0000261{
Jerry Yu95699e72022-08-21 19:22:23 +0800262 ((void) session);
263 ((void) obfuscated_ticket_age);
Jerry Yu5725f1c2022-08-21 17:27:16 +0800264 *psk_type = MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL;
Jerry Yu95699e72022-08-21 19:22:23 +0800265
266 MBEDTLS_SSL_DEBUG_BUF( 4, "identity", identity, identity_len );
267 ssl->handshake->resume = 0;
268
Jerry Yu95699e72022-08-21 19:22:23 +0800269#if defined(MBEDTLS_SSL_SESSION_TICKETS)
270 if( ssl_tls13_offered_psks_check_identity_match_ticket(
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800271 ssl, identity, identity_len, obfuscated_ticket_age,
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800272 session ) == SSL_TLS1_3_OFFERED_PSK_MATCH )
Jerry Yu95699e72022-08-21 19:22:23 +0800273 {
Jerry Yu95699e72022-08-21 19:22:23 +0800274 ssl->handshake->resume = 1;
275 *psk_type = MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION;
276 mbedtls_ssl_set_hs_psk( ssl,
Jerry Yu0a55cc62022-09-15 16:15:06 +0800277 session->resumption_key,
278 session->resumption_key_len );
Jerry Yu95699e72022-08-21 19:22:23 +0800279
280 MBEDTLS_SSL_DEBUG_BUF( 4, "Ticket-resumed PSK:",
Jerry Yu0a55cc62022-09-15 16:15:06 +0800281 session->resumption_key,
282 session->resumption_key_len );
Jerry Yu95699e72022-08-21 19:22:23 +0800283 MBEDTLS_SSL_DEBUG_MSG( 4, ( "ticket: obfuscated_ticket_age: %u",
284 (unsigned)obfuscated_ticket_age ) );
285 return( SSL_TLS1_3_OFFERED_PSK_MATCH );
286 }
287#endif /* MBEDTLS_SSL_SESSION_TICKETS */
288
Jerry Yu1c105562022-07-10 06:32:38 +0000289 /* Check identity with external configured function */
290 if( ssl->conf->f_psk != NULL )
291 {
292 if( ssl->conf->f_psk(
293 ssl->conf->p_psk, ssl, identity, identity_len ) == 0 )
294 {
295 return( SSL_TLS1_3_OFFERED_PSK_MATCH );
296 }
297 return( SSL_TLS1_3_OFFERED_PSK_NOT_MATCH );
298 }
299
Jerry Yu96a2e362022-07-21 15:11:34 +0800300 MBEDTLS_SSL_DEBUG_BUF( 5, "identity", identity, identity_len );
Jerry Yu1c105562022-07-10 06:32:38 +0000301 /* Check identity with pre-configured psk */
Jerry Yu2f0abc92022-07-22 19:34:48 +0800302 if( ssl->conf->psk_identity != NULL &&
303 identity_len == ssl->conf->psk_identity_len &&
Jerry Yu1c105562022-07-10 06:32:38 +0000304 mbedtls_ct_memcmp( ssl->conf->psk_identity,
305 identity, identity_len ) == 0 )
306 {
307 mbedtls_ssl_set_hs_psk( ssl, ssl->conf->psk, ssl->conf->psk_len );
308 return( SSL_TLS1_3_OFFERED_PSK_MATCH );
309 }
310
Jerry Yu1c105562022-07-10 06:32:38 +0000311 return( SSL_TLS1_3_OFFERED_PSK_NOT_MATCH );
312}
313
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800314MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu96a2e362022-07-21 15:11:34 +0800315static int ssl_tls13_offered_psks_check_binder_match( mbedtls_ssl_context *ssl,
316 const unsigned char *binder,
Jerry Yue95c8af2022-07-26 15:48:20 +0800317 size_t binder_len,
Jerry Yu5725f1c2022-08-21 17:27:16 +0800318 int psk_type,
Jerry Yu29d9faa2022-08-23 17:52:45 +0800319 psa_algorithm_t psk_hash_alg )
Jerry Yu1c105562022-07-10 06:32:38 +0000320{
321 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu96a2e362022-07-21 15:11:34 +0800322
Jerry Yudaf375a2022-07-20 21:31:43 +0800323 unsigned char transcript[PSA_HASH_MAX_SIZE];
Jerry Yu1c105562022-07-10 06:32:38 +0000324 size_t transcript_len;
Jerry Yu2f0abc92022-07-22 19:34:48 +0800325 unsigned char *psk;
Jerry Yu96a2e362022-07-21 15:11:34 +0800326 size_t psk_len;
Jerry Yudaf375a2022-07-20 21:31:43 +0800327 unsigned char server_computed_binder[PSA_HASH_MAX_SIZE];
Jerry Yu1c105562022-07-10 06:32:38 +0000328
Jerry Yu1c105562022-07-10 06:32:38 +0000329 /* Get current state of handshake transcript. */
Jerry Yu29d9faa2022-08-23 17:52:45 +0800330 ret = mbedtls_ssl_get_handshake_transcript(
331 ssl, mbedtls_hash_info_md_from_psa( psk_hash_alg ),
332 transcript, sizeof( transcript ), &transcript_len );
Jerry Yu1c105562022-07-10 06:32:38 +0000333 if( ret != 0 )
334 return( ret );
335
Jerry Yu40f37712022-07-26 16:58:57 +0800336 ret = mbedtls_ssl_tls13_export_handshake_psk( ssl, &psk, &psk_len );
Jerry Yu96a2e362022-07-21 15:11:34 +0800337 if( ret != 0 )
338 return( ret );
339
Jerry Yu29d9faa2022-08-23 17:52:45 +0800340 ret = mbedtls_ssl_tls13_create_psk_binder( ssl, psk_hash_alg,
Jerry Yu1c105562022-07-10 06:32:38 +0000341 psk, psk_len, psk_type,
342 transcript,
343 server_computed_binder );
Jerry Yu96a2e362022-07-21 15:11:34 +0800344#if defined(MBEDTLS_USE_PSA_CRYPTO)
345 mbedtls_free( (void*)psk );
346#endif
Jerry Yu1c105562022-07-10 06:32:38 +0000347 if( ret != 0 )
348 {
349 MBEDTLS_SSL_DEBUG_MSG( 1, ( "PSK binder calculation failed." ) );
350 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
351 }
352
353 MBEDTLS_SSL_DEBUG_BUF( 3, "psk binder ( computed ): ",
Jerry Yu2f0abc92022-07-22 19:34:48 +0800354 server_computed_binder, transcript_len );
Jerry Yu1c105562022-07-10 06:32:38 +0000355 MBEDTLS_SSL_DEBUG_BUF( 3, "psk binder ( received ): ", binder, binder_len );
356
357 if( mbedtls_ct_memcmp( server_computed_binder, binder, binder_len ) == 0 )
358 {
359 return( SSL_TLS1_3_OFFERED_PSK_MATCH );
360 }
361
Jerry Yudaf375a2022-07-20 21:31:43 +0800362 mbedtls_platform_zeroize( server_computed_binder,
363 sizeof( server_computed_binder ) );
Jerry Yu1c105562022-07-10 06:32:38 +0000364 return( SSL_TLS1_3_OFFERED_PSK_NOT_MATCH );
365}
Jerry Yu96a2e362022-07-21 15:11:34 +0800366
Jerry Yu5725f1c2022-08-21 17:27:16 +0800367MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf35ba382022-08-23 17:58:26 +0800368static int ssl_tls13_select_ciphersuite_for_psk(
369 mbedtls_ssl_context *ssl,
370 const unsigned char *cipher_suites,
371 const unsigned char *cipher_suites_end,
372 uint16_t *selected_ciphersuite,
373 const mbedtls_ssl_ciphersuite_t **selected_ciphersuite_info )
Jerry Yu5725f1c2022-08-21 17:27:16 +0800374{
Jerry Yuf35ba382022-08-23 17:58:26 +0800375 psa_algorithm_t psk_hash_alg = PSA_ALG_SHA_256;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800376
Jerry Yu0baf9072022-08-25 11:21:04 +0800377 *selected_ciphersuite = 0;
378 *selected_ciphersuite_info = NULL;
379
Jerry Yuf35ba382022-08-23 17:58:26 +0800380 /* RFC 8446, page 55.
381 *
382 * For externally established PSKs, the Hash algorithm MUST be set when the
383 * PSK is established or default to SHA-256 if no such algorithm is defined.
384 *
385 */
Jerry Yu5725f1c2022-08-21 17:27:16 +0800386
Jerry Yu5725f1c2022-08-21 17:27:16 +0800387 /*
388 * Search for a matching ciphersuite
389 */
Jerry Yu1e05b6d2022-08-31 10:35:52 +0800390 for ( const unsigned char *p = cipher_suites;
391 p < cipher_suites_end; p += 2 )
Jerry Yu5725f1c2022-08-21 17:27:16 +0800392 {
393 uint16_t cipher_suite;
Jerry Yuf35ba382022-08-23 17:58:26 +0800394 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800395
396 cipher_suite = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yuc5a23a02022-08-25 10:51:44 +0800397 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite( ssl,
398 cipher_suite );
Jerry Yuf35ba382022-08-23 17:58:26 +0800399 if( ciphersuite_info == NULL )
Jerry Yu5725f1c2022-08-21 17:27:16 +0800400 continue;
401
Jerry Yu5725f1c2022-08-21 17:27:16 +0800402 /* MAC of selected ciphersuite MUST be same with PSK binder if exist.
403 * Otherwise, client should reject.
404 */
Jerry Yuf35ba382022-08-23 17:58:26 +0800405 if( psk_hash_alg == mbedtls_psa_translate_md( ciphersuite_info->mac ) )
406 {
407 *selected_ciphersuite = cipher_suite;
408 *selected_ciphersuite_info = ciphersuite_info;
409 return( 0 );
410 }
411 }
412 MBEDTLS_SSL_DEBUG_MSG( 2, ( "No matched ciphersuite" ) );
413 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
414}
Jerry Yu5725f1c2022-08-21 17:27:16 +0800415
Jerry Yu82534862022-08-30 10:42:33 +0800416#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yuf35ba382022-08-23 17:58:26 +0800417MBEDTLS_CHECK_RETURN_CRITICAL
418static int ssl_tls13_select_ciphersuite_for_resumption(
419 mbedtls_ssl_context *ssl,
420 const unsigned char *cipher_suites,
421 const unsigned char *cipher_suites_end,
422 mbedtls_ssl_session *session,
423 uint16_t *selected_ciphersuite,
424 const mbedtls_ssl_ciphersuite_t **selected_ciphersuite_info )
425{
Jerry Yu82534862022-08-30 10:42:33 +0800426
Jerry Yuf35ba382022-08-23 17:58:26 +0800427 *selected_ciphersuite = 0;
428 *selected_ciphersuite_info = NULL;
Jerry Yu82534862022-08-30 10:42:33 +0800429 for( const unsigned char *p = cipher_suites; p < cipher_suites_end; p += 2 )
430 {
431 uint16_t cipher_suite = MBEDTLS_GET_UINT16_BE( p, 0 );
432 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
433
434 if( cipher_suite != session->ciphersuite )
435 continue;
436
437 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite( ssl,
438 cipher_suite );
439 if( ciphersuite_info == NULL )
440 continue;
441
Jerry Yu4746b102022-09-13 11:11:48 +0800442 *selected_ciphersuite = cipher_suite;
Jerry Yu82534862022-08-30 10:42:33 +0800443 *selected_ciphersuite_info = ciphersuite_info;
444
445 return( 0 );
Jerry Yu82534862022-08-30 10:42:33 +0800446 }
447
448 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu5725f1c2022-08-21 17:27:16 +0800449}
Jerry Yuf35ba382022-08-23 17:58:26 +0800450
Jerry Yu82534862022-08-30 10:42:33 +0800451MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4746b102022-09-13 11:11:48 +0800452static int ssl_tls13_session_copy_ticket( mbedtls_ssl_session *dst,
453 const mbedtls_ssl_session *src )
Jerry Yu82534862022-08-30 10:42:33 +0800454{
Jerry Yu82534862022-08-30 10:42:33 +0800455 dst->ticket_age_add = src->ticket_age_add;
456 dst->ticket_flags = src->ticket_flags;
457 dst->resumption_key_len = src->resumption_key_len;
458 if( src->resumption_key_len == 0 )
459 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
460 memcpy( dst->resumption_key, src->resumption_key, src->resumption_key_len );
Jerry Yu4746b102022-09-13 11:11:48 +0800461
Jerry Yu82534862022-08-30 10:42:33 +0800462 return( 0 );
463}
464#endif /* MBEDTLS_SSL_SESSION_TICKETS */
465
Jerry Yu1c105562022-07-10 06:32:38 +0000466/* Parser for pre_shared_key extension in client hello
467 * struct {
468 * opaque identity<1..2^16-1>;
469 * uint32 obfuscated_ticket_age;
470 * } PskIdentity;
471 *
472 * opaque PskBinderEntry<32..255>;
473 *
474 * struct {
475 * PskIdentity identities<7..2^16-1>;
476 * PskBinderEntry binders<33..2^16-1>;
477 * } OfferedPsks;
478 *
479 * struct {
480 * select (Handshake.msg_type) {
481 * case client_hello: OfferedPsks;
482 * ....
483 * };
484 * } PreSharedKeyExtension;
485 */
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800486MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yubb852022022-07-20 21:10:44 +0800487static int ssl_tls13_parse_pre_shared_key_ext( mbedtls_ssl_context *ssl,
Jerry Yu29d9faa2022-08-23 17:52:45 +0800488 const unsigned char *pre_shared_key_ext,
489 const unsigned char *pre_shared_key_ext_end,
Jerry Yu5725f1c2022-08-21 17:27:16 +0800490 const unsigned char *ciphersuites,
491 const unsigned char *ciphersuites_end )
Jerry Yu1c105562022-07-10 06:32:38 +0000492{
Jerry Yu29d9faa2022-08-23 17:52:45 +0800493 const unsigned char *identities = pre_shared_key_ext;
Jerry Yu568ec252022-07-22 21:27:34 +0800494 const unsigned char *p_identity_len;
495 size_t identities_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000496 const unsigned char *identities_end;
Jerry Yu568ec252022-07-22 21:27:34 +0800497 const unsigned char *binders;
498 const unsigned char *p_binder_len;
499 size_t binders_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000500 const unsigned char *binders_end;
Jerry Yu96a2e362022-07-21 15:11:34 +0800501 int matched_identity = -1;
502 int identity_id = -1;
Jerry Yu1c105562022-07-10 06:32:38 +0000503
Jerry Yu29d9faa2022-08-23 17:52:45 +0800504 MBEDTLS_SSL_DEBUG_BUF( 3, "pre_shared_key extension",
505 pre_shared_key_ext,
506 pre_shared_key_ext_end - pre_shared_key_ext );
Jerry Yu1c105562022-07-10 06:32:38 +0000507
Jerry Yu96a2e362022-07-21 15:11:34 +0800508 /* identities_len 2 bytes
509 * identities_data >= 7 bytes
510 */
Jerry Yu29d9faa2022-08-23 17:52:45 +0800511 MBEDTLS_SSL_CHK_BUF_READ_PTR( identities, pre_shared_key_ext_end, 7 + 2 );
Jerry Yu568ec252022-07-22 21:27:34 +0800512 identities_len = MBEDTLS_GET_UINT16_BE( identities, 0 );
513 p_identity_len = identities + 2;
Jerry Yu29d9faa2022-08-23 17:52:45 +0800514 MBEDTLS_SSL_CHK_BUF_READ_PTR( p_identity_len, pre_shared_key_ext_end,
515 identities_len );
Jerry Yu568ec252022-07-22 21:27:34 +0800516 identities_end = p_identity_len + identities_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000517
Jerry Yu96a2e362022-07-21 15:11:34 +0800518 /* binders_len 2 bytes
519 * binders >= 33 bytes
520 */
Jerry Yu568ec252022-07-22 21:27:34 +0800521 binders = identities_end;
Jerry Yu29d9faa2022-08-23 17:52:45 +0800522 MBEDTLS_SSL_CHK_BUF_READ_PTR( binders, pre_shared_key_ext_end, 33 + 2 );
Jerry Yu568ec252022-07-22 21:27:34 +0800523 binders_len = MBEDTLS_GET_UINT16_BE( binders, 0 );
524 p_binder_len = binders + 2;
Jerry Yu29d9faa2022-08-23 17:52:45 +0800525 MBEDTLS_SSL_CHK_BUF_READ_PTR( p_binder_len, pre_shared_key_ext_end, binders_len );
Jerry Yu568ec252022-07-22 21:27:34 +0800526 binders_end = p_binder_len + binders_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000527
Jerry Yu29d9faa2022-08-23 17:52:45 +0800528 ssl->handshake->update_checksum( ssl, pre_shared_key_ext,
529 identities_end - pre_shared_key_ext );
Jerry Yu96a2e362022-07-21 15:11:34 +0800530
Jerry Yu568ec252022-07-22 21:27:34 +0800531 while( p_identity_len < identities_end && p_binder_len < binders_end )
Jerry Yu1c105562022-07-10 06:32:38 +0000532 {
Jerry Yu1c105562022-07-10 06:32:38 +0000533 const unsigned char *identity;
Jerry Yu568ec252022-07-22 21:27:34 +0800534 size_t identity_len;
Jerry Yu82534862022-08-30 10:42:33 +0800535 uint32_t obfuscated_ticket_age;
Jerry Yu96a2e362022-07-21 15:11:34 +0800536 const unsigned char *binder;
Jerry Yu568ec252022-07-22 21:27:34 +0800537 size_t binder_len;
Jerry Yu96a2e362022-07-21 15:11:34 +0800538 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800539 int psk_type;
540 uint16_t cipher_suite;
Jerry Yu29d9faa2022-08-23 17:52:45 +0800541 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu82534862022-08-30 10:42:33 +0800542#if defined(MBEDTLS_SSL_SESSION_TICKETS)
543 mbedtls_ssl_session session;
Jerry Yu4746b102022-09-13 11:11:48 +0800544 mbedtls_ssl_session_init( &session );
Jerry Yu82534862022-08-30 10:42:33 +0800545#endif
Jerry Yubb852022022-07-20 21:10:44 +0800546
Jerry Yu568ec252022-07-22 21:27:34 +0800547 MBEDTLS_SSL_CHK_BUF_READ_PTR( p_identity_len, identities_end, 2 + 1 + 4 );
548 identity_len = MBEDTLS_GET_UINT16_BE( p_identity_len, 0 );
549 identity = p_identity_len + 2;
550 MBEDTLS_SSL_CHK_BUF_READ_PTR( identity, identities_end, identity_len + 4 );
Jerry Yu82534862022-08-30 10:42:33 +0800551 obfuscated_ticket_age = MBEDTLS_GET_UINT32_BE( identity , identity_len );
Jerry Yu568ec252022-07-22 21:27:34 +0800552 p_identity_len += identity_len + 6;
Jerry Yu1c105562022-07-10 06:32:38 +0000553
Jerry Yu568ec252022-07-22 21:27:34 +0800554 MBEDTLS_SSL_CHK_BUF_READ_PTR( p_binder_len, binders_end, 1 + 32 );
555 binder_len = *p_binder_len;
556 binder = p_binder_len + 1;
557 MBEDTLS_SSL_CHK_BUF_READ_PTR( binder, binders_end, binder_len );
558 p_binder_len += binder_len + 1;
Jerry Yu96a2e362022-07-21 15:11:34 +0800559
Jerry Yu96a2e362022-07-21 15:11:34 +0800560 identity_id++;
561 if( matched_identity != -1 )
Jerry Yu1c105562022-07-10 06:32:38 +0000562 continue;
563
Jerry Yu96a2e362022-07-21 15:11:34 +0800564 ret = ssl_tls13_offered_psks_check_identity_match(
Jerry Yu82534862022-08-30 10:42:33 +0800565 ssl, identity, identity_len, obfuscated_ticket_age,
Jerry Yu4746b102022-09-13 11:11:48 +0800566 &psk_type, &session );
Jerry Yue95c8af2022-07-26 15:48:20 +0800567 if( ret != SSL_TLS1_3_OFFERED_PSK_MATCH )
Jerry Yu96a2e362022-07-21 15:11:34 +0800568 continue;
569
Jerry Yuf35ba382022-08-23 17:58:26 +0800570 MBEDTLS_SSL_DEBUG_MSG( 4, ( "found matched identity" ) );
Jerry Yu0baf9072022-08-25 11:21:04 +0800571 switch( psk_type )
572 {
573 case MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL:
574 ret = ssl_tls13_select_ciphersuite_for_psk(
575 ssl, ciphersuites, ciphersuites_end,
576 &cipher_suite, &ciphersuite_info );
577 break;
578 case MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION:
Jerry Yu82534862022-08-30 10:42:33 +0800579#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yu0baf9072022-08-25 11:21:04 +0800580 ret = ssl_tls13_select_ciphersuite_for_resumption(
Jerry Yu82534862022-08-30 10:42:33 +0800581 ssl, ciphersuites, ciphersuites_end, &session,
Jerry Yu0baf9072022-08-25 11:21:04 +0800582 &cipher_suite, &ciphersuite_info );
Jerry Yu4746b102022-09-13 11:11:48 +0800583 if( ret != 0 )
584 mbedtls_ssl_session_free( &session );
Jerry Yu82534862022-08-30 10:42:33 +0800585#else
586 ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
587#endif
Jerry Yu0baf9072022-08-25 11:21:04 +0800588 break;
589 default:
590 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
591 }
Jerry Yuf35ba382022-08-23 17:58:26 +0800592 if( ret != 0 )
Jerry Yu5725f1c2022-08-21 17:27:16 +0800593 {
Jerry Yuf35ba382022-08-23 17:58:26 +0800594 /* See below, no cipher_suite available, abort handshake */
595 MBEDTLS_SSL_PEND_FATAL_ALERT(
596 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
597 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
598 MBEDTLS_SSL_DEBUG_RET(
Jerry Yu0baf9072022-08-25 11:21:04 +0800599 2, "ssl_tls13_select_ciphersuite", ret );
Jerry Yuf35ba382022-08-23 17:58:26 +0800600 return( ret );
Jerry Yu5725f1c2022-08-21 17:27:16 +0800601 }
602
Jerry Yu96a2e362022-07-21 15:11:34 +0800603 ret = ssl_tls13_offered_psks_check_binder_match(
Jerry Yu29d9faa2022-08-23 17:52:45 +0800604 ssl, binder, binder_len, psk_type,
605 mbedtls_psa_translate_md( ciphersuite_info->mac ) );
Jerry Yue9d4fc02022-08-20 19:21:15 +0800606 if( ret != SSL_TLS1_3_OFFERED_PSK_MATCH )
Jerry Yu96a2e362022-07-21 15:11:34 +0800607 {
Jerry Yuc5a23a02022-08-25 10:51:44 +0800608 /* For security reasons, the handshake should be aborted when we
609 * fail to validate a binder value. See RFC 8446 section 4.2.11.2
610 * and appendix E.6. */
Jerry Yu82534862022-08-30 10:42:33 +0800611#if defined(MBEDTLS_SSL_SESSION_TICKETS)
612 mbedtls_ssl_session_free( &session );
613#endif
Jerry Yuc5a23a02022-08-25 10:51:44 +0800614 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Invalid binder." ) );
Jerry Yu96a2e362022-07-21 15:11:34 +0800615 MBEDTLS_SSL_DEBUG_RET( 1,
616 "ssl_tls13_offered_psks_check_binder_match" , ret );
617 MBEDTLS_SSL_PEND_FATAL_ALERT(
618 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
619 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
620 return( ret );
621 }
Jerry Yu96a2e362022-07-21 15:11:34 +0800622
623 matched_identity = identity_id;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800624
625 /* Update handshake parameters */
Jerry Yue5834fd2022-08-29 20:16:09 +0800626 ssl->handshake->ciphersuite_info = ciphersuite_info;
Jerry Yu4746b102022-09-13 11:11:48 +0800627 ssl->session_negotiate->ciphersuite = cipher_suite;
Jerry Yue5834fd2022-08-29 20:16:09 +0800628 MBEDTLS_SSL_DEBUG_MSG( 2, ( "overwrite ciphersuite: %04x - %s",
629 cipher_suite, ciphersuite_info->name ) );
Jerry Yu82534862022-08-30 10:42:33 +0800630#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yu82534862022-08-30 10:42:33 +0800631 if( psk_type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION )
632 {
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800633 ret = ssl_tls13_session_copy_ticket( ssl->session_negotiate,
634 &session );
Jerry Yu82534862022-08-30 10:42:33 +0800635 mbedtls_ssl_session_free( &session );
636 if( ret != 0 )
637 return( ret );
638 }
639#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu1c105562022-07-10 06:32:38 +0000640 }
641
Jerry Yu568ec252022-07-22 21:27:34 +0800642 if( p_identity_len != identities_end || p_binder_len != binders_end )
Jerry Yu1c105562022-07-10 06:32:38 +0000643 {
644 MBEDTLS_SSL_DEBUG_MSG( 3, ( "pre_shared_key extesion decode error" ) );
645 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
646 MBEDTLS_ERR_SSL_DECODE_ERROR );
647 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
648 }
649
Jerry Yu6f1db3f2022-07-22 23:05:59 +0800650 /* Update the handshake transcript with the binder list. */
651 ssl->handshake->update_checksum( ssl,
652 identities_end,
653 (size_t)( binders_end - identities_end ) );
Jerry Yu96a2e362022-07-21 15:11:34 +0800654 if( matched_identity == -1 )
Jerry Yu1c105562022-07-10 06:32:38 +0000655 {
Jerry Yue9d4fc02022-08-20 19:21:15 +0800656 MBEDTLS_SSL_DEBUG_MSG( 3, ( "No matched PSK or ticket." ) );
Jerry Yu96a2e362022-07-21 15:11:34 +0800657 return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
Jerry Yu1c105562022-07-10 06:32:38 +0000658 }
659
Jerry Yu96a2e362022-07-21 15:11:34 +0800660 ssl->handshake->selected_identity = (uint16_t)matched_identity;
661 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Pre shared key found" ) );
Jerry Yu1c105562022-07-10 06:32:38 +0000662
Jerry Yu96a2e362022-07-21 15:11:34 +0800663 return( 0 );
Jerry Yu1c105562022-07-10 06:32:38 +0000664}
Jerry Yu032b15ce2022-07-11 06:10:03 +0000665
666/*
667 * struct {
668 * select ( Handshake.msg_type ) {
669 * ....
670 * case server_hello:
671 * uint16 selected_identity;
672 * }
673 * } PreSharedKeyExtension;
674 */
Jerry Yubb852022022-07-20 21:10:44 +0800675static int ssl_tls13_write_server_pre_shared_key_ext( mbedtls_ssl_context *ssl,
676 unsigned char *buf,
677 unsigned char *end,
678 size_t *olen )
Jerry Yu032b15ce2022-07-11 06:10:03 +0000679{
680 unsigned char *p = (unsigned char*)buf;
Jerry Yu032b15ce2022-07-11 06:10:03 +0000681
682 *olen = 0;
683
684#if defined(MBEDTLS_USE_PSA_CRYPTO)
685 if( mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
686#else
687 if( ssl->handshake->psk == NULL )
688#endif
689 {
690 /* We shouldn't have called this extension writer unless we've
691 * chosen to use a PSK. */
692 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
693 }
694
695 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding pre_shared_key extension" ) );
696 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
697
Jerry Yu032b15ce2022-07-11 06:10:03 +0000698 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_PRE_SHARED_KEY, p, 0 );
Jerry Yu032b15ce2022-07-11 06:10:03 +0000699 MBEDTLS_PUT_UINT16_BE( 2, p, 2 );
700
Jerry Yu96a2e362022-07-21 15:11:34 +0800701 MBEDTLS_PUT_UINT16_BE( ssl->handshake->selected_identity, p, 4 );
Jerry Yu032b15ce2022-07-11 06:10:03 +0000702
703 *olen = 6;
704
Jerry Yu96a2e362022-07-21 15:11:34 +0800705 MBEDTLS_SSL_DEBUG_MSG( 4, ( "sent selected_identity: %u",
706 ssl->handshake->selected_identity ) );
Jerry Yu032b15ce2022-07-11 06:10:03 +0000707
708 return( 0 );
709}
710
Jerry Yue19e3b92022-07-08 12:04:51 +0000711#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
712
XiaokangQian7807f9f2022-02-15 10:04:37 +0000713/* From RFC 8446:
714 * struct {
XiaokangQiancfd925f2022-04-14 07:10:37 +0000715 * ProtocolVersion versions<2..254>;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000716 * } SupportedVersions;
717 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200718MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian7807f9f2022-02-15 10:04:37 +0000719static int ssl_tls13_parse_supported_versions_ext( mbedtls_ssl_context *ssl,
720 const unsigned char *buf,
721 const unsigned char *end )
722{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000723 const unsigned char *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000724 size_t versions_len;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000725 const unsigned char *versions_end;
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000726 uint16_t tls_version;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000727 int tls13_supported = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000728
729 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 1 );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000730 versions_len = p[0];
XiaokangQian7807f9f2022-02-15 10:04:37 +0000731 p += 1;
732
XiaokangQian4080a7f2022-04-11 09:55:18 +0000733 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, versions_len );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000734 versions_end = p + versions_len;
735 while( p < versions_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000736 {
XiaokangQiancfd925f2022-04-14 07:10:37 +0000737 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, versions_end, 2 );
XiaokangQiande333912022-04-20 08:49:42 +0000738 tls_version = mbedtls_ssl_read_version( p, ssl->conf->transport );
XiaokangQianb67384d2022-04-19 00:02:38 +0000739 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000740
741 /* In this implementation we only support TLS 1.3 and DTLS 1.3. */
XiaokangQiande333912022-04-20 08:49:42 +0000742 if( tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000743 {
744 tls13_supported = 1;
745 break;
746 }
XiaokangQian7807f9f2022-02-15 10:04:37 +0000747 }
748
XiaokangQianb67384d2022-04-19 00:02:38 +0000749 if( !tls13_supported )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000750 {
XiaokangQian7807f9f2022-02-15 10:04:37 +0000751 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS 1.3 is not supported by the client" ) );
752
753 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
754 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
755 return( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
756 }
757
XiaokangQiande333912022-04-20 08:49:42 +0000758 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Negotiated version. Supported is [%04x]",
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000759 (unsigned int)tls_version ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000760
XiaokangQian7807f9f2022-02-15 10:04:37 +0000761 return( 0 );
762}
763
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000764#if defined(MBEDTLS_ECDH_C)
XiaokangQiane8ff3502022-04-22 02:34:40 +0000765/*
XiaokangQian7807f9f2022-02-15 10:04:37 +0000766 *
767 * From RFC 8446:
768 * enum {
769 * ... (0xFFFF)
770 * } NamedGroup;
771 * struct {
772 * NamedGroup named_group_list<2..2^16-1>;
773 * } NamedGroupList;
774 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200775MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc1be19f2022-04-23 16:11:39 +0800776static int ssl_tls13_parse_supported_groups_ext( mbedtls_ssl_context *ssl,
777 const unsigned char *buf,
778 const unsigned char *end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000779{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000780 const unsigned char *p = buf;
XiaokangQian84823772022-04-19 07:57:30 +0000781 size_t named_group_list_len;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000782 const unsigned char *named_group_list_end;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000783
784 MBEDTLS_SSL_DEBUG_BUF( 3, "supported_groups extension", p, end - buf );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000785 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian4080a7f2022-04-11 09:55:18 +0000786 named_group_list_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000787 p += 2;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000788 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, named_group_list_len );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000789 named_group_list_end = p + named_group_list_len;
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000790 ssl->handshake->hrr_selected_group = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000791
XiaokangQian08037552022-04-20 07:16:41 +0000792 while( p < named_group_list_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000793 {
XiaokangQian08037552022-04-20 07:16:41 +0000794 uint16_t named_group;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000795 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, named_group_list_end, 2 );
XiaokangQian08037552022-04-20 07:16:41 +0000796 named_group = MBEDTLS_GET_UINT16_BE( p, 0 );
797 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000798
Jerry Yuc1be19f2022-04-23 16:11:39 +0800799 MBEDTLS_SSL_DEBUG_MSG( 2,
800 ( "got named group: %s(%04x)",
801 mbedtls_ssl_named_group_to_str( named_group ),
802 named_group ) );
XiaokangQian08037552022-04-20 07:16:41 +0000803
804 if( ! mbedtls_ssl_named_group_is_offered( ssl, named_group ) ||
805 ! mbedtls_ssl_named_group_is_supported( named_group ) ||
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000806 ssl->handshake->hrr_selected_group != 0 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000807 {
XiaokangQian08037552022-04-20 07:16:41 +0000808 continue;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000809 }
810
Jerry Yuc1be19f2022-04-23 16:11:39 +0800811 MBEDTLS_SSL_DEBUG_MSG( 2,
812 ( "add named group %s(%04x) into received list.",
813 mbedtls_ssl_named_group_to_str( named_group ),
814 named_group ) );
815
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000816 ssl->handshake->hrr_selected_group = named_group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000817 }
818
819 return( 0 );
820
821}
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000822#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000823
XiaokangQian08037552022-04-20 07:16:41 +0000824#define SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH 1
825
XiaokangQian88408882022-04-02 10:15:03 +0000826#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000827/*
828 * ssl_tls13_parse_key_shares_ext() verifies whether the information in the
XiaokangQiane8ff3502022-04-22 02:34:40 +0000829 * extension is correct and stores the first acceptable key share and its associated group.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000830 *
831 * Possible return values are:
832 * - 0: Successful processing of the client provided key share extension.
XiaokangQian08037552022-04-20 07:16:41 +0000833 * - SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH: The key shares provided by the client
XiaokangQian7807f9f2022-02-15 10:04:37 +0000834 * does not match a group supported by the server. A HelloRetryRequest will
835 * be needed.
XiaokangQiane8ff3502022-04-22 02:34:40 +0000836 * - A negative value for fatal errors.
Jerry Yuc1be19f2022-04-23 16:11:39 +0800837 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200838MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian7807f9f2022-02-15 10:04:37 +0000839static int ssl_tls13_parse_key_shares_ext( mbedtls_ssl_context *ssl,
840 const unsigned char *buf,
841 const unsigned char *end )
842{
XiaokangQianb67384d2022-04-19 00:02:38 +0000843 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000844 unsigned char const *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000845 unsigned char const *client_shares_end;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800846 size_t client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000847
848 /* From RFC 8446:
849 *
850 * struct {
851 * KeyShareEntry client_shares<0..2^16-1>;
852 * } KeyShareClientHello;
853 *
854 */
855
XiaokangQian7807f9f2022-02-15 10:04:37 +0000856 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000857 client_shares_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000858 p += 2;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000859 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, client_shares_len );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000860
861 ssl->handshake->offered_group_id = 0;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000862 client_shares_end = p + client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000863
864 /* We try to find a suitable key share entry and copy it to the
865 * handshake context. Later, we have to find out whether we can do
866 * something with the provided key share or whether we have to
XiaokangQianc5763b52022-04-02 03:34:37 +0000867 * dismiss it and send a HelloRetryRequest message.
868 */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000869
Jerry Yuc1be19f2022-04-23 16:11:39 +0800870 while( p < client_shares_end )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000871 {
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000872 uint16_t group;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800873 size_t key_exchange_len;
Jerry Yu086edc22022-05-05 10:50:38 +0800874 const unsigned char *key_exchange;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000875
876 /*
877 * struct {
878 * NamedGroup group;
879 * opaque key_exchange<1..2^16-1>;
880 * } KeyShareEntry;
881 */
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000882 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, client_shares_end, 4 );
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000883 group = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yuc1be19f2022-04-23 16:11:39 +0800884 key_exchange_len = MBEDTLS_GET_UINT16_BE( p, 2 );
885 p += 4;
Jerry Yu086edc22022-05-05 10:50:38 +0800886 key_exchange = p;
XiaokangQianb67384d2022-04-19 00:02:38 +0000887 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, client_shares_end, key_exchange_len );
Jerry Yu086edc22022-05-05 10:50:38 +0800888 p += key_exchange_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000889
890 /* Continue parsing even if we have already found a match,
XiaokangQianc5763b52022-04-02 03:34:37 +0000891 * for input validation purposes.
892 */
XiaokangQian060d8672022-04-21 09:24:56 +0000893 if( ! mbedtls_ssl_named_group_is_offered( ssl, group ) ||
Jerry Yuc1be19f2022-04-23 16:11:39 +0800894 ! mbedtls_ssl_named_group_is_supported( group ) ||
895 ssl->handshake->offered_group_id != 0 )
XiaokangQian060d8672022-04-21 09:24:56 +0000896 {
897 continue;
898 }
XiaokangQian060d8672022-04-21 09:24:56 +0000899
XiaokangQian7807f9f2022-02-15 10:04:37 +0000900 /*
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000901 * For now, we only support ECDHE groups.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000902 */
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000903 if( mbedtls_ssl_tls13_named_group_is_ecdhe( group ) )
904 {
Jerry Yuc1be19f2022-04-23 16:11:39 +0800905 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH group: %s (%04x)",
906 mbedtls_ssl_named_group_to_str( group ),
907 group ) );
XiaokangQian318dc762022-04-20 09:43:51 +0000908 ret = mbedtls_ssl_tls13_read_public_ecdhe_share(
Jerry Yu086edc22022-05-05 10:50:38 +0800909 ssl, key_exchange - 2, key_exchange_len + 2 );
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000910 if( ret != 0 )
911 return( ret );
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000912
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000913 }
914 else
XiaokangQian7807f9f2022-02-15 10:04:37 +0000915 {
916 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Unrecognized NamedGroup %u",
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000917 (unsigned) group ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000918 continue;
919 }
920
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000921 ssl->handshake->offered_group_id = group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000922 }
923
Jerry Yuc1be19f2022-04-23 16:11:39 +0800924
925 if( ssl->handshake->offered_group_id == 0 )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000926 {
927 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching key share" ) );
XiaokangQian08037552022-04-20 07:16:41 +0000928 return( SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000929 }
930 return( 0 );
931}
XiaokangQian88408882022-04-02 10:15:03 +0000932#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000933
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000934#if defined(MBEDTLS_DEBUG_C)
XiaokangQian4080a7f2022-04-11 09:55:18 +0000935static void ssl_tls13_debug_print_client_hello_exts( mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000936{
XiaokangQian3207a322022-02-23 03:15:27 +0000937 ((void) ssl);
938
XiaokangQian7807f9f2022-02-15 10:04:37 +0000939 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Extensions:" ) );
XiaokangQianb67384d2022-04-19 00:02:38 +0000940 MBEDTLS_SSL_DEBUG_MSG( 3,
941 ( "- KEY_SHARE_EXTENSION ( %s )",
942 ( ( ssl->handshake->extensions_present
943 & MBEDTLS_SSL_EXT_KEY_SHARE ) > 0 ) ? "TRUE" : "FALSE" ) );
944 MBEDTLS_SSL_DEBUG_MSG( 3,
945 ( "- PSK_KEY_EXCHANGE_MODES_EXTENSION ( %s )",
946 ( ( ssl->handshake->extensions_present
947 & MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES ) > 0 ) ?
948 "TRUE" : "FALSE" ) );
949 MBEDTLS_SSL_DEBUG_MSG( 3,
950 ( "- PRE_SHARED_KEY_EXTENSION ( %s )",
951 ( ( ssl->handshake->extensions_present
952 & MBEDTLS_SSL_EXT_PRE_SHARED_KEY ) > 0 ) ? "TRUE" : "FALSE" ) );
953 MBEDTLS_SSL_DEBUG_MSG( 3,
954 ( "- SIGNATURE_ALGORITHM_EXTENSION ( %s )",
955 ( ( ssl->handshake->extensions_present
956 & MBEDTLS_SSL_EXT_SIG_ALG ) > 0 ) ? "TRUE" : "FALSE" ) );
957 MBEDTLS_SSL_DEBUG_MSG( 3,
958 ( "- SUPPORTED_GROUPS_EXTENSION ( %s )",
959 ( ( ssl->handshake->extensions_present
960 & MBEDTLS_SSL_EXT_SUPPORTED_GROUPS ) >0 ) ?
961 "TRUE" : "FALSE" ) );
962 MBEDTLS_SSL_DEBUG_MSG( 3,
963 ( "- SUPPORTED_VERSION_EXTENSION ( %s )",
964 ( ( ssl->handshake->extensions_present
965 & MBEDTLS_SSL_EXT_SUPPORTED_VERSIONS ) > 0 ) ?
966 "TRUE" : "FALSE" ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000967#if defined ( MBEDTLS_SSL_SERVER_NAME_INDICATION )
XiaokangQianb67384d2022-04-19 00:02:38 +0000968 MBEDTLS_SSL_DEBUG_MSG( 3,
969 ( "- SERVERNAME_EXTENSION ( %s )",
970 ( ( ssl->handshake->extensions_present
971 & MBEDTLS_SSL_EXT_SERVERNAME ) > 0 ) ?
972 "TRUE" : "FALSE" ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000973#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQianacb39922022-06-17 10:18:48 +0000974#if defined ( MBEDTLS_SSL_ALPN )
975 MBEDTLS_SSL_DEBUG_MSG( 3,
976 ( "- ALPN_EXTENSION ( %s )",
977 ( ( ssl->handshake->extensions_present
978 & MBEDTLS_SSL_EXT_ALPN ) > 0 ) ?
979 "TRUE" : "FALSE" ) );
980#endif /* MBEDTLS_SSL_ALPN */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000981}
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000982#endif /* MBEDTLS_DEBUG_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000983
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200984MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian4080a7f2022-04-11 09:55:18 +0000985static int ssl_tls13_client_hello_has_exts( mbedtls_ssl_context *ssl,
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000986 int exts_mask )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000987{
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000988 int masked = ssl->handshake->extensions_present & exts_mask;
989 return( masked == exts_mask );
XiaokangQian7807f9f2022-02-15 10:04:37 +0000990}
991
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200992MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianb67384d2022-04-19 00:02:38 +0000993static int ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(
994 mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +0000995{
Jerry Yu77f01482022-07-11 07:03:24 +0000996 return( ssl_tls13_client_hello_has_exts(
997 ssl,
998 MBEDTLS_SSL_EXT_SUPPORTED_GROUPS |
999 MBEDTLS_SSL_EXT_KEY_SHARE |
1000 MBEDTLS_SSL_EXT_SIG_ALG ) );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001001}
1002
Jerry Yu77f01482022-07-11 07:03:24 +00001003#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1004MBEDTLS_CHECK_RETURN_CRITICAL
1005static int ssl_tls13_client_hello_has_exts_for_psk_key_exchange(
1006 mbedtls_ssl_context *ssl )
1007{
1008 return( ssl_tls13_client_hello_has_exts(
1009 ssl,
1010 MBEDTLS_SSL_EXT_PRE_SHARED_KEY |
1011 MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES ) );
1012}
1013
1014MBEDTLS_CHECK_RETURN_CRITICAL
1015static int ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange(
1016 mbedtls_ssl_context *ssl )
1017{
1018 return( ssl_tls13_client_hello_has_exts(
1019 ssl,
1020 MBEDTLS_SSL_EXT_SUPPORTED_GROUPS |
1021 MBEDTLS_SSL_EXT_KEY_SHARE |
1022 MBEDTLS_SSL_EXT_PRE_SHARED_KEY |
1023 MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES ) );
1024}
1025#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
1026
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001027MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianb67384d2022-04-19 00:02:38 +00001028static int ssl_tls13_check_ephemeral_key_exchange( mbedtls_ssl_context *ssl )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001029{
Jerry Yu77f01482022-07-11 07:03:24 +00001030 return( mbedtls_ssl_conf_tls13_ephemeral_enabled( ssl ) &&
1031 ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange( ssl ) );
1032}
XiaokangQian7807f9f2022-02-15 10:04:37 +00001033
Jerry Yu77f01482022-07-11 07:03:24 +00001034MBEDTLS_CHECK_RETURN_CRITICAL
1035static int ssl_tls13_check_psk_key_exchange( mbedtls_ssl_context *ssl )
1036{
1037#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1038 return( mbedtls_ssl_conf_tls13_psk_enabled( ssl ) &&
1039 mbedtls_ssl_tls13_psk_enabled( ssl ) &&
1040 ssl_tls13_client_hello_has_exts_for_psk_key_exchange( ssl ) );
1041#else
1042 ((void) ssl);
1043 return( 0 );
1044#endif
1045}
XiaokangQian7807f9f2022-02-15 10:04:37 +00001046
Jerry Yu77f01482022-07-11 07:03:24 +00001047MBEDTLS_CHECK_RETURN_CRITICAL
1048static int ssl_tls13_check_psk_ephemeral_key_exchange( mbedtls_ssl_context *ssl )
1049{
1050#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1051 return( mbedtls_ssl_conf_tls13_psk_ephemeral_enabled( ssl ) &&
1052 mbedtls_ssl_tls13_psk_ephemeral_enabled( ssl ) &&
1053 ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange( ssl ) );
1054#else
1055 ((void) ssl);
1056 return( 0 );
1057#endif
1058}
1059
1060static int ssl_tls13_determine_key_exchange_mode( mbedtls_ssl_context *ssl )
1061{
1062 /*
1063 * Determine the key exchange algorithm to use.
1064 * There are three types of key exchanges supported in TLS 1.3:
1065 * - (EC)DH with ECDSA,
1066 * - (EC)DH with PSK,
1067 * - plain PSK.
1068 *
1069 * The PSK-based key exchanges may additionally be used with 0-RTT.
1070 *
1071 * Our built-in order of preference is
Jerry Yuce6ed702022-07-22 21:49:53 +08001072 * 1 ) (EC)DHE-PSK Mode ( psk_ephemeral )
1073 * 2 ) Certificate Mode ( ephemeral )
1074 * 3 ) Plain PSK Mode ( psk )
Jerry Yu77f01482022-07-11 07:03:24 +00001075 */
1076
1077 ssl->handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE;
1078
Jerry Yu77f01482022-07-11 07:03:24 +00001079 if( ssl_tls13_check_psk_ephemeral_key_exchange( ssl ) )
1080 {
1081 ssl->handshake->key_exchange_mode =
1082 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
1083 MBEDTLS_SSL_DEBUG_MSG( 2, ( "key exchange mode: psk_ephemeral" ) );
1084 }
1085 else
1086 if( ssl_tls13_check_ephemeral_key_exchange( ssl ) )
1087 {
1088 ssl->handshake->key_exchange_mode =
1089 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
1090 MBEDTLS_SSL_DEBUG_MSG( 2, ( "key exchange mode: ephemeral" ) );
1091 }
1092 else
Jerry Yuce6ed702022-07-22 21:49:53 +08001093 if( ssl_tls13_check_psk_key_exchange( ssl ) )
1094 {
1095 ssl->handshake->key_exchange_mode =
1096 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
1097 MBEDTLS_SSL_DEBUG_MSG( 2, ( "key exchange mode: psk" ) );
1098 }
1099 else
Jerry Yu77f01482022-07-11 07:03:24 +00001100 {
1101 MBEDTLS_SSL_DEBUG_MSG(
1102 1,
1103 ( "ClientHello message misses mandatory extensions." ) );
1104 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_MISSING_EXTENSION ,
1105 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1106 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1107 }
1108
1109 return( 0 );
1110
XiaokangQian7807f9f2022-02-15 10:04:37 +00001111}
1112
XiaokangQian81802f42022-06-10 13:25:22 +00001113#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1114 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Ronald Cron67ea2542022-09-15 17:34:42 +02001115
1116#if defined(MBEDTLS_USE_PSA_CRYPTO)
1117static psa_algorithm_t ssl_tls13_iana_sig_alg_to_psa_alg( uint16_t sig_alg )
1118{
1119 switch( sig_alg )
1120 {
1121 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256:
1122 return( PSA_ALG_ECDSA( PSA_ALG_SHA_256 ) );
1123 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384:
1124 return( PSA_ALG_ECDSA( PSA_ALG_SHA_384 ) );
1125 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512:
1126 return( PSA_ALG_ECDSA( PSA_ALG_SHA_512 ) );
1127 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256:
1128 return( PSA_ALG_RSA_PSS( PSA_ALG_SHA_256 ) );
1129 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384:
1130 return( PSA_ALG_RSA_PSS( PSA_ALG_SHA_384 ) );
1131 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
1132 return( PSA_ALG_RSA_PSS( PSA_ALG_SHA_512 ) );
1133 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256:
Ronald Cronb72dac42022-09-27 08:56:47 +02001134 return( PSA_ALG_RSA_PKCS1V15_SIGN( PSA_ALG_SHA_256 ) );
Ronald Cron67ea2542022-09-15 17:34:42 +02001135 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384:
Ronald Cronb72dac42022-09-27 08:56:47 +02001136 return( PSA_ALG_RSA_PKCS1V15_SIGN( PSA_ALG_SHA_384 ) );
Ronald Cron67ea2542022-09-15 17:34:42 +02001137 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512:
Ronald Cronb72dac42022-09-27 08:56:47 +02001138 return( PSA_ALG_RSA_PKCS1V15_SIGN( PSA_ALG_SHA_512 ) );
Ronald Cron67ea2542022-09-15 17:34:42 +02001139 default:
1140 return( PSA_ALG_NONE );
1141 }
1142}
1143#endif /* MBEDTLS_USE_PSA_CRYPTO */
1144
XiaokangQian23c5be62022-06-07 02:04:34 +00001145/*
XiaokangQianfb665a82022-06-15 03:57:21 +00001146 * Pick best ( private key, certificate chain ) pair based on the signature
1147 * algorithms supported by the client.
XiaokangQian23c5be62022-06-07 02:04:34 +00001148 */
Ronald Cronce7d76e2022-07-08 18:56:49 +02001149MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian07aad072022-06-14 05:35:09 +00001150static int ssl_tls13_pick_key_cert( mbedtls_ssl_context *ssl )
XiaokangQian23c5be62022-06-07 02:04:34 +00001151{
XiaokangQianfb665a82022-06-15 03:57:21 +00001152 mbedtls_ssl_key_cert *key_cert, *key_cert_list;
XiaokangQian81802f42022-06-10 13:25:22 +00001153 const uint16_t *sig_alg = ssl->handshake->received_sig_algs;
XiaokangQian23c5be62022-06-07 02:04:34 +00001154
1155#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1156 if( ssl->handshake->sni_key_cert != NULL )
XiaokangQianfb665a82022-06-15 03:57:21 +00001157 key_cert_list = ssl->handshake->sni_key_cert;
XiaokangQian23c5be62022-06-07 02:04:34 +00001158 else
1159#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQianfb665a82022-06-15 03:57:21 +00001160 key_cert_list = ssl->conf->key_cert;
XiaokangQian23c5be62022-06-07 02:04:34 +00001161
XiaokangQianfb665a82022-06-15 03:57:21 +00001162 if( key_cert_list == NULL )
XiaokangQian23c5be62022-06-07 02:04:34 +00001163 {
1164 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) );
1165 return( -1 );
1166 }
1167
XiaokangQian81802f42022-06-10 13:25:22 +00001168 for( ; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++ )
XiaokangQian23c5be62022-06-07 02:04:34 +00001169 {
Ronald Cron67ea2542022-09-15 17:34:42 +02001170 if( !mbedtls_ssl_sig_alg_is_offered( ssl, *sig_alg ) )
1171 continue;
1172
1173 if( !mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported( *sig_alg ) )
1174 continue;
1175
XiaokangQianfb665a82022-06-15 03:57:21 +00001176 for( key_cert = key_cert_list; key_cert != NULL;
1177 key_cert = key_cert->next )
XiaokangQian23c5be62022-06-07 02:04:34 +00001178 {
Ronald Cron67ea2542022-09-15 17:34:42 +02001179#if defined(MBEDTLS_USE_PSA_CRYPTO)
1180 psa_algorithm_t psa_alg = PSA_ALG_NONE;
1181#endif /* MBEDTLS_USE_PSA_CRYPTO */
1182
XiaokangQianfb665a82022-06-15 03:57:21 +00001183 MBEDTLS_SSL_DEBUG_CRT( 3, "certificate (chain) candidate",
1184 key_cert->cert );
XiaokangQian81802f42022-06-10 13:25:22 +00001185
1186 /*
1187 * This avoids sending the client a cert it'll reject based on
1188 * keyUsage or other extensions.
1189 */
1190 if( mbedtls_x509_crt_check_key_usage(
XiaokangQianfb665a82022-06-15 03:57:21 +00001191 key_cert->cert, MBEDTLS_X509_KU_DIGITAL_SIGNATURE ) != 0 ||
XiaokangQian81802f42022-06-10 13:25:22 +00001192 mbedtls_x509_crt_check_extended_key_usage(
XiaokangQianfb665a82022-06-15 03:57:21 +00001193 key_cert->cert, MBEDTLS_OID_SERVER_AUTH,
1194 MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH ) ) != 0 )
XiaokangQian81802f42022-06-10 13:25:22 +00001195 {
1196 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: "
XiaokangQianfb665a82022-06-15 03:57:21 +00001197 "(extended) key usage extension" ) );
XiaokangQian81802f42022-06-10 13:25:22 +00001198 continue;
1199 }
XiaokangQian23c5be62022-06-07 02:04:34 +00001200
Jerry Yucc539102022-06-27 16:27:35 +08001201 MBEDTLS_SSL_DEBUG_MSG( 3,
1202 ( "ssl_tls13_pick_key_cert:"
1203 "check signature algorithm %s [%04x]",
1204 mbedtls_ssl_sig_alg_to_str( *sig_alg ),
1205 *sig_alg ) );
Ronald Cron67ea2542022-09-15 17:34:42 +02001206#if defined(MBEDTLS_USE_PSA_CRYPTO)
1207 psa_alg = ssl_tls13_iana_sig_alg_to_psa_alg( *sig_alg );
1208#endif /* MBEDTLS_USE_PSA_CRYPTO */
1209
Jerry Yufb526692022-06-19 11:22:49 +08001210 if( mbedtls_ssl_tls13_check_sig_alg_cert_key_match(
Ronald Cron67ea2542022-09-15 17:34:42 +02001211 *sig_alg, &key_cert->cert->pk )
1212#if defined(MBEDTLS_USE_PSA_CRYPTO)
1213 && psa_alg != PSA_ALG_NONE &&
1214 mbedtls_pk_can_do_ext( &key_cert->cert->pk, psa_alg,
1215 PSA_KEY_USAGE_SIGN_HASH ) == 1
1216#endif /* MBEDTLS_USE_PSA_CRYPTO */
1217 )
XiaokangQian81802f42022-06-10 13:25:22 +00001218 {
XiaokangQianfb665a82022-06-15 03:57:21 +00001219 ssl->handshake->key_cert = key_cert;
Jerry Yucc539102022-06-27 16:27:35 +08001220 MBEDTLS_SSL_DEBUG_MSG( 3,
1221 ( "ssl_tls13_pick_key_cert:"
1222 "selected signature algorithm"
1223 " %s [%04x]",
1224 mbedtls_ssl_sig_alg_to_str( *sig_alg ),
1225 *sig_alg ) );
XiaokangQianfb665a82022-06-15 03:57:21 +00001226 MBEDTLS_SSL_DEBUG_CRT(
XiaokangQian75fe8c72022-06-15 09:42:45 +00001227 3, "selected certificate (chain)",
XiaokangQianfb665a82022-06-15 03:57:21 +00001228 ssl->handshake->key_cert->cert );
XiaokangQian81802f42022-06-10 13:25:22 +00001229 return( 0 );
1230 }
XiaokangQian81802f42022-06-10 13:25:22 +00001231 }
XiaokangQian23c5be62022-06-07 02:04:34 +00001232 }
1233
Jerry Yu9d3e2fa2022-06-27 22:14:01 +08001234 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ssl_tls13_pick_key_cert:"
1235 "no suitable certificate found" ) );
XiaokangQian23c5be62022-06-07 02:04:34 +00001236 return( -1 );
1237}
XiaokangQian81802f42022-06-10 13:25:22 +00001238#endif /* MBEDTLS_X509_CRT_PARSE_C &&
1239 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
XiaokangQian23c5be62022-06-07 02:04:34 +00001240
XiaokangQian4080a7f2022-04-11 09:55:18 +00001241/*
XiaokangQianed582dd2022-04-13 08:21:05 +00001242 *
1243 * STATE HANDLING: ClientHello
1244 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001245 * There are three possible classes of outcomes when parsing the ClientHello:
XiaokangQianed582dd2022-04-13 08:21:05 +00001246 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001247 * 1) The ClientHello was well-formed and matched the server's configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +00001248 *
1249 * In this case, the server progresses to sending its ServerHello.
1250 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001251 * 2) The ClientHello was well-formed but didn't match the server's
1252 * configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +00001253 *
1254 * For example, the client might not have offered a key share which
1255 * the server supports, or the server might require a cookie.
1256 *
1257 * In this case, the server sends a HelloRetryRequest.
1258 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001259 * 3) The ClientHello was ill-formed
XiaokangQianed582dd2022-04-13 08:21:05 +00001260 *
1261 * In this case, we abort the handshake.
1262 *
1263 */
1264
1265/*
XiaokangQian4080a7f2022-04-11 09:55:18 +00001266 * Structure of this message:
1267 *
XiaokangQiane8ff3502022-04-22 02:34:40 +00001268 * uint16 ProtocolVersion;
1269 * opaque Random[32];
1270 * uint8 CipherSuite[2]; // Cryptographic suite selector
XiaokangQian4080a7f2022-04-11 09:55:18 +00001271 *
XiaokangQiane8ff3502022-04-22 02:34:40 +00001272 * struct {
1273 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
1274 * Random random;
1275 * opaque legacy_session_id<0..32>;
1276 * CipherSuite cipher_suites<2..2^16-2>;
1277 * opaque legacy_compression_methods<1..2^8-1>;
1278 * Extension extensions<8..2^16-1>;
1279 * } ClientHello;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001280 */
XiaokangQianed582dd2022-04-13 08:21:05 +00001281
1282#define SSL_CLIENT_HELLO_OK 0
1283#define SSL_CLIENT_HELLO_HRR_REQUIRED 1
1284
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001285MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian4080a7f2022-04-11 09:55:18 +00001286static int ssl_tls13_parse_client_hello( mbedtls_ssl_context *ssl,
1287 const unsigned char *buf,
1288 const unsigned char *end )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001289{
XiaokangQianb67384d2022-04-19 00:02:38 +00001290 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1291 const unsigned char *p = buf;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001292 size_t legacy_session_id_len;
XiaokangQian318dc762022-04-20 09:43:51 +00001293 size_t cipher_suites_len;
XiaokangQian060d8672022-04-21 09:24:56 +00001294 const unsigned char *cipher_suites_end;
XiaokangQianb67384d2022-04-19 00:02:38 +00001295 size_t extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001296 const unsigned char *extensions_end;
Jerry Yu49ca9282022-05-05 11:05:22 +08001297 int hrr_required = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001298
Jerry Yu1c105562022-07-10 06:32:38 +00001299#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Jerry Yu5725f1c2022-08-21 17:27:16 +08001300 const unsigned char *cipher_suites;
Jerry Yu29d9faa2022-08-23 17:52:45 +08001301 const unsigned char *pre_shared_key_ext = NULL;
Jerry Yu1c105562022-07-10 06:32:38 +00001302 const unsigned char *pre_shared_key_ext_end = NULL;
1303#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001304
1305 ssl->handshake->extensions_present = MBEDTLS_SSL_EXT_NONE;
1306
1307 /*
XiaokangQianb67384d2022-04-19 00:02:38 +00001308 * ClientHello layout:
XiaokangQian7807f9f2022-02-15 10:04:37 +00001309 * 0 . 1 protocol version
XiaokangQiane8ff3502022-04-22 02:34:40 +00001310 * 2 . 33 random bytes
XiaokangQianc5763b52022-04-02 03:34:37 +00001311 * 34 . 34 session id length ( 1 byte )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001312 * 35 . 34+x session id
XiaokangQian7807f9f2022-02-15 10:04:37 +00001313 * .. . .. ciphersuite list length ( 2 bytes )
1314 * .. . .. ciphersuite list
1315 * .. . .. compression alg. list length ( 1 byte )
1316 * .. . .. compression alg. list
1317 * .. . .. extensions length ( 2 bytes, optional )
1318 * .. . .. extensions ( optional )
1319 */
1320
XiaokangQianb67384d2022-04-19 00:02:38 +00001321 /*
bootstrap-prime6dbbf442022-05-17 19:30:44 -04001322 * Minimal length ( with everything empty and extensions omitted ) is
XiaokangQian7807f9f2022-02-15 10:04:37 +00001323 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1324 * read at least up to session id length without worrying.
1325 */
1326 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 38 );
1327
1328 /* ...
1329 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1330 * ...
1331 * with ProtocolVersion defined as:
1332 * uint16 ProtocolVersion;
1333 */
XiaokangQiande333912022-04-20 08:49:42 +00001334 if( mbedtls_ssl_read_version( p, ssl->conf->transport ) !=
1335 MBEDTLS_SSL_VERSION_TLS1_2 )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001336 {
1337 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Unsupported version of TLS." ) );
1338 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1339 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
XiaokangQianb67384d2022-04-19 00:02:38 +00001340 return ( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001341 }
1342 p += 2;
1343
1344 /*
XiaokangQianf8ceb942022-04-15 11:43:27 +00001345 * Only support TLS 1.3 currently, temporarily set the version.
1346 */
XiaokangQiande333912022-04-20 08:49:42 +00001347 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
XiaokangQianf8ceb942022-04-15 11:43:27 +00001348
Jerry Yue67bef42022-07-07 07:29:42 +00001349#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1350 /* Store minor version for later use with ticket serialization. */
1351 ssl->session_negotiate->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
Jerry Yua66fece2022-07-13 14:30:29 +08001352 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Jerry Yufca4d572022-07-21 10:37:48 +08001353#endif
Jerry Yue67bef42022-07-07 07:29:42 +00001354
Jerry Yuc1be19f2022-04-23 16:11:39 +08001355 /* ...
1356 * Random random;
1357 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001358 * with Random defined as:
1359 * opaque Random[32];
XiaokangQian7807f9f2022-02-15 10:04:37 +00001360 */
XiaokangQian4080a7f2022-04-11 09:55:18 +00001361 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes",
XiaokangQian08037552022-04-20 07:16:41 +00001362 p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001363
XiaokangQian08037552022-04-20 07:16:41 +00001364 memcpy( &ssl->handshake->randbytes[0], p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN );
1365 p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001366
Jerry Yuc1be19f2022-04-23 16:11:39 +08001367 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001368 * opaque legacy_session_id<0..32>;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001369 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +00001370 */
XiaokangQian4080a7f2022-04-11 09:55:18 +00001371 legacy_session_id_len = p[0];
XiaokangQianc5763b52022-04-02 03:34:37 +00001372 p++;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001373
XiaokangQianb67384d2022-04-19 00:02:38 +00001374 if( legacy_session_id_len > sizeof( ssl->session_negotiate->id ) )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001375 {
1376 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1377 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
1378 }
1379
XiaokangQian4080a7f2022-04-11 09:55:18 +00001380 ssl->session_negotiate->id_len = legacy_session_id_len;
XiaokangQianed582dd2022-04-13 08:21:05 +00001381 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id",
XiaokangQiane8ff3502022-04-22 02:34:40 +00001382 p, legacy_session_id_len );
XiaokangQianb67384d2022-04-19 00:02:38 +00001383 /*
1384 * Check we have enough data for the legacy session identifier
Jerry Yue95c8af2022-07-26 15:48:20 +08001385 * and the ciphersuite list length.
XiaokangQianb67384d2022-04-19 00:02:38 +00001386 */
1387 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, legacy_session_id_len + 2 );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001388
XiaokangQianed582dd2022-04-13 08:21:05 +00001389 memcpy( &ssl->session_negotiate->id[0], p, legacy_session_id_len );
XiaokangQian4080a7f2022-04-11 09:55:18 +00001390 p += legacy_session_id_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001391
XiaokangQian7807f9f2022-02-15 10:04:37 +00001392 cipher_suites_len = MBEDTLS_GET_UINT16_BE( p, 0 );
1393 p += 2;
1394
XiaokangQianb67384d2022-04-19 00:02:38 +00001395 /* Check we have enough data for the ciphersuite list, the legacy
1396 * compression methods and the length of the extensions.
Jerry Yue95c8af2022-07-26 15:48:20 +08001397 *
1398 * cipher_suites cipher_suites_len bytes
1399 * legacy_compression_methods 2 bytes
1400 * extensions_len 2 bytes
XiaokangQianb67384d2022-04-19 00:02:38 +00001401 */
1402 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, cipher_suites_len + 2 + 2 );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001403
Jerry Yu24b8c812022-08-20 19:06:56 +08001404 /* ...
1405 * CipherSuite cipher_suites<2..2^16-2>;
1406 * ...
1407 * with CipherSuite defined as:
1408 * uint8 CipherSuite[2];
XiaokangQian08037552022-04-20 07:16:41 +00001409 */
Jerry Yu5725f1c2022-08-21 17:27:16 +08001410#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
XiaokangQian060d8672022-04-21 09:24:56 +00001411 cipher_suites = p;
Jerry Yu5725f1c2022-08-21 17:27:16 +08001412#endif
XiaokangQian060d8672022-04-21 09:24:56 +00001413 cipher_suites_end = p + cipher_suites_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001414 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
1415 p, cipher_suites_len );
Jerry Yu5725f1c2022-08-21 17:27:16 +08001416
1417 /*
1418 * Search for a matching ciphersuite
1419 */
XiaokangQian060d8672022-04-21 09:24:56 +00001420 for ( ; p < cipher_suites_end; p += 2 )
XiaokangQian17f974c2022-04-19 09:57:41 +00001421 {
XiaokangQiane8ff3502022-04-22 02:34:40 +00001422 uint16_t cipher_suite;
Jerry Yue95c8af2022-07-26 15:48:20 +08001423 const mbedtls_ssl_ciphersuite_t* ciphersuite_info;
Jerry Yu5725f1c2022-08-21 17:27:16 +08001424
XiaokangQiane8ff3502022-04-22 02:34:40 +00001425 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, cipher_suites_end, 2 );
Jerry Yu5725f1c2022-08-21 17:27:16 +08001426
XiaokangQiane8ff3502022-04-22 02:34:40 +00001427 cipher_suite = MBEDTLS_GET_UINT16_BE( p, 0 );
Jerry Yuc5a23a02022-08-25 10:51:44 +08001428 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite(
Jerry Yudd1bef72022-08-23 17:57:02 +08001429 ssl,cipher_suite );
1430 if( ciphersuite_info == NULL )
Jerry Yu5725f1c2022-08-21 17:27:16 +08001431 continue;
1432
Jerry Yu5725f1c2022-08-21 17:27:16 +08001433 ssl->session_negotiate->ciphersuite = cipher_suite;
1434 ssl->handshake->ciphersuite_info = ciphersuite_info;
1435 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %04x - %s",
Jerry Yue95c8af2022-07-26 15:48:20 +08001436 cipher_suite,
Jerry Yu5725f1c2022-08-21 17:27:16 +08001437 ciphersuite_info->name ) );
XiaokangQian17f974c2022-04-19 09:57:41 +00001438 }
Jerry Yu5725f1c2022-08-21 17:27:16 +08001439
1440 if( ssl->handshake->ciphersuite_info == NULL )
1441 {
1442 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1443 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1444 return ( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1445 }
Jerry Yuc1be19f2022-04-23 16:11:39 +08001446
XiaokangQian4080a7f2022-04-11 09:55:18 +00001447 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001448 * opaque legacy_compression_methods<1..2^8-1>;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001449 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +00001450 */
XiaokangQian0a1b54e2022-04-21 03:01:38 +00001451 if( p[0] != 1 || p[1] != MBEDTLS_SSL_COMPRESS_NULL )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001452 {
XiaokangQian4080a7f2022-04-11 09:55:18 +00001453 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad legacy compression method" ) );
1454 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1455 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
1456 return ( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001457 }
XiaokangQianb67384d2022-04-19 00:02:38 +00001458 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001459
Jerry Yuc1be19f2022-04-23 16:11:39 +08001460 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001461 * Extension extensions<8..2^16-1>;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001462 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001463 * with Extension defined as:
1464 * struct {
1465 * ExtensionType extension_type;
1466 * opaque extension_data<0..2^16-1>;
1467 * } Extension;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001468 */
XiaokangQian4080a7f2022-04-11 09:55:18 +00001469 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001470 p += 2;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001471 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
XiaokangQiane8ff3502022-04-22 02:34:40 +00001472 extensions_end = p + extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001473
XiaokangQian4080a7f2022-04-11 09:55:18 +00001474 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", p, extensions_len );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001475
1476 while( p < extensions_end )
1477 {
1478 unsigned int extension_type;
1479 size_t extension_data_len;
1480 const unsigned char *extension_data_end;
1481
Jerry Yu1c9247c2022-07-21 12:37:39 +08001482 /* RFC 8446, page 57
1483 *
1484 * The "pre_shared_key" extension MUST be the last extension in the
1485 * ClientHello (this facilitates implementation as described below).
1486 * Servers MUST check that it is the last extension and otherwise fail
1487 * the handshake with an "illegal_parameter" alert.
1488 */
1489 if( ssl->handshake->extensions_present & MBEDTLS_SSL_EXT_PRE_SHARED_KEY )
1490 {
1491 MBEDTLS_SSL_DEBUG_MSG(
1492 3, ( "pre_shared_key is not last extension." ) );
1493 MBEDTLS_SSL_PEND_FATAL_ALERT(
1494 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1495 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1496 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1497 }
1498
XiaokangQian318dc762022-04-20 09:43:51 +00001499 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, 4 );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001500 extension_type = MBEDTLS_GET_UINT16_BE( p, 0 );
1501 extension_data_len = MBEDTLS_GET_UINT16_BE( p, 2 );
1502 p += 4;
1503
1504 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, extensions_end, extension_data_len );
1505 extension_data_end = p + extension_data_len;
1506
1507 switch( extension_type )
1508 {
XiaokangQian40a35232022-05-07 09:02:40 +00001509#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1510 case MBEDTLS_TLS_EXT_SERVERNAME:
1511 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
XiaokangQian9b2b7712022-05-17 02:57:00 +00001512 ret = mbedtls_ssl_parse_server_name_ext( ssl, p,
1513 extension_data_end );
XiaokangQian40a35232022-05-07 09:02:40 +00001514 if( ret != 0 )
1515 {
1516 MBEDTLS_SSL_DEBUG_RET(
1517 1, "mbedtls_ssl_parse_servername_ext", ret );
1518 return( ret );
1519 }
1520 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SERVERNAME;
1521 break;
1522#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1523
XiaokangQianb67384d2022-04-19 00:02:38 +00001524#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001525 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
1526 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported group extension" ) );
1527
1528 /* Supported Groups Extension
1529 *
1530 * When sent by the client, the "supported_groups" extension
1531 * indicates the named groups which the client supports,
1532 * ordered from most preferred to least preferred.
1533 */
Jerry Yuc1be19f2022-04-23 16:11:39 +08001534 ret = ssl_tls13_parse_supported_groups_ext(
1535 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001536 if( ret != 0 )
1537 {
1538 MBEDTLS_SSL_DEBUG_RET( 1,
1539 "mbedtls_ssl_parse_supported_groups_ext", ret );
1540 return( ret );
1541 }
1542
1543 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_GROUPS;
1544 break;
XiaokangQianb67384d2022-04-19 00:02:38 +00001545#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001546
XiaokangQian88408882022-04-02 10:15:03 +00001547#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001548 case MBEDTLS_TLS_EXT_KEY_SHARE:
1549 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found key share extension" ) );
1550
1551 /*
1552 * Key Share Extension
1553 *
1554 * When sent by the client, the "key_share" extension
1555 * contains the endpoint's cryptographic parameters for
1556 * ECDHE/DHE key establishment methods.
1557 */
Jerry Yuc1be19f2022-04-23 16:11:39 +08001558 ret = ssl_tls13_parse_key_shares_ext(
1559 ssl, p, extension_data_end );
XiaokangQian08037552022-04-20 07:16:41 +00001560 if( ret == SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001561 {
XiaokangQianed582dd2022-04-13 08:21:05 +00001562 MBEDTLS_SSL_DEBUG_MSG( 2, ( "HRR needed " ) );
Jerry Yu49ca9282022-05-05 11:05:22 +08001563 hrr_required = 1;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001564 }
1565
Jerry Yu582dd062022-04-22 21:59:01 +08001566 if( ret < 0 )
1567 {
1568 MBEDTLS_SSL_DEBUG_RET(
1569 1, "ssl_tls13_parse_key_shares_ext", ret );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001570 return( ret );
Jerry Yu582dd062022-04-22 21:59:01 +08001571 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001572
1573 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_KEY_SHARE;
1574 break;
XiaokangQian88408882022-04-02 10:15:03 +00001575#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001576
1577 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
1578 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported versions extension" ) );
1579
1580 ret = ssl_tls13_parse_supported_versions_ext(
Jerry Yuc1be19f2022-04-23 16:11:39 +08001581 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001582 if( ret != 0 )
1583 {
1584 MBEDTLS_SSL_DEBUG_RET( 1,
1585 ( "ssl_tls13_parse_supported_versions_ext" ), ret );
1586 return( ret );
1587 }
1588 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_VERSIONS;
1589 break;
1590
Jerry Yue19e3b92022-07-08 12:04:51 +00001591#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1592 case MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES:
1593 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found psk key exchange modes extension" ) );
1594
1595 ret = ssl_tls13_parse_key_exchange_modes_ext(
1596 ssl, p, extension_data_end );
1597 if( ret != 0 )
1598 {
1599 MBEDTLS_SSL_DEBUG_RET(
1600 1, "ssl_tls13_parse_key_exchange_modes_ext", ret );
1601 return( ret );
1602 }
1603
1604 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES;
1605 break;
1606#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
1607
Jerry Yu1c105562022-07-10 06:32:38 +00001608 case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
1609 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found pre_shared_key extension" ) );
Jerry Yu13ab81d2022-07-22 23:17:11 +08001610 if( ( ssl->handshake->extensions_present &
1611 MBEDTLS_SSL_EXT_PSK_KEY_EXCHANGE_MODES ) == 0 )
1612 {
1613 MBEDTLS_SSL_PEND_FATAL_ALERT(
1614 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1615 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1616 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1617 }
Jerry Yu1c9247c2022-07-21 12:37:39 +08001618#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Jerry Yu1c105562022-07-10 06:32:38 +00001619 /* Delay processing of the PSK identity once we have
1620 * found out which algorithms to use. We keep a pointer
1621 * to the buffer and the size for later processing.
1622 */
Jerry Yu29d9faa2022-08-23 17:52:45 +08001623 pre_shared_key_ext = p;
Jerry Yu1c105562022-07-10 06:32:38 +00001624 pre_shared_key_ext_end = extension_data_end;
Jerry Yu1c9247c2022-07-21 12:37:39 +08001625#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Jerry Yu1c105562022-07-10 06:32:38 +00001626 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_PRE_SHARED_KEY;
1627 break;
Jerry Yu1c105562022-07-10 06:32:38 +00001628
XiaokangQianacb39922022-06-17 10:18:48 +00001629#if defined(MBEDTLS_SSL_ALPN)
1630 case MBEDTLS_TLS_EXT_ALPN:
1631 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
1632
1633 ret = mbedtls_ssl_parse_alpn_ext( ssl, p, extension_data_end );
1634 if( ret != 0 )
1635 {
1636 MBEDTLS_SSL_DEBUG_RET(
1637 1, ( "mbedtls_ssl_parse_alpn_ext" ), ret );
1638 return( ret );
1639 }
1640 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_ALPN;
1641 break;
1642#endif /* MBEDTLS_SSL_ALPN */
1643
XiaokangQian7807f9f2022-02-15 10:04:37 +00001644#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1645 case MBEDTLS_TLS_EXT_SIG_ALG:
1646 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
1647
Gabor Mezei078e8032022-04-27 21:17:56 +02001648 ret = mbedtls_ssl_parse_sig_alg_ext(
Jerry Yuc1be19f2022-04-23 16:11:39 +08001649 ssl, p, extension_data_end );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001650 if( ret != 0 )
1651 {
1652 MBEDTLS_SSL_DEBUG_MSG( 1,
1653 ( "ssl_parse_supported_signature_algorithms_server_ext ( %d )",
1654 ret ) );
1655 return( ret );
1656 }
1657 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SIG_ALG;
1658 break;
1659#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
1660
1661 default:
1662 MBEDTLS_SSL_DEBUG_MSG( 3,
1663 ( "unknown extension found: %ud ( ignoring )",
1664 extension_type ) );
1665 }
1666
1667 p += extension_data_len;
1668 }
1669
Jerry Yu1c105562022-07-10 06:32:38 +00001670#if defined(MBEDTLS_DEBUG_C)
1671 /* List all the extensions we have received */
1672 ssl_tls13_debug_print_client_hello_exts( ssl );
1673#endif /* MBEDTLS_DEBUG_C */
1674
1675 mbedtls_ssl_add_hs_hdr_to_checksum( ssl,
1676 MBEDTLS_SSL_HS_CLIENT_HELLO,
1677 p - buf );
Jerry Yu032b15ce2022-07-11 06:10:03 +00001678
Jerry Yu1c105562022-07-10 06:32:38 +00001679#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001680 /* Update checksum with either
1681 * - The entire content of the CH message, if no PSK extension is present
1682 * - The content up to but excluding the PSK extension, if present.
1683 */
Jerry Yu1c105562022-07-10 06:32:38 +00001684 /* If we've settled on a PSK-based exchange, parse PSK identity ext */
Jerry Yuba9b6e92022-07-22 21:35:18 +08001685 if( mbedtls_ssl_tls13_some_psk_enabled( ssl ) &&
Jerry Yu32e13702022-07-29 13:04:08 +08001686 mbedtls_ssl_conf_tls13_some_psk_enabled( ssl ) &&
Jerry Yuba9b6e92022-07-22 21:35:18 +08001687 ( ssl->handshake->extensions_present & MBEDTLS_SSL_EXT_PRE_SHARED_KEY ) )
Jerry Yu1c105562022-07-10 06:32:38 +00001688 {
1689 ssl->handshake->update_checksum( ssl, buf,
Jerry Yu29d9faa2022-08-23 17:52:45 +08001690 pre_shared_key_ext - buf );
Jerry Yubb852022022-07-20 21:10:44 +08001691 ret = ssl_tls13_parse_pre_shared_key_ext( ssl,
Jerry Yu29d9faa2022-08-23 17:52:45 +08001692 pre_shared_key_ext,
Jerry Yue95c8af2022-07-26 15:48:20 +08001693 pre_shared_key_ext_end,
Jerry Yu5725f1c2022-08-21 17:27:16 +08001694 cipher_suites,
1695 cipher_suites_end );
Jerry Yue9d4fc02022-08-20 19:21:15 +08001696 if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
Jerry Yuba9b6e92022-07-22 21:35:18 +08001697 {
1698 ssl->handshake->extensions_present &= ~MBEDTLS_SSL_EXT_PRE_SHARED_KEY;
Jerry Yu6f1db3f2022-07-22 23:05:59 +08001699 }
1700 else if( ret != 0 )
Jerry Yu1c105562022-07-10 06:32:38 +00001701 {
Jerry Yubb852022022-07-20 21:10:44 +08001702 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_tls13_parse_pre_shared_key_ext" ),
Jerry Yu1c105562022-07-10 06:32:38 +00001703 ret );
1704 return( ret );
1705 }
Jerry Yu1c105562022-07-10 06:32:38 +00001706 }
1707 else
1708#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
1709 {
1710 ssl->handshake->update_checksum( ssl, buf, p - buf );
1711 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001712
Jerry Yuba9b6e92022-07-22 21:35:18 +08001713 ret = ssl_tls13_determine_key_exchange_mode( ssl );
1714 if( ret < 0 )
1715 return( ret );
XiaokangQian7807f9f2022-02-15 10:04:37 +00001716
Jerry Yue5834fd2022-08-29 20:16:09 +08001717 mbedtls_ssl_optimize_checksum( ssl, ssl->handshake->ciphersuite_info );
1718
XiaokangQian75fe8c72022-06-15 09:42:45 +00001719 return( hrr_required ? SSL_CLIENT_HELLO_HRR_REQUIRED : SSL_CLIENT_HELLO_OK );
1720}
1721
1722/* Update the handshake state machine */
1723
Ronald Cronce7d76e2022-07-08 18:56:49 +02001724MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian75fe8c72022-06-15 09:42:45 +00001725static int ssl_tls13_postprocess_client_hello( mbedtls_ssl_context* ssl )
1726{
1727 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1728
XiaokangQian7807f9f2022-02-15 10:04:37 +00001729 /*
XiaokangQianfb665a82022-06-15 03:57:21 +00001730 * Server certificate selection
1731 */
1732 if( ssl->conf->f_cert_cb && ( ret = ssl->conf->f_cert_cb( ssl ) ) != 0 )
1733 {
1734 MBEDTLS_SSL_DEBUG_RET( 1, "f_cert_cb", ret );
1735 return( ret );
1736 }
1737#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1738 ssl->handshake->sni_name = NULL;
1739 ssl->handshake->sni_name_len = 0;
1740#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001741
XiaokangQian7807f9f2022-02-15 10:04:37 +00001742 ret = mbedtls_ssl_tls13_key_schedule_stage_early( ssl );
1743 if( ret != 0 )
1744 {
1745 MBEDTLS_SSL_DEBUG_RET( 1,
1746 "mbedtls_ssl_tls1_3_key_schedule_stage_early", ret );
1747 return( ret );
1748 }
1749
XiaokangQian7807f9f2022-02-15 10:04:37 +00001750 return( 0 );
1751
1752}
1753
1754/*
XiaokangQianed582dd2022-04-13 08:21:05 +00001755 * Main entry point from the state machine; orchestrates the otherfunctions.
1756 */
1757
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001758MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianed582dd2022-04-13 08:21:05 +00001759static int ssl_tls13_process_client_hello( mbedtls_ssl_context *ssl )
1760{
1761
XiaokangQian08037552022-04-20 07:16:41 +00001762 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianed582dd2022-04-13 08:21:05 +00001763 unsigned char* buf = NULL;
1764 size_t buflen = 0;
Jerry Yu4ca91402022-05-09 15:50:57 +08001765 int parse_client_hello_ret;
1766
XiaokangQianed582dd2022-04-13 08:21:05 +00001767 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
1768
XiaokangQianed582dd2022-04-13 08:21:05 +00001769 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg(
1770 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
1771 &buf, &buflen ) );
1772
1773 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_parse_client_hello( ssl, buf,
1774 buf + buflen ) );
Jerry Yuf41553b2022-05-09 22:20:30 +08001775 parse_client_hello_ret = ret; /* Store return value of parse_client_hello,
1776 * only SSL_CLIENT_HELLO_OK or
1777 * SSL_CLIENT_HELLO_HRR_REQUIRED at this
1778 * stage as negative error codes are handled
1779 * by MBEDTLS_SSL_PROC_CHK_NEG. */
Jerry Yu4ca91402022-05-09 15:50:57 +08001780
XiaokangQiancfd925f2022-04-14 07:10:37 +00001781 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_client_hello( ssl ) );
Jerry Yu582dd062022-04-22 21:59:01 +08001782
Jerry Yu4ca91402022-05-09 15:50:57 +08001783 if( parse_client_hello_ret == SSL_CLIENT_HELLO_OK )
1784 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_HELLO );
1785 else
1786 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HELLO_RETRY_REQUEST );
XiaokangQianed582dd2022-04-13 08:21:05 +00001787
1788cleanup:
1789
1790 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
1791 return( ret );
1792}
1793
1794/*
Jerry Yu1c3e6882022-04-20 21:23:40 +08001795 * Handler for MBEDTLS_SSL_SERVER_HELLO
Jerry Yu5b64ae92022-03-30 17:15:02 +08001796 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001797MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf4b27e42022-03-30 17:32:21 +08001798static int ssl_tls13_prepare_server_hello( mbedtls_ssl_context *ssl )
1799{
Jerry Yu637a3f12022-04-20 21:37:58 +08001800 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1801 unsigned char *server_randbytes =
Jerry Yu3bf2c642022-03-30 22:02:12 +08001802 ssl->handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
Jerry Yuf4b27e42022-03-30 17:32:21 +08001803 if( ssl->conf->f_rng == NULL )
1804 {
1805 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided" ) );
1806 return( MBEDTLS_ERR_SSL_NO_RNG );
1807 }
1808
Jerry Yu637a3f12022-04-20 21:37:58 +08001809 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, server_randbytes,
Jerry Yuf4b27e42022-03-30 17:32:21 +08001810 MBEDTLS_SERVER_HELLO_RANDOM_LEN ) ) != 0 )
1811 {
1812 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
1813 return( ret );
1814 }
1815
Jerry Yu637a3f12022-04-20 21:37:58 +08001816 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", server_randbytes,
Jerry Yuf4b27e42022-03-30 17:32:21 +08001817 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
1818
1819#if defined(MBEDTLS_HAVE_TIME)
1820 ssl->session_negotiate->start = time( NULL );
1821#endif /* MBEDTLS_HAVE_TIME */
1822
1823 return( ret );
1824}
1825
Jerry Yu3bf2c642022-03-30 22:02:12 +08001826/*
Jerry Yue74e04a2022-04-21 09:23:16 +08001827 * ssl_tls13_write_server_hello_supported_versions_ext ():
Jerry Yu3bf2c642022-03-30 22:02:12 +08001828 *
1829 * struct {
Jerry Yufb9f54d2022-04-06 10:08:34 +08001830 * ProtocolVersion selected_version;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001831 * } SupportedVersions;
1832 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001833MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue74e04a2022-04-21 09:23:16 +08001834static int ssl_tls13_write_server_hello_supported_versions_ext(
1835 mbedtls_ssl_context *ssl,
1836 unsigned char *buf,
1837 unsigned char *end,
1838 size_t *out_len )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001839{
Jerry Yu3bf2c642022-03-30 22:02:12 +08001840 *out_len = 0;
1841
Jerry Yu955ddd72022-04-22 22:27:33 +08001842 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, write selected version" ) );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001843
1844 /* Check if we have space to write the extension:
1845 * - extension_type (2 bytes)
1846 * - extension_data_length (2 bytes)
Jerry Yu349a6132022-04-14 20:52:56 +08001847 * - selected_version (2 bytes)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001848 */
Jerry Yu349a6132022-04-14 20:52:56 +08001849 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 6 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001850
Jerry Yu349a6132022-04-14 20:52:56 +08001851 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, buf, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001852
Jerry Yu349a6132022-04-14 20:52:56 +08001853 MBEDTLS_PUT_UINT16_BE( 2, buf, 2 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001854
Jerry Yu349a6132022-04-14 20:52:56 +08001855 mbedtls_ssl_write_version( buf + 4,
1856 ssl->conf->transport,
1857 ssl->tls_version );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001858
1859 MBEDTLS_SSL_DEBUG_MSG( 3, ( "supported version: [%04x]",
1860 ssl->tls_version ) );
1861
Jerry Yu349a6132022-04-14 20:52:56 +08001862 *out_len = 6;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001863
1864 return( 0 );
1865}
1866
Jerry Yud9436a12022-04-20 22:28:09 +08001867
Jerry Yu3bf2c642022-03-30 22:02:12 +08001868
1869/* Generate and export a single key share. For hybrid KEMs, this can
1870 * be called multiple times with the different components of the hybrid. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001871MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu955ddd72022-04-22 22:27:33 +08001872static int ssl_tls13_generate_and_write_key_share( mbedtls_ssl_context *ssl,
1873 uint16_t named_group,
1874 unsigned char *buf,
1875 unsigned char *end,
1876 size_t *out_len )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001877{
1878 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu955ddd72022-04-22 22:27:33 +08001879
1880 *out_len = 0;
1881
Jerry Yu89e103c2022-03-30 22:43:29 +08001882#if defined(MBEDTLS_ECDH_C)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001883 if( mbedtls_ssl_tls13_named_group_is_ecdhe( named_group ) )
1884 {
Jerry Yu89e103c2022-03-30 22:43:29 +08001885 ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
1886 ssl, named_group, buf, end, out_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001887 if( ret != 0 )
1888 {
Jerry Yu89e103c2022-03-30 22:43:29 +08001889 MBEDTLS_SSL_DEBUG_RET(
1890 1, "mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange",
1891 ret );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001892 return( ret );
1893 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08001894 }
Jerry Yu89e103c2022-03-30 22:43:29 +08001895 else
1896#endif /* MBEDTLS_ECDH_C */
1897 if( 0 /* Other kinds of KEMs */ )
Jerry Yu3bf2c642022-03-30 22:02:12 +08001898 {
1899 }
1900 else
1901 {
Jerry Yu955ddd72022-04-22 22:27:33 +08001902 ((void) ssl);
1903 ((void) named_group);
1904 ((void) buf);
1905 ((void) end);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001906 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1907 }
1908
1909 return( ret );
1910}
1911
1912/*
1913 * ssl_tls13_write_key_share_ext
1914 *
1915 * Structure of key_share extension in ServerHello:
1916 *
Jerry Yu1c3e6882022-04-20 21:23:40 +08001917 * struct {
1918 * NamedGroup group;
1919 * opaque key_exchange<1..2^16-1>;
1920 * } KeyShareEntry;
1921 * struct {
1922 * KeyShareEntry server_share;
1923 * } KeyShareServerHello;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001924 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001925MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu3bf2c642022-03-30 22:02:12 +08001926static int ssl_tls13_write_key_share_ext( mbedtls_ssl_context *ssl,
1927 unsigned char *buf,
1928 unsigned char *end,
1929 size_t *out_len )
1930{
Jerry Yu955ddd72022-04-22 22:27:33 +08001931 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001932 unsigned char *p = buf;
Jerry Yu57d48412022-04-20 21:50:42 +08001933 uint16_t group = ssl->handshake->offered_group_id;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001934 unsigned char *server_share = buf + 4;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001935 size_t key_exchange_length;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001936
1937 *out_len = 0;
1938
1939 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding key share extension" ) );
1940
Jerry Yu58af2332022-09-06 11:19:31 +08001941 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, write selected_group: %s (%04x)",
1942 mbedtls_ssl_named_group_to_str( group ),
1943 group ) );
1944
Jerry Yu3bf2c642022-03-30 22:02:12 +08001945 /* Check if we have space for header and length fields:
1946 * - extension_type (2 bytes)
1947 * - extension_data_length (2 bytes)
1948 * - group (2 bytes)
1949 * - key_exchange_length (2 bytes)
1950 */
1951 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 8 );
Jerry Yu57d48412022-04-20 21:50:42 +08001952 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, p, 0 );
1953 MBEDTLS_PUT_UINT16_BE( group, server_share, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001954 p += 8;
Jerry Yu57d48412022-04-20 21:50:42 +08001955
Jerry Yu3bf2c642022-03-30 22:02:12 +08001956 /* When we introduce PQC-ECDHE hybrids, we'll want to call this
1957 * function multiple times. */
Jerry Yu955ddd72022-04-22 22:27:33 +08001958 ret = ssl_tls13_generate_and_write_key_share(
Jerry Yue65d8012022-04-23 10:34:35 +08001959 ssl, group, server_share + 4, end, &key_exchange_length );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001960 if( ret != 0 )
1961 return( ret );
1962 p += key_exchange_length;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001963
Jerry Yu955ddd72022-04-22 22:27:33 +08001964 MBEDTLS_PUT_UINT16_BE( key_exchange_length, server_share + 2, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001965
Jerry Yu57d48412022-04-20 21:50:42 +08001966 MBEDTLS_PUT_UINT16_BE( p - server_share, buf, 2 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08001967
Jerry Yu57d48412022-04-20 21:50:42 +08001968 *out_len = p - buf;
Jerry Yu955ddd72022-04-22 22:27:33 +08001969
Jerry Yu3bf2c642022-03-30 22:02:12 +08001970 return( 0 );
1971}
Jerry Yud9436a12022-04-20 22:28:09 +08001972
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001973MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001974static int ssl_tls13_write_hrr_key_share_ext( mbedtls_ssl_context *ssl,
1975 unsigned char *buf,
1976 unsigned char *end,
1977 size_t *out_len )
1978{
1979 uint16_t selected_group = ssl->handshake->hrr_selected_group;
1980 /* key_share Extension
1981 *
1982 * struct {
1983 * select (Handshake.msg_type) {
1984 * ...
1985 * case hello_retry_request:
1986 * NamedGroup selected_group;
1987 * ...
1988 * };
1989 * } KeyShare;
1990 */
1991
1992 *out_len = 0;
1993
Jerry Yub0ac10b2022-05-05 11:10:08 +08001994 /*
1995 * For a pure PSK key exchange, there is no group to agree upon. The purpose
1996 * of the HRR is then to transmit a cookie to force the client to demonstrate
1997 * reachability at their apparent network address (primarily useful for DTLS).
1998 */
Ronald Cron79907712022-07-20 17:05:29 +02001999 if( ! mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral( ssl ) )
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002000 return( 0 );
2001
2002 /* We should only send the key_share extension if the client's initial
2003 * key share was not acceptable. */
2004 if( ssl->handshake->offered_group_id != 0 )
2005 {
2006 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Skip key_share extension in HRR" ) );
2007 return( 0 );
2008 }
2009
2010 if( selected_group == 0 )
2011 {
2012 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching named group found" ) );
2013 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
2014 }
2015
Jerry Yub0ac10b2022-05-05 11:10:08 +08002016 /* Check if we have enough space:
2017 * - extension_type (2 bytes)
2018 * - extension_data_length (2 bytes)
2019 * - selected_group (2 bytes)
2020 */
Ronald Cron154d1b62022-06-01 15:33:26 +02002021 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 6 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002022
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002023 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002024 MBEDTLS_PUT_UINT16_BE( 2, buf, 2 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002025 MBEDTLS_PUT_UINT16_BE( selected_group, buf, 4 );
2026
2027 MBEDTLS_SSL_DEBUG_MSG( 3,
2028 ( "HRR selected_group: %s (%x)",
2029 mbedtls_ssl_named_group_to_str( selected_group ),
2030 selected_group ) );
2031
2032 *out_len = 6;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002033
Jerry Yub0ac10b2022-05-05 11:10:08 +08002034 return( 0 );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002035}
Jerry Yu3bf2c642022-03-30 22:02:12 +08002036
2037/*
2038 * Structure of ServerHello message:
2039 *
2040 * struct {
2041 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
2042 * Random random;
2043 * opaque legacy_session_id_echo<0..32>;
2044 * CipherSuite cipher_suite;
2045 * uint8 legacy_compression_method = 0;
2046 * Extension extensions<6..2^16-1>;
2047 * } ServerHello;
2048 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002049MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu3bf2c642022-03-30 22:02:12 +08002050static int ssl_tls13_write_server_hello_body( mbedtls_ssl_context *ssl,
Jerry Yu56404d72022-03-30 17:36:13 +08002051 unsigned char *buf,
2052 unsigned char *end,
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002053 size_t *out_len,
2054 int is_hrr )
Jerry Yu56404d72022-03-30 17:36:13 +08002055{
Jerry Yu955ddd72022-04-22 22:27:33 +08002056 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002057 unsigned char *p = buf;
Jerry Yud9436a12022-04-20 22:28:09 +08002058 unsigned char *p_extensions_len;
Jerry Yufbe3e642022-04-25 19:31:51 +08002059 size_t output_len;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002060
2061 *out_len = 0;
2062
Jerry Yucfc04b32022-04-21 09:31:58 +08002063 /* ...
2064 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
2065 * ...
2066 * with ProtocolVersion defined as:
2067 * uint16 ProtocolVersion;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002068 */
2069 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
2070 MBEDTLS_PUT_UINT16_BE( 0x0303, p, 0 );
2071 p += 2;
2072
Jerry Yu1c3e6882022-04-20 21:23:40 +08002073 /* ...
2074 * Random random;
2075 * ...
Jerry Yucfc04b32022-04-21 09:31:58 +08002076 * with Random defined as:
2077 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu1c3e6882022-04-20 21:23:40 +08002078 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08002079 MBEDTLS_SSL_CHK_BUF_PTR( p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002080 if( is_hrr )
2081 {
2082 memcpy( p, mbedtls_ssl_tls13_hello_retry_request_magic,
Jerry Yufbe3e642022-04-25 19:31:51 +08002083 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002084 }
2085 else
2086 {
2087 memcpy( p, &ssl->handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN],
Jerry Yufbe3e642022-04-25 19:31:51 +08002088 MBEDTLS_SERVER_HELLO_RANDOM_LEN );
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002089 }
Jerry Yu955ddd72022-04-22 22:27:33 +08002090 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes",
Jerry Yu3bf2c642022-03-30 22:02:12 +08002091 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN );
2092 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
2093
Jerry Yucfc04b32022-04-21 09:31:58 +08002094 /* ...
2095 * opaque legacy_session_id_echo<0..32>;
2096 * ...
Jerry Yu3bf2c642022-03-30 22:02:12 +08002097 */
2098 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 + ssl->session_negotiate->id_len );
2099 *p++ = (unsigned char)ssl->session_negotiate->id_len;
2100 if( ssl->session_negotiate->id_len > 0 )
2101 {
2102 memcpy( p, &ssl->session_negotiate->id[0],
2103 ssl->session_negotiate->id_len );
2104 p += ssl->session_negotiate->id_len;
Jerry Yu955ddd72022-04-22 22:27:33 +08002105
Jerry Yu3bf2c642022-03-30 22:02:12 +08002106 MBEDTLS_SSL_DEBUG_BUF( 3, "session id", ssl->session_negotiate->id,
2107 ssl->session_negotiate->id_len );
2108 }
2109
Jerry Yucfc04b32022-04-21 09:31:58 +08002110 /* ...
2111 * CipherSuite cipher_suite;
2112 * ...
2113 * with CipherSuite defined as:
2114 * uint8 CipherSuite[2];
Jerry Yu3bf2c642022-03-30 22:02:12 +08002115 */
2116 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
2117 MBEDTLS_PUT_UINT16_BE( ssl->session_negotiate->ciphersuite, p, 0 );
2118 p += 2;
2119 MBEDTLS_SSL_DEBUG_MSG( 3,
2120 ( "server hello, chosen ciphersuite: %s ( id=%d )",
2121 mbedtls_ssl_get_ciphersuite_name(
2122 ssl->session_negotiate->ciphersuite ),
2123 ssl->session_negotiate->ciphersuite ) );
2124
Jerry Yucfc04b32022-04-21 09:31:58 +08002125 /* ...
2126 * uint8 legacy_compression_method = 0;
2127 * ...
2128 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08002129 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
Thomas Daubney31e03a82022-07-25 15:59:25 +01002130 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002131
Jerry Yucfc04b32022-04-21 09:31:58 +08002132 /* ...
2133 * Extension extensions<6..2^16-1>;
2134 * ...
2135 * struct {
2136 * ExtensionType extension_type; (2 bytes)
2137 * opaque extension_data<0..2^16-1>;
2138 * } Extension;
2139 */
Jerry Yu3bf2c642022-03-30 22:02:12 +08002140 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yud9436a12022-04-20 22:28:09 +08002141 p_extensions_len = p;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002142 p += 2;
2143
Jerry Yue74e04a2022-04-21 09:23:16 +08002144 if( ( ret = ssl_tls13_write_server_hello_supported_versions_ext(
Jerry Yu3bf2c642022-03-30 22:02:12 +08002145 ssl, p, end, &output_len ) ) != 0 )
2146 {
Jerry Yu955ddd72022-04-22 22:27:33 +08002147 MBEDTLS_SSL_DEBUG_RET(
2148 1, "ssl_tls13_write_server_hello_supported_versions_ext", ret );
Jerry Yu3bf2c642022-03-30 22:02:12 +08002149 return( ret );
2150 }
2151 p += output_len;
2152
Jerry Yu56acc942022-07-30 23:02:36 +08002153 if( mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral( ssl ) )
Jerry Yu3bf2c642022-03-30 22:02:12 +08002154 {
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002155 if( is_hrr )
2156 ret = ssl_tls13_write_hrr_key_share_ext( ssl, p, end, &output_len );
2157 else
2158 ret = ssl_tls13_write_key_share_ext( ssl, p, end, &output_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08002159 if( ret != 0 )
2160 return( ret );
2161 p += output_len;
2162 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08002163
Jerry Yu032b15ce2022-07-11 06:10:03 +00002164#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Jerry Yuad4d2bb2022-09-14 22:40:35 +08002165 if( !is_hrr && mbedtls_ssl_tls13_key_exchange_mode_with_psk( ssl ) )
Jerry Yu032b15ce2022-07-11 06:10:03 +00002166 {
Jerry Yubb852022022-07-20 21:10:44 +08002167 ret = ssl_tls13_write_server_pre_shared_key_ext( ssl, p, end, &output_len );
Jerry Yu032b15ce2022-07-11 06:10:03 +00002168 if( ret != 0 )
2169 {
Jerry Yubb852022022-07-20 21:10:44 +08002170 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_server_pre_shared_key_ext",
Jerry Yu032b15ce2022-07-11 06:10:03 +00002171 ret );
2172 return( ret );
2173 }
2174 p += output_len;
2175 }
2176#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2177
Jerry Yud9436a12022-04-20 22:28:09 +08002178 MBEDTLS_PUT_UINT16_BE( p - p_extensions_len - 2, p_extensions_len, 0 );
Jerry Yu3bf2c642022-03-30 22:02:12 +08002179
Jerry Yud9436a12022-04-20 22:28:09 +08002180 MBEDTLS_SSL_DEBUG_BUF( 4, "server hello extensions",
2181 p_extensions_len, p - p_extensions_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08002182
Jerry Yud9436a12022-04-20 22:28:09 +08002183 *out_len = p - buf;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002184
Jerry Yud9436a12022-04-20 22:28:09 +08002185 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello", buf, *out_len );
Jerry Yu3bf2c642022-03-30 22:02:12 +08002186
2187 return( ret );
Jerry Yu56404d72022-03-30 17:36:13 +08002188}
2189
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002190MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue110d252022-05-05 10:19:22 +08002191static int ssl_tls13_finalize_write_server_hello( mbedtls_ssl_context *ssl )
2192{
2193 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf86eb752022-05-06 11:16:55 +08002194 ret = mbedtls_ssl_tls13_compute_handshake_transform( ssl );
Jerry Yue110d252022-05-05 10:19:22 +08002195 if( ret != 0 )
2196 {
Jerry Yuf86eb752022-05-06 11:16:55 +08002197 MBEDTLS_SSL_DEBUG_RET( 1,
2198 "mbedtls_ssl_tls13_compute_handshake_transform",
Jerry Yue110d252022-05-05 10:19:22 +08002199 ret );
2200 return( ret );
2201 }
2202
Jerry Yue110d252022-05-05 10:19:22 +08002203 return( ret );
2204}
2205
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002206MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu5b64ae92022-03-30 17:15:02 +08002207static int ssl_tls13_write_server_hello( mbedtls_ssl_context *ssl )
2208{
Jerry Yu637a3f12022-04-20 21:37:58 +08002209 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf4b27e42022-03-30 17:32:21 +08002210 unsigned char *buf;
2211 size_t buf_len, msg_len;
2212
2213 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
2214
Jerry Yuf4b27e42022-03-30 17:32:21 +08002215 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_server_hello( ssl ) );
2216
Jerry Yu3bf2c642022-03-30 22:02:12 +08002217 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
Jerry Yuf4b27e42022-03-30 17:32:21 +08002218 MBEDTLS_SSL_HS_SERVER_HELLO, &buf, &buf_len ) );
2219
Jerry Yu3bf2c642022-03-30 22:02:12 +08002220 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_server_hello_body( ssl, buf,
2221 buf + buf_len,
Jerry Yu23f7a6f2022-04-23 15:16:45 +08002222 &msg_len,
2223 0 ) );
Jerry Yuf4b27e42022-03-30 17:32:21 +08002224
Jerry Yu3bf2c642022-03-30 22:02:12 +08002225 mbedtls_ssl_add_hs_msg_to_checksum(
Jerry Yuf4b27e42022-03-30 17:32:21 +08002226 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len );
2227
Jerry Yu3bf2c642022-03-30 22:02:12 +08002228 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
Jerry Yuf4b27e42022-03-30 17:32:21 +08002229 ssl, buf_len, msg_len ) );
Jerry Yu637a3f12022-04-20 21:37:58 +08002230
Jerry Yue110d252022-05-05 10:19:22 +08002231 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_write_server_hello( ssl ) );
2232
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002233#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2234 /* The server sends a dummy change_cipher_spec record immediately
2235 * after its first handshake message. This may either be after
2236 * a ServerHello or a HelloRetryRequest.
2237 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02002238 mbedtls_ssl_handshake_set_state(
2239 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002240#else
Jerry Yu637a3f12022-04-20 21:37:58 +08002241 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002242#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yue110d252022-05-05 10:19:22 +08002243
Jerry Yuf4b27e42022-03-30 17:32:21 +08002244cleanup:
2245
2246 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
2247 return( ret );
Jerry Yu5b64ae92022-03-30 17:15:02 +08002248}
2249
Jerry Yu23d1a252022-05-12 18:08:59 +08002250
2251/*
2252 * Handler for MBEDTLS_SSL_HELLO_RETRY_REQUEST
2253 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002254MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron7b840462022-06-01 17:05:53 +02002255static int ssl_tls13_prepare_hello_retry_request( mbedtls_ssl_context *ssl )
Jerry Yu23d1a252022-05-12 18:08:59 +08002256{
2257 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2258 if( ssl->handshake->hello_retry_request_count > 0 )
2259 {
2260 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Too many HRRs" ) );
2261 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2262 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
2263 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
2264 }
2265
2266 /*
2267 * Create stateless transcript hash for HRR
2268 */
2269 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Reset transcript for HRR" ) );
2270 ret = mbedtls_ssl_reset_transcript_for_hrr( ssl );
2271 if( ret != 0 )
2272 {
2273 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_reset_transcript_for_hrr", ret );
2274 return( ret );
2275 }
2276 mbedtls_ssl_session_reset_msg_layer( ssl, 0 );
2277
2278 return( 0 );
2279}
2280
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002281MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu23d1a252022-05-12 18:08:59 +08002282static int ssl_tls13_write_hello_retry_request( mbedtls_ssl_context *ssl )
2283{
2284 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2285 unsigned char *buf;
2286 size_t buf_len, msg_len;
2287
2288 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello retry request" ) );
2289
Ronald Cron7b840462022-06-01 17:05:53 +02002290 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_hello_retry_request( ssl ) );
Jerry Yu23d1a252022-05-12 18:08:59 +08002291
2292 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg(
2293 ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
2294 &buf, &buf_len ) );
2295
2296 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_server_hello_body( ssl, buf,
2297 buf + buf_len,
2298 &msg_len,
2299 1 ) );
2300 mbedtls_ssl_add_hs_msg_to_checksum(
2301 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len );
2302
2303
2304 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg( ssl, buf_len,
2305 msg_len ) );
2306
2307 ssl->handshake->hello_retry_request_count++;
2308
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002309#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2310 /* The server sends a dummy change_cipher_spec record immediately
2311 * after its first handshake message. This may either be after
2312 * a ServerHello or a HelloRetryRequest.
2313 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02002314 mbedtls_ssl_handshake_set_state(
Gabor Mezeif7044ea2022-06-28 16:01:49 +02002315 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002316#else
Jerry Yu23d1a252022-05-12 18:08:59 +08002317 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002318#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yu23d1a252022-05-12 18:08:59 +08002319
2320cleanup:
2321 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello retry request" ) );
2322 return( ret );
2323}
2324
Jerry Yu5b64ae92022-03-30 17:15:02 +08002325/*
Jerry Yu4d3841a2022-04-16 12:37:19 +08002326 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
2327 */
Jerry Yu4d3841a2022-04-16 12:37:19 +08002328
2329/*
2330 * struct {
2331 * Extension extensions<0..2 ^ 16 - 1>;
2332 * } EncryptedExtensions;
2333 *
2334 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002335MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d3841a2022-04-16 12:37:19 +08002336static int ssl_tls13_write_encrypted_extensions_body( mbedtls_ssl_context *ssl,
2337 unsigned char *buf,
2338 unsigned char *end,
2339 size_t *out_len )
2340{
XiaokangQianacb39922022-06-17 10:18:48 +00002341 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002342 unsigned char *p = buf;
2343 size_t extensions_len = 0;
Jerry Yu8937eb42022-05-03 12:12:14 +08002344 unsigned char *p_extensions_len;
XiaokangQianacb39922022-06-17 10:18:48 +00002345 size_t output_len;
Jerry Yu9da5e5a2022-05-03 15:46:09 +08002346
Jerry Yu4d3841a2022-04-16 12:37:19 +08002347 *out_len = 0;
2348
2349 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Jerry Yu8937eb42022-05-03 12:12:14 +08002350 p_extensions_len = p;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002351 p += 2;
2352
Jerry Yu8937eb42022-05-03 12:12:14 +08002353 ((void) ssl);
XiaokangQianacb39922022-06-17 10:18:48 +00002354 ((void) ret);
2355 ((void) output_len);
2356
2357#if defined(MBEDTLS_SSL_ALPN)
2358 ret = mbedtls_ssl_write_alpn_ext( ssl, p, end, &output_len );
2359 if( ret != 0 )
2360 return( ret );
XiaokangQian95d5f542022-06-24 02:29:26 +00002361 p += output_len;
XiaokangQianacb39922022-06-17 10:18:48 +00002362#endif /* MBEDTLS_SSL_ALPN */
Jerry Yu4d3841a2022-04-16 12:37:19 +08002363
Jerry Yu8937eb42022-05-03 12:12:14 +08002364 extensions_len = ( p - p_extensions_len ) - 2;
2365 MBEDTLS_PUT_UINT16_BE( extensions_len, p_extensions_len, 0 );
2366
2367 *out_len = p - buf;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002368
2369 MBEDTLS_SSL_DEBUG_BUF( 4, "encrypted extensions", buf, *out_len );
2370
2371 return( 0 );
2372}
2373
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002374MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d3841a2022-04-16 12:37:19 +08002375static int ssl_tls13_write_encrypted_extensions( mbedtls_ssl_context *ssl )
2376{
2377 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2378 unsigned char *buf;
Jerry Yu39730a72022-05-03 12:14:04 +08002379 size_t buf_len, msg_len;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002380
Gabor Mezei54719122022-06-28 11:34:56 +02002381 mbedtls_ssl_set_outbound_transform( ssl,
2382 ssl->handshake->transform_handshake );
2383 MBEDTLS_SSL_DEBUG_MSG(
2384 3, ( "switching to handshake transform for outbound data" ) );
2385
Jerry Yuab452cc2022-04-28 15:27:08 +08002386 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write encrypted extensions" ) );
Jerry Yu4d3841a2022-04-16 12:37:19 +08002387
Jerry Yu4d3841a2022-04-16 12:37:19 +08002388 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
2389 MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, &buf, &buf_len ) );
2390
2391 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_encrypted_extensions_body(
2392 ssl, buf, buf + buf_len, &msg_len ) );
2393
2394 mbedtls_ssl_add_hs_msg_to_checksum(
2395 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, buf, msg_len );
2396
Jerry Yu4d3841a2022-04-16 12:37:19 +08002397 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
2398 ssl, buf_len, msg_len ) );
2399
Jerry Yu8937eb42022-05-03 12:12:14 +08002400#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Ronald Cron79907712022-07-20 17:05:29 +02002401 if( mbedtls_ssl_tls13_key_exchange_mode_with_psk( ssl ) )
Jerry Yu8937eb42022-05-03 12:12:14 +08002402 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2403 else
XiaokangQiana987e1d2022-05-07 01:25:58 +00002404 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST );
Jerry Yu8937eb42022-05-03 12:12:14 +08002405#else
2406 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2407#endif
2408
Jerry Yu4d3841a2022-04-16 12:37:19 +08002409cleanup:
2410
Jerry Yuab452cc2022-04-28 15:27:08 +08002411 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write encrypted extensions" ) );
Jerry Yu4d3841a2022-04-16 12:37:19 +08002412 return( ret );
2413}
2414
XiaokangQiancec9ae62022-05-06 07:28:50 +00002415#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
XiaokangQiana987e1d2022-05-07 01:25:58 +00002416#define SSL_CERTIFICATE_REQUEST_SEND_REQUEST 0
2417#define SSL_CERTIFICATE_REQUEST_SKIP 1
2418/* Coordination:
2419 * Check whether a CertificateRequest message should be written.
2420 * Returns a negative code on failure, or
2421 * - SSL_CERTIFICATE_REQUEST_SEND_REQUEST
2422 * - SSL_CERTIFICATE_REQUEST_SKIP
2423 * indicating if the writing of the CertificateRequest
2424 * should be skipped or not.
2425 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002426MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiana987e1d2022-05-07 01:25:58 +00002427static int ssl_tls13_certificate_request_coordinate( mbedtls_ssl_context *ssl )
2428{
2429 int authmode;
2430
XiaokangQian40a35232022-05-07 09:02:40 +00002431#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2432 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
2433 authmode = ssl->handshake->sni_authmode;
2434 else
2435#endif
XiaokangQiana987e1d2022-05-07 01:25:58 +00002436 authmode = ssl->conf->authmode;
2437
2438 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2439 return( SSL_CERTIFICATE_REQUEST_SKIP );
2440
XiaokangQianc3017f62022-05-13 05:55:41 +00002441 ssl->handshake->certificate_request_sent = 1;
XiaokangQian189ded22022-05-10 08:12:17 +00002442
XiaokangQiana987e1d2022-05-07 01:25:58 +00002443 return( SSL_CERTIFICATE_REQUEST_SEND_REQUEST );
2444}
2445
XiaokangQiancec9ae62022-05-06 07:28:50 +00002446/*
2447 * struct {
2448 * opaque certificate_request_context<0..2^8-1>;
2449 * Extension extensions<2..2^16-1>;
2450 * } CertificateRequest;
2451 *
2452 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002453MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiancec9ae62022-05-06 07:28:50 +00002454static int ssl_tls13_write_certificate_request_body( mbedtls_ssl_context *ssl,
2455 unsigned char *buf,
2456 const unsigned char *end,
2457 size_t *out_len )
2458{
2459 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2460 unsigned char *p = buf;
XiaokangQianec6efb92022-05-06 09:53:10 +00002461 size_t output_len = 0;
XiaokangQiancec9ae62022-05-06 07:28:50 +00002462 unsigned char *p_extensions_len;
2463
2464 *out_len = 0;
2465
2466 /* Check if we have enough space:
2467 * - certificate_request_context (1 byte)
2468 * - extensions length (2 bytes)
2469 */
2470 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 3 );
2471
2472 /*
2473 * Write certificate_request_context
2474 */
2475 /*
2476 * We use a zero length context for the normal handshake
2477 * messages. For post-authentication handshake messages
2478 * this request context would be set to a non-zero value.
2479 */
2480 *p++ = 0x0;
2481
2482 /*
2483 * Write extensions
2484 */
2485 /* The extensions must contain the signature_algorithms. */
2486 p_extensions_len = p;
2487 p += 2;
XiaokangQianec6efb92022-05-06 09:53:10 +00002488 ret = mbedtls_ssl_write_sig_alg_ext( ssl, p, end, &output_len );
XiaokangQiancec9ae62022-05-06 07:28:50 +00002489 if( ret != 0 )
2490 return( ret );
2491
XiaokangQianec6efb92022-05-06 09:53:10 +00002492 p += output_len;
XiaokangQianaad9b0a2022-05-09 01:11:21 +00002493 MBEDTLS_PUT_UINT16_BE( p - p_extensions_len - 2, p_extensions_len, 0 );
XiaokangQiancec9ae62022-05-06 07:28:50 +00002494
2495 *out_len = p - buf;
2496
2497 return( 0 );
2498}
2499
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002500MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQiancec9ae62022-05-06 07:28:50 +00002501static int ssl_tls13_write_certificate_request( mbedtls_ssl_context *ssl )
2502{
2503 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2504
2505 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
2506
2507 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_certificate_request_coordinate( ssl ) );
2508
2509 if( ret == SSL_CERTIFICATE_REQUEST_SEND_REQUEST )
2510 {
2511 unsigned char *buf;
2512 size_t buf_len, msg_len;
2513
2514 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
2515 MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, &buf, &buf_len ) );
2516
2517 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_certificate_request_body(
2518 ssl, buf, buf + buf_len, &msg_len ) );
2519
2520 mbedtls_ssl_add_hs_msg_to_checksum(
2521 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, buf, msg_len );
2522
2523 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
2524 ssl, buf_len, msg_len ) );
2525 }
2526 else if( ret == SSL_CERTIFICATE_REQUEST_SKIP )
2527 {
2528 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
2529 ret = 0;
2530 }
2531 else
2532 {
2533 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2534 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2535 goto cleanup;
2536 }
2537
2538 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_CERTIFICATE );
2539cleanup:
2540
2541 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
2542 return( ret );
2543}
XiaokangQiancec9ae62022-05-06 07:28:50 +00002544
Jerry Yu4d3841a2022-04-16 12:37:19 +08002545/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002546 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
Jerry Yu83da34e2022-04-16 13:59:52 +08002547 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002548MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002549static int ssl_tls13_write_server_certificate( mbedtls_ssl_context *ssl )
Jerry Yu83da34e2022-04-16 13:59:52 +08002550{
Jerry Yu5a26f302022-05-10 20:46:40 +08002551 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianfb665a82022-06-15 03:57:21 +00002552
2553#if defined(MBEDTLS_X509_CRT_PARSE_C)
2554 if( ( ssl_tls13_pick_key_cert( ssl ) != 0 ) ||
2555 mbedtls_ssl_own_cert( ssl ) == NULL )
Jerry Yu5a26f302022-05-10 20:46:40 +08002556 {
Jerry Yub89125b2022-05-13 15:45:49 +08002557 MBEDTLS_SSL_DEBUG_MSG( 2, ( "No certificate available." ) );
Jerry Yu5a26f302022-05-10 20:46:40 +08002558 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2559 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08002560 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu5a26f302022-05-10 20:46:40 +08002561 }
XiaokangQianfb665a82022-06-15 03:57:21 +00002562#endif /* MBEDTLS_X509_CRT_PARSE_C */
Jerry Yu5a26f302022-05-10 20:46:40 +08002563
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08002564 ret = mbedtls_ssl_tls13_write_certificate( ssl );
2565 if( ret != 0 )
Jerry Yu1bff7112022-04-16 14:29:11 +08002566 return( ret );
Jerry Yu1bff7112022-04-16 14:29:11 +08002567 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY );
2568 return( 0 );
Jerry Yu83da34e2022-04-16 13:59:52 +08002569}
2570
2571/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002572 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
Jerry Yu83da34e2022-04-16 13:59:52 +08002573 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002574MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002575static int ssl_tls13_write_certificate_verify( mbedtls_ssl_context *ssl )
Jerry Yu83da34e2022-04-16 13:59:52 +08002576{
Jerry Yu4ff9e142022-04-16 14:57:49 +08002577 int ret = mbedtls_ssl_tls13_write_certificate_verify( ssl );
Jerry Yuf1c3c4e2022-05-10 11:36:35 +08002578 if( ret != 0 )
Jerry Yu4ff9e142022-04-16 14:57:49 +08002579 return( ret );
Jerry Yu4ff9e142022-04-16 14:57:49 +08002580 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_SERVER_FINISHED );
2581 return( 0 );
Jerry Yu83da34e2022-04-16 13:59:52 +08002582}
Jerry Yu5a26f302022-05-10 20:46:40 +08002583#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08002584
2585/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002586 * Handler for MBEDTLS_SSL_SERVER_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08002587 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002588MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08002589static int ssl_tls13_write_server_finished( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08002590{
Jerry Yud6e253d2022-05-18 13:59:24 +08002591 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu27bdc7c2022-04-16 13:33:27 +08002592
2593 ret = mbedtls_ssl_tls13_write_finished_message( ssl );
2594 if( ret != 0 )
2595 return( ret );
2596
Jerry Yue3d67cb2022-05-19 15:33:10 +08002597 ret = mbedtls_ssl_tls13_compute_application_transform( ssl );
2598 if( ret != 0 )
2599 {
2600 MBEDTLS_SSL_PEND_FATAL_ALERT(
2601 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2602 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
2603 return( ret );
2604 }
XiaokangQianc3017f62022-05-13 05:55:41 +00002605
Ronald Cron63dc4632022-05-31 14:41:53 +02002606 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Switch to handshake keys for inbound traffic" ) );
2607 mbedtls_ssl_set_inbound_transform( ssl, ssl->handshake->transform_handshake );
XiaokangQian189ded22022-05-10 08:12:17 +00002608
Ronald Cron63dc4632022-05-31 14:41:53 +02002609 if( ssl->handshake->certificate_request_sent )
2610 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE );
XiaokangQian189ded22022-05-10 08:12:17 +00002611 else
Ronald Cron19385882022-06-15 16:26:13 +02002612 {
2613 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate" ) );
2614 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate verify" ) );
XiaokangQian189ded22022-05-10 08:12:17 +00002615 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Ronald Cron19385882022-06-15 16:26:13 +02002616 }
Ronald Cron63dc4632022-05-31 14:41:53 +02002617
Jerry Yu27bdc7c2022-04-16 13:33:27 +08002618 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08002619}
2620
2621/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002622 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08002623 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002624MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08002625static int ssl_tls13_process_client_finished( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08002626{
Jerry Yud6e253d2022-05-18 13:59:24 +08002627 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2628
Jerry Yuff226982022-04-16 16:52:57 +08002629 ret = mbedtls_ssl_tls13_process_finished_message( ssl );
2630 if( ret != 0 )
2631 return( ret );
2632
Jerry Yu466dda82022-09-13 11:20:20 +08002633 ret = mbedtls_ssl_tls13_compute_resumption_master_secret( ssl );
Jerry Yue3d67cb2022-05-19 15:33:10 +08002634 if( ret != 0 )
2635 {
2636 MBEDTLS_SSL_DEBUG_RET( 1,
Jerry Yu466dda82022-09-13 11:20:20 +08002637 "mbedtls_ssl_tls13_compute_resumption_master_secret", ret );
Jerry Yue3d67cb2022-05-19 15:33:10 +08002638 }
2639
Jerry Yu03ed50b2022-04-16 17:13:30 +08002640 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP );
Jerry Yuff226982022-04-16 16:52:57 +08002641 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08002642}
2643
2644/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002645 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
Jerry Yu69dd8d42022-04-16 12:51:26 +08002646 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002647MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu4d8567f2022-04-17 10:57:57 +08002648static int ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl )
Jerry Yu69dd8d42022-04-16 12:51:26 +08002649{
Jerry Yu03ed50b2022-04-16 17:13:30 +08002650 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2651
Jerry Yu03ed50b2022-04-16 17:13:30 +08002652 mbedtls_ssl_tls13_handshake_wrapup( ssl );
Jerry Yue67bef42022-07-07 07:29:42 +00002653
2654#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yufca4d572022-07-21 10:37:48 +08002655 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_NEW_SESSION_TICKET );
2656#else
Jerry Yu03ed50b2022-04-16 17:13:30 +08002657 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
Jerry Yufca4d572022-07-21 10:37:48 +08002658#endif
Jerry Yu03ed50b2022-04-16 17:13:30 +08002659 return( 0 );
Jerry Yu69dd8d42022-04-16 12:51:26 +08002660}
2661
2662/*
Jerry Yue67bef42022-07-07 07:29:42 +00002663 * Handler for MBEDTLS_SSL_NEW_SESSION_TICKET
2664 */
2665#define SSL_NEW_SESSION_TICKET_SKIP 0
2666#define SSL_NEW_SESSION_TICKET_WRITE 1
2667MBEDTLS_CHECK_RETURN_CRITICAL
2668static int ssl_tls13_write_new_session_ticket_coordinate( mbedtls_ssl_context *ssl )
2669{
2670 /* Check whether the use of session tickets is enabled */
2671 if( ssl->conf->f_ticket_write == NULL )
2672 {
Jerry Yud0766ec2022-09-22 10:46:57 +08002673 MBEDTLS_SSL_DEBUG_MSG( 2, ( "NewSessionTicket: disabled,"
2674 " callback is not set" ) );
2675 return( SSL_NEW_SESSION_TICKET_SKIP );
2676 }
2677 if( ssl->conf->new_session_tickets_count == 0 )
2678 {
2679 MBEDTLS_SSL_DEBUG_MSG( 2, ( "NewSessionTicket: disabled,"
2680 " configured count is zero" ) );
2681 return( SSL_NEW_SESSION_TICKET_SKIP );
2682 }
2683
2684 if( ssl->handshake->new_session_tickets_count == 0 )
2685 {
2686 MBEDTLS_SSL_DEBUG_MSG( 2, ( "NewSessionTicket: all tickets have "
2687 "been sent." ) );
Jerry Yue67bef42022-07-07 07:29:42 +00002688 return( SSL_NEW_SESSION_TICKET_SKIP );
2689 }
2690
Jerry Yue67bef42022-07-07 07:29:42 +00002691 return( SSL_NEW_SESSION_TICKET_WRITE );
2692}
2693
2694#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2695MBEDTLS_CHECK_RETURN_CRITICAL
2696static int ssl_tls13_prepare_new_session_ticket( mbedtls_ssl_context *ssl,
2697 unsigned char *ticket_nonce,
2698 size_t ticket_nonce_size )
2699{
2700 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2701 mbedtls_ssl_session *session = ssl->session;
2702 mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2703 psa_algorithm_t psa_hash_alg;
2704 int hash_length;
2705
2706 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> prepare NewSessionTicket msg" ) );
2707
2708#if defined(MBEDTLS_HAVE_TIME)
2709 session->start = mbedtls_time( NULL );
2710#endif
2711
2712 /* Generate ticket_age_add */
2713 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng,
Jerry Yufca4d572022-07-21 10:37:48 +08002714 (unsigned char *) &session->ticket_age_add,
Jerry Yue67bef42022-07-07 07:29:42 +00002715 sizeof( session->ticket_age_add ) ) != 0 ) )
2716 {
2717 MBEDTLS_SSL_DEBUG_RET( 1, "generate_ticket_age_add", ret );
2718 return( ret );
2719 }
2720 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket_age_add: %u",
Jerry Yufca4d572022-07-21 10:37:48 +08002721 (unsigned int)session->ticket_age_add ) );
Jerry Yue67bef42022-07-07 07:29:42 +00002722
2723 /* Generate ticket_nonce */
2724 ret = ssl->conf->f_rng( ssl->conf->p_rng, ticket_nonce, ticket_nonce_size );
2725 if( ret != 0 )
2726 {
2727 MBEDTLS_SSL_DEBUG_RET( 1, "generate_ticket_nonce", ret );
2728 return( ret );
2729 }
2730 MBEDTLS_SSL_DEBUG_BUF( 3, "ticket_nonce:",
2731 ticket_nonce, ticket_nonce_size );
2732
2733 ciphersuite_info =
2734 (mbedtls_ssl_ciphersuite_t *) ssl->handshake->ciphersuite_info;
2735 psa_hash_alg = mbedtls_psa_translate_md( ciphersuite_info->mac );
2736 hash_length = PSA_HASH_LENGTH( psa_hash_alg );
Jerry Yufca4d572022-07-21 10:37:48 +08002737 if( hash_length == -1 ||
Jerry Yu61197152022-07-21 16:28:02 +08002738 (size_t)hash_length > sizeof( session->resumption_key ) )
Jerry Yufca4d572022-07-21 10:37:48 +08002739 {
Jerry Yue67bef42022-07-07 07:29:42 +00002740 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yufca4d572022-07-21 10:37:48 +08002741 }
2742
Jerry Yue67bef42022-07-07 07:29:42 +00002743 /* In this code the psk key length equals the length of the hash */
2744 session->resumption_key_len = hash_length;
2745 session->ciphersuite = ciphersuite_info->id;
2746
2747 /* Compute resumption key
2748 *
2749 * HKDF-Expand-Label( resumption_master_secret,
2750 * "resumption", ticket_nonce, Hash.length )
2751 */
2752 ret = mbedtls_ssl_tls13_hkdf_expand_label(
2753 psa_hash_alg,
2754 session->app_secrets.resumption_master_secret,
2755 hash_length,
2756 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( resumption ),
2757 ticket_nonce,
2758 ticket_nonce_size,
2759 session->resumption_key,
2760 hash_length );
2761
2762 if( ret != 0 )
2763 {
2764 MBEDTLS_SSL_DEBUG_RET( 2,
2765 "Creating the ticket-resumed PSK failed",
2766 ret );
2767 return ( ret );
2768 }
2769 MBEDTLS_SSL_DEBUG_BUF( 3, "Ticket-resumed PSK",
2770 session->resumption_key,
2771 session->resumption_key_len );
2772
2773 MBEDTLS_SSL_DEBUG_BUF( 3, "resumption_master_secret",
2774 session->app_secrets.resumption_master_secret,
2775 hash_length );
2776
2777 return( 0 );
2778}
2779
2780/* This function creates a NewSessionTicket message in the following format:
2781 *
2782 * struct {
2783 * uint32 ticket_lifetime;
2784 * uint32 ticket_age_add;
2785 * opaque ticket_nonce<0..255>;
2786 * opaque ticket<1..2^16-1>;
2787 * Extension extensions<0..2^16-2>;
2788 * } NewSessionTicket;
2789 *
2790 * The ticket inside the NewSessionTicket message is an encrypted container
2791 * carrying the necessary information so that the server is later able to
2792 * re-start the communication.
2793 *
2794 * The following fields are placed inside the ticket by the
2795 * f_ticket_write() function:
2796 *
2797 * - creation time (start)
2798 * - flags (flags)
2799 * - age add (ticket_age_add)
2800 * - key (key)
2801 * - key length (key_len)
2802 * - ciphersuite (ciphersuite)
2803 */
2804MBEDTLS_CHECK_RETURN_CRITICAL
2805static int ssl_tls13_write_new_session_ticket_body( mbedtls_ssl_context *ssl,
2806 unsigned char *buf,
2807 unsigned char *end,
2808 size_t *out_len,
2809 unsigned char *ticket_nonce,
2810 size_t ticket_nonce_size )
2811{
2812 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2813 unsigned char *p = buf;
2814 mbedtls_ssl_session *session = ssl->session;
2815 size_t ticket_len;
2816 uint32_t ticket_lifetime;
2817
2818 *out_len = 0;
2819 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write NewSessionTicket msg" ) );
2820
2821 /*
2822 * ticket_lifetime 4 bytes
2823 * ticket_age_add 4 bytes
2824 * ticket_nonce 1 + ticket_nonce_size bytes
2825 * ticket >=2 bytes
2826 */
2827 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 + 4 + 1 + ticket_nonce_size + 2 );
2828
2829 /* Generate ticket and ticket_lifetime */
2830 ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket,
2831 session,
2832 p + 9 + ticket_nonce_size + 2,
2833 end,
2834 &ticket_len,
2835 &ticket_lifetime);
2836 if( ret != 0 )
2837 {
2838 MBEDTLS_SSL_DEBUG_RET( 1, "write_ticket", ret );
2839 return( ret );
2840 }
2841 /* RFC 8446 4.6.1
2842 * ticket_lifetime: Indicates the lifetime in seconds as a 32-bit
2843 * unsigned integer in network byte order from the time of ticket
2844 * issuance. Servers MUST NOT use any value greater than
2845 * 604800 seconds (7 days). The value of zero indicates that the
2846 * ticket should be discarded immediately. Clients MUST NOT cache
2847 * tickets for longer than 7 days, regardless of the ticket_lifetime,
2848 * and MAY delete tickets earlier based on local policy. A server
2849 * MAY treat a ticket as valid for a shorter period of time than what
2850 * is stated in the ticket_lifetime.
2851 */
2852 ticket_lifetime %= 604800;
2853 MBEDTLS_PUT_UINT32_BE( ticket_lifetime, p, 0 );
2854 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket_lifetime: %u",
2855 ( unsigned int )ticket_lifetime ) );
2856
2857 /* Write ticket_age_add */
2858 MBEDTLS_PUT_UINT32_BE( session->ticket_age_add, p, 4 );
2859 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket_age_add: %u",
2860 ( unsigned int )session->ticket_age_add ) );
2861
2862 /* Write ticket_nonce */
2863 p[8] = ( unsigned char )ticket_nonce_size;
2864 if( ticket_nonce_size > 0 )
2865 {
2866 memcpy( p + 9, ticket_nonce, ticket_nonce_size );
2867 }
2868 p += 9 + ticket_nonce_size;
2869
2870 /* Write ticket */
2871 MBEDTLS_PUT_UINT16_BE( ticket_len, p, 0 );
2872 p += 2;
2873 MBEDTLS_SSL_DEBUG_BUF( 4, "ticket", p, ticket_len);
2874 p += ticket_len;
2875
2876 /* Ticket Extensions
2877 *
2878 * Note: We currently don't have any extensions.
2879 * Set length to zero.
2880 */
2881 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
2882 MBEDTLS_PUT_UINT16_BE( 0, p, 0 );
2883 p += 2;
2884
2885 *out_len = p - buf;
2886 MBEDTLS_SSL_DEBUG_BUF( 4, "ticket", buf, *out_len );
2887 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
2888
2889 return( 0 );
2890}
2891
2892/*
2893 * Handler for MBEDTLS_SSL_NEW_SESSION_TICKET
2894 */
2895static int ssl_tls13_write_new_session_ticket( mbedtls_ssl_context *ssl )
2896{
2897 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2898
2899 MBEDTLS_SSL_PROC_CHK_NEG( ssl_tls13_write_new_session_ticket_coordinate( ssl ) );
2900
2901 if( ret == SSL_NEW_SESSION_TICKET_WRITE )
2902 {
2903 unsigned char ticket_nonce[MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH];
2904 unsigned char *buf;
2905 size_t buf_len, msg_len;
2906
2907 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_new_session_ticket(
2908 ssl, ticket_nonce, sizeof( ticket_nonce ) ) );
2909
2910 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_start_handshake_msg( ssl,
2911 MBEDTLS_SSL_HS_NEW_SESSION_TICKET, &buf, &buf_len ) );
2912
2913 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_new_session_ticket_body(
2914 ssl, buf, buf + buf_len, &msg_len,
2915 ticket_nonce, sizeof( ticket_nonce ) ) );
2916
Jerry Yue67bef42022-07-07 07:29:42 +00002917 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_finish_handshake_msg(
2918 ssl, buf_len, msg_len ) );
Jerry Yufca4d572022-07-21 10:37:48 +08002919
Jerry Yu359e65f2022-09-22 23:47:43 +08002920 /* Limit session tickets count to one when resumption connection.
2921 *
2922 * See document of mbedtls_ssl_conf_new_session_tickets.
2923 */
2924 if( ssl->handshake->resume == 1 )
2925 ssl->handshake->new_session_tickets_count = 0;
2926 else
2927 ssl->handshake->new_session_tickets_count--;
Jerry Yub7e3fa72022-09-22 11:07:18 +08002928
Jerry Yufca4d572022-07-21 10:37:48 +08002929 mbedtls_ssl_handshake_set_state( ssl,
2930 MBEDTLS_SSL_NEW_SESSION_TICKET_FLUSH );
Jerry Yue67bef42022-07-07 07:29:42 +00002931 }
2932 else
2933 {
2934 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
2935 }
2936
Jerry Yue67bef42022-07-07 07:29:42 +00002937cleanup:
2938
2939 return( ret );
2940}
2941#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2942
2943/*
XiaokangQiane8ff3502022-04-22 02:34:40 +00002944 * TLS 1.3 State Machine -- server side
XiaokangQian7807f9f2022-02-15 10:04:37 +00002945 */
Jerry Yu27561932021-08-27 17:07:38 +08002946int mbedtls_ssl_tls13_handshake_server_step( mbedtls_ssl_context *ssl )
Jerry Yub9930e72021-08-06 17:11:51 +08002947{
XiaokangQian08037552022-04-20 07:16:41 +00002948 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002949
2950 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
2951 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2952
Jerry Yue3b34122021-09-28 17:53:35 +08002953 MBEDTLS_SSL_DEBUG_MSG( 2, ( "tls13 server state: %s(%d)",
2954 mbedtls_ssl_states_str( ssl->state ),
2955 ssl->state ) );
Jerry Yu6e81b272021-09-27 11:16:17 +08002956
XiaokangQian7807f9f2022-02-15 10:04:37 +00002957 switch( ssl->state )
2958 {
2959 /* start state */
2960 case MBEDTLS_SSL_HELLO_REQUEST:
XiaokangQian7807f9f2022-02-15 10:04:37 +00002961 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
XiaokangQian08037552022-04-20 07:16:41 +00002962 ret = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002963 break;
2964
XiaokangQian7807f9f2022-02-15 10:04:37 +00002965 case MBEDTLS_SSL_CLIENT_HELLO:
XiaokangQian4080a7f2022-04-11 09:55:18 +00002966 ret = ssl_tls13_process_client_hello( ssl );
XiaokangQian7807f9f2022-02-15 10:04:37 +00002967 if( ret != 0 )
XiaokangQian4080a7f2022-04-11 09:55:18 +00002968 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_process_client_hello", ret );
Jerry Yuf41553b2022-05-09 22:20:30 +08002969 break;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002970
Jerry Yuf41553b2022-05-09 22:20:30 +08002971 case MBEDTLS_SSL_HELLO_RETRY_REQUEST:
2972 ret = ssl_tls13_write_hello_retry_request( ssl );
2973 if( ret != 0 )
2974 {
2975 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_hello_retry_request", ret );
2976 return( ret );
2977 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00002978 break;
2979
Jerry Yu5b64ae92022-03-30 17:15:02 +08002980 case MBEDTLS_SSL_SERVER_HELLO:
2981 ret = ssl_tls13_write_server_hello( ssl );
2982 break;
2983
Xiaofei Baicba64af2022-02-15 10:00:56 +00002984 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Jerry Yu4d3841a2022-04-16 12:37:19 +08002985 ret = ssl_tls13_write_encrypted_extensions( ssl );
Xiaofei Baicba64af2022-02-15 10:00:56 +00002986 if( ret != 0 )
2987 {
Jerry Yu4d3841a2022-04-16 12:37:19 +08002988 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls13_write_encrypted_extensions", ret );
2989 return( ret );
Xiaofei Baicba64af2022-02-15 10:00:56 +00002990 }
Jerry Yu48330562022-05-06 21:35:44 +08002991 break;
Jerry Yu6a2cd9e2022-05-05 11:14:19 +08002992
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002993#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
2994 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Xiaofei Bai5ee73d82022-03-14 02:48:30 +00002995 ret = ssl_tls13_write_certificate_request( ssl );
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002996 break;
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002997
Jerry Yu83da34e2022-04-16 13:59:52 +08002998 case MBEDTLS_SSL_SERVER_CERTIFICATE:
2999 ret = ssl_tls13_write_server_certificate( ssl );
3000 break;
3001
3002 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
3003 ret = ssl_tls13_write_certificate_verify( ssl );
3004 break;
Jerry Yu5a26f302022-05-10 20:46:40 +08003005#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08003006
Gabor Mezei7b39bf12022-05-24 16:04:14 +02003007 /*
3008 * Injection of dummy-CCS's for middlebox compatibility
3009 */
3010#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Gabor Mezeif7044ea2022-06-28 16:01:49 +02003011 case MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST:
Gabor Mezei7b39bf12022-05-24 16:04:14 +02003012 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
3013 if( ret == 0 )
3014 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_CLIENT_HELLO );
3015 break;
3016
3017 case MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO:
3018 ret = mbedtls_ssl_tls13_write_change_cipher_spec( ssl );
3019 if( ret == 0 )
3020 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS );
3021 break;
3022#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
3023
Jerry Yu69dd8d42022-04-16 12:51:26 +08003024 case MBEDTLS_SSL_SERVER_FINISHED:
3025 ret = ssl_tls13_write_server_finished( ssl );
3026 break;
3027
3028 case MBEDTLS_SSL_CLIENT_FINISHED:
3029 ret = ssl_tls13_process_client_finished( ssl );
3030 break;
3031
Jerry Yu69dd8d42022-04-16 12:51:26 +08003032 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3033 ret = ssl_tls13_handshake_wrapup( ssl );
3034 break;
3035
XiaokangQian6b916b12022-04-25 07:29:34 +00003036 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3037 ret = mbedtls_ssl_tls13_process_certificate( ssl );
Ronald Cron209cae92022-06-07 10:30:19 +02003038 if( ret == 0 )
XiaokangQian6b916b12022-04-25 07:29:34 +00003039 {
Ronald Cron209cae92022-06-07 10:30:19 +02003040 if( ssl->session_negotiate->peer_cert != NULL )
3041 {
3042 mbedtls_ssl_handshake_set_state(
3043 ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY );
3044 }
3045 else
Ronald Cron19385882022-06-15 16:26:13 +02003046 {
3047 MBEDTLS_SSL_DEBUG_MSG( 2, ( "skip parse certificate verify" ) );
Ronald Cron209cae92022-06-07 10:30:19 +02003048 mbedtls_ssl_handshake_set_state(
3049 ssl, MBEDTLS_SSL_CLIENT_FINISHED );
Ronald Cron19385882022-06-15 16:26:13 +02003050 }
XiaokangQian6b916b12022-04-25 07:29:34 +00003051 }
3052 break;
3053
3054 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
3055 ret = mbedtls_ssl_tls13_process_certificate_verify( ssl );
3056 if( ret == 0 )
3057 {
3058 mbedtls_ssl_handshake_set_state(
3059 ssl, MBEDTLS_SSL_CLIENT_FINISHED );
3060 }
3061 break;
3062
Jerry Yue67bef42022-07-07 07:29:42 +00003063#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3064 case MBEDTLS_SSL_NEW_SESSION_TICKET:
3065 ret = ssl_tls13_write_new_session_ticket( ssl );
3066 if( ret != 0 )
3067 {
3068 MBEDTLS_SSL_DEBUG_RET( 1,
3069 "ssl_tls13_write_new_session_ticket ",
3070 ret );
3071 }
3072 break;
3073 case MBEDTLS_SSL_NEW_SESSION_TICKET_FLUSH:
3074 /* This state is necessary to do the flush of the New Session
3075 * Ticket message written in MBEDTLS_SSL_NEW_SESSION_TICKET
3076 * as part of ssl_prepare_handshake_step.
3077 */
3078 ret = 0;
Jerry Yud4e75002022-08-09 13:33:50 +08003079
Jerry Yud0766ec2022-09-22 10:46:57 +08003080 if( ssl->handshake->new_session_tickets_count == 0 )
Jerry Yud4e75002022-08-09 13:33:50 +08003081 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
3082 else
3083 mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_NEW_SESSION_TICKET );
Jerry Yue67bef42022-07-07 07:29:42 +00003084 break;
3085
3086#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3087
XiaokangQian7807f9f2022-02-15 10:04:37 +00003088 default:
3089 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
XiaokangQian060d8672022-04-21 09:24:56 +00003090 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
XiaokangQian7807f9f2022-02-15 10:04:37 +00003091 }
3092
3093 return( ret );
Jerry Yub9930e72021-08-06 17:11:51 +08003094}
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08003095
Jerry Yufb4b6472022-01-27 15:03:26 +08003096#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_3 */