blob: 980c2255b01283e6601767de4fb4854cc37f8566 [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.
Gilles Peskine449bd832023-01-11 14:50:10 +010018 */
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080019
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
Jerry Yuf35ba382022-08-23 17:58:26 +080033
Jerry Yuc5a23a02022-08-25 10:51:44 +080034static const mbedtls_ssl_ciphersuite_t *ssl_tls13_validate_peer_ciphersuite(
Gilles Peskine449bd832023-01-11 14:50:10 +010035 mbedtls_ssl_context *ssl,
36 unsigned int cipher_suite)
Jerry Yuf35ba382022-08-23 17:58:26 +080037{
38 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +010039 if (!mbedtls_ssl_tls13_cipher_suite_is_offered(ssl, cipher_suite)) {
40 return NULL;
Jerry Yuf35ba382022-08-23 17:58:26 +080041 }
Gilles Peskine449bd832023-01-11 14:50:10 +010042
43 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
44 if ((mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info,
45 ssl->tls_version,
46 ssl->tls_version) != 0)) {
47 return NULL;
48 }
49 return ciphersuite_info;
Jerry Yuf35ba382022-08-23 17:58:26 +080050}
51
Ronald Cron41a443a2022-10-04 16:38:25 +020052#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yue19e3b92022-07-08 12:04:51 +000053/* From RFC 8446:
54 *
55 * enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;
56 * struct {
57 * PskKeyExchangeMode ke_modes<1..255>;
58 * } PskKeyExchangeModes;
59 */
Jerry Yu6e74a7e2022-07-20 20:49:32 +080060MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010061static int ssl_tls13_parse_key_exchange_modes_ext(mbedtls_ssl_context *ssl,
62 const unsigned char *buf,
63 const unsigned char *end)
Jerry Yue19e3b92022-07-08 12:04:51 +000064{
Jerry Yu299e31f2022-07-13 23:06:36 +080065 const unsigned char *p = buf;
Jerry Yue19e3b92022-07-08 12:04:51 +000066 size_t ke_modes_len;
67 int ke_modes = 0;
68
Jerry Yu854dd9e2022-07-15 14:28:27 +080069 /* Read ke_modes length (1 Byte) */
Gilles Peskine449bd832023-01-11 14:50:10 +010070 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
Jerry Yu299e31f2022-07-13 23:06:36 +080071 ke_modes_len = *p++;
Jerry Yue19e3b92022-07-08 12:04:51 +000072 /* Currently, there are only two PSK modes, so even without looking
73 * at the content, something's wrong if the list has more than 2 items. */
Gilles Peskine449bd832023-01-11 14:50:10 +010074 if (ke_modes_len > 2) {
75 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
76 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
77 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu299e31f2022-07-13 23:06:36 +080078 }
Jerry Yue19e3b92022-07-08 12:04:51 +000079
Gilles Peskine449bd832023-01-11 14:50:10 +010080 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, ke_modes_len);
Jerry Yue19e3b92022-07-08 12:04:51 +000081
Gilles Peskine449bd832023-01-11 14:50:10 +010082 while (ke_modes_len-- != 0) {
83 switch (*p++) {
84 case MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE:
85 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
86 MBEDTLS_SSL_DEBUG_MSG(3, ("Found PSK KEX MODE"));
87 break;
88 case MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE:
89 ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
90 MBEDTLS_SSL_DEBUG_MSG(3, ("Found PSK_EPHEMERAL KEX MODE"));
91 break;
92 default:
93 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
94 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
95 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yue19e3b92022-07-08 12:04:51 +000096 }
97 }
98
99 ssl->handshake->tls13_kex_modes = ke_modes;
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 return 0;
Jerry Yue19e3b92022-07-08 12:04:51 +0000101}
Jerry Yu1c105562022-07-10 06:32:38 +0000102
Jerry Yue9d4fc02022-08-20 19:21:15 +0800103#define SSL_TLS1_3_OFFERED_PSK_NOT_MATCH 1
104#define SSL_TLS1_3_OFFERED_PSK_MATCH 0
Jerry Yu95699e72022-08-21 19:22:23 +0800105
106#if defined(MBEDTLS_SSL_SESSION_TICKETS)
107
108MBEDTLS_CHECK_RETURN_CRITICAL
109static int ssl_tls13_offered_psks_check_identity_match_ticket(
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 mbedtls_ssl_context *ssl,
111 const unsigned char *identity,
112 size_t identity_len,
113 uint32_t obfuscated_ticket_age,
114 mbedtls_ssl_session *session)
Jerry Yu95699e72022-08-21 19:22:23 +0800115{
Jerry Yufd310eb2022-09-06 09:16:35 +0800116 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu95699e72022-08-21 19:22:23 +0800117 unsigned char *ticket_buffer;
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800118#if defined(MBEDTLS_HAVE_TIME)
119 mbedtls_time_t now;
Jerry Yuacff8232022-09-14 14:35:11 +0800120 uint64_t age_in_s;
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800121 int64_t age_diff_in_ms;
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800122#endif
Jerry Yu95699e72022-08-21 19:22:23 +0800123
124 ((void) obfuscated_ticket_age);
125
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 MBEDTLS_SSL_DEBUG_MSG(2, ("=> check_identity_match_ticket"));
Jerry Yu95699e72022-08-21 19:22:23 +0800127
Jerry Yufd310eb2022-09-06 09:16:35 +0800128 /* Ticket parser is not configured, Skip */
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 if (ssl->conf->f_ticket_parse == NULL || identity_len == 0) {
130 return 0;
131 }
Jerry Yu95699e72022-08-21 19:22:23 +0800132
Jerry Yu4746b102022-09-13 11:11:48 +0800133 /* We create a copy of the encrypted ticket since the ticket parsing
134 * function is allowed to use its input buffer as an output buffer
135 * (in-place decryption). We do, however, need the original buffer for
136 * computing the PSK binder value.
Jerry Yu95699e72022-08-21 19:22:23 +0800137 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 ticket_buffer = mbedtls_calloc(1, identity_len);
139 if (ticket_buffer == NULL) {
140 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
141 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Jerry Yu95699e72022-08-21 19:22:23 +0800142 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 memcpy(ticket_buffer, identity, identity_len);
Jerry Yu95699e72022-08-21 19:22:23 +0800144
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket,
146 session,
147 ticket_buffer, identity_len)) != 0) {
148 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
149 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
150 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
151 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
152 } else {
153 MBEDTLS_SSL_DEBUG_RET(1, "ticket_parse", ret);
154 }
Jerry Yu95699e72022-08-21 19:22:23 +0800155 }
156
157 /* We delete the temporary buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 mbedtls_free(ticket_buffer);
Jerry Yu95699e72022-08-21 19:22:23 +0800159
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 if (ret != 0) {
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800161 goto exit;
162 }
Jerry Yu95699e72022-08-21 19:22:23 +0800163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;
165#if defined(MBEDTLS_HAVE_TIME)
166 now = mbedtls_time(NULL);
167
168 if (now < session->start) {
169 MBEDTLS_SSL_DEBUG_MSG(
170 3, ("Invalid ticket start time ( now=%" MBEDTLS_PRINTF_LONGLONG
171 ", start=%" MBEDTLS_PRINTF_LONGLONG " )",
172 (long long) now, (long long) session->start));
173 goto exit;
174 }
175
176 age_in_s = (uint64_t) (now - session->start);
Jerry Yu95699e72022-08-21 19:22:23 +0800177
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800178 /* RFC 8446 section 4.6.1
179 *
180 * Servers MUST NOT use any value greater than 604800 seconds (7 days).
181 *
182 * RFC 8446 section 4.2.11.1
183 *
184 * Clients MUST NOT attempt to use tickets which have ages greater than
185 * the "ticket_lifetime" value which was provided with the ticket.
186 *
187 * For time being, the age MUST be less than 604800 seconds (7 days).
188 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 if (age_in_s > 604800) {
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800190 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 3, ("Ticket age exceeds limitation ticket_age=%lu",
192 (long unsigned int) age_in_s));
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 /* RFC 8446 section 4.2.10
197 *
198 * For PSKs provisioned via NewSessionTicket, a server MUST validate that
199 * the ticket age for the selected PSK identity (computed by subtracting
200 * ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2^32) is
201 * within a small tolerance of the time since the ticket was issued.
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800202 *
Jerry Yu0a55cc62022-09-15 16:15:06 +0800203 * NOTE: When `now == session->start`, `age_diff_in_ms` may be negative
204 * as the age units are different on the server (s) and in the
205 * client (ms) side. Add a -1000 ms tolerance window to take this
206 * into account.
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800207 */
Jerry Yuf7dad3c2022-09-14 22:31:39 +0800208 age_diff_in_ms = age_in_s * 1000;
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 age_diff_in_ms -= (obfuscated_ticket_age - session->ticket_age_add);
210 if (age_diff_in_ms <= -1000 ||
211 age_diff_in_ms > MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE) {
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800212 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 3, ("Ticket age outside tolerance window ( diff=%d )",
214 (int) age_diff_in_ms));
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800215 goto exit;
216 }
217
218 ret = 0;
Jerry Yu95699e72022-08-21 19:22:23 +0800219
220#endif /* MBEDTLS_HAVE_TIME */
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800221
222exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 if (ret != 0) {
224 mbedtls_ssl_session_free(session);
225 }
Jerry Yu95699e72022-08-21 19:22:23 +0800226
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 MBEDTLS_SSL_DEBUG_MSG(2, ("<= check_identity_match_ticket"));
228 return ret;
Jerry Yu95699e72022-08-21 19:22:23 +0800229}
230#endif /* MBEDTLS_SSL_SESSION_TICKETS */
231
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800232MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu1c105562022-07-10 06:32:38 +0000233static int ssl_tls13_offered_psks_check_identity_match(
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 mbedtls_ssl_context *ssl,
235 const unsigned char *identity,
236 size_t identity_len,
237 uint32_t obfuscated_ticket_age,
238 int *psk_type,
239 mbedtls_ssl_session *session)
Jerry Yu1c105562022-07-10 06:32:38 +0000240{
Jerry Yu95699e72022-08-21 19:22:23 +0800241 ((void) session);
242 ((void) obfuscated_ticket_age);
Jerry Yu5725f1c2022-08-21 17:27:16 +0800243 *psk_type = MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL;
Jerry Yu95699e72022-08-21 19:22:23 +0800244
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 MBEDTLS_SSL_DEBUG_BUF(4, "identity", identity, identity_len);
Jerry Yu95699e72022-08-21 19:22:23 +0800246 ssl->handshake->resume = 0;
247
Jerry Yu95699e72022-08-21 19:22:23 +0800248#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 if (ssl_tls13_offered_psks_check_identity_match_ticket(
Jerry Yu8d4bbba2022-09-13 14:15:48 +0800250 ssl, identity, identity_len, obfuscated_ticket_age,
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 session) == SSL_TLS1_3_OFFERED_PSK_MATCH) {
Jerry Yu95699e72022-08-21 19:22:23 +0800252 ssl->handshake->resume = 1;
253 *psk_type = MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION;
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 mbedtls_ssl_set_hs_psk(ssl,
Jerry Yu0a55cc62022-09-15 16:15:06 +0800255 session->resumption_key,
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 session->resumption_key_len);
257
258 MBEDTLS_SSL_DEBUG_BUF(4, "Ticket-resumed PSK:",
259 session->resumption_key,
260 session->resumption_key_len);
261 MBEDTLS_SSL_DEBUG_MSG(4, ("ticket: obfuscated_ticket_age: %u",
262 (unsigned) obfuscated_ticket_age));
263 return SSL_TLS1_3_OFFERED_PSK_MATCH;
Jerry Yu95699e72022-08-21 19:22:23 +0800264 }
265#endif /* MBEDTLS_SSL_SESSION_TICKETS */
266
Jerry Yu1c105562022-07-10 06:32:38 +0000267 /* Check identity with external configured function */
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 if (ssl->conf->f_psk != NULL) {
269 if (ssl->conf->f_psk(
270 ssl->conf->p_psk, ssl, identity, identity_len) == 0) {
271 return SSL_TLS1_3_OFFERED_PSK_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000272 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 return SSL_TLS1_3_OFFERED_PSK_NOT_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000274 }
275
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 MBEDTLS_SSL_DEBUG_BUF(5, "identity", identity, identity_len);
Jerry Yu1c105562022-07-10 06:32:38 +0000277 /* Check identity with pre-configured psk */
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 if (ssl->conf->psk_identity != NULL &&
Jerry Yu2f0abc92022-07-22 19:34:48 +0800279 identity_len == ssl->conf->psk_identity_len &&
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 mbedtls_ct_memcmp(ssl->conf->psk_identity,
281 identity, identity_len) == 0) {
282 mbedtls_ssl_set_hs_psk(ssl, ssl->conf->psk, ssl->conf->psk_len);
283 return SSL_TLS1_3_OFFERED_PSK_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000284 }
285
Gilles Peskine449bd832023-01-11 14:50:10 +0100286 return SSL_TLS1_3_OFFERED_PSK_NOT_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000287}
288
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800289MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100290static int ssl_tls13_offered_psks_check_binder_match(mbedtls_ssl_context *ssl,
291 const unsigned char *binder,
292 size_t binder_len,
293 int psk_type,
294 psa_algorithm_t psk_hash_alg)
Jerry Yu1c105562022-07-10 06:32:38 +0000295{
296 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu96a2e362022-07-21 15:11:34 +0800297
Jerry Yudaf375a2022-07-20 21:31:43 +0800298 unsigned char transcript[PSA_HASH_MAX_SIZE];
Jerry Yu1c105562022-07-10 06:32:38 +0000299 size_t transcript_len;
Jerry Yu2f0abc92022-07-22 19:34:48 +0800300 unsigned char *psk;
Jerry Yu96a2e362022-07-21 15:11:34 +0800301 size_t psk_len;
Jerry Yudaf375a2022-07-20 21:31:43 +0800302 unsigned char server_computed_binder[PSA_HASH_MAX_SIZE];
Jerry Yu1c105562022-07-10 06:32:38 +0000303
Jerry Yu1c105562022-07-10 06:32:38 +0000304 /* Get current state of handshake transcript. */
Jerry Yu29d9faa2022-08-23 17:52:45 +0800305 ret = mbedtls_ssl_get_handshake_transcript(
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 ssl, mbedtls_hash_info_md_from_psa(psk_hash_alg),
307 transcript, sizeof(transcript), &transcript_len);
308 if (ret != 0) {
309 return ret;
310 }
Jerry Yu1c105562022-07-10 06:32:38 +0000311
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 ret = mbedtls_ssl_tls13_export_handshake_psk(ssl, &psk, &psk_len);
313 if (ret != 0) {
314 return ret;
315 }
Jerry Yu96a2e362022-07-21 15:11:34 +0800316
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 ret = mbedtls_ssl_tls13_create_psk_binder(ssl, psk_hash_alg,
318 psk, psk_len, psk_type,
319 transcript,
320 server_computed_binder);
Jerry Yu96a2e362022-07-21 15:11:34 +0800321#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 mbedtls_free((void *) psk);
Jerry Yu96a2e362022-07-21 15:11:34 +0800323#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 if (ret != 0) {
325 MBEDTLS_SSL_DEBUG_MSG(1, ("PSK binder calculation failed."));
326 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu1c105562022-07-10 06:32:38 +0000327 }
328
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 MBEDTLS_SSL_DEBUG_BUF(3, "psk binder ( computed ): ",
330 server_computed_binder, transcript_len);
331 MBEDTLS_SSL_DEBUG_BUF(3, "psk binder ( received ): ", binder, binder_len);
Jerry Yu1c105562022-07-10 06:32:38 +0000332
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 if (mbedtls_ct_memcmp(server_computed_binder, binder, binder_len) == 0) {
334 return SSL_TLS1_3_OFFERED_PSK_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000335 }
336
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 mbedtls_platform_zeroize(server_computed_binder,
338 sizeof(server_computed_binder));
339 return SSL_TLS1_3_OFFERED_PSK_NOT_MATCH;
Jerry Yu1c105562022-07-10 06:32:38 +0000340}
Jerry Yu96a2e362022-07-21 15:11:34 +0800341
Jerry Yu5725f1c2022-08-21 17:27:16 +0800342MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf35ba382022-08-23 17:58:26 +0800343static int ssl_tls13_select_ciphersuite_for_psk(
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 mbedtls_ssl_context *ssl,
345 const unsigned char *cipher_suites,
346 const unsigned char *cipher_suites_end,
347 uint16_t *selected_ciphersuite,
348 const mbedtls_ssl_ciphersuite_t **selected_ciphersuite_info)
Jerry Yu5725f1c2022-08-21 17:27:16 +0800349{
Jerry Yuf35ba382022-08-23 17:58:26 +0800350 psa_algorithm_t psk_hash_alg = PSA_ALG_SHA_256;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800351
Jerry Yu0baf9072022-08-25 11:21:04 +0800352 *selected_ciphersuite = 0;
353 *selected_ciphersuite_info = NULL;
354
Jerry Yuf35ba382022-08-23 17:58:26 +0800355 /* RFC 8446, page 55.
356 *
357 * For externally established PSKs, the Hash algorithm MUST be set when the
358 * PSK is established or default to SHA-256 if no such algorithm is defined.
359 *
360 */
Jerry Yu5725f1c2022-08-21 17:27:16 +0800361
Jerry Yu5725f1c2022-08-21 17:27:16 +0800362 /*
363 * Search for a matching ciphersuite
364 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 for (const unsigned char *p = cipher_suites;
366 p < cipher_suites_end; p += 2) {
Jerry Yu5725f1c2022-08-21 17:27:16 +0800367 uint16_t cipher_suite;
Jerry Yuf35ba382022-08-23 17:58:26 +0800368 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800369
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0);
371 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite(ssl,
372 cipher_suite);
373 if (ciphersuite_info == NULL) {
Jerry Yu5725f1c2022-08-21 17:27:16 +0800374 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 }
Jerry Yu5725f1c2022-08-21 17:27:16 +0800376
Jerry Yu5725f1c2022-08-21 17:27:16 +0800377 /* MAC of selected ciphersuite MUST be same with PSK binder if exist.
378 * Otherwise, client should reject.
379 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100380 if (psk_hash_alg == mbedtls_psa_translate_md(ciphersuite_info->mac)) {
Jerry Yuf35ba382022-08-23 17:58:26 +0800381 *selected_ciphersuite = cipher_suite;
382 *selected_ciphersuite_info = ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 return 0;
Jerry Yuf35ba382022-08-23 17:58:26 +0800384 }
385 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 MBEDTLS_SSL_DEBUG_MSG(2, ("No matched ciphersuite"));
387 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yuf35ba382022-08-23 17:58:26 +0800388}
Jerry Yu5725f1c2022-08-21 17:27:16 +0800389
Jerry Yu82534862022-08-30 10:42:33 +0800390#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yuf35ba382022-08-23 17:58:26 +0800391MBEDTLS_CHECK_RETURN_CRITICAL
392static int ssl_tls13_select_ciphersuite_for_resumption(
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 mbedtls_ssl_context *ssl,
394 const unsigned char *cipher_suites,
395 const unsigned char *cipher_suites_end,
396 mbedtls_ssl_session *session,
397 uint16_t *selected_ciphersuite,
398 const mbedtls_ssl_ciphersuite_t **selected_ciphersuite_info)
Jerry Yuf35ba382022-08-23 17:58:26 +0800399{
Jerry Yu82534862022-08-30 10:42:33 +0800400
Jerry Yuf35ba382022-08-23 17:58:26 +0800401 *selected_ciphersuite = 0;
402 *selected_ciphersuite_info = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100403 for (const unsigned char *p = cipher_suites; p < cipher_suites_end; p += 2) {
404 uint16_t cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu82534862022-08-30 10:42:33 +0800405 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
406
Gilles Peskine449bd832023-01-11 14:50:10 +0100407 if (cipher_suite != session->ciphersuite) {
Jerry Yu82534862022-08-30 10:42:33 +0800408 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 }
Jerry Yu82534862022-08-30 10:42:33 +0800410
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite(ssl,
412 cipher_suite);
413 if (ciphersuite_info == NULL) {
Jerry Yu82534862022-08-30 10:42:33 +0800414 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 }
Jerry Yu82534862022-08-30 10:42:33 +0800416
Jerry Yu4746b102022-09-13 11:11:48 +0800417 *selected_ciphersuite = cipher_suite;
Jerry Yu82534862022-08-30 10:42:33 +0800418 *selected_ciphersuite_info = ciphersuite_info;
419
Gilles Peskine449bd832023-01-11 14:50:10 +0100420 return 0;
Jerry Yu82534862022-08-30 10:42:33 +0800421 }
422
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800424}
Jerry Yuf35ba382022-08-23 17:58:26 +0800425
Jerry Yu82534862022-08-30 10:42:33 +0800426MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100427static int ssl_tls13_session_copy_ticket(mbedtls_ssl_session *dst,
428 const mbedtls_ssl_session *src)
Jerry Yu82534862022-08-30 10:42:33 +0800429{
Jerry Yu82534862022-08-30 10:42:33 +0800430 dst->ticket_age_add = src->ticket_age_add;
431 dst->ticket_flags = src->ticket_flags;
432 dst->resumption_key_len = src->resumption_key_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100433 if (src->resumption_key_len == 0) {
434 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
435 }
436 memcpy(dst->resumption_key, src->resumption_key, src->resumption_key_len);
Jerry Yu4746b102022-09-13 11:11:48 +0800437
Gilles Peskine449bd832023-01-11 14:50:10 +0100438 return 0;
Jerry Yu82534862022-08-30 10:42:33 +0800439}
440#endif /* MBEDTLS_SSL_SESSION_TICKETS */
441
Jerry Yu1c105562022-07-10 06:32:38 +0000442/* Parser for pre_shared_key extension in client hello
443 * struct {
444 * opaque identity<1..2^16-1>;
445 * uint32 obfuscated_ticket_age;
446 * } PskIdentity;
447 *
448 * opaque PskBinderEntry<32..255>;
449 *
450 * struct {
451 * PskIdentity identities<7..2^16-1>;
452 * PskBinderEntry binders<33..2^16-1>;
453 * } OfferedPsks;
454 *
455 * struct {
456 * select (Handshake.msg_type) {
457 * case client_hello: OfferedPsks;
458 * ....
459 * };
460 * } PreSharedKeyExtension;
461 */
Jerry Yu6e74a7e2022-07-20 20:49:32 +0800462MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100463static int ssl_tls13_parse_pre_shared_key_ext(mbedtls_ssl_context *ssl,
464 const unsigned char *pre_shared_key_ext,
465 const unsigned char *pre_shared_key_ext_end,
466 const unsigned char *ciphersuites,
467 const unsigned char *ciphersuites_end)
Jerry Yu1c105562022-07-10 06:32:38 +0000468{
Jerry Yu29d9faa2022-08-23 17:52:45 +0800469 const unsigned char *identities = pre_shared_key_ext;
Jerry Yu568ec252022-07-22 21:27:34 +0800470 const unsigned char *p_identity_len;
471 size_t identities_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000472 const unsigned char *identities_end;
Jerry Yu568ec252022-07-22 21:27:34 +0800473 const unsigned char *binders;
474 const unsigned char *p_binder_len;
475 size_t binders_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000476 const unsigned char *binders_end;
Jerry Yu96a2e362022-07-21 15:11:34 +0800477 int matched_identity = -1;
478 int identity_id = -1;
Jerry Yu1c105562022-07-10 06:32:38 +0000479
Gilles Peskine449bd832023-01-11 14:50:10 +0100480 MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key extension",
481 pre_shared_key_ext,
482 pre_shared_key_ext_end - pre_shared_key_ext);
Jerry Yu1c105562022-07-10 06:32:38 +0000483
Jerry Yu96a2e362022-07-21 15:11:34 +0800484 /* identities_len 2 bytes
485 * identities_data >= 7 bytes
486 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 MBEDTLS_SSL_CHK_BUF_READ_PTR(identities, pre_shared_key_ext_end, 7 + 2);
488 identities_len = MBEDTLS_GET_UINT16_BE(identities, 0);
Jerry Yu568ec252022-07-22 21:27:34 +0800489 p_identity_len = identities + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100490 MBEDTLS_SSL_CHK_BUF_READ_PTR(p_identity_len, pre_shared_key_ext_end,
491 identities_len);
Jerry Yu568ec252022-07-22 21:27:34 +0800492 identities_end = p_identity_len + identities_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000493
Jerry Yu96a2e362022-07-21 15:11:34 +0800494 /* binders_len 2 bytes
495 * binders >= 33 bytes
496 */
Jerry Yu568ec252022-07-22 21:27:34 +0800497 binders = identities_end;
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 MBEDTLS_SSL_CHK_BUF_READ_PTR(binders, pre_shared_key_ext_end, 33 + 2);
499 binders_len = MBEDTLS_GET_UINT16_BE(binders, 0);
Jerry Yu568ec252022-07-22 21:27:34 +0800500 p_binder_len = binders + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 MBEDTLS_SSL_CHK_BUF_READ_PTR(p_binder_len, pre_shared_key_ext_end, binders_len);
Jerry Yu568ec252022-07-22 21:27:34 +0800502 binders_end = p_binder_len + binders_len;
Jerry Yu1c105562022-07-10 06:32:38 +0000503
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 ssl->handshake->update_checksum(ssl, pre_shared_key_ext,
505 identities_end - pre_shared_key_ext);
Jerry Yu96a2e362022-07-21 15:11:34 +0800506
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 while (p_identity_len < identities_end && p_binder_len < binders_end) {
Jerry Yu1c105562022-07-10 06:32:38 +0000508 const unsigned char *identity;
Jerry Yu568ec252022-07-22 21:27:34 +0800509 size_t identity_len;
Jerry Yu82534862022-08-30 10:42:33 +0800510 uint32_t obfuscated_ticket_age;
Jerry Yu96a2e362022-07-21 15:11:34 +0800511 const unsigned char *binder;
Jerry Yu568ec252022-07-22 21:27:34 +0800512 size_t binder_len;
Jerry Yu96a2e362022-07-21 15:11:34 +0800513 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800514 int psk_type;
515 uint16_t cipher_suite;
Jerry Yu29d9faa2022-08-23 17:52:45 +0800516 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu82534862022-08-30 10:42:33 +0800517#if defined(MBEDTLS_SSL_SESSION_TICKETS)
518 mbedtls_ssl_session session;
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 mbedtls_ssl_session_init(&session);
Jerry Yu82534862022-08-30 10:42:33 +0800520#endif
Jerry Yubb852022022-07-20 21:10:44 +0800521
Gilles Peskine449bd832023-01-11 14:50:10 +0100522 MBEDTLS_SSL_CHK_BUF_READ_PTR(p_identity_len, identities_end, 2 + 1 + 4);
523 identity_len = MBEDTLS_GET_UINT16_BE(p_identity_len, 0);
Jerry Yu568ec252022-07-22 21:27:34 +0800524 identity = p_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 MBEDTLS_SSL_CHK_BUF_READ_PTR(identity, identities_end, identity_len + 4);
526 obfuscated_ticket_age = MBEDTLS_GET_UINT32_BE(identity, identity_len);
Jerry Yu568ec252022-07-22 21:27:34 +0800527 p_identity_len += identity_len + 6;
Jerry Yu1c105562022-07-10 06:32:38 +0000528
Gilles Peskine449bd832023-01-11 14:50:10 +0100529 MBEDTLS_SSL_CHK_BUF_READ_PTR(p_binder_len, binders_end, 1 + 32);
Jerry Yu568ec252022-07-22 21:27:34 +0800530 binder_len = *p_binder_len;
531 binder = p_binder_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100532 MBEDTLS_SSL_CHK_BUF_READ_PTR(binder, binders_end, binder_len);
Jerry Yu568ec252022-07-22 21:27:34 +0800533 p_binder_len += binder_len + 1;
Jerry Yu96a2e362022-07-21 15:11:34 +0800534
Jerry Yu96a2e362022-07-21 15:11:34 +0800535 identity_id++;
Gilles Peskine449bd832023-01-11 14:50:10 +0100536 if (matched_identity != -1) {
Jerry Yu1c105562022-07-10 06:32:38 +0000537 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 }
Jerry Yu1c105562022-07-10 06:32:38 +0000539
Jerry Yu96a2e362022-07-21 15:11:34 +0800540 ret = ssl_tls13_offered_psks_check_identity_match(
Gilles Peskine449bd832023-01-11 14:50:10 +0100541 ssl, identity, identity_len, obfuscated_ticket_age,
542 &psk_type, &session);
543 if (ret != SSL_TLS1_3_OFFERED_PSK_MATCH) {
Jerry Yu96a2e362022-07-21 15:11:34 +0800544 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100545 }
Jerry Yu96a2e362022-07-21 15:11:34 +0800546
Gilles Peskine449bd832023-01-11 14:50:10 +0100547 MBEDTLS_SSL_DEBUG_MSG(4, ("found matched identity"));
548 switch (psk_type) {
Jerry Yu0baf9072022-08-25 11:21:04 +0800549 case MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL:
550 ret = ssl_tls13_select_ciphersuite_for_psk(
Gilles Peskine449bd832023-01-11 14:50:10 +0100551 ssl, ciphersuites, ciphersuites_end,
552 &cipher_suite, &ciphersuite_info);
Jerry Yu0baf9072022-08-25 11:21:04 +0800553 break;
554 case MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION:
Jerry Yu82534862022-08-30 10:42:33 +0800555#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yu0baf9072022-08-25 11:21:04 +0800556 ret = ssl_tls13_select_ciphersuite_for_resumption(
Gilles Peskine449bd832023-01-11 14:50:10 +0100557 ssl, ciphersuites, ciphersuites_end, &session,
558 &cipher_suite, &ciphersuite_info);
559 if (ret != 0) {
560 mbedtls_ssl_session_free(&session);
561 }
Jerry Yu82534862022-08-30 10:42:33 +0800562#else
563 ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
564#endif
Jerry Yu0baf9072022-08-25 11:21:04 +0800565 break;
566 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu0baf9072022-08-25 11:21:04 +0800568 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100569 if (ret != 0) {
Jerry Yuf35ba382022-08-23 17:58:26 +0800570 /* See below, no cipher_suite available, abort handshake */
571 MBEDTLS_SSL_PEND_FATAL_ALERT(
572 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +0100573 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
Jerry Yuf35ba382022-08-23 17:58:26 +0800574 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +0100575 2, "ssl_tls13_select_ciphersuite", ret);
576 return ret;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800577 }
578
Jerry Yu96a2e362022-07-21 15:11:34 +0800579 ret = ssl_tls13_offered_psks_check_binder_match(
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 ssl, binder, binder_len, psk_type,
581 mbedtls_psa_translate_md(ciphersuite_info->mac));
582 if (ret != SSL_TLS1_3_OFFERED_PSK_MATCH) {
Jerry Yuc5a23a02022-08-25 10:51:44 +0800583 /* For security reasons, the handshake should be aborted when we
584 * fail to validate a binder value. See RFC 8446 section 4.2.11.2
585 * and appendix E.6. */
Jerry Yu82534862022-08-30 10:42:33 +0800586#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100587 mbedtls_ssl_session_free(&session);
Jerry Yu82534862022-08-30 10:42:33 +0800588#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 MBEDTLS_SSL_DEBUG_MSG(3, ("Invalid binder."));
590 MBEDTLS_SSL_DEBUG_RET(1,
591 "ssl_tls13_offered_psks_check_binder_match", ret);
Jerry Yu96a2e362022-07-21 15:11:34 +0800592 MBEDTLS_SSL_PEND_FATAL_ALERT(
593 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
595 return ret;
Jerry Yu96a2e362022-07-21 15:11:34 +0800596 }
Jerry Yu96a2e362022-07-21 15:11:34 +0800597
598 matched_identity = identity_id;
Jerry Yu5725f1c2022-08-21 17:27:16 +0800599
600 /* Update handshake parameters */
Jerry Yue5834fd2022-08-29 20:16:09 +0800601 ssl->handshake->ciphersuite_info = ciphersuite_info;
Jerry Yu4746b102022-09-13 11:11:48 +0800602 ssl->session_negotiate->ciphersuite = cipher_suite;
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 MBEDTLS_SSL_DEBUG_MSG(2, ("overwrite ciphersuite: %04x - %s",
604 cipher_suite, ciphersuite_info->name));
Jerry Yu82534862022-08-30 10:42:33 +0800605#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100606 if (psk_type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION) {
607 ret = ssl_tls13_session_copy_ticket(ssl->session_negotiate,
608 &session);
609 mbedtls_ssl_session_free(&session);
610 if (ret != 0) {
611 return ret;
612 }
Jerry Yu82534862022-08-30 10:42:33 +0800613 }
614#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu1c105562022-07-10 06:32:38 +0000615 }
616
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 if (p_identity_len != identities_end || p_binder_len != binders_end) {
618 MBEDTLS_SSL_DEBUG_MSG(3, ("pre_shared_key extension decode error"));
619 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
620 MBEDTLS_ERR_SSL_DECODE_ERROR);
621 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Jerry Yu1c105562022-07-10 06:32:38 +0000622 }
623
Jerry Yu6f1db3f2022-07-22 23:05:59 +0800624 /* Update the handshake transcript with the binder list. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 ssl->handshake->update_checksum(ssl,
626 identities_end,
627 (size_t) (binders_end - identities_end));
628 if (matched_identity == -1) {
629 MBEDTLS_SSL_DEBUG_MSG(3, ("No matched PSK or ticket."));
630 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Jerry Yu1c105562022-07-10 06:32:38 +0000631 }
632
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 ssl->handshake->selected_identity = (uint16_t) matched_identity;
634 MBEDTLS_SSL_DEBUG_MSG(3, ("Pre shared key found"));
Jerry Yu1c105562022-07-10 06:32:38 +0000635
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 return 0;
Jerry Yu1c105562022-07-10 06:32:38 +0000637}
Jerry Yu032b15ce2022-07-11 06:10:03 +0000638
639/*
640 * struct {
641 * select ( Handshake.msg_type ) {
642 * ....
643 * case server_hello:
644 * uint16 selected_identity;
645 * }
646 * } PreSharedKeyExtension;
647 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100648static int ssl_tls13_write_server_pre_shared_key_ext(mbedtls_ssl_context *ssl,
649 unsigned char *buf,
650 unsigned char *end,
651 size_t *olen)
Jerry Yu032b15ce2022-07-11 06:10:03 +0000652{
Gilles Peskine449bd832023-01-11 14:50:10 +0100653 unsigned char *p = (unsigned char *) buf;
Jerry Yu032b15ce2022-07-11 06:10:03 +0000654
655 *olen = 0;
656
David Horstmann21b89762022-10-06 18:34:28 +0100657 int not_using_psk = 0;
Jerry Yu032b15ce2022-07-11 06:10:03 +0000658#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 not_using_psk = (mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque));
Jerry Yu032b15ce2022-07-11 06:10:03 +0000660#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 not_using_psk = (ssl->handshake->psk == NULL);
Jerry Yu032b15ce2022-07-11 06:10:03 +0000662#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 if (not_using_psk) {
Jerry Yu032b15ce2022-07-11 06:10:03 +0000664 /* We shouldn't have called this extension writer unless we've
665 * chosen to use a PSK. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100666 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu032b15ce2022-07-11 06:10:03 +0000667 }
668
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding pre_shared_key extension"));
670 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Jerry Yu032b15ce2022-07-11 06:10:03 +0000671
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PRE_SHARED_KEY, p, 0);
673 MBEDTLS_PUT_UINT16_BE(2, p, 2);
Jerry Yu032b15ce2022-07-11 06:10:03 +0000674
Gilles Peskine449bd832023-01-11 14:50:10 +0100675 MBEDTLS_PUT_UINT16_BE(ssl->handshake->selected_identity, p, 4);
Jerry Yu032b15ce2022-07-11 06:10:03 +0000676
677 *olen = 6;
678
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 MBEDTLS_SSL_DEBUG_MSG(4, ("sent selected_identity: %u",
680 ssl->handshake->selected_identity));
Jerry Yu032b15ce2022-07-11 06:10:03 +0000681
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY);
Jerry Yub95dd362022-11-08 21:19:34 +0800683
Gilles Peskine449bd832023-01-11 14:50:10 +0100684 return 0;
Jerry Yu032b15ce2022-07-11 06:10:03 +0000685}
686
Ronald Cron41a443a2022-10-04 16:38:25 +0200687#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
Jerry Yue19e3b92022-07-08 12:04:51 +0000688
XiaokangQian7807f9f2022-02-15 10:04:37 +0000689/* From RFC 8446:
690 * struct {
XiaokangQiancfd925f2022-04-14 07:10:37 +0000691 * ProtocolVersion versions<2..254>;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000692 * } SupportedVersions;
693 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200694MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100695static int ssl_tls13_parse_supported_versions_ext(mbedtls_ssl_context *ssl,
696 const unsigned char *buf,
697 const unsigned char *end)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000698{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000699 const unsigned char *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000700 size_t versions_len;
XiaokangQian4080a7f2022-04-11 09:55:18 +0000701 const unsigned char *versions_end;
XiaokangQian0a1b54e2022-04-21 03:01:38 +0000702 uint16_t tls_version;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000703 int tls13_supported = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000704
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
XiaokangQian4080a7f2022-04-11 09:55:18 +0000706 versions_len = p[0];
XiaokangQian7807f9f2022-02-15 10:04:37 +0000707 p += 1;
708
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, versions_len);
XiaokangQian4080a7f2022-04-11 09:55:18 +0000710 versions_end = p + versions_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 while (p < versions_end) {
712 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, versions_end, 2);
713 tls_version = mbedtls_ssl_read_version(p, ssl->conf->transport);
XiaokangQianb67384d2022-04-19 00:02:38 +0000714 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000715
716 /* In this implementation we only support TLS 1.3 and DTLS 1.3. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100717 if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
XiaokangQian7807f9f2022-02-15 10:04:37 +0000718 tls13_supported = 1;
719 break;
720 }
XiaokangQian7807f9f2022-02-15 10:04:37 +0000721 }
722
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 if (!tls13_supported) {
724 MBEDTLS_SSL_DEBUG_MSG(1, ("TLS 1.3 is not supported by the client"));
XiaokangQian7807f9f2022-02-15 10:04:37 +0000725
Gilles Peskine449bd832023-01-11 14:50:10 +0100726 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
727 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
728 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000729 }
730
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 MBEDTLS_SSL_DEBUG_MSG(1, ("Negotiated version. Supported is [%04x]",
732 (unsigned int) tls_version));
XiaokangQian7807f9f2022-02-15 10:04:37 +0000733
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 return 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000735}
736
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000737#if defined(MBEDTLS_ECDH_C)
XiaokangQiane8ff3502022-04-22 02:34:40 +0000738/*
XiaokangQian7807f9f2022-02-15 10:04:37 +0000739 *
740 * From RFC 8446:
741 * enum {
742 * ... (0xFFFF)
743 * } NamedGroup;
744 * struct {
745 * NamedGroup named_group_list<2..2^16-1>;
746 * } NamedGroupList;
747 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200748MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100749static int ssl_tls13_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
750 const unsigned char *buf,
751 const unsigned char *end)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000752{
XiaokangQian7807f9f2022-02-15 10:04:37 +0000753 const unsigned char *p = buf;
XiaokangQian84823772022-04-19 07:57:30 +0000754 size_t named_group_list_len;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000755 const unsigned char *named_group_list_end;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000756
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 MBEDTLS_SSL_DEBUG_BUF(3, "supported_groups extension", p, end - buf);
758 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
759 named_group_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian7807f9f2022-02-15 10:04:37 +0000760 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100761 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, named_group_list_len);
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000762 named_group_list_end = p + named_group_list_len;
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000763 ssl->handshake->hrr_selected_group = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000764
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 while (p < named_group_list_end) {
XiaokangQian08037552022-04-20 07:16:41 +0000766 uint16_t named_group;
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, named_group_list_end, 2);
768 named_group = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian08037552022-04-20 07:16:41 +0000769 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000770
Gilles Peskine449bd832023-01-11 14:50:10 +0100771 MBEDTLS_SSL_DEBUG_MSG(2,
772 ("got named group: %s(%04x)",
773 mbedtls_ssl_named_group_to_str(named_group),
774 named_group));
XiaokangQian08037552022-04-20 07:16:41 +0000775
Gilles Peskine449bd832023-01-11 14:50:10 +0100776 if (!mbedtls_ssl_named_group_is_offered(ssl, named_group) ||
777 !mbedtls_ssl_named_group_is_supported(named_group) ||
778 ssl->handshake->hrr_selected_group != 0) {
XiaokangQian08037552022-04-20 07:16:41 +0000779 continue;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000780 }
781
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 MBEDTLS_SSL_DEBUG_MSG(2,
783 ("add named group %s(%04x) into received list.",
784 mbedtls_ssl_named_group_to_str(named_group),
785 named_group));
Jerry Yuc1be19f2022-04-23 16:11:39 +0800786
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000787 ssl->handshake->hrr_selected_group = named_group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000788 }
789
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 return 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000791
792}
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000793#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000794
XiaokangQian08037552022-04-20 07:16:41 +0000795#define SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH 1
796
XiaokangQian88408882022-04-02 10:15:03 +0000797#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000798/*
799 * ssl_tls13_parse_key_shares_ext() verifies whether the information in the
XiaokangQiane8ff3502022-04-22 02:34:40 +0000800 * extension is correct and stores the first acceptable key share and its associated group.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000801 *
802 * Possible return values are:
803 * - 0: Successful processing of the client provided key share extension.
XiaokangQian08037552022-04-20 07:16:41 +0000804 * - SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH: The key shares provided by the client
XiaokangQian7807f9f2022-02-15 10:04:37 +0000805 * does not match a group supported by the server. A HelloRetryRequest will
806 * be needed.
XiaokangQiane8ff3502022-04-22 02:34:40 +0000807 * - A negative value for fatal errors.
Jerry Yuc1be19f2022-04-23 16:11:39 +0800808 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200809MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100810static int ssl_tls13_parse_key_shares_ext(mbedtls_ssl_context *ssl,
811 const unsigned char *buf,
812 const unsigned char *end)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000813{
XiaokangQianb67384d2022-04-19 00:02:38 +0000814 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000815 unsigned char const *p = buf;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000816 unsigned char const *client_shares_end;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800817 size_t client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000818
819 /* From RFC 8446:
820 *
821 * struct {
822 * KeyShareEntry client_shares<0..2^16-1>;
823 * } KeyShareClientHello;
824 *
825 */
826
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
828 client_shares_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian7807f9f2022-02-15 10:04:37 +0000829 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, client_shares_len);
XiaokangQian7807f9f2022-02-15 10:04:37 +0000831
832 ssl->handshake->offered_group_id = 0;
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000833 client_shares_end = p + client_shares_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000834
835 /* We try to find a suitable key share entry and copy it to the
836 * handshake context. Later, we have to find out whether we can do
837 * something with the provided key share or whether we have to
XiaokangQianc5763b52022-04-02 03:34:37 +0000838 * dismiss it and send a HelloRetryRequest message.
839 */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000840
Gilles Peskine449bd832023-01-11 14:50:10 +0100841 while (p < client_shares_end) {
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000842 uint16_t group;
Jerry Yuc1be19f2022-04-23 16:11:39 +0800843 size_t key_exchange_len;
Jerry Yu086edc22022-05-05 10:50:38 +0800844 const unsigned char *key_exchange;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000845
846 /*
847 * struct {
848 * NamedGroup group;
849 * opaque key_exchange<1..2^16-1>;
850 * } KeyShareEntry;
851 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100852 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, client_shares_end, 4);
853 group = MBEDTLS_GET_UINT16_BE(p, 0);
854 key_exchange_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yuc1be19f2022-04-23 16:11:39 +0800855 p += 4;
Jerry Yu086edc22022-05-05 10:50:38 +0800856 key_exchange = p;
Gilles Peskine449bd832023-01-11 14:50:10 +0100857 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, client_shares_end, key_exchange_len);
Jerry Yu086edc22022-05-05 10:50:38 +0800858 p += key_exchange_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000859
860 /* Continue parsing even if we have already found a match,
XiaokangQianc5763b52022-04-02 03:34:37 +0000861 * for input validation purposes.
862 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100863 if (!mbedtls_ssl_named_group_is_offered(ssl, group) ||
864 !mbedtls_ssl_named_group_is_supported(group) ||
865 ssl->handshake->offered_group_id != 0) {
XiaokangQian060d8672022-04-21 09:24:56 +0000866 continue;
867 }
XiaokangQian060d8672022-04-21 09:24:56 +0000868
XiaokangQian7807f9f2022-02-15 10:04:37 +0000869 /*
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000870 * For now, we only support ECDHE groups.
XiaokangQian7807f9f2022-02-15 10:04:37 +0000871 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group)) {
873 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDH group: %s (%04x)",
874 mbedtls_ssl_named_group_to_str(group),
875 group));
XiaokangQian318dc762022-04-20 09:43:51 +0000876 ret = mbedtls_ssl_tls13_read_public_ecdhe_share(
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 ssl, key_exchange - 2, key_exchange_len + 2);
878 if (ret != 0) {
879 return ret;
880 }
XiaokangQian4e8cd7b2022-04-21 09:48:09 +0000881
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 } else {
883 MBEDTLS_SSL_DEBUG_MSG(4, ("Unrecognized NamedGroup %u",
884 (unsigned) group));
XiaokangQian7807f9f2022-02-15 10:04:37 +0000885 continue;
886 }
887
XiaokangQian9b5d04b2022-04-10 10:20:43 +0000888 ssl->handshake->offered_group_id = group;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000889 }
890
Jerry Yuc1be19f2022-04-23 16:11:39 +0800891
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 if (ssl->handshake->offered_group_id == 0) {
893 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching key share"));
894 return SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000895 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 return 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000897}
XiaokangQian88408882022-04-02 10:15:03 +0000898#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000899
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200900MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100901static int ssl_tls13_client_hello_has_exts(mbedtls_ssl_context *ssl,
902 int exts_mask)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000903{
Jerry Yu0c354a22022-08-29 15:25:36 +0800904 int masked = ssl->handshake->received_extensions & exts_mask;
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 return masked == exts_mask;
XiaokangQian7807f9f2022-02-15 10:04:37 +0000906}
907
Jerry Yue5991322022-11-07 14:03:44 +0800908#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200909MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianb67384d2022-04-19 00:02:38 +0000910static int ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +0100911 mbedtls_ssl_context *ssl)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000912{
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 return ssl_tls13_client_hello_has_exts(
914 ssl,
915 MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS) |
916 MBEDTLS_SSL_EXT_MASK(KEY_SHARE) |
917 MBEDTLS_SSL_EXT_MASK(SIG_ALG));
XiaokangQian7807f9f2022-02-15 10:04:37 +0000918}
Jerry Yue5991322022-11-07 14:03:44 +0800919#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
XiaokangQian7807f9f2022-02-15 10:04:37 +0000920
Jerry Yue5991322022-11-07 14:03:44 +0800921#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
Jerry Yu77f01482022-07-11 07:03:24 +0000922MBEDTLS_CHECK_RETURN_CRITICAL
923static int ssl_tls13_client_hello_has_exts_for_psk_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 mbedtls_ssl_context *ssl)
Jerry Yu77f01482022-07-11 07:03:24 +0000925{
Gilles Peskine449bd832023-01-11 14:50:10 +0100926 return ssl_tls13_client_hello_has_exts(
927 ssl,
928 MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
929 MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES));
Jerry Yu77f01482022-07-11 07:03:24 +0000930}
Jerry Yue5991322022-11-07 14:03:44 +0800931#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED */
Jerry Yu77f01482022-07-11 07:03:24 +0000932
Jerry Yue5991322022-11-07 14:03:44 +0800933#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
Jerry Yu77f01482022-07-11 07:03:24 +0000934MBEDTLS_CHECK_RETURN_CRITICAL
935static int ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 mbedtls_ssl_context *ssl)
Jerry Yu77f01482022-07-11 07:03:24 +0000937{
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 return ssl_tls13_client_hello_has_exts(
939 ssl,
940 MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS) |
941 MBEDTLS_SSL_EXT_MASK(KEY_SHARE) |
942 MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
943 MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES));
Jerry Yu77f01482022-07-11 07:03:24 +0000944}
Jerry Yue5991322022-11-07 14:03:44 +0800945#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED */
Jerry Yu77f01482022-07-11 07:03:24 +0000946
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200947MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100948static int ssl_tls13_check_ephemeral_key_exchange(mbedtls_ssl_context *ssl)
XiaokangQian7807f9f2022-02-15 10:04:37 +0000949{
Jerry Yue5991322022-11-07 14:03:44 +0800950#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100951 return mbedtls_ssl_conf_tls13_ephemeral_enabled(ssl) &&
952 ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(ssl);
Jerry Yue5991322022-11-07 14:03:44 +0800953#else
954 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 return 0;
Jerry Yue5991322022-11-07 14:03:44 +0800956#endif
Jerry Yu77f01482022-07-11 07:03:24 +0000957}
XiaokangQian7807f9f2022-02-15 10:04:37 +0000958
Jerry Yu77f01482022-07-11 07:03:24 +0000959MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100960static int ssl_tls13_check_psk_key_exchange(mbedtls_ssl_context *ssl)
Jerry Yu77f01482022-07-11 07:03:24 +0000961{
Jerry Yue5991322022-11-07 14:03:44 +0800962#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 return mbedtls_ssl_conf_tls13_psk_enabled(ssl) &&
964 mbedtls_ssl_tls13_psk_enabled(ssl) &&
965 ssl_tls13_client_hello_has_exts_for_psk_key_exchange(ssl);
Jerry Yu77f01482022-07-11 07:03:24 +0000966#else
967 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 return 0;
Jerry Yu77f01482022-07-11 07:03:24 +0000969#endif
970}
XiaokangQian7807f9f2022-02-15 10:04:37 +0000971
Jerry Yu77f01482022-07-11 07:03:24 +0000972MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100973static int ssl_tls13_check_psk_ephemeral_key_exchange(mbedtls_ssl_context *ssl)
Jerry Yu77f01482022-07-11 07:03:24 +0000974{
Jerry Yue5991322022-11-07 14:03:44 +0800975#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 return mbedtls_ssl_conf_tls13_psk_ephemeral_enabled(ssl) &&
977 mbedtls_ssl_tls13_psk_ephemeral_enabled(ssl) &&
978 ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange(ssl);
Jerry Yu77f01482022-07-11 07:03:24 +0000979#else
980 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 return 0;
Jerry Yu77f01482022-07-11 07:03:24 +0000982#endif
983}
984
Gilles Peskine449bd832023-01-11 14:50:10 +0100985static int ssl_tls13_determine_key_exchange_mode(mbedtls_ssl_context *ssl)
Jerry Yu77f01482022-07-11 07:03:24 +0000986{
987 /*
988 * Determine the key exchange algorithm to use.
989 * There are three types of key exchanges supported in TLS 1.3:
990 * - (EC)DH with ECDSA,
991 * - (EC)DH with PSK,
992 * - plain PSK.
993 *
994 * The PSK-based key exchanges may additionally be used with 0-RTT.
995 *
996 * Our built-in order of preference is
Jerry Yuce6ed702022-07-22 21:49:53 +0800997 * 1 ) (EC)DHE-PSK Mode ( psk_ephemeral )
998 * 2 ) Certificate Mode ( ephemeral )
999 * 3 ) Plain PSK Mode ( psk )
Jerry Yu77f01482022-07-11 07:03:24 +00001000 */
1001
1002 ssl->handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE;
1003
Gilles Peskine449bd832023-01-11 14:50:10 +01001004 if (ssl_tls13_check_psk_ephemeral_key_exchange(ssl)) {
Jerry Yu77f01482022-07-11 07:03:24 +00001005 ssl->handshake->key_exchange_mode =
1006 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: psk_ephemeral"));
1008 } else
1009 if (ssl_tls13_check_ephemeral_key_exchange(ssl)) {
Jerry Yu77f01482022-07-11 07:03:24 +00001010 ssl->handshake->key_exchange_mode =
1011 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
Gilles Peskine449bd832023-01-11 14:50:10 +01001012 MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: ephemeral"));
1013 } else
1014 if (ssl_tls13_check_psk_key_exchange(ssl)) {
Jerry Yuce6ed702022-07-22 21:49:53 +08001015 ssl->handshake->key_exchange_mode =
1016 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: psk"));
1018 } else {
Jerry Yu77f01482022-07-11 07:03:24 +00001019 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001020 1,
1021 ("ClientHello message misses mandatory extensions."));
1022 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_MISSING_EXTENSION,
1023 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1024 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu77f01482022-07-11 07:03:24 +00001025 }
1026
Gilles Peskine449bd832023-01-11 14:50:10 +01001027 return 0;
Jerry Yu77f01482022-07-11 07:03:24 +00001028
XiaokangQian7807f9f2022-02-15 10:04:37 +00001029}
1030
XiaokangQian81802f42022-06-10 13:25:22 +00001031#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
Ronald Cron928cbd32022-10-04 16:14:26 +02001032 defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Ronald Cron67ea2542022-09-15 17:34:42 +02001033
1034#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001035static psa_algorithm_t ssl_tls13_iana_sig_alg_to_psa_alg(uint16_t sig_alg)
Ronald Cron67ea2542022-09-15 17:34:42 +02001036{
Gilles Peskine449bd832023-01-11 14:50:10 +01001037 switch (sig_alg) {
Ronald Cron67ea2542022-09-15 17:34:42 +02001038 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 return PSA_ALG_ECDSA(PSA_ALG_SHA_256);
Ronald Cron67ea2542022-09-15 17:34:42 +02001040 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +01001041 return PSA_ALG_ECDSA(PSA_ALG_SHA_384);
Ronald Cron67ea2542022-09-15 17:34:42 +02001042 case MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +01001043 return PSA_ALG_ECDSA(PSA_ALG_SHA_512);
Ronald Cron67ea2542022-09-15 17:34:42 +02001044 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +01001045 return PSA_ALG_RSA_PSS(PSA_ALG_SHA_256);
Ronald Cron67ea2542022-09-15 17:34:42 +02001046 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 return PSA_ALG_RSA_PSS(PSA_ALG_SHA_384);
Ronald Cron67ea2542022-09-15 17:34:42 +02001048 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 return PSA_ALG_RSA_PSS(PSA_ALG_SHA_512);
Ronald Cron67ea2542022-09-15 17:34:42 +02001050 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256);
Ronald Cron67ea2542022-09-15 17:34:42 +02001052 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_384);
Ronald Cron67ea2542022-09-15 17:34:42 +02001054 case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_512);
Ronald Cron67ea2542022-09-15 17:34:42 +02001056 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 return PSA_ALG_NONE;
Ronald Cron67ea2542022-09-15 17:34:42 +02001058 }
1059}
1060#endif /* MBEDTLS_USE_PSA_CRYPTO */
1061
XiaokangQian23c5be62022-06-07 02:04:34 +00001062/*
XiaokangQianfb665a82022-06-15 03:57:21 +00001063 * Pick best ( private key, certificate chain ) pair based on the signature
1064 * algorithms supported by the client.
XiaokangQian23c5be62022-06-07 02:04:34 +00001065 */
Ronald Cronce7d76e2022-07-08 18:56:49 +02001066MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001067static int ssl_tls13_pick_key_cert(mbedtls_ssl_context *ssl)
XiaokangQian23c5be62022-06-07 02:04:34 +00001068{
XiaokangQianfb665a82022-06-15 03:57:21 +00001069 mbedtls_ssl_key_cert *key_cert, *key_cert_list;
XiaokangQian81802f42022-06-10 13:25:22 +00001070 const uint16_t *sig_alg = ssl->handshake->received_sig_algs;
XiaokangQian23c5be62022-06-07 02:04:34 +00001071
1072#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 if (ssl->handshake->sni_key_cert != NULL) {
XiaokangQianfb665a82022-06-15 03:57:21 +00001074 key_cert_list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 } else
XiaokangQian23c5be62022-06-07 02:04:34 +00001076#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Gilles Peskine449bd832023-01-11 14:50:10 +01001077 key_cert_list = ssl->conf->key_cert;
XiaokangQian23c5be62022-06-07 02:04:34 +00001078
Gilles Peskine449bd832023-01-11 14:50:10 +01001079 if (key_cert_list == NULL) {
1080 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
1081 return -1;
XiaokangQian23c5be62022-06-07 02:04:34 +00001082 }
1083
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
1085 if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
Ronald Cron67ea2542022-09-15 17:34:42 +02001086 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 }
Ronald Cron67ea2542022-09-15 17:34:42 +02001088
Gilles Peskine449bd832023-01-11 14:50:10 +01001089 if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
Ronald Cron67ea2542022-09-15 17:34:42 +02001090 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 }
Ronald Cron67ea2542022-09-15 17:34:42 +02001092
Gilles Peskine449bd832023-01-11 14:50:10 +01001093 for (key_cert = key_cert_list; key_cert != NULL;
1094 key_cert = key_cert->next) {
Ronald Cron67ea2542022-09-15 17:34:42 +02001095#if defined(MBEDTLS_USE_PSA_CRYPTO)
1096 psa_algorithm_t psa_alg = PSA_ALG_NONE;
1097#endif /* MBEDTLS_USE_PSA_CRYPTO */
1098
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 MBEDTLS_SSL_DEBUG_CRT(3, "certificate (chain) candidate",
1100 key_cert->cert);
XiaokangQian81802f42022-06-10 13:25:22 +00001101
1102 /*
Gilles Peskine449bd832023-01-11 14:50:10 +01001103 * This avoids sending the client a cert it'll reject based on
1104 * keyUsage or other extensions.
1105 */
1106 if (mbedtls_x509_crt_check_key_usage(
1107 key_cert->cert, MBEDTLS_X509_KU_DIGITAL_SIGNATURE) != 0 ||
XiaokangQian81802f42022-06-10 13:25:22 +00001108 mbedtls_x509_crt_check_extended_key_usage(
XiaokangQianfb665a82022-06-15 03:57:21 +00001109 key_cert->cert, MBEDTLS_OID_SERVER_AUTH,
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH)) != 0) {
1111 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
1112 "(extended) key usage extension"));
XiaokangQian81802f42022-06-10 13:25:22 +00001113 continue;
1114 }
XiaokangQian23c5be62022-06-07 02:04:34 +00001115
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 MBEDTLS_SSL_DEBUG_MSG(3,
1117 ("ssl_tls13_pick_key_cert:"
1118 "check signature algorithm %s [%04x]",
1119 mbedtls_ssl_sig_alg_to_str(*sig_alg),
1120 *sig_alg));
Ronald Cron67ea2542022-09-15 17:34:42 +02001121#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001122 psa_alg = ssl_tls13_iana_sig_alg_to_psa_alg(*sig_alg);
Ronald Cron67ea2542022-09-15 17:34:42 +02001123#endif /* MBEDTLS_USE_PSA_CRYPTO */
1124
Gilles Peskine449bd832023-01-11 14:50:10 +01001125 if (mbedtls_ssl_tls13_check_sig_alg_cert_key_match(
1126 *sig_alg, &key_cert->cert->pk)
Ronald Cron67ea2542022-09-15 17:34:42 +02001127#if defined(MBEDTLS_USE_PSA_CRYPTO)
1128 && psa_alg != PSA_ALG_NONE &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 mbedtls_pk_can_do_ext(&key_cert->cert->pk, psa_alg,
1130 PSA_KEY_USAGE_SIGN_HASH) == 1
Ronald Cron67ea2542022-09-15 17:34:42 +02001131#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 ) {
XiaokangQianfb665a82022-06-15 03:57:21 +00001133 ssl->handshake->key_cert = key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +01001134 MBEDTLS_SSL_DEBUG_MSG(3,
1135 ("ssl_tls13_pick_key_cert:"
1136 "selected signature algorithm"
1137 " %s [%04x]",
1138 mbedtls_ssl_sig_alg_to_str(*sig_alg),
1139 *sig_alg));
XiaokangQianfb665a82022-06-15 03:57:21 +00001140 MBEDTLS_SSL_DEBUG_CRT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001141 3, "selected certificate (chain)",
1142 ssl->handshake->key_cert->cert);
1143 return 0;
XiaokangQian81802f42022-06-10 13:25:22 +00001144 }
XiaokangQian81802f42022-06-10 13:25:22 +00001145 }
XiaokangQian23c5be62022-06-07 02:04:34 +00001146 }
1147
Gilles Peskine449bd832023-01-11 14:50:10 +01001148 MBEDTLS_SSL_DEBUG_MSG(2, ("ssl_tls13_pick_key_cert:"
1149 "no suitable certificate found"));
1150 return -1;
XiaokangQian23c5be62022-06-07 02:04:34 +00001151}
XiaokangQian81802f42022-06-10 13:25:22 +00001152#endif /* MBEDTLS_X509_CRT_PARSE_C &&
Ronald Cron928cbd32022-10-04 16:14:26 +02001153 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
XiaokangQian23c5be62022-06-07 02:04:34 +00001154
XiaokangQian4080a7f2022-04-11 09:55:18 +00001155/*
XiaokangQianed582dd2022-04-13 08:21:05 +00001156 *
1157 * STATE HANDLING: ClientHello
1158 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001159 * There are three possible classes of outcomes when parsing the ClientHello:
XiaokangQianed582dd2022-04-13 08:21:05 +00001160 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001161 * 1) The ClientHello was well-formed and matched the server's configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +00001162 *
1163 * In this case, the server progresses to sending its ServerHello.
1164 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001165 * 2) The ClientHello was well-formed but didn't match the server's
1166 * configuration.
XiaokangQianed582dd2022-04-13 08:21:05 +00001167 *
1168 * For example, the client might not have offered a key share which
1169 * the server supports, or the server might require a cookie.
1170 *
1171 * In this case, the server sends a HelloRetryRequest.
1172 *
XiaokangQianb67384d2022-04-19 00:02:38 +00001173 * 3) The ClientHello was ill-formed
XiaokangQianed582dd2022-04-13 08:21:05 +00001174 *
1175 * In this case, we abort the handshake.
1176 *
1177 */
1178
1179/*
XiaokangQian4080a7f2022-04-11 09:55:18 +00001180 * Structure of this message:
1181 *
XiaokangQiane8ff3502022-04-22 02:34:40 +00001182 * uint16 ProtocolVersion;
1183 * opaque Random[32];
1184 * uint8 CipherSuite[2]; // Cryptographic suite selector
XiaokangQian4080a7f2022-04-11 09:55:18 +00001185 *
XiaokangQiane8ff3502022-04-22 02:34:40 +00001186 * struct {
1187 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
1188 * Random random;
1189 * opaque legacy_session_id<0..32>;
1190 * CipherSuite cipher_suites<2..2^16-2>;
1191 * opaque legacy_compression_methods<1..2^8-1>;
1192 * Extension extensions<8..2^16-1>;
1193 * } ClientHello;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001194 */
XiaokangQianed582dd2022-04-13 08:21:05 +00001195
1196#define SSL_CLIENT_HELLO_OK 0
1197#define SSL_CLIENT_HELLO_HRR_REQUIRED 1
1198
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001199MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001200static int ssl_tls13_parse_client_hello(mbedtls_ssl_context *ssl,
1201 const unsigned char *buf,
1202 const unsigned char *end)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001203{
XiaokangQianb67384d2022-04-19 00:02:38 +00001204 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1205 const unsigned char *p = buf;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001206 size_t legacy_session_id_len;
XiaokangQian318dc762022-04-20 09:43:51 +00001207 size_t cipher_suites_len;
XiaokangQian060d8672022-04-21 09:24:56 +00001208 const unsigned char *cipher_suites_end;
XiaokangQianb67384d2022-04-19 00:02:38 +00001209 size_t extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001210 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001211 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yu49ca9282022-05-05 11:05:22 +08001212 int hrr_required = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001213
Ronald Cron41a443a2022-10-04 16:38:25 +02001214#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yu5725f1c2022-08-21 17:27:16 +08001215 const unsigned char *cipher_suites;
Jerry Yu29d9faa2022-08-23 17:52:45 +08001216 const unsigned char *pre_shared_key_ext = NULL;
Jerry Yu1c105562022-07-10 06:32:38 +00001217 const unsigned char *pre_shared_key_ext_end = NULL;
Ronald Cron41a443a2022-10-04 16:38:25 +02001218#endif
XiaokangQian7807f9f2022-02-15 10:04:37 +00001219
XiaokangQian7807f9f2022-02-15 10:04:37 +00001220 /*
XiaokangQianb67384d2022-04-19 00:02:38 +00001221 * ClientHello layout:
XiaokangQian7807f9f2022-02-15 10:04:37 +00001222 * 0 . 1 protocol version
XiaokangQiane8ff3502022-04-22 02:34:40 +00001223 * 2 . 33 random bytes
XiaokangQianc5763b52022-04-02 03:34:37 +00001224 * 34 . 34 session id length ( 1 byte )
XiaokangQian7807f9f2022-02-15 10:04:37 +00001225 * 35 . 34+x session id
XiaokangQian7807f9f2022-02-15 10:04:37 +00001226 * .. . .. ciphersuite list length ( 2 bytes )
1227 * .. . .. ciphersuite list
1228 * .. . .. compression alg. list length ( 1 byte )
1229 * .. . .. compression alg. list
1230 * .. . .. extensions length ( 2 bytes, optional )
1231 * .. . .. extensions ( optional )
1232 */
1233
XiaokangQianb67384d2022-04-19 00:02:38 +00001234 /*
bootstrap-prime6dbbf442022-05-17 19:30:44 -04001235 * Minimal length ( with everything empty and extensions omitted ) is
XiaokangQian7807f9f2022-02-15 10:04:37 +00001236 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1237 * read at least up to session id length without worrying.
1238 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 38);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001240
1241 /* ...
1242 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1243 * ...
1244 * with ProtocolVersion defined as:
1245 * uint16 ProtocolVersion;
1246 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001247 if (mbedtls_ssl_read_version(p, ssl->conf->transport) !=
1248 MBEDTLS_SSL_VERSION_TLS1_2) {
1249 MBEDTLS_SSL_DEBUG_MSG(1, ("Unsupported version of TLS."));
1250 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1251 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
1252 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001253 }
1254 p += 2;
1255
1256 /*
XiaokangQianf8ceb942022-04-15 11:43:27 +00001257 * Only support TLS 1.3 currently, temporarily set the version.
1258 */
XiaokangQiande333912022-04-20 08:49:42 +00001259 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
XiaokangQianf8ceb942022-04-15 11:43:27 +00001260
Jerry Yue67bef42022-07-07 07:29:42 +00001261#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1262 /* Store minor version for later use with ticket serialization. */
1263 ssl->session_negotiate->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
Jerry Yua66fece2022-07-13 14:30:29 +08001264 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Jerry Yufca4d572022-07-21 10:37:48 +08001265#endif
Jerry Yue67bef42022-07-07 07:29:42 +00001266
Jerry Yuc1be19f2022-04-23 16:11:39 +08001267 /* ...
1268 * Random random;
1269 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001270 * with Random defined as:
1271 * opaque Random[32];
XiaokangQian7807f9f2022-02-15 10:04:37 +00001272 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes",
1274 p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001275
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 memcpy(&handshake->randbytes[0], p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
XiaokangQian08037552022-04-20 07:16:41 +00001277 p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001278
Jerry Yuc1be19f2022-04-23 16:11:39 +08001279 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001280 * opaque legacy_session_id<0..32>;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001281 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +00001282 */
XiaokangQian4080a7f2022-04-11 09:55:18 +00001283 legacy_session_id_len = p[0];
XiaokangQianc5763b52022-04-02 03:34:37 +00001284 p++;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001285
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 if (legacy_session_id_len > sizeof(ssl->session_negotiate->id)) {
1287 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1288 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001289 }
1290
XiaokangQian4080a7f2022-04-11 09:55:18 +00001291 ssl->session_negotiate->id_len = legacy_session_id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id",
1293 p, legacy_session_id_len);
XiaokangQianb67384d2022-04-19 00:02:38 +00001294 /*
1295 * Check we have enough data for the legacy session identifier
Jerry Yue95c8af2022-07-26 15:48:20 +08001296 * and the ciphersuite list length.
XiaokangQianb67384d2022-04-19 00:02:38 +00001297 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_len + 2);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001299
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 memcpy(&ssl->session_negotiate->id[0], p, legacy_session_id_len);
XiaokangQian4080a7f2022-04-11 09:55:18 +00001301 p += legacy_session_id_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001302
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 cipher_suites_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001304 p += 2;
1305
XiaokangQianb67384d2022-04-19 00:02:38 +00001306 /* Check we have enough data for the ciphersuite list, the legacy
1307 * compression methods and the length of the extensions.
Jerry Yue95c8af2022-07-26 15:48:20 +08001308 *
1309 * cipher_suites cipher_suites_len bytes
1310 * legacy_compression_methods 2 bytes
1311 * extensions_len 2 bytes
XiaokangQianb67384d2022-04-19 00:02:38 +00001312 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, cipher_suites_len + 2 + 2);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 /* ...
1316 * CipherSuite cipher_suites<2..2^16-2>;
1317 * ...
1318 * with CipherSuite defined as:
1319 * uint8 CipherSuite[2];
1320 */
Ronald Cron41a443a2022-10-04 16:38:25 +02001321#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQian060d8672022-04-21 09:24:56 +00001322 cipher_suites = p;
Jerry Yu5725f1c2022-08-21 17:27:16 +08001323#endif
XiaokangQian060d8672022-04-21 09:24:56 +00001324 cipher_suites_end = p + cipher_suites_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001325 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1326 p, cipher_suites_len);
Jerry Yu5725f1c2022-08-21 17:27:16 +08001327
1328 /*
1329 * Search for a matching ciphersuite
1330 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 for (; p < cipher_suites_end; p += 2) {
XiaokangQiane8ff3502022-04-22 02:34:40 +00001332 uint16_t cipher_suite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Jerry Yu5725f1c2022-08-21 17:27:16 +08001334
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, cipher_suites_end, 2);
Jerry Yu5725f1c2022-08-21 17:27:16 +08001336
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yuc5a23a02022-08-25 10:51:44 +08001338 ciphersuite_info = ssl_tls13_validate_peer_ciphersuite(
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 ssl, cipher_suite);
1340 if (ciphersuite_info == NULL) {
Jerry Yu5725f1c2022-08-21 17:27:16 +08001341 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 }
Jerry Yu5725f1c2022-08-21 17:27:16 +08001343
Jerry Yu5725f1c2022-08-21 17:27:16 +08001344 ssl->session_negotiate->ciphersuite = cipher_suite;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001345 handshake->ciphersuite_info = ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01001346 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %04x - %s",
1347 cipher_suite,
1348 ciphersuite_info->name));
XiaokangQian17f974c2022-04-19 09:57:41 +00001349 }
Jerry Yu5725f1c2022-08-21 17:27:16 +08001350
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 if (handshake->ciphersuite_info == NULL) {
1352 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1353 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1354 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu5725f1c2022-08-21 17:27:16 +08001355 }
Jerry Yuc1be19f2022-04-23 16:11:39 +08001356
XiaokangQian4080a7f2022-04-11 09:55:18 +00001357 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001358 * opaque legacy_compression_methods<1..2^8-1>;
XiaokangQian4080a7f2022-04-11 09:55:18 +00001359 * ...
XiaokangQian7807f9f2022-02-15 10:04:37 +00001360 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 if (p[0] != 1 || p[1] != MBEDTLS_SSL_COMPRESS_NULL) {
1362 MBEDTLS_SSL_DEBUG_MSG(1, ("bad legacy compression method"));
1363 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1364 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1365 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001366 }
XiaokangQianb67384d2022-04-19 00:02:38 +00001367 p += 2;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001368
Jerry Yuc1be19f2022-04-23 16:11:39 +08001369 /* ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001370 * Extension extensions<8..2^16-1>;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001371 * ...
XiaokangQianb67384d2022-04-19 00:02:38 +00001372 * with Extension defined as:
1373 * struct {
1374 * ExtensionType extension_type;
1375 * opaque extension_data<0..2^16-1>;
1376 * } Extension;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001377 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001378 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001379 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
XiaokangQiane8ff3502022-04-22 02:34:40 +00001381 extensions_end = p + extensions_len;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001382
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", p, extensions_len);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001384
Jerry Yu63a459c2022-10-31 13:38:40 +08001385 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu0c354a22022-08-29 15:25:36 +08001386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 while (p < extensions_end) {
XiaokangQian7807f9f2022-02-15 10:04:37 +00001388 unsigned int extension_type;
1389 size_t extension_data_len;
1390 const unsigned char *extension_data_end;
1391
Jerry Yu0c354a22022-08-29 15:25:36 +08001392 /* RFC 8446, section 4.2.11
Jerry Yu1c9247c2022-07-21 12:37:39 +08001393 *
1394 * The "pre_shared_key" extension MUST be the last extension in the
1395 * ClientHello (this facilitates implementation as described below).
1396 * Servers MUST check that it is the last extension and otherwise fail
1397 * the handshake with an "illegal_parameter" alert.
1398 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)) {
Jerry Yu1c9247c2022-07-21 12:37:39 +08001400 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 3, ("pre_shared_key is not last extension."));
Jerry Yu1c9247c2022-07-21 12:37:39 +08001402 MBEDTLS_SSL_PEND_FATAL_ALERT(
1403 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1405 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu1c9247c2022-07-21 12:37:39 +08001406 }
1407
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
1409 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
1410 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001411 p += 4;
1412
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
XiaokangQian7807f9f2022-02-15 10:04:37 +00001414 extension_data_end = p + extension_data_len;
1415
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001416 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO, extension_type,
1418 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CH);
1419 if (ret != 0) {
1420 return ret;
1421 }
Jerry Yue18dc7e2022-08-04 16:29:22 +08001422
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 switch (extension_type) {
XiaokangQian40a35232022-05-07 09:02:40 +00001424#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1425 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1427 ret = mbedtls_ssl_parse_server_name_ext(ssl, p,
1428 extension_data_end);
1429 if (ret != 0) {
XiaokangQian40a35232022-05-07 09:02:40 +00001430 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001431 1, "mbedtls_ssl_parse_servername_ext", ret);
1432 return ret;
XiaokangQian40a35232022-05-07 09:02:40 +00001433 }
XiaokangQian40a35232022-05-07 09:02:40 +00001434 break;
1435#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1436
XiaokangQianb67384d2022-04-19 00:02:38 +00001437#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001438 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported group extension"));
XiaokangQian7807f9f2022-02-15 10:04:37 +00001440
1441 /* Supported Groups Extension
1442 *
1443 * When sent by the client, the "supported_groups" extension
1444 * indicates the named groups which the client supports,
1445 * ordered from most preferred to least preferred.
1446 */
Jerry Yuc1be19f2022-04-23 16:11:39 +08001447 ret = ssl_tls13_parse_supported_groups_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 ssl, p, extension_data_end);
1449 if (ret != 0) {
1450 MBEDTLS_SSL_DEBUG_RET(1,
1451 "mbedtls_ssl_parse_supported_groups_ext", ret);
1452 return ret;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001453 }
1454
XiaokangQian7807f9f2022-02-15 10:04:37 +00001455 break;
XiaokangQianb67384d2022-04-19 00:02:38 +00001456#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001457
XiaokangQian88408882022-04-02 10:15:03 +00001458#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001459 case MBEDTLS_TLS_EXT_KEY_SHARE:
Gilles Peskine449bd832023-01-11 14:50:10 +01001460 MBEDTLS_SSL_DEBUG_MSG(3, ("found key share extension"));
XiaokangQian7807f9f2022-02-15 10:04:37 +00001461
1462 /*
1463 * Key Share Extension
1464 *
1465 * When sent by the client, the "key_share" extension
1466 * contains the endpoint's cryptographic parameters for
1467 * ECDHE/DHE key establishment methods.
1468 */
Jerry Yuc1be19f2022-04-23 16:11:39 +08001469 ret = ssl_tls13_parse_key_shares_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001470 ssl, p, extension_data_end);
1471 if (ret == SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH) {
1472 MBEDTLS_SSL_DEBUG_MSG(2, ("HRR needed "));
Jerry Yu49ca9282022-05-05 11:05:22 +08001473 hrr_required = 1;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001474 }
1475
Gilles Peskine449bd832023-01-11 14:50:10 +01001476 if (ret < 0) {
Jerry Yu582dd062022-04-22 21:59:01 +08001477 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001478 1, "ssl_tls13_parse_key_shares_ext", ret);
1479 return ret;
Jerry Yu582dd062022-04-22 21:59:01 +08001480 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001481
XiaokangQian7807f9f2022-02-15 10:04:37 +00001482 break;
XiaokangQian88408882022-04-02 10:15:03 +00001483#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001484
1485 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported versions extension"));
XiaokangQian7807f9f2022-02-15 10:04:37 +00001487
1488 ret = ssl_tls13_parse_supported_versions_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 ssl, p, extension_data_end);
1490 if (ret != 0) {
1491 MBEDTLS_SSL_DEBUG_RET(1,
1492 ("ssl_tls13_parse_supported_versions_ext"), ret);
1493 return ret;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001494 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001495 break;
1496
Ronald Cron41a443a2022-10-04 16:38:25 +02001497#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yue19e3b92022-07-08 12:04:51 +00001498 case MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES:
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 MBEDTLS_SSL_DEBUG_MSG(3, ("found psk key exchange modes extension"));
Jerry Yue19e3b92022-07-08 12:04:51 +00001500
1501 ret = ssl_tls13_parse_key_exchange_modes_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001502 ssl, p, extension_data_end);
1503 if (ret != 0) {
Jerry Yue19e3b92022-07-08 12:04:51 +00001504 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 1, "ssl_tls13_parse_key_exchange_modes_ext", ret);
1506 return ret;
Jerry Yue19e3b92022-07-08 12:04:51 +00001507 }
1508
Jerry Yue19e3b92022-07-08 12:04:51 +00001509 break;
Ronald Cron41a443a2022-10-04 16:38:25 +02001510#endif
Jerry Yue19e3b92022-07-08 12:04:51 +00001511
Jerry Yu1c105562022-07-10 06:32:38 +00001512 case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 MBEDTLS_SSL_DEBUG_MSG(3, ("found pre_shared_key extension"));
1514 if ((handshake->received_extensions &
1515 MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES)) == 0) {
Jerry Yu13ab81d2022-07-22 23:17:11 +08001516 MBEDTLS_SSL_PEND_FATAL_ALERT(
1517 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
Gilles Peskine449bd832023-01-11 14:50:10 +01001518 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1519 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu13ab81d2022-07-22 23:17:11 +08001520 }
Ronald Cron41a443a2022-10-04 16:38:25 +02001521#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yu1c105562022-07-10 06:32:38 +00001522 /* Delay processing of the PSK identity once we have
1523 * found out which algorithms to use. We keep a pointer
1524 * to the buffer and the size for later processing.
1525 */
Jerry Yu29d9faa2022-08-23 17:52:45 +08001526 pre_shared_key_ext = p;
Jerry Yu1c105562022-07-10 06:32:38 +00001527 pre_shared_key_ext_end = extension_data_end;
Jerry Yue18dc7e2022-08-04 16:29:22 +08001528#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
Jerry Yu1c105562022-07-10 06:32:38 +00001529 break;
Jerry Yu1c105562022-07-10 06:32:38 +00001530
XiaokangQianacb39922022-06-17 10:18:48 +00001531#if defined(MBEDTLS_SSL_ALPN)
1532 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
XiaokangQianacb39922022-06-17 10:18:48 +00001534
Gilles Peskine449bd832023-01-11 14:50:10 +01001535 ret = mbedtls_ssl_parse_alpn_ext(ssl, p, extension_data_end);
1536 if (ret != 0) {
XiaokangQianacb39922022-06-17 10:18:48 +00001537 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001538 1, ("mbedtls_ssl_parse_alpn_ext"), ret);
1539 return ret;
XiaokangQianacb39922022-06-17 10:18:48 +00001540 }
XiaokangQianacb39922022-06-17 10:18:48 +00001541 break;
1542#endif /* MBEDTLS_SSL_ALPN */
1543
Ronald Cron928cbd32022-10-04 16:14:26 +02001544#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001545 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
XiaokangQian7807f9f2022-02-15 10:04:37 +00001547
Gabor Mezei078e8032022-04-27 21:17:56 +02001548 ret = mbedtls_ssl_parse_sig_alg_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001549 ssl, p, extension_data_end);
1550 if (ret != 0) {
1551 MBEDTLS_SSL_DEBUG_MSG(1,
1552 (
1553 "ssl_parse_supported_signature_algorithms_server_ext ( %d )",
1554 ret));
1555 return ret;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001556 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001557 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02001558#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001559
1560 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08001561 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu63a459c2022-10-31 13:38:40 +08001562 3, MBEDTLS_SSL_HS_CLIENT_HELLO,
Gilles Peskine449bd832023-01-11 14:50:10 +01001563 extension_type, "( ignored )");
Jerry Yu0c354a22022-08-29 15:25:36 +08001564 break;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001565 }
1566
1567 p += extension_data_len;
1568 }
1569
Gilles Peskine449bd832023-01-11 14:50:10 +01001570 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CLIENT_HELLO,
1571 handshake->received_extensions);
Jerry Yue18dc7e2022-08-04 16:29:22 +08001572
Gilles Peskine449bd832023-01-11 14:50:10 +01001573 mbedtls_ssl_add_hs_hdr_to_checksum(ssl,
1574 MBEDTLS_SSL_HS_CLIENT_HELLO,
1575 p - buf);
Jerry Yu032b15ce2022-07-11 06:10:03 +00001576
Ronald Cron41a443a2022-10-04 16:38:25 +02001577#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001578 /* Update checksum with either
1579 * - The entire content of the CH message, if no PSK extension is present
1580 * - The content up to but excluding the PSK extension, if present.
1581 */
Jerry Yu1c105562022-07-10 06:32:38 +00001582 /* If we've settled on a PSK-based exchange, parse PSK identity ext */
Gilles Peskine449bd832023-01-11 14:50:10 +01001583 if (mbedtls_ssl_tls13_some_psk_enabled(ssl) &&
1584 mbedtls_ssl_conf_tls13_some_psk_enabled(ssl) &&
1585 (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY))) {
1586 handshake->update_checksum(ssl, buf,
1587 pre_shared_key_ext - buf);
1588 ret = ssl_tls13_parse_pre_shared_key_ext(ssl,
1589 pre_shared_key_ext,
1590 pre_shared_key_ext_end,
1591 cipher_suites,
1592 cipher_suites_end);
1593 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
1594 handshake->received_extensions &= ~MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY);
1595 } else if (ret != 0) {
Jerry Yu63a459c2022-10-31 13:38:40 +08001596 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001597 1, "ssl_tls13_parse_pre_shared_key_ext", ret);
1598 return ret;
Jerry Yu1c105562022-07-10 06:32:38 +00001599 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001600 } else
Ronald Cron41a443a2022-10-04 16:38:25 +02001601#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
Jerry Yu1c105562022-07-10 06:32:38 +00001602 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 handshake->update_checksum(ssl, buf, p - buf);
Jerry Yu1c105562022-07-10 06:32:38 +00001604 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001605
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 ret = ssl_tls13_determine_key_exchange_mode(ssl);
1607 if (ret < 0) {
1608 return ret;
1609 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00001610
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 mbedtls_ssl_optimize_checksum(ssl, handshake->ciphersuite_info);
Jerry Yue5834fd2022-08-29 20:16:09 +08001612
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 return hrr_required ? SSL_CLIENT_HELLO_HRR_REQUIRED : SSL_CLIENT_HELLO_OK;
XiaokangQian75fe8c72022-06-15 09:42:45 +00001614}
1615
1616/* Update the handshake state machine */
1617
Ronald Cronce7d76e2022-07-08 18:56:49 +02001618MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001619static int ssl_tls13_postprocess_client_hello(mbedtls_ssl_context *ssl)
XiaokangQian75fe8c72022-06-15 09:42:45 +00001620{
1621 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1622
XiaokangQian7807f9f2022-02-15 10:04:37 +00001623 /*
XiaokangQianfb665a82022-06-15 03:57:21 +00001624 * Server certificate selection
1625 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001626 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1627 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1628 return ret;
XiaokangQianfb665a82022-06-15 03:57:21 +00001629 }
1630#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1631 ssl->handshake->sni_name = NULL;
1632 ssl->handshake->sni_name_len = 0;
1633#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001634
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1636 if (ret != 0) {
1637 MBEDTLS_SSL_DEBUG_RET(1,
1638 "mbedtls_ssl_tls1_3_key_schedule_stage_early", ret);
1639 return ret;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001640 }
1641
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 return 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001643
1644}
1645
1646/*
XiaokangQianed582dd2022-04-13 08:21:05 +00001647 * Main entry point from the state machine; orchestrates the otherfunctions.
1648 */
1649
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001650MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001651static int ssl_tls13_process_client_hello(mbedtls_ssl_context *ssl)
XiaokangQianed582dd2022-04-13 08:21:05 +00001652{
1653
XiaokangQian08037552022-04-20 07:16:41 +00001654 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001655 unsigned char *buf = NULL;
XiaokangQianed582dd2022-04-13 08:21:05 +00001656 size_t buflen = 0;
Jerry Yu4ca91402022-05-09 15:50:57 +08001657 int parse_client_hello_ret;
1658
Gilles Peskine449bd832023-01-11 14:50:10 +01001659 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
XiaokangQianed582dd2022-04-13 08:21:05 +00001660
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
1662 ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
1663 &buf, &buflen));
XiaokangQianed582dd2022-04-13 08:21:05 +00001664
Gilles Peskine449bd832023-01-11 14:50:10 +01001665 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_parse_client_hello(ssl, buf,
1666 buf + buflen));
Jerry Yuf41553b2022-05-09 22:20:30 +08001667 parse_client_hello_ret = ret; /* Store return value of parse_client_hello,
1668 * only SSL_CLIENT_HELLO_OK or
1669 * SSL_CLIENT_HELLO_HRR_REQUIRED at this
1670 * stage as negative error codes are handled
1671 * by MBEDTLS_SSL_PROC_CHK_NEG. */
Jerry Yu4ca91402022-05-09 15:50:57 +08001672
Gilles Peskine449bd832023-01-11 14:50:10 +01001673 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_client_hello(ssl));
Jerry Yu582dd062022-04-22 21:59:01 +08001674
Gilles Peskine449bd832023-01-11 14:50:10 +01001675 if (parse_client_hello_ret == SSL_CLIENT_HELLO_OK) {
1676 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
1677 } else {
1678 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HELLO_RETRY_REQUEST);
1679 }
XiaokangQianed582dd2022-04-13 08:21:05 +00001680
1681cleanup:
1682
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
1684 return ret;
XiaokangQianed582dd2022-04-13 08:21:05 +00001685}
1686
1687/*
Jerry Yu1c3e6882022-04-20 21:23:40 +08001688 * Handler for MBEDTLS_SSL_SERVER_HELLO
Jerry Yu5b64ae92022-03-30 17:15:02 +08001689 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001690MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001691static int ssl_tls13_prepare_server_hello(mbedtls_ssl_context *ssl)
Jerry Yuf4b27e42022-03-30 17:32:21 +08001692{
Jerry Yu637a3f12022-04-20 21:37:58 +08001693 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1694 unsigned char *server_randbytes =
Gilles Peskine449bd832023-01-11 14:50:10 +01001695 ssl->handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
1696 if (ssl->conf->f_rng == NULL) {
1697 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
1698 return MBEDTLS_ERR_SSL_NO_RNG;
Jerry Yuf4b27e42022-03-30 17:32:21 +08001699 }
1700
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, server_randbytes,
1702 MBEDTLS_SERVER_HELLO_RANDOM_LEN)) != 0) {
1703 MBEDTLS_SSL_DEBUG_RET(1, "f_rng", ret);
1704 return ret;
Jerry Yuf4b27e42022-03-30 17:32:21 +08001705 }
1706
Gilles Peskine449bd832023-01-11 14:50:10 +01001707 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", server_randbytes,
1708 MBEDTLS_SERVER_HELLO_RANDOM_LEN);
Jerry Yuf4b27e42022-03-30 17:32:21 +08001709
1710#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001711 ssl->session_negotiate->start = time(NULL);
Jerry Yuf4b27e42022-03-30 17:32:21 +08001712#endif /* MBEDTLS_HAVE_TIME */
1713
Gilles Peskine449bd832023-01-11 14:50:10 +01001714 return ret;
Jerry Yuf4b27e42022-03-30 17:32:21 +08001715}
1716
Jerry Yu3bf2c642022-03-30 22:02:12 +08001717/*
Jerry Yue74e04a2022-04-21 09:23:16 +08001718 * ssl_tls13_write_server_hello_supported_versions_ext ():
Jerry Yu3bf2c642022-03-30 22:02:12 +08001719 *
1720 * struct {
Jerry Yufb9f54d2022-04-06 10:08:34 +08001721 * ProtocolVersion selected_version;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001722 * } SupportedVersions;
1723 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001724MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yue74e04a2022-04-21 09:23:16 +08001725static int ssl_tls13_write_server_hello_supported_versions_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 mbedtls_ssl_context *ssl,
1727 unsigned char *buf,
1728 unsigned char *end,
1729 size_t *out_len)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001730{
Jerry Yu3bf2c642022-03-30 22:02:12 +08001731 *out_len = 0;
1732
Gilles Peskine449bd832023-01-11 14:50:10 +01001733 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, write selected version"));
Jerry Yu3bf2c642022-03-30 22:02:12 +08001734
1735 /* Check if we have space to write the extension:
1736 * - extension_type (2 bytes)
1737 * - extension_data_length (2 bytes)
Jerry Yu349a6132022-04-14 20:52:56 +08001738 * - selected_version (2 bytes)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001739 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001740 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001741
Gilles Peskine449bd832023-01-11 14:50:10 +01001742 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, buf, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001743
Gilles Peskine449bd832023-01-11 14:50:10 +01001744 MBEDTLS_PUT_UINT16_BE(2, buf, 2);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001745
Gilles Peskine449bd832023-01-11 14:50:10 +01001746 mbedtls_ssl_write_version(buf + 4,
1747 ssl->conf->transport,
1748 ssl->tls_version);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001749
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [%04x]",
1751 ssl->tls_version));
Jerry Yu3bf2c642022-03-30 22:02:12 +08001752
Jerry Yu349a6132022-04-14 20:52:56 +08001753 *out_len = 6;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001754
Jerry Yub95dd362022-11-08 21:19:34 +08001755 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS);
Jerry Yub95dd362022-11-08 21:19:34 +08001757
Gilles Peskine449bd832023-01-11 14:50:10 +01001758 return 0;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001759}
1760
Jerry Yud9436a12022-04-20 22:28:09 +08001761
Jerry Yu3bf2c642022-03-30 22:02:12 +08001762
1763/* Generate and export a single key share. For hybrid KEMs, this can
1764 * be called multiple times with the different components of the hybrid. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001765MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001766static int ssl_tls13_generate_and_write_key_share(mbedtls_ssl_context *ssl,
1767 uint16_t named_group,
1768 unsigned char *buf,
1769 unsigned char *end,
1770 size_t *out_len)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001771{
1772 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu955ddd72022-04-22 22:27:33 +08001773
1774 *out_len = 0;
1775
Jerry Yu89e103c2022-03-30 22:43:29 +08001776#if defined(MBEDTLS_ECDH_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001777 if (mbedtls_ssl_tls13_named_group_is_ecdhe(named_group)) {
Jerry Yu89e103c2022-03-30 22:43:29 +08001778 ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +01001779 ssl, named_group, buf, end, out_len);
1780 if (ret != 0) {
Jerry Yu89e103c2022-03-30 22:43:29 +08001781 MBEDTLS_SSL_DEBUG_RET(
1782 1, "mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange",
Gilles Peskine449bd832023-01-11 14:50:10 +01001783 ret);
1784 return ret;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001785 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 } else
Jerry Yu89e103c2022-03-30 22:43:29 +08001787#endif /* MBEDTLS_ECDH_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001788 if (0 /* Other kinds of KEMs */) {
1789 } else {
Jerry Yu955ddd72022-04-22 22:27:33 +08001790 ((void) ssl);
1791 ((void) named_group);
1792 ((void) buf);
1793 ((void) end);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001794 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1795 }
1796
Gilles Peskine449bd832023-01-11 14:50:10 +01001797 return ret;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001798}
1799
1800/*
1801 * ssl_tls13_write_key_share_ext
1802 *
1803 * Structure of key_share extension in ServerHello:
1804 *
Jerry Yu1c3e6882022-04-20 21:23:40 +08001805 * struct {
1806 * NamedGroup group;
1807 * opaque key_exchange<1..2^16-1>;
1808 * } KeyShareEntry;
1809 * struct {
1810 * KeyShareEntry server_share;
1811 * } KeyShareServerHello;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001812 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001813MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001814static int ssl_tls13_write_key_share_ext(mbedtls_ssl_context *ssl,
1815 unsigned char *buf,
1816 unsigned char *end,
1817 size_t *out_len)
Jerry Yu3bf2c642022-03-30 22:02:12 +08001818{
Jerry Yu955ddd72022-04-22 22:27:33 +08001819 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001820 unsigned char *p = buf;
Jerry Yu57d48412022-04-20 21:50:42 +08001821 uint16_t group = ssl->handshake->offered_group_id;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001822 unsigned char *server_share = buf + 4;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001823 size_t key_exchange_length;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001824
1825 *out_len = 0;
1826
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding key share extension"));
Jerry Yu3bf2c642022-03-30 22:02:12 +08001828
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 MBEDTLS_SSL_DEBUG_MSG(2, ("server hello, write selected_group: %s (%04x)",
1830 mbedtls_ssl_named_group_to_str(group),
1831 group));
Jerry Yu58af2332022-09-06 11:19:31 +08001832
Jerry Yu3bf2c642022-03-30 22:02:12 +08001833 /* Check if we have space for header and length fields:
1834 * - extension_type (2 bytes)
1835 * - extension_data_length (2 bytes)
1836 * - group (2 bytes)
1837 * - key_exchange_length (2 bytes)
1838 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001839 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 8);
1840 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, p, 0);
1841 MBEDTLS_PUT_UINT16_BE(group, server_share, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001842 p += 8;
Jerry Yu57d48412022-04-20 21:50:42 +08001843
Jerry Yu3bf2c642022-03-30 22:02:12 +08001844 /* When we introduce PQC-ECDHE hybrids, we'll want to call this
1845 * function multiple times. */
Jerry Yu955ddd72022-04-22 22:27:33 +08001846 ret = ssl_tls13_generate_and_write_key_share(
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 ssl, group, server_share + 4, end, &key_exchange_length);
1848 if (ret != 0) {
1849 return ret;
1850 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08001851 p += key_exchange_length;
Jerry Yuc1be19f2022-04-23 16:11:39 +08001852
Gilles Peskine449bd832023-01-11 14:50:10 +01001853 MBEDTLS_PUT_UINT16_BE(key_exchange_length, server_share + 2, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001854
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 MBEDTLS_PUT_UINT16_BE(p - server_share, buf, 2);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001856
Jerry Yu57d48412022-04-20 21:50:42 +08001857 *out_len = p - buf;
Jerry Yu955ddd72022-04-22 22:27:33 +08001858
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
Jerry Yub95dd362022-11-08 21:19:34 +08001860
Gilles Peskine449bd832023-01-11 14:50:10 +01001861 return 0;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001862}
Jerry Yud9436a12022-04-20 22:28:09 +08001863
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001864MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001865static int ssl_tls13_write_hrr_key_share_ext(mbedtls_ssl_context *ssl,
1866 unsigned char *buf,
1867 unsigned char *end,
1868 size_t *out_len)
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001869{
1870 uint16_t selected_group = ssl->handshake->hrr_selected_group;
1871 /* key_share Extension
1872 *
1873 * struct {
1874 * select (Handshake.msg_type) {
1875 * ...
1876 * case hello_retry_request:
1877 * NamedGroup selected_group;
1878 * ...
1879 * };
1880 * } KeyShare;
1881 */
1882
1883 *out_len = 0;
1884
Jerry Yub0ac10b2022-05-05 11:10:08 +08001885 /*
1886 * For a pure PSK key exchange, there is no group to agree upon. The purpose
1887 * of the HRR is then to transmit a cookie to force the client to demonstrate
1888 * reachability at their apparent network address (primarily useful for DTLS).
1889 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001890 if (!mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
1891 return 0;
1892 }
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001893
1894 /* We should only send the key_share extension if the client's initial
1895 * key share was not acceptable. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001896 if (ssl->handshake->offered_group_id != 0) {
1897 MBEDTLS_SSL_DEBUG_MSG(4, ("Skip key_share extension in HRR"));
1898 return 0;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001899 }
1900
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 if (selected_group == 0) {
1902 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching named group found"));
1903 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001904 }
1905
Jerry Yub0ac10b2022-05-05 11:10:08 +08001906 /* Check if we have enough space:
1907 * - extension_type (2 bytes)
1908 * - extension_data_length (2 bytes)
1909 * - selected_group (2 bytes)
1910 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001911 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6);
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001912
Gilles Peskine449bd832023-01-11 14:50:10 +01001913 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0);
1914 MBEDTLS_PUT_UINT16_BE(2, buf, 2);
1915 MBEDTLS_PUT_UINT16_BE(selected_group, buf, 4);
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001916
Gilles Peskine449bd832023-01-11 14:50:10 +01001917 MBEDTLS_SSL_DEBUG_MSG(3,
1918 ("HRR selected_group: %s (%x)",
1919 mbedtls_ssl_named_group_to_str(selected_group),
1920 selected_group));
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001921
1922 *out_len = 6;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
Jerry Yub95dd362022-11-08 21:19:34 +08001925
Gilles Peskine449bd832023-01-11 14:50:10 +01001926 return 0;
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001927}
Jerry Yu3bf2c642022-03-30 22:02:12 +08001928
1929/*
1930 * Structure of ServerHello message:
1931 *
1932 * struct {
1933 * ProtocolVersion legacy_version = 0x0303; // TLS v1.2
1934 * Random random;
1935 * opaque legacy_session_id_echo<0..32>;
1936 * CipherSuite cipher_suite;
1937 * uint8 legacy_compression_method = 0;
1938 * Extension extensions<6..2^16-1>;
1939 * } ServerHello;
1940 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001941MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001942static int ssl_tls13_write_server_hello_body(mbedtls_ssl_context *ssl,
1943 unsigned char *buf,
1944 unsigned char *end,
1945 size_t *out_len,
1946 int is_hrr)
Jerry Yu56404d72022-03-30 17:36:13 +08001947{
Jerry Yu955ddd72022-04-22 22:27:33 +08001948 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001949 unsigned char *p = buf;
Jerry Yud9436a12022-04-20 22:28:09 +08001950 unsigned char *p_extensions_len;
Jerry Yufbe3e642022-04-25 19:31:51 +08001951 size_t output_len;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001952
1953 *out_len = 0;
Jerry Yu50e00e32022-10-31 14:45:01 +08001954 ssl->handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001955
Jerry Yucfc04b32022-04-21 09:31:58 +08001956 /* ...
1957 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1958 * ...
1959 * with ProtocolVersion defined as:
1960 * uint16 ProtocolVersion;
Jerry Yu3bf2c642022-03-30 22:02:12 +08001961 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001962 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
1963 MBEDTLS_PUT_UINT16_BE(0x0303, p, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001964 p += 2;
1965
Jerry Yu1c3e6882022-04-20 21:23:40 +08001966 /* ...
1967 * Random random;
1968 * ...
Jerry Yucfc04b32022-04-21 09:31:58 +08001969 * with Random defined as:
1970 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu1c3e6882022-04-20 21:23:40 +08001971 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 MBEDTLS_SSL_CHK_BUF_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
1973 if (is_hrr) {
1974 memcpy(p, mbedtls_ssl_tls13_hello_retry_request_magic,
1975 MBEDTLS_SERVER_HELLO_RANDOM_LEN);
1976 } else {
1977 memcpy(p, &ssl->handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN],
1978 MBEDTLS_SERVER_HELLO_RANDOM_LEN);
Jerry Yu23f7a6f2022-04-23 15:16:45 +08001979 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001980 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes",
1981 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001982 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
1983
Jerry Yucfc04b32022-04-21 09:31:58 +08001984 /* ...
1985 * opaque legacy_session_id_echo<0..32>;
1986 * ...
Jerry Yu3bf2c642022-03-30 22:02:12 +08001987 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001988 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1 + ssl->session_negotiate->id_len);
1989 *p++ = (unsigned char) ssl->session_negotiate->id_len;
1990 if (ssl->session_negotiate->id_len > 0) {
1991 memcpy(p, &ssl->session_negotiate->id[0],
1992 ssl->session_negotiate->id_len);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001993 p += ssl->session_negotiate->id_len;
Jerry Yu955ddd72022-04-22 22:27:33 +08001994
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 MBEDTLS_SSL_DEBUG_BUF(3, "session id", ssl->session_negotiate->id,
1996 ssl->session_negotiate->id_len);
Jerry Yu3bf2c642022-03-30 22:02:12 +08001997 }
1998
Jerry Yucfc04b32022-04-21 09:31:58 +08001999 /* ...
2000 * CipherSuite cipher_suite;
2001 * ...
2002 * with CipherSuite defined as:
2003 * uint8 CipherSuite[2];
Jerry Yu3bf2c642022-03-30 22:02:12 +08002004 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2006 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08002007 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 MBEDTLS_SSL_DEBUG_MSG(3,
2009 ("server hello, chosen ciphersuite: %s ( id=%d )",
2010 mbedtls_ssl_get_ciphersuite_name(
2011 ssl->session_negotiate->ciphersuite),
2012 ssl->session_negotiate->ciphersuite));
Jerry Yu3bf2c642022-03-30 22:02:12 +08002013
Jerry Yucfc04b32022-04-21 09:31:58 +08002014 /* ...
2015 * uint8 legacy_compression_method = 0;
2016 * ...
2017 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002018 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1);
Thomas Daubney31e03a82022-07-25 15:59:25 +01002019 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002020
Jerry Yucfc04b32022-04-21 09:31:58 +08002021 /* ...
2022 * Extension extensions<6..2^16-1>;
2023 * ...
2024 * struct {
2025 * ExtensionType extension_type; (2 bytes)
2026 * opaque extension_data<0..2^16-1>;
2027 * } Extension;
2028 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002029 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
Jerry Yud9436a12022-04-20 22:28:09 +08002030 p_extensions_len = p;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002031 p += 2;
2032
Gilles Peskine449bd832023-01-11 14:50:10 +01002033 if ((ret = ssl_tls13_write_server_hello_supported_versions_ext(
2034 ssl, p, end, &output_len)) != 0) {
Jerry Yu955ddd72022-04-22 22:27:33 +08002035 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 1, "ssl_tls13_write_server_hello_supported_versions_ext", ret);
2037 return ret;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002038 }
2039 p += output_len;
2040
Gilles Peskine449bd832023-01-11 14:50:10 +01002041 if (mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
2042 if (is_hrr) {
2043 ret = ssl_tls13_write_hrr_key_share_ext(ssl, p, end, &output_len);
2044 } else {
2045 ret = ssl_tls13_write_key_share_ext(ssl, p, end, &output_len);
2046 }
2047 if (ret != 0) {
2048 return ret;
2049 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08002050 p += output_len;
2051 }
Jerry Yu3bf2c642022-03-30 22:02:12 +08002052
Ronald Cron41a443a2022-10-04 16:38:25 +02002053#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 if (!is_hrr && mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2055 ret = ssl_tls13_write_server_pre_shared_key_ext(ssl, p, end, &output_len);
2056 if (ret != 0) {
2057 MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_server_pre_shared_key_ext",
2058 ret);
2059 return ret;
Jerry Yu032b15ce2022-07-11 06:10:03 +00002060 }
2061 p += output_len;
2062 }
Ronald Cron41a443a2022-10-04 16:38:25 +02002063#endif
Jerry Yu032b15ce2022-07-11 06:10:03 +00002064
Gilles Peskine449bd832023-01-11 14:50:10 +01002065 MBEDTLS_PUT_UINT16_BE(p - p_extensions_len - 2, p_extensions_len, 0);
Jerry Yu3bf2c642022-03-30 22:02:12 +08002066
Gilles Peskine449bd832023-01-11 14:50:10 +01002067 MBEDTLS_SSL_DEBUG_BUF(4, "server hello extensions",
2068 p_extensions_len, p - p_extensions_len);
Jerry Yu3bf2c642022-03-30 22:02:12 +08002069
Jerry Yud9436a12022-04-20 22:28:09 +08002070 *out_len = p - buf;
Jerry Yu3bf2c642022-03-30 22:02:12 +08002071
Gilles Peskine449bd832023-01-11 14:50:10 +01002072 MBEDTLS_SSL_DEBUG_BUF(3, "server hello", buf, *out_len);
Jerry Yu3bf2c642022-03-30 22:02:12 +08002073
Jerry Yu7de2ff02022-11-08 21:43:46 +08002074 MBEDTLS_SSL_PRINT_EXTS(
Jerry Yu4b8f2f72022-10-31 13:31:22 +08002075 3, is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST :
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 MBEDTLS_SSL_HS_SERVER_HELLO,
2077 ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +08002078
Gilles Peskine449bd832023-01-11 14:50:10 +01002079 return ret;
Jerry Yu56404d72022-03-30 17:36:13 +08002080}
2081
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002082MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002083static int ssl_tls13_finalize_write_server_hello(mbedtls_ssl_context *ssl)
Jerry Yue110d252022-05-05 10:19:22 +08002084{
2085 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 ret = mbedtls_ssl_tls13_compute_handshake_transform(ssl);
2087 if (ret != 0) {
2088 MBEDTLS_SSL_DEBUG_RET(1,
2089 "mbedtls_ssl_tls13_compute_handshake_transform",
2090 ret);
2091 return ret;
Jerry Yue110d252022-05-05 10:19:22 +08002092 }
2093
Gilles Peskine449bd832023-01-11 14:50:10 +01002094 return ret;
Jerry Yue110d252022-05-05 10:19:22 +08002095}
2096
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002097MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002098static int ssl_tls13_write_server_hello(mbedtls_ssl_context *ssl)
Jerry Yu5b64ae92022-03-30 17:15:02 +08002099{
Jerry Yu637a3f12022-04-20 21:37:58 +08002100 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf4b27e42022-03-30 17:32:21 +08002101 unsigned char *buf;
2102 size_t buf_len, msg_len;
2103
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Jerry Yuf4b27e42022-03-30 17:32:21 +08002105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_server_hello(ssl));
Jerry Yuf4b27e42022-03-30 17:32:21 +08002107
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
2109 MBEDTLS_SSL_HS_SERVER_HELLO, &buf,
2110 &buf_len));
Jerry Yuf4b27e42022-03-30 17:32:21 +08002111
Gilles Peskine449bd832023-01-11 14:50:10 +01002112 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_server_hello_body(ssl, buf,
2113 buf + buf_len,
2114 &msg_len,
2115 0));
Jerry Yuf4b27e42022-03-30 17:32:21 +08002116
Jerry Yu3bf2c642022-03-30 22:02:12 +08002117 mbedtls_ssl_add_hs_msg_to_checksum(
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len);
Jerry Yuf4b27e42022-03-30 17:32:21 +08002119
Gilles Peskine449bd832023-01-11 14:50:10 +01002120 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2121 ssl, buf_len, msg_len));
Jerry Yu637a3f12022-04-20 21:37:58 +08002122
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 MBEDTLS_SSL_PROC_CHK(ssl_tls13_finalize_write_server_hello(ssl));
Jerry Yue110d252022-05-05 10:19:22 +08002124
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002125#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2126 /* The server sends a dummy change_cipher_spec record immediately
2127 * after its first handshake message. This may either be after
2128 * a ServerHello or a HelloRetryRequest.
2129 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02002130 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO);
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002132#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002134#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yue110d252022-05-05 10:19:22 +08002135
Jerry Yuf4b27e42022-03-30 17:32:21 +08002136cleanup:
2137
Gilles Peskine449bd832023-01-11 14:50:10 +01002138 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
2139 return ret;
Jerry Yu5b64ae92022-03-30 17:15:02 +08002140}
2141
Jerry Yu23d1a252022-05-12 18:08:59 +08002142
2143/*
2144 * Handler for MBEDTLS_SSL_HELLO_RETRY_REQUEST
2145 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002146MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002147static int ssl_tls13_prepare_hello_retry_request(mbedtls_ssl_context *ssl)
Jerry Yu23d1a252022-05-12 18:08:59 +08002148{
2149 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 if (ssl->handshake->hello_retry_request_count > 0) {
2151 MBEDTLS_SSL_DEBUG_MSG(1, ("Too many HRRs"));
2152 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2153 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2154 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu23d1a252022-05-12 18:08:59 +08002155 }
2156
2157 /*
2158 * Create stateless transcript hash for HRR
2159 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002160 MBEDTLS_SSL_DEBUG_MSG(4, ("Reset transcript for HRR"));
2161 ret = mbedtls_ssl_reset_transcript_for_hrr(ssl);
2162 if (ret != 0) {
2163 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_transcript_for_hrr", ret);
2164 return ret;
Jerry Yu23d1a252022-05-12 18:08:59 +08002165 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002166 mbedtls_ssl_session_reset_msg_layer(ssl, 0);
Jerry Yu23d1a252022-05-12 18:08:59 +08002167
Gilles Peskine449bd832023-01-11 14:50:10 +01002168 return 0;
Jerry Yu23d1a252022-05-12 18:08:59 +08002169}
2170
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002171MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002172static int ssl_tls13_write_hello_retry_request(mbedtls_ssl_context *ssl)
Jerry Yu23d1a252022-05-12 18:08:59 +08002173{
2174 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2175 unsigned char *buf;
2176 size_t buf_len, msg_len;
2177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello retry request"));
Jerry Yu23d1a252022-05-12 18:08:59 +08002179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_hello_retry_request(ssl));
Jerry Yu23d1a252022-05-12 18:08:59 +08002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
2183 ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
2184 &buf, &buf_len));
Jerry Yu23d1a252022-05-12 18:08:59 +08002185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_server_hello_body(ssl, buf,
2187 buf + buf_len,
2188 &msg_len,
2189 1));
Jerry Yu23d1a252022-05-12 18:08:59 +08002190 mbedtls_ssl_add_hs_msg_to_checksum(
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len);
Jerry Yu23d1a252022-05-12 18:08:59 +08002192
2193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(ssl, buf_len,
2195 msg_len));
Jerry Yu23d1a252022-05-12 18:08:59 +08002196
2197 ssl->handshake->hello_retry_request_count++;
2198
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002199#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2200 /* The server sends a dummy change_cipher_spec record immediately
2201 * after its first handshake message. This may either be after
2202 * a ServerHello or a HelloRetryRequest.
2203 */
Gabor Mezei96ae9262022-06-28 11:45:18 +02002204 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002205 ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST);
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002206#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002207 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002208#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
Jerry Yu23d1a252022-05-12 18:08:59 +08002209
2210cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01002211 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello retry request"));
2212 return ret;
Jerry Yu23d1a252022-05-12 18:08:59 +08002213}
2214
Jerry Yu5b64ae92022-03-30 17:15:02 +08002215/*
Jerry Yu4d3841a2022-04-16 12:37:19 +08002216 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
2217 */
Jerry Yu4d3841a2022-04-16 12:37:19 +08002218
2219/*
2220 * struct {
2221 * Extension extensions<0..2 ^ 16 - 1>;
2222 * } EncryptedExtensions;
2223 *
2224 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002225MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002226static int ssl_tls13_write_encrypted_extensions_body(mbedtls_ssl_context *ssl,
2227 unsigned char *buf,
2228 unsigned char *end,
2229 size_t *out_len)
Jerry Yu4d3841a2022-04-16 12:37:19 +08002230{
XiaokangQianacb39922022-06-17 10:18:48 +00002231 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002232 unsigned char *p = buf;
2233 size_t extensions_len = 0;
Jerry Yu8937eb42022-05-03 12:12:14 +08002234 unsigned char *p_extensions_len;
XiaokangQianacb39922022-06-17 10:18:48 +00002235 size_t output_len;
Jerry Yu9da5e5a2022-05-03 15:46:09 +08002236
Jerry Yu4d3841a2022-04-16 12:37:19 +08002237 *out_len = 0;
2238
Gilles Peskine449bd832023-01-11 14:50:10 +01002239 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
Jerry Yu8937eb42022-05-03 12:12:14 +08002240 p_extensions_len = p;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002241 p += 2;
2242
Jerry Yu8937eb42022-05-03 12:12:14 +08002243 ((void) ssl);
XiaokangQianacb39922022-06-17 10:18:48 +00002244 ((void) ret);
2245 ((void) output_len);
2246
2247#if defined(MBEDTLS_SSL_ALPN)
Gilles Peskine449bd832023-01-11 14:50:10 +01002248 ret = mbedtls_ssl_write_alpn_ext(ssl, p, end, &output_len);
2249 if (ret != 0) {
2250 return ret;
2251 }
XiaokangQian95d5f542022-06-24 02:29:26 +00002252 p += output_len;
XiaokangQianacb39922022-06-17 10:18:48 +00002253#endif /* MBEDTLS_SSL_ALPN */
Jerry Yu4d3841a2022-04-16 12:37:19 +08002254
Gilles Peskine449bd832023-01-11 14:50:10 +01002255 extensions_len = (p - p_extensions_len) - 2;
2256 MBEDTLS_PUT_UINT16_BE(extensions_len, p_extensions_len, 0);
Jerry Yu8937eb42022-05-03 12:12:14 +08002257
2258 *out_len = p - buf;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002259
Gilles Peskine449bd832023-01-11 14:50:10 +01002260 MBEDTLS_SSL_DEBUG_BUF(4, "encrypted extensions", buf, *out_len);
Jerry Yu4d3841a2022-04-16 12:37:19 +08002261
Jerry Yu7de2ff02022-11-08 21:43:46 +08002262 MBEDTLS_SSL_PRINT_EXTS(
Gilles Peskine449bd832023-01-11 14:50:10 +01002263 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +08002264
Gilles Peskine449bd832023-01-11 14:50:10 +01002265 return 0;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002266}
2267
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002268MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002269static int ssl_tls13_write_encrypted_extensions(mbedtls_ssl_context *ssl)
Jerry Yu4d3841a2022-04-16 12:37:19 +08002270{
2271 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2272 unsigned char *buf;
Jerry Yu39730a72022-05-03 12:14:04 +08002273 size_t buf_len, msg_len;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002274
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 mbedtls_ssl_set_outbound_transform(ssl,
2276 ssl->handshake->transform_handshake);
Gabor Mezei54719122022-06-28 11:34:56 +02002277 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01002278 3, ("switching to handshake transform for outbound data"));
Gabor Mezei54719122022-06-28 11:34:56 +02002279
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write encrypted extensions"));
Jerry Yu4d3841a2022-04-16 12:37:19 +08002281
Gilles Peskine449bd832023-01-11 14:50:10 +01002282 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
2283 MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, &buf,
2284 &buf_len));
Jerry Yu4d3841a2022-04-16 12:37:19 +08002285
Gilles Peskine449bd832023-01-11 14:50:10 +01002286 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_encrypted_extensions_body(
2287 ssl, buf, buf + buf_len, &msg_len));
Jerry Yu4d3841a2022-04-16 12:37:19 +08002288
2289 mbedtls_ssl_add_hs_msg_to_checksum(
Gilles Peskine449bd832023-01-11 14:50:10 +01002290 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, buf, msg_len);
Jerry Yu4d3841a2022-04-16 12:37:19 +08002291
Gilles Peskine449bd832023-01-11 14:50:10 +01002292 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2293 ssl, buf_len, msg_len));
Jerry Yu4d3841a2022-04-16 12:37:19 +08002294
Ronald Cron928cbd32022-10-04 16:14:26 +02002295#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002296 if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2297 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2298 } else {
2299 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST);
2300 }
Jerry Yu8937eb42022-05-03 12:12:14 +08002301#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002302 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
Jerry Yu8937eb42022-05-03 12:12:14 +08002303#endif
2304
Jerry Yu4d3841a2022-04-16 12:37:19 +08002305cleanup:
2306
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write encrypted extensions"));
2308 return ret;
Jerry Yu4d3841a2022-04-16 12:37:19 +08002309}
2310
Ronald Cron928cbd32022-10-04 16:14:26 +02002311#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQiana987e1d2022-05-07 01:25:58 +00002312#define SSL_CERTIFICATE_REQUEST_SEND_REQUEST 0
2313#define SSL_CERTIFICATE_REQUEST_SKIP 1
2314/* Coordination:
2315 * Check whether a CertificateRequest message should be written.
2316 * Returns a negative code on failure, or
2317 * - SSL_CERTIFICATE_REQUEST_SEND_REQUEST
2318 * - SSL_CERTIFICATE_REQUEST_SKIP
2319 * indicating if the writing of the CertificateRequest
2320 * should be skipped or not.
2321 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002322MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002323static int ssl_tls13_certificate_request_coordinate(mbedtls_ssl_context *ssl)
XiaokangQiana987e1d2022-05-07 01:25:58 +00002324{
2325 int authmode;
2326
XiaokangQian40a35232022-05-07 09:02:40 +00002327#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
XiaokangQian40a35232022-05-07 09:02:40 +00002329 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002330 } else
XiaokangQian40a35232022-05-07 09:02:40 +00002331#endif
XiaokangQiana987e1d2022-05-07 01:25:58 +00002332 authmode = ssl->conf->authmode;
2333
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
Ronald Croneac00ad2022-09-13 10:16:31 +02002335 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY;
Gilles Peskine449bd832023-01-11 14:50:10 +01002336 return SSL_CERTIFICATE_REQUEST_SKIP;
Ronald Croneac00ad2022-09-13 10:16:31 +02002337 }
XiaokangQiana987e1d2022-05-07 01:25:58 +00002338
XiaokangQianc3017f62022-05-13 05:55:41 +00002339 ssl->handshake->certificate_request_sent = 1;
XiaokangQian189ded22022-05-10 08:12:17 +00002340
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 return SSL_CERTIFICATE_REQUEST_SEND_REQUEST;
XiaokangQiana987e1d2022-05-07 01:25:58 +00002342}
2343
XiaokangQiancec9ae62022-05-06 07:28:50 +00002344/*
2345 * struct {
2346 * opaque certificate_request_context<0..2^8-1>;
2347 * Extension extensions<2..2^16-1>;
2348 * } CertificateRequest;
2349 *
2350 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002351MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002352static int ssl_tls13_write_certificate_request_body(mbedtls_ssl_context *ssl,
2353 unsigned char *buf,
2354 const unsigned char *end,
2355 size_t *out_len)
XiaokangQiancec9ae62022-05-06 07:28:50 +00002356{
2357 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2358 unsigned char *p = buf;
XiaokangQianec6efb92022-05-06 09:53:10 +00002359 size_t output_len = 0;
XiaokangQiancec9ae62022-05-06 07:28:50 +00002360 unsigned char *p_extensions_len;
2361
2362 *out_len = 0;
2363
2364 /* Check if we have enough space:
2365 * - certificate_request_context (1 byte)
2366 * - extensions length (2 bytes)
2367 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
XiaokangQiancec9ae62022-05-06 07:28:50 +00002369
2370 /*
2371 * Write certificate_request_context
2372 */
2373 /*
2374 * We use a zero length context for the normal handshake
2375 * messages. For post-authentication handshake messages
2376 * this request context would be set to a non-zero value.
2377 */
2378 *p++ = 0x0;
2379
2380 /*
2381 * Write extensions
2382 */
2383 /* The extensions must contain the signature_algorithms. */
2384 p_extensions_len = p;
2385 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002386 ret = mbedtls_ssl_write_sig_alg_ext(ssl, p, end, &output_len);
2387 if (ret != 0) {
2388 return ret;
2389 }
XiaokangQiancec9ae62022-05-06 07:28:50 +00002390
XiaokangQianec6efb92022-05-06 09:53:10 +00002391 p += output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002392 MBEDTLS_PUT_UINT16_BE(p - p_extensions_len - 2, p_extensions_len, 0);
XiaokangQiancec9ae62022-05-06 07:28:50 +00002393
2394 *out_len = p - buf;
2395
Jerry Yu7de2ff02022-11-08 21:43:46 +08002396 MBEDTLS_SSL_PRINT_EXTS(
Gilles Peskine449bd832023-01-11 14:50:10 +01002397 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +08002398
Gilles Peskine449bd832023-01-11 14:50:10 +01002399 return 0;
XiaokangQiancec9ae62022-05-06 07:28:50 +00002400}
2401
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002402MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002403static int ssl_tls13_write_certificate_request(mbedtls_ssl_context *ssl)
XiaokangQiancec9ae62022-05-06 07:28:50 +00002404{
2405 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2406
Gilles Peskine449bd832023-01-11 14:50:10 +01002407 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002408
Gilles Peskine449bd832023-01-11 14:50:10 +01002409 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_certificate_request_coordinate(ssl));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002410
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 if (ret == SSL_CERTIFICATE_REQUEST_SEND_REQUEST) {
XiaokangQiancec9ae62022-05-06 07:28:50 +00002412 unsigned char *buf;
2413 size_t buf_len, msg_len;
2414
Gilles Peskine449bd832023-01-11 14:50:10 +01002415 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
2416 MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2417 &buf, &buf_len));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002418
Gilles Peskine449bd832023-01-11 14:50:10 +01002419 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_request_body(
2420 ssl, buf, buf + buf_len, &msg_len));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002421
2422 mbedtls_ssl_add_hs_msg_to_checksum(
Gilles Peskine449bd832023-01-11 14:50:10 +01002423 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, buf, msg_len);
XiaokangQiancec9ae62022-05-06 07:28:50 +00002424
Gilles Peskine449bd832023-01-11 14:50:10 +01002425 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2426 ssl, buf_len, msg_len));
2427 } else if (ret == SSL_CERTIFICATE_REQUEST_SKIP) {
2428 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002429 ret = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002430 } else {
2431 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
XiaokangQiancec9ae62022-05-06 07:28:50 +00002432 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2433 goto cleanup;
2434 }
2435
Gilles Peskine449bd832023-01-11 14:50:10 +01002436 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CERTIFICATE);
XiaokangQiancec9ae62022-05-06 07:28:50 +00002437cleanup:
2438
Gilles Peskine449bd832023-01-11 14:50:10 +01002439 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
2440 return ret;
XiaokangQiancec9ae62022-05-06 07:28:50 +00002441}
XiaokangQiancec9ae62022-05-06 07:28:50 +00002442
Jerry Yu4d3841a2022-04-16 12:37:19 +08002443/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002444 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
Jerry Yu83da34e2022-04-16 13:59:52 +08002445 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002446MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002447static int ssl_tls13_write_server_certificate(mbedtls_ssl_context *ssl)
Jerry Yu83da34e2022-04-16 13:59:52 +08002448{
Jerry Yu5a26f302022-05-10 20:46:40 +08002449 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianfb665a82022-06-15 03:57:21 +00002450
2451#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002452 if ((ssl_tls13_pick_key_cert(ssl) != 0) ||
2453 mbedtls_ssl_own_cert(ssl) == NULL) {
2454 MBEDTLS_SSL_DEBUG_MSG(2, ("No certificate available."));
2455 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2456 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2457 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu5a26f302022-05-10 20:46:40 +08002458 }
XiaokangQianfb665a82022-06-15 03:57:21 +00002459#endif /* MBEDTLS_X509_CRT_PARSE_C */
Jerry Yu5a26f302022-05-10 20:46:40 +08002460
Gilles Peskine449bd832023-01-11 14:50:10 +01002461 ret = mbedtls_ssl_tls13_write_certificate(ssl);
2462 if (ret != 0) {
2463 return ret;
2464 }
2465 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY);
2466 return 0;
Jerry Yu83da34e2022-04-16 13:59:52 +08002467}
2468
2469/*
Jerry Yuc6e6dbf2022-04-16 19:42:57 +08002470 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
Jerry Yu83da34e2022-04-16 13:59:52 +08002471 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002472MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002473static int ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu83da34e2022-04-16 13:59:52 +08002474{
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 int ret = mbedtls_ssl_tls13_write_certificate_verify(ssl);
2476 if (ret != 0) {
2477 return ret;
2478 }
2479 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2480 return 0;
Jerry Yu83da34e2022-04-16 13:59:52 +08002481}
Ronald Cron928cbd32022-10-04 16:14:26 +02002482#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08002483
2484/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002485 * Handler for MBEDTLS_SSL_SERVER_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08002486 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002487MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002488static int ssl_tls13_write_server_finished(mbedtls_ssl_context *ssl)
Jerry Yu69dd8d42022-04-16 12:51:26 +08002489{
Jerry Yud6e253d2022-05-18 13:59:24 +08002490 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu27bdc7c2022-04-16 13:33:27 +08002491
Gilles Peskine449bd832023-01-11 14:50:10 +01002492 ret = mbedtls_ssl_tls13_write_finished_message(ssl);
2493 if (ret != 0) {
2494 return ret;
2495 }
Jerry Yu27bdc7c2022-04-16 13:33:27 +08002496
Gilles Peskine449bd832023-01-11 14:50:10 +01002497 ret = mbedtls_ssl_tls13_compute_application_transform(ssl);
2498 if (ret != 0) {
Jerry Yue3d67cb2022-05-19 15:33:10 +08002499 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2501 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2502 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002503 }
XiaokangQianc3017f62022-05-13 05:55:41 +00002504
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to handshake keys for inbound traffic"));
2506 mbedtls_ssl_set_inbound_transform(ssl, ssl->handshake->transform_handshake);
XiaokangQian189ded22022-05-10 08:12:17 +00002507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 if (ssl->handshake->certificate_request_sent) {
2509 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
2510 } else {
2511 MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate"));
2512 MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate verify"));
2513 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
Ronald Cron19385882022-06-15 16:26:13 +02002514 }
Ronald Cron63dc4632022-05-31 14:41:53 +02002515
Gilles Peskine449bd832023-01-11 14:50:10 +01002516 return 0;
Jerry Yu69dd8d42022-04-16 12:51:26 +08002517}
2518
2519/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002520 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
Jerry Yu69dd8d42022-04-16 12:51:26 +08002521 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002522MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002523static int ssl_tls13_process_client_finished(mbedtls_ssl_context *ssl)
Jerry Yu69dd8d42022-04-16 12:51:26 +08002524{
Jerry Yud6e253d2022-05-18 13:59:24 +08002525 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2526
Gilles Peskine449bd832023-01-11 14:50:10 +01002527 ret = mbedtls_ssl_tls13_process_finished_message(ssl);
2528 if (ret != 0) {
2529 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002530 }
2531
Gilles Peskine449bd832023-01-11 14:50:10 +01002532 ret = mbedtls_ssl_tls13_compute_resumption_master_secret(ssl);
2533 if (ret != 0) {
2534 MBEDTLS_SSL_DEBUG_RET(1,
2535 "mbedtls_ssl_tls13_compute_resumption_master_secret", ret);
2536 }
2537
2538 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
2539 return 0;
Jerry Yu69dd8d42022-04-16 12:51:26 +08002540}
2541
2542/*
Jerry Yud6e253d2022-05-18 13:59:24 +08002543 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
Jerry Yu69dd8d42022-04-16 12:51:26 +08002544 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002545MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002546static int ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu69dd8d42022-04-16 12:51:26 +08002547{
Gilles Peskine449bd832023-01-11 14:50:10 +01002548 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Jerry Yu03ed50b2022-04-16 17:13:30 +08002549
Gilles Peskine449bd832023-01-11 14:50:10 +01002550 mbedtls_ssl_tls13_handshake_wrapup(ssl);
Jerry Yue67bef42022-07-07 07:29:42 +00002551
2552#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002553 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET);
Jerry Yufca4d572022-07-21 10:37:48 +08002554#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
Jerry Yufca4d572022-07-21 10:37:48 +08002556#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 return 0;
Jerry Yu69dd8d42022-04-16 12:51:26 +08002558}
2559
2560/*
Jerry Yua8d3c502022-10-30 14:51:23 +08002561 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yue67bef42022-07-07 07:29:42 +00002562 */
2563#define SSL_NEW_SESSION_TICKET_SKIP 0
2564#define SSL_NEW_SESSION_TICKET_WRITE 1
2565MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002566static int ssl_tls13_write_new_session_ticket_coordinate(mbedtls_ssl_context *ssl)
Jerry Yue67bef42022-07-07 07:29:42 +00002567{
2568 /* Check whether the use of session tickets is enabled */
Gilles Peskine449bd832023-01-11 14:50:10 +01002569 if (ssl->conf->f_ticket_write == NULL) {
2570 MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: disabled,"
2571 " callback is not set"));
2572 return SSL_NEW_SESSION_TICKET_SKIP;
Jerry Yud0766ec2022-09-22 10:46:57 +08002573 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002574 if (ssl->conf->new_session_tickets_count == 0) {
2575 MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: disabled,"
2576 " configured count is zero"));
2577 return SSL_NEW_SESSION_TICKET_SKIP;
Jerry Yud0766ec2022-09-22 10:46:57 +08002578 }
2579
Gilles Peskine449bd832023-01-11 14:50:10 +01002580 if (ssl->handshake->new_session_tickets_count == 0) {
2581 MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: all tickets have "
2582 "been sent."));
2583 return SSL_NEW_SESSION_TICKET_SKIP;
Jerry Yue67bef42022-07-07 07:29:42 +00002584 }
2585
Gilles Peskine449bd832023-01-11 14:50:10 +01002586 return SSL_NEW_SESSION_TICKET_WRITE;
Jerry Yue67bef42022-07-07 07:29:42 +00002587}
2588
2589#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2590MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002591static int ssl_tls13_prepare_new_session_ticket(mbedtls_ssl_context *ssl,
2592 unsigned char *ticket_nonce,
2593 size_t ticket_nonce_size)
Jerry Yue67bef42022-07-07 07:29:42 +00002594{
2595 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2596 mbedtls_ssl_session *session = ssl->session;
2597 mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2598 psa_algorithm_t psa_hash_alg;
2599 int hash_length;
2600
Gilles Peskine449bd832023-01-11 14:50:10 +01002601 MBEDTLS_SSL_DEBUG_MSG(2, ("=> prepare NewSessionTicket msg"));
Jerry Yue67bef42022-07-07 07:29:42 +00002602
2603#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 session->start = mbedtls_time(NULL);
Jerry Yue67bef42022-07-07 07:29:42 +00002605#endif
2606
2607 /* Generate ticket_age_add */
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng,
2609 (unsigned char *) &session->ticket_age_add,
2610 sizeof(session->ticket_age_add)) != 0)) {
2611 MBEDTLS_SSL_DEBUG_RET(1, "generate_ticket_age_add", ret);
2612 return ret;
Jerry Yue67bef42022-07-07 07:29:42 +00002613 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_age_add: %u",
2615 (unsigned int) session->ticket_age_add));
Jerry Yue67bef42022-07-07 07:29:42 +00002616
2617 /* Generate ticket_nonce */
Gilles Peskine449bd832023-01-11 14:50:10 +01002618 ret = ssl->conf->f_rng(ssl->conf->p_rng, ticket_nonce, ticket_nonce_size);
2619 if (ret != 0) {
2620 MBEDTLS_SSL_DEBUG_RET(1, "generate_ticket_nonce", ret);
2621 return ret;
Jerry Yue67bef42022-07-07 07:29:42 +00002622 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002623 MBEDTLS_SSL_DEBUG_BUF(3, "ticket_nonce:",
2624 ticket_nonce, ticket_nonce_size);
Jerry Yue67bef42022-07-07 07:29:42 +00002625
2626 ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01002627 (mbedtls_ssl_ciphersuite_t *) ssl->handshake->ciphersuite_info;
2628 psa_hash_alg = mbedtls_psa_translate_md(ciphersuite_info->mac);
2629 hash_length = PSA_HASH_LENGTH(psa_hash_alg);
2630 if (hash_length == -1 ||
2631 (size_t) hash_length > sizeof(session->resumption_key)) {
2632 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yufca4d572022-07-21 10:37:48 +08002633 }
2634
Jerry Yue67bef42022-07-07 07:29:42 +00002635 /* In this code the psk key length equals the length of the hash */
2636 session->resumption_key_len = hash_length;
2637 session->ciphersuite = ciphersuite_info->id;
2638
2639 /* Compute resumption key
2640 *
2641 * HKDF-Expand-Label( resumption_master_secret,
2642 * "resumption", ticket_nonce, Hash.length )
2643 */
2644 ret = mbedtls_ssl_tls13_hkdf_expand_label(
Gilles Peskine449bd832023-01-11 14:50:10 +01002645 psa_hash_alg,
2646 session->app_secrets.resumption_master_secret,
2647 hash_length,
2648 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(resumption),
2649 ticket_nonce,
2650 ticket_nonce_size,
2651 session->resumption_key,
2652 hash_length);
Jerry Yue67bef42022-07-07 07:29:42 +00002653
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 if (ret != 0) {
2655 MBEDTLS_SSL_DEBUG_RET(2,
2656 "Creating the ticket-resumed PSK failed",
2657 ret);
2658 return ret;
Jerry Yue67bef42022-07-07 07:29:42 +00002659 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002660 MBEDTLS_SSL_DEBUG_BUF(3, "Ticket-resumed PSK",
2661 session->resumption_key,
2662 session->resumption_key_len);
Jerry Yue67bef42022-07-07 07:29:42 +00002663
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 MBEDTLS_SSL_DEBUG_BUF(3, "resumption_master_secret",
2665 session->app_secrets.resumption_master_secret,
2666 hash_length);
Jerry Yue67bef42022-07-07 07:29:42 +00002667
Gilles Peskine449bd832023-01-11 14:50:10 +01002668 return 0;
Jerry Yue67bef42022-07-07 07:29:42 +00002669}
2670
2671/* This function creates a NewSessionTicket message in the following format:
2672 *
2673 * struct {
2674 * uint32 ticket_lifetime;
2675 * uint32 ticket_age_add;
2676 * opaque ticket_nonce<0..255>;
2677 * opaque ticket<1..2^16-1>;
2678 * Extension extensions<0..2^16-2>;
2679 * } NewSessionTicket;
2680 *
2681 * The ticket inside the NewSessionTicket message is an encrypted container
2682 * carrying the necessary information so that the server is later able to
2683 * re-start the communication.
2684 *
2685 * The following fields are placed inside the ticket by the
2686 * f_ticket_write() function:
2687 *
2688 * - creation time (start)
2689 * - flags (flags)
2690 * - age add (ticket_age_add)
2691 * - key (key)
2692 * - key length (key_len)
2693 * - ciphersuite (ciphersuite)
2694 */
2695MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002696static int ssl_tls13_write_new_session_ticket_body(mbedtls_ssl_context *ssl,
2697 unsigned char *buf,
2698 unsigned char *end,
2699 size_t *out_len,
2700 unsigned char *ticket_nonce,
2701 size_t ticket_nonce_size)
Jerry Yue67bef42022-07-07 07:29:42 +00002702{
2703 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2704 unsigned char *p = buf;
2705 mbedtls_ssl_session *session = ssl->session;
2706 size_t ticket_len;
2707 uint32_t ticket_lifetime;
2708
2709 *out_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002710 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write NewSessionTicket msg"));
Jerry Yue67bef42022-07-07 07:29:42 +00002711
2712 /*
2713 * ticket_lifetime 4 bytes
2714 * ticket_age_add 4 bytes
2715 * ticket_nonce 1 + ticket_nonce_size bytes
2716 * ticket >=2 bytes
2717 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002718 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4 + 4 + 1 + ticket_nonce_size + 2);
Jerry Yue67bef42022-07-07 07:29:42 +00002719
2720 /* Generate ticket and ticket_lifetime */
Gilles Peskine449bd832023-01-11 14:50:10 +01002721 ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
2722 session,
2723 p + 9 + ticket_nonce_size + 2,
2724 end,
2725 &ticket_len,
2726 &ticket_lifetime);
2727 if (ret != 0) {
2728 MBEDTLS_SSL_DEBUG_RET(1, "write_ticket", ret);
2729 return ret;
Jerry Yue67bef42022-07-07 07:29:42 +00002730 }
2731 /* RFC 8446 4.6.1
2732 * ticket_lifetime: Indicates the lifetime in seconds as a 32-bit
2733 * unsigned integer in network byte order from the time of ticket
2734 * issuance. Servers MUST NOT use any value greater than
2735 * 604800 seconds (7 days). The value of zero indicates that the
2736 * ticket should be discarded immediately. Clients MUST NOT cache
2737 * tickets for longer than 7 days, regardless of the ticket_lifetime,
2738 * and MAY delete tickets earlier based on local policy. A server
2739 * MAY treat a ticket as valid for a shorter period of time than what
2740 * is stated in the ticket_lifetime.
2741 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002742 if (ticket_lifetime > 604800) {
Xiaokang Qian28af5012022-10-13 08:18:19 +00002743 ticket_lifetime = 604800;
Gilles Peskine449bd832023-01-11 14:50:10 +01002744 }
2745 MBEDTLS_PUT_UINT32_BE(ticket_lifetime, p, 0);
2746 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_lifetime: %u",
2747 (unsigned int) ticket_lifetime));
Jerry Yue67bef42022-07-07 07:29:42 +00002748
2749 /* Write ticket_age_add */
Gilles Peskine449bd832023-01-11 14:50:10 +01002750 MBEDTLS_PUT_UINT32_BE(session->ticket_age_add, p, 4);
2751 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_age_add: %u",
2752 (unsigned int) session->ticket_age_add));
Jerry Yue67bef42022-07-07 07:29:42 +00002753
2754 /* Write ticket_nonce */
Gilles Peskine449bd832023-01-11 14:50:10 +01002755 p[8] = (unsigned char) ticket_nonce_size;
2756 if (ticket_nonce_size > 0) {
2757 memcpy(p + 9, ticket_nonce, ticket_nonce_size);
Jerry Yue67bef42022-07-07 07:29:42 +00002758 }
2759 p += 9 + ticket_nonce_size;
2760
2761 /* Write ticket */
Gilles Peskine449bd832023-01-11 14:50:10 +01002762 MBEDTLS_PUT_UINT16_BE(ticket_len, p, 0);
Jerry Yue67bef42022-07-07 07:29:42 +00002763 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002764 MBEDTLS_SSL_DEBUG_BUF(4, "ticket", p, ticket_len);
Jerry Yue67bef42022-07-07 07:29:42 +00002765 p += ticket_len;
2766
2767 /* Ticket Extensions
2768 *
2769 * Note: We currently don't have any extensions.
2770 * Set length to zero.
2771 */
Jerry Yuedab6372022-10-31 14:37:31 +08002772 ssl->handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
2773
Gilles Peskine449bd832023-01-11 14:50:10 +01002774 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2775 MBEDTLS_PUT_UINT16_BE(0, p, 0);
Jerry Yue67bef42022-07-07 07:29:42 +00002776 p += 2;
2777
2778 *out_len = p - buf;
Gilles Peskine449bd832023-01-11 14:50:10 +01002779 MBEDTLS_SSL_DEBUG_BUF(4, "ticket", buf, *out_len);
2780 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Jerry Yue67bef42022-07-07 07:29:42 +00002781
Jerry Yu7de2ff02022-11-08 21:43:46 +08002782 MBEDTLS_SSL_PRINT_EXTS(
Gilles Peskine449bd832023-01-11 14:50:10 +01002783 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +08002784
Gilles Peskine449bd832023-01-11 14:50:10 +01002785 return 0;
Jerry Yue67bef42022-07-07 07:29:42 +00002786}
2787
2788/*
Jerry Yua8d3c502022-10-30 14:51:23 +08002789 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yue67bef42022-07-07 07:29:42 +00002790 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002791static int ssl_tls13_write_new_session_ticket(mbedtls_ssl_context *ssl)
Jerry Yue67bef42022-07-07 07:29:42 +00002792{
2793 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2794
Gilles Peskine449bd832023-01-11 14:50:10 +01002795 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_write_new_session_ticket_coordinate(ssl));
Jerry Yue67bef42022-07-07 07:29:42 +00002796
Gilles Peskine449bd832023-01-11 14:50:10 +01002797 if (ret == SSL_NEW_SESSION_TICKET_WRITE) {
Jerry Yue67bef42022-07-07 07:29:42 +00002798 unsigned char ticket_nonce[MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH];
2799 unsigned char *buf;
2800 size_t buf_len, msg_len;
2801
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_new_session_ticket(
2803 ssl, ticket_nonce, sizeof(ticket_nonce)));
Jerry Yue67bef42022-07-07 07:29:42 +00002804
Gilles Peskine449bd832023-01-11 14:50:10 +01002805 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
2806 MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2807 &buf, &buf_len));
Jerry Yue67bef42022-07-07 07:29:42 +00002808
Gilles Peskine449bd832023-01-11 14:50:10 +01002809 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_new_session_ticket_body(
2810 ssl, buf, buf + buf_len, &msg_len,
2811 ticket_nonce, sizeof(ticket_nonce)));
Jerry Yue67bef42022-07-07 07:29:42 +00002812
Gilles Peskine449bd832023-01-11 14:50:10 +01002813 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2814 ssl, buf_len, msg_len));
Jerry Yufca4d572022-07-21 10:37:48 +08002815
Jerry Yu359e65f2022-09-22 23:47:43 +08002816 /* Limit session tickets count to one when resumption connection.
2817 *
2818 * See document of mbedtls_ssl_conf_new_session_tickets.
2819 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002820 if (ssl->handshake->resume == 1) {
Jerry Yu359e65f2022-09-22 23:47:43 +08002821 ssl->handshake->new_session_tickets_count = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002822 } else {
Jerry Yu359e65f2022-09-22 23:47:43 +08002823 ssl->handshake->new_session_tickets_count--;
Gilles Peskine449bd832023-01-11 14:50:10 +01002824 }
Jerry Yub7e3fa72022-09-22 11:07:18 +08002825
Jerry Yua8d3c502022-10-30 14:51:23 +08002826 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002827 ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH);
2828 } else {
2829 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
Jerry Yue67bef42022-07-07 07:29:42 +00002830 }
2831
Jerry Yue67bef42022-07-07 07:29:42 +00002832cleanup:
2833
Gilles Peskine449bd832023-01-11 14:50:10 +01002834 return ret;
Jerry Yue67bef42022-07-07 07:29:42 +00002835}
2836#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2837
2838/*
XiaokangQiane8ff3502022-04-22 02:34:40 +00002839 * TLS 1.3 State Machine -- server side
XiaokangQian7807f9f2022-02-15 10:04:37 +00002840 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002841int mbedtls_ssl_tls13_handshake_server_step(mbedtls_ssl_context *ssl)
Jerry Yub9930e72021-08-06 17:11:51 +08002842{
XiaokangQian08037552022-04-20 07:16:41 +00002843 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002844
Gilles Peskine449bd832023-01-11 14:50:10 +01002845 if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL) {
2846 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2847 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00002848
Gilles Peskine449bd832023-01-11 14:50:10 +01002849 MBEDTLS_SSL_DEBUG_MSG(2, ("tls13 server state: %s(%d)",
2850 mbedtls_ssl_states_str(ssl->state),
2851 ssl->state));
Jerry Yu6e81b272021-09-27 11:16:17 +08002852
Gilles Peskine449bd832023-01-11 14:50:10 +01002853 switch (ssl->state) {
XiaokangQian7807f9f2022-02-15 10:04:37 +00002854 /* start state */
2855 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002856 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
XiaokangQian08037552022-04-20 07:16:41 +00002857 ret = 0;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002858 break;
2859
XiaokangQian7807f9f2022-02-15 10:04:37 +00002860 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002861 ret = ssl_tls13_process_client_hello(ssl);
2862 if (ret != 0) {
2863 MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_process_client_hello", ret);
2864 }
Jerry Yuf41553b2022-05-09 22:20:30 +08002865 break;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002866
Jerry Yuf41553b2022-05-09 22:20:30 +08002867 case MBEDTLS_SSL_HELLO_RETRY_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002868 ret = ssl_tls13_write_hello_retry_request(ssl);
2869 if (ret != 0) {
2870 MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_hello_retry_request", ret);
2871 return ret;
Jerry Yuf41553b2022-05-09 22:20:30 +08002872 }
XiaokangQian7807f9f2022-02-15 10:04:37 +00002873 break;
2874
Jerry Yu5b64ae92022-03-30 17:15:02 +08002875 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002876 ret = ssl_tls13_write_server_hello(ssl);
Jerry Yu5b64ae92022-03-30 17:15:02 +08002877 break;
2878
Xiaofei Baicba64af2022-02-15 10:00:56 +00002879 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01002880 ret = ssl_tls13_write_encrypted_extensions(ssl);
2881 if (ret != 0) {
2882 MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_encrypted_extensions", ret);
2883 return ret;
Xiaofei Baicba64af2022-02-15 10:00:56 +00002884 }
Jerry Yu48330562022-05-06 21:35:44 +08002885 break;
Jerry Yu6a2cd9e2022-05-05 11:14:19 +08002886
Ronald Cron928cbd32022-10-04 16:14:26 +02002887#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002888 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002889 ret = ssl_tls13_write_certificate_request(ssl);
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002890 break;
Xiaofei Bai9ca09d42022-02-14 12:57:18 +00002891
Jerry Yu83da34e2022-04-16 13:59:52 +08002892 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 ret = ssl_tls13_write_server_certificate(ssl);
Jerry Yu83da34e2022-04-16 13:59:52 +08002894 break;
2895
2896 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 ret = ssl_tls13_write_certificate_verify(ssl);
Jerry Yu83da34e2022-04-16 13:59:52 +08002898 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002899#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu83da34e2022-04-16 13:59:52 +08002900
Gilles Peskine449bd832023-01-11 14:50:10 +01002901 /*
2902 * Injection of dummy-CCS's for middlebox compatibility
2903 */
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002904#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Gabor Mezeif7044ea2022-06-28 16:01:49 +02002905 case MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002906 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
2907 if (ret == 0) {
2908 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
2909 }
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002910 break;
2911
2912 case MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002913 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
2914 if (ret == 0) {
2915 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
2916 }
Gabor Mezei7b39bf12022-05-24 16:04:14 +02002917 break;
2918#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2919
Jerry Yu69dd8d42022-04-16 12:51:26 +08002920 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01002921 ret = ssl_tls13_write_server_finished(ssl);
Jerry Yu69dd8d42022-04-16 12:51:26 +08002922 break;
2923
2924 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01002925 ret = ssl_tls13_process_client_finished(ssl);
Jerry Yu69dd8d42022-04-16 12:51:26 +08002926 break;
2927
Jerry Yu69dd8d42022-04-16 12:51:26 +08002928 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01002929 ret = ssl_tls13_handshake_wrapup(ssl);
Jerry Yu69dd8d42022-04-16 12:51:26 +08002930 break;
2931
Ronald Cron766c0cd2022-10-18 12:17:11 +02002932#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQian6b916b12022-04-25 07:29:34 +00002933 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002934 ret = mbedtls_ssl_tls13_process_certificate(ssl);
2935 if (ret == 0) {
2936 if (ssl->session_negotiate->peer_cert != NULL) {
Ronald Cron209cae92022-06-07 10:30:19 +02002937 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002938 ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY);
2939 } else {
2940 MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate verify"));
Ronald Cron209cae92022-06-07 10:30:19 +02002941 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002942 ssl, MBEDTLS_SSL_CLIENT_FINISHED);
Ronald Cron19385882022-06-15 16:26:13 +02002943 }
XiaokangQian6b916b12022-04-25 07:29:34 +00002944 }
2945 break;
2946
2947 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 ret = mbedtls_ssl_tls13_process_certificate_verify(ssl);
2949 if (ret == 0) {
XiaokangQian6b916b12022-04-25 07:29:34 +00002950 mbedtls_ssl_handshake_set_state(
Gilles Peskine449bd832023-01-11 14:50:10 +01002951 ssl, MBEDTLS_SSL_CLIENT_FINISHED);
XiaokangQian6b916b12022-04-25 07:29:34 +00002952 }
2953 break;
Ronald Cron766c0cd2022-10-18 12:17:11 +02002954#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
XiaokangQian6b916b12022-04-25 07:29:34 +00002955
Jerry Yue67bef42022-07-07 07:29:42 +00002956#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yua8d3c502022-10-30 14:51:23 +08002957 case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01002958 ret = ssl_tls13_write_new_session_ticket(ssl);
2959 if (ret != 0) {
2960 MBEDTLS_SSL_DEBUG_RET(1,
2961 "ssl_tls13_write_new_session_ticket ",
2962 ret);
Jerry Yue67bef42022-07-07 07:29:42 +00002963 }
2964 break;
Jerry Yua8d3c502022-10-30 14:51:23 +08002965 case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH:
Jerry Yue67bef42022-07-07 07:29:42 +00002966 /* This state is necessary to do the flush of the New Session
Jerry Yua8d3c502022-10-30 14:51:23 +08002967 * Ticket message written in MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yue67bef42022-07-07 07:29:42 +00002968 * as part of ssl_prepare_handshake_step.
2969 */
2970 ret = 0;
Jerry Yud4e75002022-08-09 13:33:50 +08002971
Gilles Peskine449bd832023-01-11 14:50:10 +01002972 if (ssl->handshake->new_session_tickets_count == 0) {
2973 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
2974 } else {
2975 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET);
2976 }
Jerry Yue67bef42022-07-07 07:29:42 +00002977 break;
2978
2979#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2980
XiaokangQian7807f9f2022-02-15 10:04:37 +00002981 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01002982 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
2983 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
XiaokangQian7807f9f2022-02-15 10:04:37 +00002984 }
2985
Gilles Peskine449bd832023-01-11 14:50:10 +01002986 return ret;
Jerry Yub9930e72021-08-06 17:11:51 +08002987}
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08002988
Jerry Yufb4b6472022-01-27 15:03:26 +08002989#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_3 */