blob: 35679ca74fec7ff2001e8f0e8a7e7d6c58f86c04 [file] [log] [blame]
Jerry Yu3cc4c2a2021-08-06 16:29:08 +08001/*
2 * TLS 1.3 client-side functions
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * This file is part of mbed TLS ( https://tls.mbed.org )
20 */
21
22#include "common.h"
23
Jerry Yucc43c6b2022-01-28 10:24:45 +080024#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu3cc4c2a2021-08-06 16:29:08 +080025
Jerry Yubc20bdd2021-08-24 15:59:48 +080026#include <string.h>
27
Jerry Yu56fc07f2021-09-01 17:48:49 +080028#include "mbedtls/debug.h"
29#include "mbedtls/error.h"
Jerry Yue1b9c292021-09-10 10:08:31 +080030#include "mbedtls/platform.h"
Jerry Yua13c7e72021-08-17 10:44:40 +080031
Jerry Yubdc71882021-09-14 19:30:36 +080032#include "ssl_misc.h"
Ronald Cron3d580bf2022-02-18 17:24:56 +010033#include "ssl_client.h"
Jerry Yue1b9c292021-09-10 10:08:31 +080034#include "ssl_tls13_keys.h"
Jerry Yucbd082f2022-08-04 16:55:10 +080035#include "ssl_debug_helpers.h"
Jerry Yubdc71882021-09-14 19:30:36 +080036
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050037#define PSA_TO_MBEDTLS_ERR(status) PSA_TO_MBEDTLS_ERR_LIST(status, \
38 psa_to_ssl_errors, \
39 psa_generic_status_to_mbedtls)
40
Jerry Yubc20bdd2021-08-24 15:59:48 +080041/* Write extensions */
42
Jerry Yu92c6b402021-08-27 16:59:09 +080043/*
44 * ssl_tls13_write_supported_versions_ext():
45 *
46 * struct {
47 * ProtocolVersion versions<2..254>;
48 * } SupportedVersions;
49 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020050MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010051static int ssl_tls13_write_supported_versions_ext(mbedtls_ssl_context *ssl,
52 unsigned char *buf,
53 unsigned char *end,
54 size_t *out_len)
Jerry Yu92c6b402021-08-27 16:59:09 +080055{
56 unsigned char *p = buf;
Gilles Peskine449bd832023-01-11 14:50:10 +010057 unsigned char versions_len = (ssl->handshake->min_tls_version <=
58 MBEDTLS_SSL_VERSION_TLS1_2) ? 4 : 2;
Jerry Yu92c6b402021-08-27 16:59:09 +080059
Xiaofei Baid25fab62021-12-02 06:36:27 +000060 *out_len = 0;
Jerry Yu92c6b402021-08-27 16:59:09 +080061
Gilles Peskine449bd832023-01-11 14:50:10 +010062 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding supported versions extension"));
Jerry Yu92c6b402021-08-27 16:59:09 +080063
Jerry Yu388bd0d2021-09-15 18:41:02 +080064 /* Check if we have space to write the extension:
Jerry Yub60e3cf2021-09-08 16:41:02 +080065 * - extension_type (2 bytes)
66 * - extension_data_length (2 bytes)
67 * - versions_length (1 byte )
Ronald Crona77fc272022-03-30 17:20:47 +020068 * - versions (2 or 4 bytes)
Jerry Yu159c5a02021-08-31 12:51:25 +080069 */
Gilles Peskine449bd832023-01-11 14:50:10 +010070 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5 + versions_len);
Ronald Crondbe87f02022-02-10 14:35:27 +010071
Gilles Peskine449bd832023-01-11 14:50:10 +010072 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0);
73 MBEDTLS_PUT_UINT16_BE(versions_len + 1, p, 2);
Jerry Yueecfbf02021-08-30 18:32:07 +080074 p += 4;
Jerry Yu92c6b402021-08-27 16:59:09 +080075
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080076 /* Length of versions */
Ronald Crondbe87f02022-02-10 14:35:27 +010077 *p++ = versions_len;
Jerry Yu92c6b402021-08-27 16:59:09 +080078
Jerry Yu0c63af62021-09-02 12:59:12 +080079 /* Write values of supported versions.
Jerry Yu0c63af62021-09-02 12:59:12 +080080 * They are defined by the configuration.
Ronald Crondbe87f02022-02-10 14:35:27 +010081 * Currently, we advertise only TLS 1.3 or both TLS 1.3 and TLS 1.2.
Jerry Yu92c6b402021-08-27 16:59:09 +080082 */
Gilles Peskine449bd832023-01-11 14:50:10 +010083 mbedtls_ssl_write_version(p, MBEDTLS_SSL_TRANSPORT_STREAM,
84 MBEDTLS_SSL_VERSION_TLS1_3);
85 MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:4]"));
Jerry Yu92c6b402021-08-27 16:59:09 +080086
Jerry Yu92c6b402021-08-27 16:59:09 +080087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 if (ssl->handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2) {
89 mbedtls_ssl_write_version(p + 2, MBEDTLS_SSL_TRANSPORT_STREAM,
90 MBEDTLS_SSL_VERSION_TLS1_2);
91 MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:3]"));
Ronald Crondbe87f02022-02-10 14:35:27 +010092 }
93
94 *out_len = 5 + versions_len;
Jerry Yu4b8f2f72022-10-31 13:31:22 +080095
Jerry Yuc4bf5d62022-10-29 09:08:47 +080096 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +010097 ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS);
Jerry Yu4b8f2f72022-10-31 13:31:22 +080098
Gilles Peskine449bd832023-01-11 14:50:10 +010099 return 0;
Jerry Yu92c6b402021-08-27 16:59:09 +0800100}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800101
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200102MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100103static int ssl_tls13_parse_supported_versions_ext(mbedtls_ssl_context *ssl,
104 const unsigned char *buf,
105 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +0800106{
Jerry Yue1b9c292021-09-10 10:08:31 +0800107 ((void) ssl);
108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2);
110 if (mbedtls_ssl_read_version(buf, ssl->conf->transport) !=
111 MBEDTLS_SSL_VERSION_TLS1_3) {
112 MBEDTLS_SSL_DEBUG_MSG(1, ("unexpected version"));
Jerry Yu4a173382021-10-11 21:45:31 +0800113
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
115 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
116 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +0800117 }
118
Gilles Peskine449bd832023-01-11 14:50:10 +0100119 if (&buf[2] != end) {
Xiaokang Qian91bb3f02023-04-03 09:07:03 +0000120 MBEDTLS_SSL_DEBUG_MSG(
121 1, ("supported_versions ext data length incorrect"));
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
123 MBEDTLS_ERR_SSL_DECODE_ERROR);
124 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron98473382022-03-30 20:04:10 +0200125 }
126
Gilles Peskine449bd832023-01-11 14:50:10 +0100127 return 0;
Jerry Yue1b9c292021-09-10 10:08:31 +0800128}
129
lhuang0486cacac2022-01-21 07:34:27 -0800130#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200131MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100132static int ssl_tls13_parse_alpn_ext(mbedtls_ssl_context *ssl,
133 const unsigned char *buf, size_t len)
lhuang0486cacac2022-01-21 07:34:27 -0800134{
lhuang0486cacac2022-01-21 07:34:27 -0800135 const unsigned char *p = buf;
136 const unsigned char *end = buf + len;
Ronald Cron81a334f2022-05-31 16:04:11 +0200137 size_t protocol_name_list_len, protocol_name_len;
138 const unsigned char *protocol_name_list_end;
lhuang0486cacac2022-01-21 07:34:27 -0800139
140 /* If we didn't send it, the server shouldn't send it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 if (ssl->conf->alpn_list == NULL) {
142 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
143 }
lhuang0486cacac2022-01-21 07:34:27 -0800144
145 /*
146 * opaque ProtocolName<1..2^8-1>;
147 *
148 * struct {
149 * ProtocolName protocol_name_list<2..2^16-1>
150 * } ProtocolNameList;
151 *
152 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
153 */
154
Gilles Peskine449bd832023-01-11 14:50:10 +0100155 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
156 protocol_name_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
lhuang0486cacac2022-01-21 07:34:27 -0800157 p += 2;
lhuang0486cacac2022-01-21 07:34:27 -0800158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, protocol_name_list_len);
Ronald Cron81a334f2022-05-31 16:04:11 +0200160 protocol_name_list_end = p + protocol_name_list_len;
161
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, 1);
Ronald Cron81a334f2022-05-31 16:04:11 +0200163 protocol_name_len = *p++;
lhuang0486cacac2022-01-21 07:34:27 -0800164
165 /* Check that the server chosen protocol was in our list and save it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, protocol_name_len);
167 for (const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++) {
168 if (protocol_name_len == strlen(*alpn) &&
169 memcmp(p, *alpn, protocol_name_len) == 0) {
lhuang0486cacac2022-01-21 07:34:27 -0800170 ssl->alpn_chosen = *alpn;
Gilles Peskine449bd832023-01-11 14:50:10 +0100171 return 0;
lhuang0486cacac2022-01-21 07:34:27 -0800172 }
173 }
174
Gilles Peskine449bd832023-01-11 14:50:10 +0100175 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
lhuang0486cacac2022-01-21 07:34:27 -0800176}
177#endif /* MBEDTLS_SSL_ALPN */
178
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200179MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100180static int ssl_tls13_reset_key_share(mbedtls_ssl_context *ssl)
XiaokangQian647719a2021-12-07 09:16:29 +0000181{
182 uint16_t group_id = ssl->handshake->offered_group_id;
Ronald Cron5b98ac92022-03-15 10:19:18 +0100183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 if (group_id == 0) {
185 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
186 }
XiaokangQian647719a2021-12-07 09:16:29 +0000187
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200188#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
189 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group_id) ||
190 mbedtls_ssl_tls13_named_group_is_dhe(group_id)) {
Ronald Cron5b98ac92022-03-15 10:19:18 +0100191 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
192 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
193
194 /* Destroy generated private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 status = psa_destroy_key(ssl->handshake->ecdh_psa_privkey);
196 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500197 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
199 return ret;
Ronald Cron5b98ac92022-03-15 10:19:18 +0100200 }
201
202 ssl->handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +0100203 return 0;
204 } else
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200205#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 if (0 /* other KEMs? */) {
XiaokangQian647719a2021-12-07 09:16:29 +0000207 /* Do something */
208 }
209
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
XiaokangQian647719a2021-12-07 09:16:29 +0000211}
212
213/*
Jerry Yu56fc07f2021-09-01 17:48:49 +0800214 * Functions for writing key_share extension.
215 */
Ronald Cron766c0cd2022-10-18 12:17:11 +0200216#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200217MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100218static int ssl_tls13_get_default_group_id(mbedtls_ssl_context *ssl,
219 uint16_t *group_id)
Jerry Yu56fc07f2021-09-01 17:48:49 +0800220{
221 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
222
Jerry Yu56fc07f2021-09-01 17:48:49 +0800223
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200224#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Jerry Yu388bd0d2021-09-15 18:41:02 +0800226 /* Pick first available ECDHE group compatible with TLS 1.3 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 if (group_list == NULL) {
228 return MBEDTLS_ERR_SSL_BAD_CONFIG;
229 }
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200230#if defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel29c219c2023-05-31 15:21:04 +0200231 if (mbedtls_ssl_tls13_named_group_is_dhe(*group_list)) {
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200232 *group_id = *group_list;
233 return 0;
234 }
235#endif /* PSA_WANT_ALG_FFDH */
236#if defined(PSA_WANT_ALG_ECDH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 for (; *group_list != 0; group_list++) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +0000238 if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(
239 *group_list, NULL, NULL) == PSA_SUCCESS) &&
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list)) {
Brett Warren14efd332021-10-06 09:32:11 +0100241 *group_id = *group_list;
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 return 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800243 }
244 }
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200245#endif /* PSA_WANT_ALG_ECDH */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800246#else
247 ((void) ssl);
Jerry Yub60e3cf2021-09-08 16:41:02 +0800248 ((void) group_id);
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200249#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800250
251 /*
252 * Add DHE named groups here.
Jerry Yu388bd0d2021-09-15 18:41:02 +0800253 * Pick first available DHE group compatible with TLS 1.3
Jerry Yu56fc07f2021-09-01 17:48:49 +0800254 */
255
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 return ret;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800257}
258
259/*
260 * ssl_tls13_write_key_share_ext
261 *
Jerry Yu388bd0d2021-09-15 18:41:02 +0800262 * Structure of key_share extension in ClientHello:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800263 *
264 * struct {
265 * NamedGroup group;
266 * opaque key_exchange<1..2^16-1>;
267 * } KeyShareEntry;
268 * struct {
269 * KeyShareEntry client_shares<0..2^16-1>;
270 * } KeyShareClientHello;
271 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200272MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100273static int ssl_tls13_write_key_share_ext(mbedtls_ssl_context *ssl,
274 unsigned char *buf,
275 unsigned char *end,
276 size_t *out_len)
Jerry Yu56fc07f2021-09-01 17:48:49 +0800277{
278 unsigned char *p = buf;
Xiaofei Baieef15042021-11-18 07:29:56 +0000279 unsigned char *client_shares; /* Start of client_shares */
280 size_t client_shares_len; /* Length of client_shares */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800281 uint16_t group_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800282 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
283
Xiaofei Baid25fab62021-12-02 06:36:27 +0000284 *out_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800285
Jerry Yub60e3cf2021-09-08 16:41:02 +0800286 /* Check if we have space for header and length fields:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800287 * - extension_type (2 bytes)
288 * - extension_data_length (2 bytes)
289 * - client_shares_length (2 bytes)
290 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800292 p += 6;
293
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello: adding key share extension"));
Jerry Yu56fc07f2021-09-01 17:48:49 +0800295
296 /* HRR could already have requested something else. */
297 group_id = ssl->handshake->offered_group_id;
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 if (!mbedtls_ssl_tls13_named_group_is_ecdhe(group_id) &&
299 !mbedtls_ssl_tls13_named_group_is_dhe(group_id)) {
300 MBEDTLS_SSL_PROC_CHK(ssl_tls13_get_default_group_id(ssl,
301 &group_id));
Jerry Yu56fc07f2021-09-01 17:48:49 +0800302 }
303
304 /*
305 * Dispatch to type-specific key generation function.
306 *
307 * So far, we're only supporting ECDHE. With the introduction
308 * of PQC KEMs, we'll want to have multiple branches, one per
309 * type of KEM, and dispatch to the corresponding crypto. And
310 * only one key share entry is allowed.
311 */
Xiaofei Baieef15042021-11-18 07:29:56 +0000312 client_shares = p;
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200313#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
314 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group_id) ||
315 mbedtls_ssl_tls13_named_group_is_dhe(group_id)) {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800316 /* Pointer to group */
Xiaofei Baieef15042021-11-18 07:29:56 +0000317 unsigned char *group = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800318 /* Length of key_exchange */
Przemyslaw Stekiel4f419e52022-02-10 15:56:26 +0100319 size_t key_exchange_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800320
321 /* Check there is space for header of KeyShareEntry
322 * - group (2 bytes)
323 * - key_exchange_length (2 bytes)
324 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800326 p += 4;
Przemek Stekiel29c219c2023-05-31 15:21:04 +0200327 ret = mbedtls_ssl_tls13_generate_and_write_dh_key_exchange(
328 ssl, group_id, p, end, &key_exchange_len);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800329 p += key_exchange_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 if (ret != 0) {
331 return ret;
332 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800333
334 /* Write group */
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 MBEDTLS_PUT_UINT16_BE(group_id, group, 0);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800336 /* Write key_exchange_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 MBEDTLS_PUT_UINT16_BE(key_exchange_len, group, 2);
338 } else
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200339#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 if (0 /* other KEMs? */) {
Jerry Yu56fc07f2021-09-01 17:48:49 +0800341 /* Do something */
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 } else {
343 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800344 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800345
Jerry Yub60e3cf2021-09-08 16:41:02 +0800346 /* Length of client_shares */
Xiaofei Baieef15042021-11-18 07:29:56 +0000347 client_shares_len = p - client_shares;
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 if (client_shares_len == 0) {
349 MBEDTLS_SSL_DEBUG_MSG(1, ("No key share defined."));
350 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu7c522d42021-09-08 17:55:09 +0800351 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800352 /* Write extension_type */
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800354 /* Write extension_data_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100355 MBEDTLS_PUT_UINT16_BE(client_shares_len + 2, buf, 2);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800356 /* Write client_shares_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100357 MBEDTLS_PUT_UINT16_BE(client_shares_len, buf, 4);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800358
359 /* Update offered_group_id field */
360 ssl->handshake->offered_group_id = group_id;
361
362 /* Output the total length of key_share extension. */
Xiaofei Baid25fab62021-12-02 06:36:27 +0000363 *out_len = p - buf;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800364
Xiaokang Qian91bb3f02023-04-03 09:07:03 +0000365 MBEDTLS_SSL_DEBUG_BUF(
366 3, "client hello, key_share extension", buf, *out_len);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800367
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800369
370cleanup:
371
Gilles Peskine449bd832023-01-11 14:50:10 +0100372 return ret;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800373}
Ronald Cron766c0cd2022-10-18 12:17:11 +0200374#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
Jerry Yue1b9c292021-09-10 10:08:31 +0800375
XiaokangQiand59be772022-01-24 10:12:51 +0000376/*
377 * ssl_tls13_parse_hrr_key_share_ext()
378 * Parse key_share extension in Hello Retry Request
379 *
380 * struct {
381 * NamedGroup selected_group;
382 * } KeyShareHelloRetryRequest;
383 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200384MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100385static int ssl_tls13_parse_hrr_key_share_ext(mbedtls_ssl_context *ssl,
386 const unsigned char *buf,
387 const unsigned char *end)
XiaokangQianb851da82022-01-14 04:03:11 +0000388{
Valerio Setti080a22b2023-03-20 15:22:47 +0100389#if defined(PSA_WANT_ALG_ECDH)
XiaokangQianb851da82022-01-14 04:03:11 +0000390 const unsigned char *p = buf;
XiaokangQiand59be772022-01-24 10:12:51 +0000391 int selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000392 int found = 0;
393
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
395 if (group_list == NULL) {
396 return MBEDTLS_ERR_SSL_BAD_CONFIG;
397 }
XiaokangQianb851da82022-01-14 04:03:11 +0000398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 MBEDTLS_SSL_DEBUG_BUF(3, "key_share extension", p, end - buf);
XiaokangQianb851da82022-01-14 04:03:11 +0000400
401 /* Read selected_group */
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
403 selected_group = MBEDTLS_GET_UINT16_BE(p, 0);
404 MBEDTLS_SSL_DEBUG_MSG(3, ("selected_group ( %d )", selected_group));
XiaokangQianb851da82022-01-14 04:03:11 +0000405
406 /* Upon receipt of this extension in a HelloRetryRequest, the client
407 * MUST first verify that the selected_group field corresponds to a
408 * group which was provided in the "supported_groups" extension in the
409 * original ClientHello.
410 * The supported_group was based on the info in ssl->conf->group_list.
411 *
412 * If the server provided a key share that was not sent in the ClientHello
413 * then the client MUST abort the handshake with an "illegal_parameter" alert.
414 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 for (; *group_list != 0; group_list++) {
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200416 if (mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list)) {
417 if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(
418 *group_list, NULL, NULL) == PSA_ERROR_NOT_SUPPORTED) ||
419 *group_list != selected_group) {
420 found = 1;
421 break;
422 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 }
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200424 if (mbedtls_ssl_tls13_named_group_is_dhe(*group_list)) {
425 found = 1;
426 break;
427 }
XiaokangQianb851da82022-01-14 04:03:11 +0000428 }
429
430 /* Client MUST verify that the selected_group field does not
431 * correspond to a group which was provided in the "key_share"
432 * extension in the original ClientHello. If the server sent an
433 * HRR message with a key share already provided in the
434 * ClientHello then the client MUST abort the handshake with
435 * an "illegal_parameter" alert.
436 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 if (found == 0 || selected_group == ssl->handshake->offered_group_id) {
438 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid key share in HRR"));
XiaokangQianb851da82022-01-14 04:03:11 +0000439 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
441 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
442 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
XiaokangQianb851da82022-01-14 04:03:11 +0000443 }
444
445 /* Remember server's preference for next ClientHello */
XiaokangQiand59be772022-01-24 10:12:51 +0000446 ssl->handshake->offered_group_id = selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 return 0;
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400449#else
450 (void) ssl;
451 (void) buf;
452 (void) end;
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 return MBEDTLS_ERR_SSL_BAD_CONFIG;
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400454#endif
XiaokangQianb851da82022-01-14 04:03:11 +0000455}
456
Jerry Yue1b9c292021-09-10 10:08:31 +0800457/*
Jerry Yub85277e2021-10-13 13:36:05 +0800458 * ssl_tls13_parse_key_share_ext()
459 * Parse key_share extension in Server Hello
460 *
Jerry Yue1b9c292021-09-10 10:08:31 +0800461 * struct {
462 * KeyShareEntry server_share;
463 * } KeyShareServerHello;
464 * struct {
465 * NamedGroup group;
466 * opaque key_exchange<1..2^16-1>;
467 * } KeyShareEntry;
468 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200469MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100470static int ssl_tls13_parse_key_share_ext(mbedtls_ssl_context *ssl,
471 const unsigned char *buf,
472 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +0800473{
Jerry Yub85277e2021-10-13 13:36:05 +0800474 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +0800475 const unsigned char *p = buf;
Jerry Yu4a173382021-10-11 21:45:31 +0800476 uint16_t group, offered_group;
Jerry Yue1b9c292021-09-10 10:08:31 +0800477
Jerry Yu4a173382021-10-11 21:45:31 +0800478 /* ...
479 * NamedGroup group; (2 bytes)
480 * ...
481 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
483 group = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +0800484 p += 2;
485
Jerry Yu4a173382021-10-11 21:45:31 +0800486 /* Check that the chosen group matches the one we offered. */
Jerry Yue1b9c292021-09-10 10:08:31 +0800487 offered_group = ssl->handshake->offered_group_id;
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 if (offered_group != group) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +0000489 MBEDTLS_SSL_DEBUG_MSG(
490 1, ("Invalid server key share, our group %u, their group %u",
491 (unsigned) offered_group, (unsigned) group));
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
493 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
494 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yue1b9c292021-09-10 10:08:31 +0800495 }
496
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200497#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
498 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group) ||
499 mbedtls_ssl_tls13_named_group_is_dhe(group)) {
Valerio Setti080a22b2023-03-20 15:22:47 +0100500#if defined(PSA_WANT_ALG_ECDH)
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200501 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group)) {
502 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(group, NULL, NULL)
503 == PSA_ERROR_NOT_SUPPORTED) {
504 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid TLS curve group id"));
505 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
506 }
507
508 MBEDTLS_SSL_DEBUG_MSG(
509 2,
510 ("ECDH curve: %s", mbedtls_ssl_get_curve_name_from_tls_id(group)));
Przemyslaw Stekiel9e23ddb2022-02-10 10:32:02 +0100511 }
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200512#endif /* PSA_WANT_ALG_ECDH */
513#if defined(PSA_WANT_ALG_FFDH)
514 if (mbedtls_ssl_tls13_named_group_is_dhe(group)) {
515 MBEDTLS_SSL_DEBUG_MSG(2,
516 ("DHE group name: %s", mbedtls_ssl_ffdh_name_from_group(group)));
517 }
518#endif /* PSA_WANT_ALG_FFDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 ret = mbedtls_ssl_tls13_read_public_ecdhe_share(ssl, p, end - p);
520 if (ret != 0) {
521 return ret;
522 }
523 } else
Przemek Stekielc89f3ea2023-05-18 15:45:53 +0200524#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 if (0 /* other KEMs? */) {
Jerry Yue1b9c292021-09-10 10:08:31 +0800526 /* Do something */
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 } else {
528 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yue1b9c292021-09-10 10:08:31 +0800529 }
Jerry Yue1b9c292021-09-10 10:08:31 +0800530
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +0800532}
533
XiaokangQiand59be772022-01-24 10:12:51 +0000534/*
535 * ssl_tls13_parse_cookie_ext()
536 * Parse cookie extension in Hello Retry Request
537 *
538 * struct {
539 * opaque cookie<1..2^16-1>;
540 * } Cookie;
541 *
542 * When sending a HelloRetryRequest, the server MAY provide a "cookie"
543 * extension to the client (this is an exception to the usual rule that
544 * the only extensions that may be sent are those that appear in the
545 * ClientHello). When sending the new ClientHello, the client MUST copy
546 * the contents of the extension received in the HelloRetryRequest into
547 * a "cookie" extension in the new ClientHello. Clients MUST NOT use
548 * cookies in their initial ClientHello in subsequent connections.
549 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200550MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100551static int ssl_tls13_parse_cookie_ext(mbedtls_ssl_context *ssl,
552 const unsigned char *buf,
553 const unsigned char *end)
XiaokangQian43550bd2022-01-21 04:32:58 +0000554{
XiaokangQian25c9c902022-02-08 10:49:53 +0000555 uint16_t cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000556 const unsigned char *p = buf;
557 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
558
559 /* Retrieve length field of cookie */
Gilles Peskine449bd832023-01-11 14:50:10 +0100560 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
561 cookie_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian43550bd2022-01-21 04:32:58 +0000562 p += 2;
563
Gilles Peskine449bd832023-01-11 14:50:10 +0100564 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, cookie_len);
565 MBEDTLS_SSL_DEBUG_BUF(3, "cookie extension", p, cookie_len);
XiaokangQian43550bd2022-01-21 04:32:58 +0000566
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 mbedtls_free(handshake->cookie);
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800568 handshake->cookie_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100569 handshake->cookie = mbedtls_calloc(1, cookie_len);
570 if (handshake->cookie == NULL) {
571 MBEDTLS_SSL_DEBUG_MSG(1,
572 ("alloc failed ( %ud bytes )",
573 cookie_len));
574 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
XiaokangQian43550bd2022-01-21 04:32:58 +0000575 }
576
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 memcpy(handshake->cookie, p, cookie_len);
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800578 handshake->cookie_len = cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000579
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 return 0;
XiaokangQian43550bd2022-01-21 04:32:58 +0000581}
XiaokangQian43550bd2022-01-21 04:32:58 +0000582
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200583MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100584static int ssl_tls13_write_cookie_ext(mbedtls_ssl_context *ssl,
585 unsigned char *buf,
586 unsigned char *end,
587 size_t *out_len)
XiaokangQian0b64eed2022-01-27 10:36:51 +0000588{
589 unsigned char *p = buf;
XiaokangQian9deb90f2022-02-08 10:31:07 +0000590 *out_len = 0;
XiaokangQianc02768a2022-02-10 07:31:25 +0000591 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000592
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 if (handshake->cookie == NULL) {
594 MBEDTLS_SSL_DEBUG_MSG(3, ("no cookie to send; skip extension"));
595 return 0;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000596 }
597
Gilles Peskine449bd832023-01-11 14:50:10 +0100598 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
599 handshake->cookie,
600 handshake->cookie_len);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 MBEDTLS_SSL_CHK_BUF_PTR(p, end, handshake->cookie_len + 6);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000603
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding cookie extension"));
XiaokangQian0b64eed2022-01-27 10:36:51 +0000605
Gilles Peskine449bd832023-01-11 14:50:10 +0100606 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_COOKIE, p, 0);
607 MBEDTLS_PUT_UINT16_BE(handshake->cookie_len + 2, p, 2);
608 MBEDTLS_PUT_UINT16_BE(handshake->cookie_len, p, 4);
XiaokangQian233397e2022-02-07 08:32:16 +0000609 p += 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000610
611 /* Cookie */
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 memcpy(p, handshake->cookie, handshake->cookie_len);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000613
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800614 *out_len = handshake->cookie_len + 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_COOKIE);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800617
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 return 0;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000619}
620
Ronald Cron41a443a2022-10-04 16:38:25 +0200621#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000622/*
623 * ssl_tls13_write_psk_key_exchange_modes_ext() structure:
624 *
625 * enum { psk_ke( 0 ), psk_dhe_ke( 1 ), ( 255 ) } PskKeyExchangeMode;
626 *
627 * struct {
628 * PskKeyExchangeMode ke_modes<1..255>;
629 * } PskKeyExchangeModes;
630 */
XiaokangQian86981952022-07-19 09:51:50 +0000631MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100632static int ssl_tls13_write_psk_key_exchange_modes_ext(mbedtls_ssl_context *ssl,
633 unsigned char *buf,
634 unsigned char *end,
635 size_t *out_len)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000636{
XiaokangQianeb69aee2022-07-05 08:21:43 +0000637 unsigned char *p = buf;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000638 int ke_modes_len = 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000639
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 ((void) ke_modes_len);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000641 *out_len = 0;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000642
XiaokangQianeb69aee2022-07-05 08:21:43 +0000643 /* Skip writing extension if no PSK key exchange mode
XiaokangQian7c12d312022-07-20 07:25:43 +0000644 * is enabled in the config.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000645 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100646 if (!mbedtls_ssl_conf_tls13_some_psk_enabled(ssl)) {
647 MBEDTLS_SSL_DEBUG_MSG(3, ("skip psk_key_exchange_modes extension"));
648 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000649 }
650
651 /* Require 7 bytes of data, otherwise fail,
652 * even if extension might be shorter.
653 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100654 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 7);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000655 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +0100656 3, ("client hello, adding psk_key_exchange_modes extension"));
XiaokangQianeb69aee2022-07-05 08:21:43 +0000657
Gilles Peskine449bd832023-01-11 14:50:10 +0100658 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES, p, 0);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000659
XiaokangQian008d2bf2022-07-14 07:54:01 +0000660 /* Skip extension length (2 bytes) and
661 * ke_modes length (1 byte) for now.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000662 */
663 p += 5;
664
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 if (mbedtls_ssl_conf_tls13_psk_ephemeral_enabled(ssl)) {
XiaokangQianeb69aee2022-07-05 08:21:43 +0000666 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000667 ke_modes_len++;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000668
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 MBEDTLS_SSL_DEBUG_MSG(4, ("Adding PSK-ECDHE key exchange mode"));
XiaokangQianeb69aee2022-07-05 08:21:43 +0000670 }
671
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 if (mbedtls_ssl_conf_tls13_psk_enabled(ssl)) {
Ronald Crona709a0f2022-09-27 16:46:11 +0200673 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE;
674 ke_modes_len++;
675
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 MBEDTLS_SSL_DEBUG_MSG(4, ("Adding pure PSK key exchange mode"));
Ronald Crona709a0f2022-09-27 16:46:11 +0200677 }
678
XiaokangQian008d2bf2022-07-14 07:54:01 +0000679 /* Now write the extension and ke_modes length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 MBEDTLS_PUT_UINT16_BE(ke_modes_len + 1, buf, 2);
XiaokangQian008d2bf2022-07-14 07:54:01 +0000681 buf[4] = ke_modes_len;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000682
683 *out_len = p - buf;
Jerry Yu0c354a22022-08-29 15:25:36 +0800684
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800685 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 ssl, MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800687
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000689}
Jerry Yudb8c5fa2022-08-03 12:10:13 +0800690
Gilles Peskine449bd832023-01-11 14:50:10 +0100691static psa_algorithm_t ssl_tls13_get_ciphersuite_hash_alg(int ciphersuite)
Jerry Yuf7c12592022-09-28 22:09:38 +0800692{
Jerry Yu21f90952022-10-08 10:30:53 +0800693 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100694 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
Jerry Yuf7c12592022-09-28 22:09:38 +0800695
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 if (ciphersuite_info != NULL) {
697 return mbedtls_psa_translate_md(ciphersuite_info->mac);
698 }
Jerry Yua99cbfa2022-10-08 11:17:14 +0800699
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 return PSA_ALG_NONE;
Jerry Yuf7c12592022-09-28 22:09:38 +0800701}
702
Jerry Yuf75364b2022-09-30 10:30:31 +0800703#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100704static int ssl_tls13_has_configured_ticket(mbedtls_ssl_context *ssl)
Xiaokang Qianb781a232022-11-01 07:39:46 +0000705{
706 mbedtls_ssl_session *session = ssl->session_negotiate;
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 return ssl->handshake->resume &&
Pengyu Lv93566782022-12-07 12:10:05 +0800708 session != NULL && session->ticket != NULL &&
Pengyu Lv9b84ea72023-01-16 14:08:23 +0800709 mbedtls_ssl_conf_tls13_check_kex_modes(
710 ssl, mbedtls_ssl_session_get_ticket_flags(
711 session, MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL));
Xiaokang Qianb781a232022-11-01 07:39:46 +0000712}
713
Xiaokang Qian01323a42022-11-03 02:27:35 +0000714#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +0100715static int ssl_tls13_early_data_has_valid_ticket(mbedtls_ssl_context *ssl)
Xiaokang Qian01323a42022-11-03 02:27:35 +0000716{
717 mbedtls_ssl_session *session = ssl->session_negotiate;
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 return ssl->handshake->resume &&
719 session->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
720 (session->ticket_flags &
721 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA) &&
722 mbedtls_ssl_tls13_cipher_suite_is_offered(
723 ssl, session->ciphersuite);
Xiaokang Qian01323a42022-11-03 02:27:35 +0000724}
725#endif
726
Xiaokang Qianb781a232022-11-01 07:39:46 +0000727MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100728static int ssl_tls13_ticket_get_identity(mbedtls_ssl_context *ssl,
729 psa_algorithm_t *hash_alg,
730 const unsigned char **identity,
731 size_t *identity_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800732{
733 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu8b41e892022-09-30 10:00:20 +0800734
Gilles Peskine449bd832023-01-11 14:50:10 +0100735 if (!ssl_tls13_has_configured_ticket(ssl)) {
736 return -1;
737 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800738
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite);
Jerry Yuf7c12592022-09-28 22:09:38 +0800740 *identity = session->ticket;
741 *identity_len = session->ticket_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800743}
744
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800745MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100746static int ssl_tls13_ticket_get_psk(mbedtls_ssl_context *ssl,
747 psa_algorithm_t *hash_alg,
748 const unsigned char **psk,
749 size_t *psk_len)
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800750{
751
752 mbedtls_ssl_session *session = ssl->session_negotiate;
753
Gilles Peskine449bd832023-01-11 14:50:10 +0100754 if (!ssl_tls13_has_configured_ticket(ssl)) {
755 return -1;
756 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800757
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite);
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800759 *psk = session->resumption_key;
760 *psk_len = session->resumption_key_len;
761
Gilles Peskine449bd832023-01-11 14:50:10 +0100762 return 0;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800763}
Jerry Yuf7c12592022-09-28 22:09:38 +0800764#endif /* MBEDTLS_SSL_SESSION_TICKETS */
765
766MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100767static int ssl_tls13_psk_get_identity(mbedtls_ssl_context *ssl,
768 psa_algorithm_t *hash_alg,
769 const unsigned char **identity,
770 size_t *identity_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800771{
Jerry Yu8b41e892022-09-30 10:00:20 +0800772
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
774 return -1;
775 }
Jerry Yuf7c12592022-09-28 22:09:38 +0800776
Jerry Yua99cbfa2022-10-08 11:17:14 +0800777 *hash_alg = PSA_ALG_SHA_256;
Jerry Yuf7c12592022-09-28 22:09:38 +0800778 *identity = ssl->conf->psk_identity;
779 *identity_len = ssl->conf->psk_identity_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800781}
782
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800783MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100784static int ssl_tls13_psk_get_psk(mbedtls_ssl_context *ssl,
785 psa_algorithm_t *hash_alg,
786 const unsigned char **psk,
787 size_t *psk_len)
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800788{
Jerry Yu8b41e892022-09-30 10:00:20 +0800789
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
791 return -1;
792 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800793
Jerry Yua99cbfa2022-10-08 11:17:14 +0800794 *hash_alg = PSA_ALG_SHA_256;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800795 *psk = ssl->conf->psk;
796 *psk_len = ssl->conf->psk_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100797 return 0;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800798}
799
Gilles Peskine449bd832023-01-11 14:50:10 +0100800static int ssl_tls13_get_configured_psk_count(mbedtls_ssl_context *ssl)
Jerry Yuf75364b2022-09-30 10:30:31 +0800801{
802 int configured_psk_count = 0;
803#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 if (ssl_tls13_has_configured_ticket(ssl)) {
805 MBEDTLS_SSL_DEBUG_MSG(3, ("Ticket is configured"));
Jerry Yuf75364b2022-09-30 10:30:31 +0800806 configured_psk_count++;
807 }
808#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100809 if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
810 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK is configured"));
Jerry Yuf75364b2022-09-30 10:30:31 +0800811 configured_psk_count++;
812 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 return configured_psk_count;
Jerry Yuf75364b2022-09-30 10:30:31 +0800814}
815
Jerry Yuf7c12592022-09-28 22:09:38 +0800816MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100817static int ssl_tls13_write_identity(mbedtls_ssl_context *ssl,
818 unsigned char *buf,
819 unsigned char *end,
820 const unsigned char *identity,
821 size_t identity_len,
822 uint32_t obfuscated_ticket_age,
823 size_t *out_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800824{
Jerry Yuf75364b2022-09-30 10:30:31 +0800825 ((void) ssl);
Jerry Yuf7c12592022-09-28 22:09:38 +0800826 *out_len = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800827
828 /*
829 * - identity_len (2 bytes)
830 * - identity (psk_identity_len bytes)
831 * - obfuscated_ticket_age (4 bytes)
832 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100833 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800834
Gilles Peskine449bd832023-01-11 14:50:10 +0100835 MBEDTLS_PUT_UINT16_BE(identity_len, buf, 0);
836 memcpy(buf + 2, identity, identity_len);
837 MBEDTLS_PUT_UINT32_BE(obfuscated_ticket_age, buf, 2 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800838
Gilles Peskine449bd832023-01-11 14:50:10 +0100839 MBEDTLS_SSL_DEBUG_BUF(4, "write identity", buf, 6 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800840
841 *out_len = 6 + identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800842
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800844}
845
Jerry Yu8b41e892022-09-30 10:00:20 +0800846MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100847static int ssl_tls13_write_binder(mbedtls_ssl_context *ssl,
848 unsigned char *buf,
849 unsigned char *end,
850 int psk_type,
851 psa_algorithm_t hash_alg,
852 const unsigned char *psk,
853 size_t psk_len,
854 size_t *out_len)
Jerry Yu8b41e892022-09-30 10:00:20 +0800855{
856 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu8b41e892022-09-30 10:00:20 +0800857 unsigned char binder_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100858 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu8b41e892022-09-30 10:00:20 +0800859 size_t transcript_len = 0;
860
861 *out_len = 0;
862
Gilles Peskine449bd832023-01-11 14:50:10 +0100863 binder_len = PSA_HASH_LENGTH(hash_alg);
Jerry Yu8b41e892022-09-30 10:00:20 +0800864
865 /*
866 * - binder_len (1 bytes)
867 * - binder (binder_len bytes)
868 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100869 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1 + binder_len);
Jerry Yu8b41e892022-09-30 10:00:20 +0800870
Jerry Yua99cbfa2022-10-08 11:17:14 +0800871 buf[0] = binder_len;
Jerry Yu8b41e892022-09-30 10:00:20 +0800872
873 /* Get current state of handshake transcript. */
874 ret = mbedtls_ssl_get_handshake_transcript(
Gilles Peskine449bd832023-01-11 14:50:10 +0100875 ssl, mbedtls_hash_info_md_from_psa(hash_alg),
876 transcript, sizeof(transcript), &transcript_len);
877 if (ret != 0) {
878 return ret;
Jerry Yu8b41e892022-09-30 10:00:20 +0800879 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100880
881 ret = mbedtls_ssl_tls13_create_psk_binder(ssl, hash_alg,
882 psk, psk_len, psk_type,
883 transcript, buf + 1);
884 if (ret != 0) {
885 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_create_psk_binder", ret);
886 return ret;
887 }
888 MBEDTLS_SSL_DEBUG_BUF(4, "write binder", buf, 1 + binder_len);
Jerry Yu8b41e892022-09-30 10:00:20 +0800889
890 *out_len = 1 + binder_len;
891
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 return 0;
Jerry Yu8b41e892022-09-30 10:00:20 +0800893}
894
895/*
896 * mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext() structure:
897 *
898 * struct {
899 * opaque identity<1..2^16-1>;
900 * uint32 obfuscated_ticket_age;
901 * } PskIdentity;
902 *
903 * opaque PskBinderEntry<32..255>;
904 *
905 * struct {
906 * PskIdentity identities<7..2^16-1>;
907 * PskBinderEntry binders<33..2^16-1>;
908 * } OfferedPsks;
909 *
910 * struct {
911 * select (Handshake.msg_type) {
912 * case client_hello: OfferedPsks;
913 * ...
914 * };
915 * } PreSharedKeyExtension;
916 *
917 */
XiaokangQian3ad67bf2022-07-21 02:26:21 +0000918int mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end,
920 size_t *out_len, size_t *binders_len)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000921{
Jerry Yuf7c12592022-09-28 22:09:38 +0800922 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf75364b2022-09-30 10:30:31 +0800923 int configured_psk_count = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800924 unsigned char *p = buf;
Xiaokang Qian854db282022-12-19 07:31:27 +0000925 psa_algorithm_t hash_alg = PSA_ALG_NONE;
Jerry Yuf75364b2022-09-30 10:30:31 +0800926 const unsigned char *identity;
927 size_t identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800928 size_t l_binders_len = 0;
Jerry Yuf75364b2022-09-30 10:30:31 +0800929 size_t output_len;
Xiaokang Qian7179f812023-02-03 03:38:44 +0000930
Jerry Yuf7c12592022-09-28 22:09:38 +0800931 *out_len = 0;
932 *binders_len = 0;
933
934 /* Check if we have any PSKs to offer. If no, skip pre_shared_key */
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 configured_psk_count = ssl_tls13_get_configured_psk_count(ssl);
936 if (configured_psk_count == 0) {
937 MBEDTLS_SSL_DEBUG_MSG(3, ("skip pre_shared_key extensions"));
938 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800939 }
940
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 MBEDTLS_SSL_DEBUG_MSG(4, ("Pre-configured PSK number = %d",
942 configured_psk_count));
Jerry Yuf75364b2022-09-30 10:30:31 +0800943
Jerry Yuf7c12592022-09-28 22:09:38 +0800944 /* Check if we have space to write the extension, binders included.
945 * - extension_type (2 bytes)
946 * - extension_data_len (2 bytes)
947 * - identities_len (2 bytes)
948 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Jerry Yuf7c12592022-09-28 22:09:38 +0800950 p += 6;
951
Jerry Yuf75364b2022-09-30 10:30:31 +0800952#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 if (ssl_tls13_ticket_get_identity(
954 ssl, &hash_alg, &identity, &identity_len) == 0) {
Jerry Yuf75364b2022-09-30 10:30:31 +0800955#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 mbedtls_time_t now = mbedtls_time(NULL);
Jerry Yuf75364b2022-09-30 10:30:31 +0800957 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu6916e702022-10-10 21:33:51 +0800958 uint32_t obfuscated_ticket_age =
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 (uint32_t) (now - session->ticket_received);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800960
Jerry Yu3e60cad2023-01-10 14:58:08 +0800961 /*
962 * The ticket timestamp is in seconds but the ticket age is in
963 * milliseconds. If the ticket was received at the end of a second and
964 * re-used here just at the beginning of the next second, the computed
965 * age `now - session->ticket_received` is equal to 1s thus 1000 ms
966 * while the actual age could be just a few milliseconds or tens of
967 * milliseconds. If the server has more accurate ticket timestamps
968 * (typically timestamps in milliseconds), as part of the processing of
969 * the ClientHello, it may compute a ticket lifetime smaller than the
970 * one computed here and potentially reject the ticket. To avoid that,
971 * remove one second to the ticket age if possible.
Jerry Yubdb936b2023-01-07 16:07:46 +0800972 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 if (obfuscated_ticket_age > 0) {
Jerry Yubdb936b2023-01-07 16:07:46 +0800974 obfuscated_ticket_age -= 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 }
Jerry Yubdb936b2023-01-07 16:07:46 +0800976
Jerry Yuf75364b2022-09-30 10:30:31 +0800977 obfuscated_ticket_age *= 1000;
978 obfuscated_ticket_age += session->ticket_age_add;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800979
Gilles Peskine449bd832023-01-11 14:50:10 +0100980 ret = ssl_tls13_write_identity(ssl, p, end,
981 identity, identity_len,
982 obfuscated_ticket_age,
983 &output_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800984#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100985 ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len,
986 0, &output_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800987#endif /* MBEDTLS_HAVE_TIME */
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 if (ret != 0) {
989 return ret;
990 }
Jerry Yuf7c12592022-09-28 22:09:38 +0800991
Jerry Yuf75364b2022-09-30 10:30:31 +0800992 p += output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100993 l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg);
Jerry Yuf75364b2022-09-30 10:30:31 +0800994 }
995#endif /* MBEDTLS_SSL_SESSION_TICKETS */
996
Gilles Peskine449bd832023-01-11 14:50:10 +0100997 if (ssl_tls13_psk_get_identity(
998 ssl, &hash_alg, &identity, &identity_len) == 0) {
Jerry Yuf75364b2022-09-30 10:30:31 +0800999
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len, 0,
1001 &output_len);
1002 if (ret != 0) {
1003 return ret;
1004 }
Jerry Yuf75364b2022-09-30 10:30:31 +08001005
Jerry Yuf7c12592022-09-28 22:09:38 +08001006 p += output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg);
Jerry Yuf7c12592022-09-28 22:09:38 +08001008 }
1009
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 MBEDTLS_SSL_DEBUG_MSG(3,
1011 ("client hello, adding pre_shared_key extension, "
1012 "omitting PSK binder list"));
Jerry Yua99cbfa2022-10-08 11:17:14 +08001013
1014 /* Take into account the two bytes for the length of the binders. */
1015 l_binders_len += 2;
Jerry Yu6916e702022-10-10 21:33:51 +08001016 /* Check if there is enough space for binders */
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 MBEDTLS_SSL_CHK_BUF_PTR(p, end, l_binders_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +08001018
Jerry Yuf7c12592022-09-28 22:09:38 +08001019 /*
1020 * - extension_type (2 bytes)
1021 * - extension_data_len (2 bytes)
1022 * - identities_len (2 bytes)
1023 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001024 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PRE_SHARED_KEY, buf, 0);
1025 MBEDTLS_PUT_UINT16_BE(p - buf - 4 + l_binders_len, buf, 2);
1026 MBEDTLS_PUT_UINT16_BE(p - buf - 6, buf, 4);
Jerry Yuf7c12592022-09-28 22:09:38 +08001027
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 *out_len = (p - buf) + l_binders_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001029 *binders_len = l_binders_len;
Jerry Yuf7c12592022-09-28 22:09:38 +08001030
Gilles Peskine449bd832023-01-11 14:50:10 +01001031 MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key identities", buf, p - buf);
Jerry Yuf7c12592022-09-28 22:09:38 +08001032
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001034}
1035
XiaokangQian86981952022-07-19 09:51:50 +00001036int mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001037 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end)
XiaokangQianeb69aee2022-07-05 08:21:43 +00001038{
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001039 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1040 unsigned char *p = buf;
Jerry Yu6183cc72022-09-30 11:08:57 +08001041 psa_algorithm_t hash_alg = PSA_ALG_NONE;
1042 const unsigned char *psk;
1043 size_t psk_len;
1044 size_t output_len;
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001045
1046 /* Check if we have space to write binders_len.
1047 * - binders_len (2 bytes)
1048 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001050 p += 2;
1051
Jerry Yu6183cc72022-09-30 11:08:57 +08001052#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 if (ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) {
Jerry Yu6183cc72022-09-30 11:08:57 +08001054
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 ret = ssl_tls13_write_binder(ssl, p, end,
1056 MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION,
1057 hash_alg, psk, psk_len,
1058 &output_len);
1059 if (ret != 0) {
1060 return ret;
1061 }
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001062 p += output_len;
1063 }
Jerry Yu6183cc72022-09-30 11:08:57 +08001064#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001065
Gilles Peskine449bd832023-01-11 14:50:10 +01001066 if (ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) {
Jerry Yu6183cc72022-09-30 11:08:57 +08001067
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 ret = ssl_tls13_write_binder(ssl, p, end,
1069 MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL,
1070 hash_alg, psk, psk_len,
1071 &output_len);
1072 if (ret != 0) {
1073 return ret;
1074 }
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001075 p += output_len;
1076 }
1077
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding PSK binder list."));
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001079
1080 /*
1081 * - binders_len (2 bytes)
1082 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 MBEDTLS_PUT_UINT16_BE(p - buf - 2, buf, 0);
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001084
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key binders", buf, p - buf);
XiaokangQianeb69aee2022-07-05 08:21:43 +00001086
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001087 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY);
Jerry Yu0c354a22022-08-29 15:25:36 +08001089
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001091}
Jerry Yu0c6105b2022-08-12 17:26:40 +08001092
1093/*
1094 * struct {
1095 * opaque identity<1..2^16-1>;
1096 * uint32 obfuscated_ticket_age;
1097 * } PskIdentity;
1098 *
1099 * opaque PskBinderEntry<32..255>;
1100 *
1101 * struct {
1102 *
1103 * select (Handshake.msg_type) {
1104 * ...
1105 * case server_hello: uint16 selected_identity;
1106 * };
1107 *
1108 * } PreSharedKeyExtension;
1109 *
1110 */
1111MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001112static int ssl_tls13_parse_server_pre_shared_key_ext(mbedtls_ssl_context *ssl,
1113 const unsigned char *buf,
1114 const unsigned char *end)
Jerry Yu0c6105b2022-08-12 17:26:40 +08001115{
Jerry Yua99cbfa2022-10-08 11:17:14 +08001116 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub300e3c2022-09-28 22:12:07 +08001117 int selected_identity;
Jerry Yub300e3c2022-09-28 22:12:07 +08001118 const unsigned char *psk;
1119 size_t psk_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001120 psa_algorithm_t hash_alg;
Jerry Yub300e3c2022-09-28 22:12:07 +08001121
Gilles Peskine449bd832023-01-11 14:50:10 +01001122 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2);
1123 selected_identity = MBEDTLS_GET_UINT16_BE(buf, 0);
Xiaokang Qian2a674932023-01-04 03:15:09 +00001124 ssl->handshake->selected_identity = (uint16_t) selected_identity;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 MBEDTLS_SSL_DEBUG_MSG(3, ("selected_identity = %d", selected_identity));
Jerry Yua99cbfa2022-10-08 11:17:14 +08001127
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 if (selected_identity >= ssl_tls13_get_configured_psk_count(ssl)) {
1129 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid PSK identity."));
Jerry Yu4a698342022-09-30 12:22:01 +08001130
Gilles Peskine449bd832023-01-11 14:50:10 +01001131 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1132 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1133 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yub300e3c2022-09-28 22:12:07 +08001134 }
Jerry Yua99cbfa2022-10-08 11:17:14 +08001135
Jerry Yu4a698342022-09-30 12:22:01 +08001136#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 if (selected_identity == 0 && ssl_tls13_has_configured_ticket(ssl)) {
1138 ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len);
1139 } else
Jerry Yu4a698342022-09-30 12:22:01 +08001140#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001141 if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
1142 ret = ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len);
1143 } else {
1144 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1145 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yub300e3c2022-09-28 22:12:07 +08001146 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001147 if (ret != 0) {
1148 return ret;
Jerry Yub300e3c2022-09-28 22:12:07 +08001149 }
Jerry Yub300e3c2022-09-28 22:12:07 +08001150
Xiaokang Qianeb31cbc2023-02-07 02:08:56 +00001151 if (mbedtls_psa_translate_md(ssl->handshake->ciphersuite_info->mac)
1152 != hash_alg) {
1153 MBEDTLS_SSL_DEBUG_MSG(
1154 1, ("Invalid ciphersuite for external psk."));
1155
1156 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1157 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1158 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1159 }
1160
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len);
1162 if (ret != 0) {
1163 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
1164 return ret;
1165 }
1166
1167 return 0;
Jerry Yu0c6105b2022-08-12 17:26:40 +08001168}
Ronald Cron41a443a2022-10-04 16:38:25 +02001169#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
XiaokangQianeb69aee2022-07-05 08:21:43 +00001170
Gilles Peskine449bd832023-01-11 14:50:10 +01001171int mbedtls_ssl_tls13_write_client_hello_exts(mbedtls_ssl_context *ssl,
1172 unsigned char *buf,
1173 unsigned char *end,
1174 size_t *out_len)
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001175{
1176 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1177 unsigned char *p = buf;
1178 size_t ext_len;
1179
1180 *out_len = 0;
1181
1182 /* Write supported_versions extension
1183 *
1184 * Supported Versions Extension is mandatory with TLS 1.3.
1185 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001186 ret = ssl_tls13_write_supported_versions_ext(ssl, p, end, &ext_len);
1187 if (ret != 0) {
1188 return ret;
1189 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001190 p += ext_len;
1191
1192 /* Echo the cookie if the server provided one in its preceding
1193 * HelloRetryRequest message.
1194 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 ret = ssl_tls13_write_cookie_ext(ssl, p, end, &ext_len);
1196 if (ret != 0) {
1197 return ret;
1198 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001199 p += ext_len;
1200
Ronald Cron766c0cd2022-10-18 12:17:11 +02001201#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001202 if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1203 ret = ssl_tls13_write_key_share_ext(ssl, p, end, &ext_len);
1204 if (ret != 0) {
1205 return ret;
1206 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001207 p += ext_len;
1208 }
Ronald Cron766c0cd2022-10-18 12:17:11 +02001209#endif
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001210
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001211#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 if (mbedtls_ssl_conf_tls13_some_psk_enabled(ssl) &&
1213 ssl_tls13_early_data_has_valid_ticket(ssl) &&
1214 ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED) {
1215 ret = mbedtls_ssl_tls13_write_early_data_ext(ssl, p, end, &ext_len);
1216 if (ret != 0) {
1217 return ret;
1218 }
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001219 p += ext_len;
1220
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001221 /* Initializes the status to `rejected`. It will be updated to
1222 * `accepted` if the EncryptedExtension message contain an early data
1223 * indication extension.
Xiaokang Qiana042b842022-11-09 01:59:33 +00001224 */
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001225 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 } else {
1227 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write early_data extension"));
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00001228 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001229 }
1230#endif /* MBEDTLS_SSL_EARLY_DATA */
1231
Ronald Cron41a443a2022-10-04 16:38:25 +02001232#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +00001233 /* For PSK-based key exchange we need the pre_shared_key extension
1234 * and the psk_key_exchange_modes extension.
1235 *
1236 * The pre_shared_key extension MUST be the last extension in the
1237 * ClientHello. Servers MUST check that it is the last extension and
1238 * otherwise fail the handshake with an "illegal_parameter" alert.
1239 *
1240 * Add the psk_key_exchange_modes extension.
1241 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 ret = ssl_tls13_write_psk_key_exchange_modes_ext(ssl, p, end, &ext_len);
1243 if (ret != 0) {
1244 return ret;
1245 }
XiaokangQianeb69aee2022-07-05 08:21:43 +00001246 p += ext_len;
Ronald Cron41a443a2022-10-04 16:38:25 +02001247#endif
XiaokangQianeb69aee2022-07-05 08:21:43 +00001248
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001249 *out_len = p - buf;
1250
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 return 0;
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001252}
1253
Xiaokang Qian934ce6f2023-02-06 10:23:04 +00001254int mbedtls_ssl_tls13_finalize_client_hello(mbedtls_ssl_context *ssl)
Xiaokang Qian126929f2023-01-03 10:29:41 +00001255{
Xiaokang Qian90746132023-01-06 05:54:59 +00001256 ((void) ssl);
Xiaokang Qian79f77522023-01-28 10:35:29 +00001257
Xiaokang Qian126929f2023-01-03 10:29:41 +00001258#if defined(MBEDTLS_SSL_EARLY_DATA)
1259 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1260 psa_algorithm_t hash_alg = PSA_ALG_NONE;
1261 const unsigned char *psk;
1262 size_t psk_len;
1263 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Xiaokang Qian592021a2023-01-04 10:47:05 +00001264
Xiaokang Qian126929f2023-01-03 10:29:41 +00001265 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) {
Xiaokang Qian6be82902023-02-03 06:04:43 +00001266#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1267 mbedtls_ssl_handshake_set_state(
1268 ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO);
1269#endif
Xiaokang Qian126929f2023-01-03 10:29:41 +00001270 MBEDTLS_SSL_DEBUG_MSG(
1271 1, ("Set hs psk for early data when writing the first psk"));
1272
1273 ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len);
1274 if (ret != 0) {
1275 MBEDTLS_SSL_DEBUG_RET(
1276 1, "ssl_tls13_ticket_get_psk", ret);
1277 return ret;
1278 }
1279
1280 ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len);
1281 if (ret != 0) {
1282 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
1283 return ret;
1284 }
1285
Xiaokang Qian64bc9bc2023-02-07 02:32:23 +00001286 /*
1287 * Early data are going to be encrypted using the ciphersuite
1288 * associated with the pre-shared key used for the handshake.
1289 * Note that if the server rejects early data, the handshake
1290 * based on the pre-shared key may complete successfully
1291 * with a selected ciphersuite different from the ciphersuite
1292 * associated with the pre-shared key. Only the hashes of the
1293 * two ciphersuites have to be the same. In that case, the
1294 * encrypted handshake data and application data are
1295 * encrypted using a different ciphersuite than the one used for
1296 * the rejected early data.
1297 */
Xiaokang Qian126929f2023-01-03 10:29:41 +00001298 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(
1299 ssl->session_negotiate->ciphersuite);
1300 ssl->handshake->ciphersuite_info = ciphersuite_info;
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001301
Tom Cosgrove5c8505f2023-03-07 11:39:52 +00001302 /* Enable psk and psk_ephemeral to make stage early happy */
Xiaokang Qian126929f2023-01-03 10:29:41 +00001303 ssl->handshake->key_exchange_mode =
1304 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
1305
1306 /* Start the TLS 1.3 key schedule:
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001307 * Set the PSK and derive early secret.
Xiaokang Qian126929f2023-01-03 10:29:41 +00001308 */
1309 ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1310 if (ret != 0) {
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001311 MBEDTLS_SSL_DEBUG_RET(
1312 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret);
Xiaokang Qian126929f2023-01-03 10:29:41 +00001313 return ret;
1314 }
1315
1316 /* Derive early data key material */
1317 ret = mbedtls_ssl_tls13_compute_early_transform(ssl);
1318 if (ret != 0) {
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001319 MBEDTLS_SSL_DEBUG_RET(
1320 1, "mbedtls_ssl_tls13_compute_early_transform", ret);
Xiaokang Qian126929f2023-01-03 10:29:41 +00001321 return ret;
1322 }
1323
Xiaokang Qian126929f2023-01-03 10:29:41 +00001324 }
1325#endif /* MBEDTLS_SSL_EARLY_DATA */
1326 return 0;
1327}
Jerry Yu1bc2c1f2021-09-01 12:57:29 +08001328/*
Jerry Yu4a173382021-10-11 21:45:31 +08001329 * Functions for parsing and processing Server Hello
Jerry Yue1b9c292021-09-10 10:08:31 +08001330 */
Ronald Cronfd6193c2022-04-05 11:04:20 +02001331
Ronald Cronda41b382022-03-30 09:57:11 +02001332/**
1333 * \brief Detect if the ServerHello contains a supported_versions extension
1334 * or not.
1335 *
1336 * \param[in] ssl SSL context
1337 * \param[in] buf Buffer containing the ServerHello message
1338 * \param[in] end End of the buffer containing the ServerHello message
1339 *
1340 * \return 0 if the ServerHello does not contain a supported_versions extension
1341 * \return 1 if the ServerHello contains a supported_versions extension
1342 * \return A negative value if an error occurred while parsing the ServerHello.
1343 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001344MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron9f0fba32022-02-10 16:45:15 +01001345static int ssl_tls13_is_supported_versions_ext_present(
1346 mbedtls_ssl_context *ssl,
1347 const unsigned char *buf,
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 const unsigned char *end)
Ronald Cron9f0fba32022-02-10 16:45:15 +01001349{
1350 const unsigned char *p = buf;
1351 size_t legacy_session_id_echo_len;
Ronald Croneff56732023-04-03 17:36:31 +02001352 const unsigned char *supported_versions_data;
1353 const unsigned char *supported_versions_data_end;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001354
1355 /*
1356 * Check there is enough data to access the legacy_session_id_echo vector
Ronald Cronda41b382022-03-30 09:57:11 +02001357 * length:
1358 * - legacy_version 2 bytes
1359 * - random MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes
1360 * - legacy_session_id_echo length 1 byte
Ronald Cron9f0fba32022-02-10 16:45:15 +01001361 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 3);
Ronald Cron9f0fba32022-02-10 16:45:15 +01001363 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2;
1364 legacy_session_id_echo_len = *p;
1365
1366 /*
1367 * Jump to the extensions, jumping over:
1368 * - legacy_session_id_echo (legacy_session_id_echo_len + 1) bytes
1369 * - cipher_suite 2 bytes
1370 * - legacy_compression_method 1 byte
1371 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001372 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len + 4);
1373 p += legacy_session_id_echo_len + 4;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001374
Ronald Cron47dce632023-02-08 17:38:29 +01001375 return mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
1376 ssl, p, end,
Ronald Croneff56732023-04-03 17:36:31 +02001377 &supported_versions_data, &supported_versions_data_end);
Ronald Cron9f0fba32022-02-10 16:45:15 +01001378}
1379
Jerry Yu7a186a02021-10-15 18:46:14 +08001380/* Returns a negative value on failure, and otherwise
Ronald Cronfd6193c2022-04-05 11:04:20 +02001381 * - 1 if the last eight bytes of the ServerHello random bytes indicate that
1382 * the server is TLS 1.3 capable but negotiating TLS 1.2 or below.
1383 * - 0 otherwise
1384 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001385MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001386static int ssl_tls13_is_downgrade_negotiation(mbedtls_ssl_context *ssl,
1387 const unsigned char *buf,
1388 const unsigned char *end)
Ronald Cronfd6193c2022-04-05 11:04:20 +02001389{
1390 /* First seven bytes of the magic downgrade strings, see RFC 8446 4.1.3 */
1391 static const unsigned char magic_downgrade_string[] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 { 0x44, 0x4F, 0x57, 0x4E, 0x47, 0x52, 0x44 };
Ronald Cronfd6193c2022-04-05 11:04:20 +02001393 const unsigned char *last_eight_bytes_of_random;
1394 unsigned char last_byte_of_random;
1395
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2);
Ronald Cronfd6193c2022-04-05 11:04:20 +02001397 last_eight_bytes_of_random = buf + 2 + MBEDTLS_SERVER_HELLO_RANDOM_LEN - 8;
1398
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 if (memcmp(last_eight_bytes_of_random,
1400 magic_downgrade_string,
1401 sizeof(magic_downgrade_string)) == 0) {
Ronald Cronfd6193c2022-04-05 11:04:20 +02001402 last_byte_of_random = last_eight_bytes_of_random[7];
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 return last_byte_of_random == 0 ||
1404 last_byte_of_random == 1;
Ronald Cronfd6193c2022-04-05 11:04:20 +02001405 }
1406
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 return 0;
Ronald Cronfd6193c2022-04-05 11:04:20 +02001408}
1409
1410/* Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001411 * - SSL_SERVER_HELLO or
1412 * - SSL_SERVER_HELLO_HRR
XiaokangQian51eff222021-12-10 10:33:56 +00001413 * to indicate which message is expected and to be parsed next.
1414 */
Ronald Cron828aff62022-05-31 12:04:31 +02001415#define SSL_SERVER_HELLO 0
1416#define SSL_SERVER_HELLO_HRR 1
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001418static int ssl_server_hello_is_hrr(mbedtls_ssl_context *ssl,
1419 const unsigned char *buf,
1420 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001421{
Jerry Yue1b9c292021-09-10 10:08:31 +08001422
1423 /* Check whether this message is a HelloRetryRequest ( HRR ) message.
1424 *
Jerry Yu4a173382021-10-11 21:45:31 +08001425 * Server Hello and HRR are only distinguished by Random set to the
Jerry Yue1b9c292021-09-10 10:08:31 +08001426 * special value of the SHA-256 of "HelloRetryRequest".
1427 *
1428 * struct {
1429 * ProtocolVersion legacy_version = 0x0303;
1430 * Random random;
1431 * opaque legacy_session_id_echo<0..32>;
1432 * CipherSuite cipher_suite;
1433 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001434 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001435 * } ServerHello;
1436 *
1437 */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001438 MBEDTLS_SSL_CHK_BUF_READ_PTR(
1439 buf, end, 2 + sizeof(mbedtls_ssl_tls13_hello_retry_request_magic));
Jerry Yu4a173382021-10-11 21:45:31 +08001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 if (memcmp(buf + 2, mbedtls_ssl_tls13_hello_retry_request_magic,
1442 sizeof(mbedtls_ssl_tls13_hello_retry_request_magic)) == 0) {
1443 return SSL_SERVER_HELLO_HRR;
Jerry Yue1b9c292021-09-10 10:08:31 +08001444 }
1445
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 return SSL_SERVER_HELLO;
Jerry Yue1b9c292021-09-10 10:08:31 +08001447}
1448
Ronald Cron828aff62022-05-31 12:04:31 +02001449/*
Jerry Yu745bb612021-10-13 22:01:04 +08001450 * Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001451 * - SSL_SERVER_HELLO or
1452 * - SSL_SERVER_HELLO_HRR or
1453 * - SSL_SERVER_HELLO_TLS1_2
Jerry Yu745bb612021-10-13 22:01:04 +08001454 */
Ronald Cron828aff62022-05-31 12:04:31 +02001455#define SSL_SERVER_HELLO_TLS1_2 2
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001456MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001457static int ssl_tls13_preprocess_server_hello(mbedtls_ssl_context *ssl,
1458 const unsigned char *buf,
1459 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001460{
Jerry Yu4a173382021-10-11 21:45:31 +08001461 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Ronald Cron5afb9042022-05-31 12:11:39 +02001462 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yue1b9c292021-09-10 10:08:31 +08001463
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_is_supported_versions_ext_present(
1465 ssl, buf, end));
Jerry Yua66fece2022-07-13 14:30:29 +08001466
Gilles Peskine449bd832023-01-11 14:50:10 +01001467 if (ret == 0) {
Ronald Cronfd6193c2022-04-05 11:04:20 +02001468 MBEDTLS_SSL_PROC_CHK_NEG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 ssl_tls13_is_downgrade_negotiation(ssl, buf, end));
Ronald Cronfd6193c2022-04-05 11:04:20 +02001470
1471 /* If the server is negotiating TLS 1.2 or below and:
1472 * . we did not propose TLS 1.2 or
1473 * . the server responded it is TLS 1.3 capable but negotiating a lower
1474 * version of the protocol and thus we are under downgrade attack
1475 * abort the handshake with an "illegal parameter" alert.
Ronald Cron9f0fba32022-02-10 16:45:15 +01001476 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001477 if (handshake->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2 || ret) {
1478 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1479 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1480 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001481 }
1482
Ronald Cronb828c7d2023-04-03 16:37:22 +02001483 /*
1484 * Version 1.2 of the protocol has been negotiated, set the
1485 * ssl->keep_current_message flag for the ServerHello to be kept and
1486 * parsed as a TLS 1.2 ServerHello. We also change ssl->tls_version to
1487 * MBEDTLS_SSL_VERSION_TLS1_2 thus from now on mbedtls_ssl_handshake_step()
1488 * will dispatch to the TLS 1.2 state machine.
1489 */
Ronald Cron9f0fba32022-02-10 16:45:15 +01001490 ssl->keep_current_message = 1;
Glenn Strauss60bfe602022-03-14 19:04:24 -04001491 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001492 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1493 ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
1494 buf, (size_t) (end - buf)));
Ronald Cron9f0fba32022-02-10 16:45:15 +01001495
Gilles Peskine449bd832023-01-11 14:50:10 +01001496 if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1497 ret = ssl_tls13_reset_key_share(ssl);
1498 if (ret != 0) {
1499 return ret;
1500 }
Ronald Cron9f0fba32022-02-10 16:45:15 +01001501 }
1502
Gilles Peskine449bd832023-01-11 14:50:10 +01001503 return SSL_SERVER_HELLO_TLS1_2;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001504 }
1505
Jerry Yua66fece2022-07-13 14:30:29 +08001506#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1507 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
1508 ssl->session_negotiate->tls_version = ssl->tls_version;
1509#endif /* MBEDTLS_SSL_SESSION_TICKETS */
1510
Jerry Yu50e00e32022-10-31 14:45:01 +08001511 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Ronald Cron5afb9042022-05-31 12:11:39 +02001512
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 ret = ssl_server_hello_is_hrr(ssl, buf, end);
1514 switch (ret) {
Ronald Cron828aff62022-05-31 12:04:31 +02001515 case SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001516 MBEDTLS_SSL_DEBUG_MSG(2, ("received ServerHello message"));
Jerry Yu745bb612021-10-13 22:01:04 +08001517 break;
Ronald Cron828aff62022-05-31 12:04:31 +02001518 case SSL_SERVER_HELLO_HRR:
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 MBEDTLS_SSL_DEBUG_MSG(2, ("received HelloRetryRequest message"));
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001520 /* If a client receives a second HelloRetryRequest in the same
1521 * connection (i.e., where the ClientHello was itself in response
1522 * to a HelloRetryRequest), it MUST abort the handshake with an
1523 * "unexpected_message" alert.
Gilles Peskine449bd832023-01-11 14:50:10 +01001524 */
1525 if (handshake->hello_retry_request_count > 0) {
1526 MBEDTLS_SSL_DEBUG_MSG(1, ("Multiple HRRs received"));
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001527 MBEDTLS_SSL_PEND_FATAL_ALERT(
1528 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
1529 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
Gilles Peskine449bd832023-01-11 14:50:10 +01001530 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
XiaokangQian16acd4b2022-01-14 07:35:47 +00001531 }
XiaokangQian2b01dc32022-01-21 02:53:13 +00001532 /*
1533 * Clients must abort the handshake with an "illegal_parameter"
1534 * alert if the HelloRetryRequest would not result in any change
1535 * in the ClientHello.
1536 * In a PSK only key exchange that what we expect.
1537 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001538 if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1539 MBEDTLS_SSL_DEBUG_MSG(1,
1540 ("Unexpected HRR in pure PSK key exchange."));
XiaokangQian2b01dc32022-01-21 02:53:13 +00001541 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001542 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1543 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1544 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
XiaokangQian2b01dc32022-01-21 02:53:13 +00001545 }
XiaokangQian16acd4b2022-01-14 07:35:47 +00001546
Ronald Cron5afb9042022-05-31 12:11:39 +02001547 handshake->hello_retry_request_count++;
XiaokangQian16acd4b2022-01-14 07:35:47 +00001548
Jerry Yu745bb612021-10-13 22:01:04 +08001549 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001550 }
1551
1552cleanup:
1553
Gilles Peskine449bd832023-01-11 14:50:10 +01001554 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08001555}
1556
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001557MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001558static int ssl_tls13_check_server_hello_session_id_echo(mbedtls_ssl_context *ssl,
1559 const unsigned char **buf,
1560 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001561{
1562 const unsigned char *p = *buf;
Jerry Yu4a173382021-10-11 21:45:31 +08001563 size_t legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001564
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
1566 legacy_session_id_echo_len = *p++;
Jerry Yue1b9c292021-09-10 10:08:31 +08001567
Gilles Peskine449bd832023-01-11 14:50:10 +01001568 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len);
Jerry Yue1b9c292021-09-10 10:08:31 +08001569
1570 /* legacy_session_id_echo */
Gilles Peskine449bd832023-01-11 14:50:10 +01001571 if (ssl->session_negotiate->id_len != legacy_session_id_echo_len ||
1572 memcmp(ssl->session_negotiate->id, p, legacy_session_id_echo_len) != 0) {
1573 MBEDTLS_SSL_DEBUG_BUF(3, "Expected Session ID",
1574 ssl->session_negotiate->id,
1575 ssl->session_negotiate->id_len);
1576 MBEDTLS_SSL_DEBUG_BUF(3, "Received Session ID", p,
1577 legacy_session_id_echo_len);
Jerry Yu4a173382021-10-11 21:45:31 +08001578
Gilles Peskine449bd832023-01-11 14:50:10 +01001579 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1580 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
Jerry Yu4a173382021-10-11 21:45:31 +08001581
Gilles Peskine449bd832023-01-11 14:50:10 +01001582 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +08001583 }
1584
Jerry Yu4a173382021-10-11 21:45:31 +08001585 p += legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001586 *buf = p;
1587
Gilles Peskine449bd832023-01-11 14:50:10 +01001588 MBEDTLS_SSL_DEBUG_BUF(3, "Session ID", ssl->session_negotiate->id,
1589 ssl->session_negotiate->id_len);
1590 return 0;
Jerry Yue1b9c292021-09-10 10:08:31 +08001591}
1592
Jerry Yue1b9c292021-09-10 10:08:31 +08001593/* Parse ServerHello message and configure context
1594 *
1595 * struct {
1596 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1597 * Random random;
1598 * opaque legacy_session_id_echo<0..32>;
1599 * CipherSuite cipher_suite;
1600 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001601 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001602 * } ServerHello;
1603 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001604MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001605static int ssl_tls13_parse_server_hello(mbedtls_ssl_context *ssl,
1606 const unsigned char *buf,
1607 const unsigned char *end,
1608 int is_hrr)
Jerry Yue1b9c292021-09-10 10:08:31 +08001609{
Jerry Yub85277e2021-10-13 13:36:05 +08001610 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +08001611 const unsigned char *p = buf;
XiaokangQian355e09a2022-01-20 11:14:50 +00001612 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yub85277e2021-10-13 13:36:05 +08001613 size_t extensions_len;
1614 const unsigned char *extensions_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001615 uint16_t cipher_suite;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001616 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
XiaokangQianb119a352022-01-26 03:29:10 +00001617 int fatal_alert = 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001618 uint32_t allowed_extensions_mask;
Jerry Yu50e00e32022-10-31 14:45:01 +08001619 int hs_msg_type = is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST :
Gilles Peskine449bd832023-01-11 14:50:10 +01001620 MBEDTLS_SSL_HS_SERVER_HELLO;
Jerry Yue1b9c292021-09-10 10:08:31 +08001621
1622 /*
1623 * Check there is space for minimal fields
1624 *
1625 * - legacy_version ( 2 bytes)
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001626 * - random (MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes)
Jerry Yue1b9c292021-09-10 10:08:31 +08001627 * - legacy_session_id_echo ( 1 byte ), minimum size
1628 * - cipher_suite ( 2 bytes)
1629 * - legacy_compression_method ( 1 byte )
1630 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 6);
Jerry Yue1b9c292021-09-10 10:08:31 +08001632
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 MBEDTLS_SSL_DEBUG_BUF(4, "server hello", p, end - p);
1634 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, version", p, 2);
Jerry Yue1b9c292021-09-10 10:08:31 +08001635
Jerry Yu4a173382021-10-11 21:45:31 +08001636 /* ...
Jerry Yub85277e2021-10-13 13:36:05 +08001637 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
Jerry Yu4a173382021-10-11 21:45:31 +08001638 * ...
1639 * with ProtocolVersion defined as:
1640 * uint16 ProtocolVersion;
1641 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 if (mbedtls_ssl_read_version(p, ssl->conf->transport) !=
1643 MBEDTLS_SSL_VERSION_TLS1_2) {
1644 MBEDTLS_SSL_DEBUG_MSG(1, ("Unsupported version of TLS."));
1645 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1646 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
XiaokangQiand59be772022-01-24 10:12:51 +00001647 ret = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1648 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001649 }
1650 p += 2;
Jerry Yue1b9c292021-09-10 10:08:31 +08001651
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001652 /* ...
Jerry Yu4a173382021-10-11 21:45:31 +08001653 * Random random;
1654 * ...
1655 * with Random defined as:
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001656 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu4a173382021-10-11 21:45:31 +08001657 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001658 if (!is_hrr) {
1659 memcpy(&handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN], p,
1660 MBEDTLS_SERVER_HELLO_RANDOM_LEN);
1661 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes",
1662 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
XiaokangQian53f20b72022-01-18 10:47:33 +00001663 }
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001664 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
Jerry Yue1b9c292021-09-10 10:08:31 +08001665
Jerry Yu4a173382021-10-11 21:45:31 +08001666 /* ...
1667 * opaque legacy_session_id_echo<0..32>;
1668 * ...
1669 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001670 if (ssl_tls13_check_server_hello_session_id_echo(ssl, &p, end) != 0) {
XiaokangQian52da5582022-01-26 09:49:29 +00001671 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001672 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001673 }
1674
Jerry Yu4a173382021-10-11 21:45:31 +08001675 /* ...
1676 * CipherSuite cipher_suite;
1677 * ...
1678 * with CipherSuite defined as:
1679 * uint8 CipherSuite[2];
1680 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1682 cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +08001683 p += 2;
1684
Jerry Yu4a173382021-10-11 21:45:31 +08001685
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
Jerry Yu4a173382021-10-11 21:45:31 +08001687 /*
Ronald Cronba120bb2022-03-30 22:09:48 +02001688 * Check whether this ciphersuite is valid and offered.
Jerry Yu4a173382021-10-11 21:45:31 +08001689 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 if ((mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info,
1691 ssl->tls_version,
1692 ssl->tls_version) != 0) ||
1693 !mbedtls_ssl_tls13_cipher_suite_is_offered(ssl, cipher_suite)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001694 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +08001695 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001696 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00001697 * If we received an HRR before and that the proposed selected
1698 * ciphersuite in this server hello is not the same as the one
1699 * proposed in the HRR, we abort the handshake and send an
1700 * "illegal_parameter" alert.
XiaokangQian53f20b72022-01-18 10:47:33 +00001701 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001702 else if ((!is_hrr) && (handshake->hello_retry_request_count > 0) &&
1703 (cipher_suite != ssl->session_negotiate->ciphersuite)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001704 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQian355e09a2022-01-20 11:14:50 +00001705 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001706
Gilles Peskine449bd832023-01-11 14:50:10 +01001707 if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) {
1708 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid ciphersuite(%04x) parameter",
1709 cipher_suite));
XiaokangQiand59be772022-01-24 10:12:51 +00001710 goto cleanup;
XiaokangQian53f20b72022-01-18 10:47:33 +00001711 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001712
Jerry Yu4a173382021-10-11 21:45:31 +08001713 /* Configure ciphersuites */
Gilles Peskine449bd832023-01-11 14:50:10 +01001714 mbedtls_ssl_optimize_checksum(ssl, ciphersuite_info);
Jerry Yu4a173382021-10-11 21:45:31 +08001715
XiaokangQian355e09a2022-01-20 11:14:50 +00001716 handshake->ciphersuite_info = ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01001717 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: ( %04x ) - %s",
1718 cipher_suite, ciphersuite_info->name));
Jerry Yue1b9c292021-09-10 10:08:31 +08001719
1720#if defined(MBEDTLS_HAVE_TIME)
YxCda609132023-05-22 12:08:12 -07001721 ssl->session_negotiate->start = mbedtls_time(NULL);
Jerry Yue1b9c292021-09-10 10:08:31 +08001722#endif /* MBEDTLS_HAVE_TIME */
1723
Jerry Yu4a173382021-10-11 21:45:31 +08001724 /* ...
1725 * uint8 legacy_compression_method = 0;
1726 * ...
Jerry Yue1b9c292021-09-10 10:08:31 +08001727 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001728 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
1729 if (p[0] != MBEDTLS_SSL_COMPRESS_NULL) {
1730 MBEDTLS_SSL_DEBUG_MSG(1, ("bad legacy compression method"));
XiaokangQian52da5582022-01-26 09:49:29 +00001731 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001732 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001733 }
1734 p++;
1735
Jerry Yub85277e2021-10-13 13:36:05 +08001736 /* ...
1737 * Extension extensions<6..2^16-1>;
1738 * ...
Jerry Yu4a173382021-10-11 21:45:31 +08001739 * struct {
1740 * ExtensionType extension_type; (2 bytes)
1741 * opaque extension_data<0..2^16-1>;
1742 * } Extension;
1743 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001744 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1745 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +08001746 p += 2;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001747
Jerry Yu4a173382021-10-11 21:45:31 +08001748 /* Check extensions do not go beyond the buffer of data. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001749 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Jerry Yu4a173382021-10-11 21:45:31 +08001750 extensions_end = p + extensions_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001751
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 MBEDTLS_SSL_DEBUG_BUF(3, "server hello extensions", p, extensions_len);
Jerry Yue1b9c292021-09-10 10:08:31 +08001753
Jerry Yu50e00e32022-10-31 14:45:01 +08001754 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu0c354a22022-08-29 15:25:36 +08001755 allowed_extensions_mask = is_hrr ?
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_HRR :
1757 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_SH;
Jerry Yu2c5363e2022-08-04 17:42:49 +08001758
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 while (p < extensions_end) {
Jerry Yue1b9c292021-09-10 10:08:31 +08001760 unsigned int extension_type;
1761 size_t extension_data_len;
XiaokangQian43550bd2022-01-21 04:32:58 +00001762 const unsigned char *extension_data_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001763
Gilles Peskine449bd832023-01-11 14:50:10 +01001764 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
1765 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
1766 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yue1b9c292021-09-10 10:08:31 +08001767 p += 4;
1768
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
XiaokangQian43550bd2022-01-21 04:32:58 +00001770 extension_data_end = p + extension_data_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001771
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001772 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 ssl, hs_msg_type, extension_type, allowed_extensions_mask);
1774 if (ret != 0) {
1775 return ret;
1776 }
Jerry Yu2c5363e2022-08-04 17:42:49 +08001777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 switch (extension_type) {
XiaokangQianb851da82022-01-14 04:03:11 +00001779 case MBEDTLS_TLS_EXT_COOKIE:
1780
Gilles Peskine449bd832023-01-11 14:50:10 +01001781 ret = ssl_tls13_parse_cookie_ext(ssl,
1782 p, extension_data_end);
1783 if (ret != 0) {
1784 MBEDTLS_SSL_DEBUG_RET(1,
1785 "ssl_tls13_parse_cookie_ext",
1786 ret);
XiaokangQiand59be772022-01-24 10:12:51 +00001787 goto cleanup;
XiaokangQianb851da82022-01-14 04:03:11 +00001788 }
XiaokangQianb851da82022-01-14 04:03:11 +00001789 break;
XiaokangQianb851da82022-01-14 04:03:11 +00001790
Jerry Yue1b9c292021-09-10 10:08:31 +08001791 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001792 ret = ssl_tls13_parse_supported_versions_ext(ssl,
1793 p,
1794 extension_data_end);
1795 if (ret != 0) {
XiaokangQiand59be772022-01-24 10:12:51 +00001796 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001797 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001798 break;
1799
Ronald Cron41a443a2022-10-04 16:38:25 +02001800#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yue1b9c292021-09-10 10:08:31 +08001801 case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
Gilles Peskine449bd832023-01-11 14:50:10 +01001802 MBEDTLS_SSL_DEBUG_MSG(3, ("found pre_shared_key extension"));
Jerry Yu4a173382021-10-11 21:45:31 +08001803
Gilles Peskine449bd832023-01-11 14:50:10 +01001804 if ((ret = ssl_tls13_parse_server_pre_shared_key_ext(
1805 ssl, p, extension_data_end)) != 0) {
XiaokangQianeb69aee2022-07-05 08:21:43 +00001806 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001807 1, ("ssl_tls13_parse_server_pre_shared_key_ext"), ret);
1808 return ret;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001809 }
1810 break;
Ronald Cron41a443a2022-10-04 16:38:25 +02001811#endif
Jerry Yue1b9c292021-09-10 10:08:31 +08001812
Jerry Yue1b9c292021-09-10 10:08:31 +08001813 case MBEDTLS_TLS_EXT_KEY_SHARE:
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 MBEDTLS_SSL_DEBUG_MSG(3, ("found key_shares extension"));
1815 if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001816 fatal_alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT;
XiaokangQiand59be772022-01-24 10:12:51 +00001817 goto cleanup;
1818 }
1819
Gilles Peskine449bd832023-01-11 14:50:10 +01001820 if (is_hrr) {
1821 ret = ssl_tls13_parse_hrr_key_share_ext(ssl,
1822 p, extension_data_end);
1823 } else {
1824 ret = ssl_tls13_parse_key_share_ext(ssl,
1825 p, extension_data_end);
1826 }
1827 if (ret != 0) {
1828 MBEDTLS_SSL_DEBUG_RET(1,
1829 "ssl_tls13_parse_key_share_ext",
1830 ret);
XiaokangQiand59be772022-01-24 10:12:51 +00001831 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001832 }
1833 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001834
1835 default:
Jerry Yu9872eb22022-08-29 13:42:01 +08001836 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1837 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001838 }
1839
1840 p += extension_data_len;
1841 }
1842
Gilles Peskine449bd832023-01-11 14:50:10 +01001843 MBEDTLS_SSL_PRINT_EXTS(3, hs_msg_type, handshake->received_extensions);
Jerry Yu2c5363e2022-08-04 17:42:49 +08001844
XiaokangQiand59be772022-01-24 10:12:51 +00001845cleanup:
1846
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT) {
1848 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
1849 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
XiaokangQiand59be772022-01-24 10:12:51 +00001850 ret = MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Gilles Peskine449bd832023-01-11 14:50:10 +01001851 } else if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) {
1852 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1853 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
XiaokangQiand59be772022-01-24 10:12:51 +00001854 ret = MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1855 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08001857}
1858
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001859#if defined(MBEDTLS_DEBUG_C)
1860static const char *ssl_tls13_get_kex_mode_str(int mode)
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001861{
Gilles Peskine449bd832023-01-11 14:50:10 +01001862 switch (mode) {
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001863 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK:
1864 return "psk";
1865 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL:
1866 return "ephemeral";
1867 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL:
1868 return "psk_ephemeral";
1869 default:
1870 return "unknown mode";
1871 }
1872}
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001873#endif /* MBEDTLS_DEBUG_C */
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001874
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001875MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001876static int ssl_tls13_postprocess_server_hello(mbedtls_ssl_context *ssl)
Jerry Yue1b9c292021-09-10 10:08:31 +08001877{
Jerry Yub85277e2021-10-13 13:36:05 +08001878 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub85277e2021-10-13 13:36:05 +08001879 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yu0b177842021-09-05 19:41:30 +08001880
Jerry Yub85277e2021-10-13 13:36:05 +08001881 /* Determine the key exchange mode:
1882 * 1) If both the pre_shared_key and key_share extensions were received
1883 * then the key exchange mode is PSK with EPHEMERAL.
1884 * 2) If only the pre_shared_key extension was received then the key
1885 * exchange mode is PSK-only.
1886 * 3) If only the key_share extension was received then the key
1887 * exchange mode is EPHEMERAL-only.
Jerry Yu0b177842021-09-05 19:41:30 +08001888 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 switch (handshake->received_extensions &
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001890 (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
1891 MBEDTLS_SSL_EXT_MASK(KEY_SHARE))) {
Jerry Yu745bb612021-10-13 22:01:04 +08001892 /* Only the pre_shared_key extension was received */
Gilles Peskine449bd832023-01-11 14:50:10 +01001893 case MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY):
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001894 handshake->key_exchange_mode =
1895 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
Jerry Yu745bb612021-10-13 22:01:04 +08001896 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001897
Jerry Yu745bb612021-10-13 22:01:04 +08001898 /* Only the key_share extension was received */
Gilles Peskine449bd832023-01-11 14:50:10 +01001899 case MBEDTLS_SSL_EXT_MASK(KEY_SHARE):
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001900 handshake->key_exchange_mode =
1901 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001902 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001903
Jerry Yu745bb612021-10-13 22:01:04 +08001904 /* Both the pre_shared_key and key_share extensions were received */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001905 case (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
1906 MBEDTLS_SSL_EXT_MASK(KEY_SHARE)):
1907 handshake->key_exchange_mode =
1908 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001909 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001910
Jerry Yu745bb612021-10-13 22:01:04 +08001911 /* Neither pre_shared_key nor key_share extension was received */
1912 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001913 MBEDTLS_SSL_DEBUG_MSG(1, ("Unknown key exchange."));
Jerry Yu745bb612021-10-13 22:01:04 +08001914 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1915 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001916 }
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001917#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qian02f5e142023-02-06 10:44:17 +00001918 if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(EARLY_DATA) &&
1919 (handshake->selected_identity != 0 ||
1920 handshake->ciphersuite_info->id !=
1921 ssl->session_negotiate->ciphersuite)) {
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001922 /* RFC8446 4.2.11
1923 * If the server supplies an "early_data" extension, the
1924 * client MUST verify that the server's selected_identity
1925 * is 0. If any other value is returned, the client MUST
1926 * abort the handshake with an "illegal_parameter" alert.
Xiaokang Qian02f5e142023-02-06 10:44:17 +00001927 *
Xiaokang Qian53c4c272023-02-07 02:42:01 +00001928 * RFC 8446 4.2.10
1929 * In order to accept early data, the server MUST have accepted a PSK
1930 * cipher suite and selected the first key offered in the client's
1931 * "pre_shared_key" extension. In addition, it MUST verify that the
1932 * following values are the same as those associated with the
1933 * selected PSK:
1934 * - The TLS version number
1935 * - The selected cipher suite
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001936 * - The selected ALPN [RFC7301] protocol, if any
1937 *
1938 * We check here that when early data is involved the server
1939 * selected the cipher suite associated to the pre-shared key
1940 * as it must have.
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001941 */
1942 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1943 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1944 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1945 }
1946#endif
Jerry Yu0b177842021-09-05 19:41:30 +08001947
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001948 if (!mbedtls_ssl_conf_tls13_check_kex_modes(
1949 ssl, handshake->key_exchange_mode)) {
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001950 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001951 MBEDTLS_SSL_DEBUG_MSG(
1952 2, ("Key exchange mode(%s) is not supported.",
1953 ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode)));
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001954 goto cleanup;
1955 }
1956
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001957 MBEDTLS_SSL_DEBUG_MSG(
1958 3, ("Selected key exchange mode: %s",
1959 ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode)));
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001960
Xiaokang Qian7892b6c2023-02-02 06:05:48 +00001961 /* Start the TLS 1.3 key scheduling if not already done.
Jerry Yu0b177842021-09-05 19:41:30 +08001962 *
Xiaokang Qian7892b6c2023-02-02 06:05:48 +00001963 * If we proposed early data then we have already derived an
1964 * early secret using the selected PSK and its associated hash.
1965 * It means that if the negotiated key exchange mode is psk or
1966 * psk_ephemeral, we have already correctly computed the
1967 * early secret and thus we do not do it again. In all other
1968 * cases we compute it here.
Xiaokang Qian303f82c52023-01-04 08:43:46 +00001969 */
Xiaokang Qian90746132023-01-06 05:54:59 +00001970#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qiane04afdc2023-02-07 02:19:42 +00001971 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT ||
1972 handshake->key_exchange_mode ==
1973 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL)
Xiaokang Qian90746132023-01-06 05:54:59 +00001974#endif
1975 {
Xiaokang Qian303f82c52023-01-04 08:43:46 +00001976 ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1977 if (ret != 0) {
1978 MBEDTLS_SSL_DEBUG_RET(
1979 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret);
1980 goto cleanup;
1981 }
Jerry Yu0b177842021-09-05 19:41:30 +08001982 }
1983
Gilles Peskine449bd832023-01-11 14:50:10 +01001984 ret = mbedtls_ssl_tls13_compute_handshake_transform(ssl);
1985 if (ret != 0) {
1986 MBEDTLS_SSL_DEBUG_RET(1,
1987 "mbedtls_ssl_tls13_compute_handshake_transform",
1988 ret);
Jerry Yu4a173382021-10-11 21:45:31 +08001989 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001990 }
1991
Gilles Peskine449bd832023-01-11 14:50:10 +01001992 mbedtls_ssl_set_inbound_transform(ssl, handshake->transform_handshake);
1993 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to handshake keys for inbound traffic"));
Xiaokang Qian4ef8ba22023-02-06 11:06:16 +00001994 ssl->session_negotiate->ciphersuite = handshake->ciphersuite_info->id;
Jerry Yu0b177842021-09-05 19:41:30 +08001995 ssl->session_in = ssl->session_negotiate;
1996
Jerry Yu4a173382021-10-11 21:45:31 +08001997cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 if (ret != 0) {
Jerry Yu4a173382021-10-11 21:45:31 +08001999 MBEDTLS_SSL_PEND_FATAL_ALERT(
2000 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
Gilles Peskine449bd832023-01-11 14:50:10 +01002001 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
Jerry Yu4a173382021-10-11 21:45:31 +08002002 }
Jerry Yue110d252022-05-05 10:19:22 +08002003
Gilles Peskine449bd832023-01-11 14:50:10 +01002004 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08002005}
2006
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002007MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002008static int ssl_tls13_postprocess_hrr(mbedtls_ssl_context *ssl)
XiaokangQian647719a2021-12-07 09:16:29 +00002009{
2010 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2011
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 mbedtls_ssl_session_reset_msg_layer(ssl, 0);
XiaokangQian647719a2021-12-07 09:16:29 +00002013
XiaokangQian78b1fa72022-01-19 06:56:30 +00002014 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00002015 * We are going to re-generate a shared secret corresponding to the group
2016 * selected by the server, which is different from the group for which we
2017 * generated a shared secret in the first client hello.
2018 * Thus, reset the shared secret.
XiaokangQian51eff222021-12-10 10:33:56 +00002019 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 ret = ssl_tls13_reset_key_share(ssl);
2021 if (ret != 0) {
2022 return ret;
2023 }
XiaokangQian647719a2021-12-07 09:16:29 +00002024
Xiaokang Qian4ef8ba22023-02-06 11:06:16 +00002025 ssl->session_negotiate->ciphersuite = ssl->handshake->ciphersuite_info->id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 return 0;
XiaokangQian647719a2021-12-07 09:16:29 +00002027}
2028
Jerry Yue1b9c292021-09-10 10:08:31 +08002029/*
Jerry Yu4a173382021-10-11 21:45:31 +08002030 * Wait and parse ServerHello handshake message.
Jerry Yu687101b2021-09-14 16:03:56 +08002031 * Handler for MBEDTLS_SSL_SERVER_HELLO
2032 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002033MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002034static int ssl_tls13_process_server_hello(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002035{
Jerry Yu4a173382021-10-11 21:45:31 +08002036 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian647719a2021-12-07 09:16:29 +00002037 unsigned char *buf = NULL;
2038 size_t buf_len = 0;
XiaokangQian78b1fa72022-01-19 06:56:30 +00002039 int is_hrr = 0;
Jerry Yue1b9c292021-09-10 10:08:31 +08002040
Gilles Peskine449bd832023-01-11 14:50:10 +01002041 MBEDTLS_SSL_DEBUG_MSG(2, ("=> %s", __func__));
Jerry Yue1b9c292021-09-10 10:08:31 +08002042
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002043 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2044 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, &buf, &buf_len));
Ronald Crondb5dfa12022-05-31 11:44:38 +02002045
Gilles Peskine449bd832023-01-11 14:50:10 +01002046 ret = ssl_tls13_preprocess_server_hello(ssl, buf, buf + buf_len);
2047 if (ret < 0) {
XiaokangQian16acd4b2022-01-14 07:35:47 +00002048 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 } else {
2050 is_hrr = (ret == SSL_SERVER_HELLO_HRR);
2051 }
XiaokangQiand59be772022-01-24 10:12:51 +00002052
Gilles Peskine449bd832023-01-11 14:50:10 +01002053 if (ret == SSL_SERVER_HELLO_TLS1_2) {
Ronald Cron9f0fba32022-02-10 16:45:15 +01002054 ret = 0;
2055 goto cleanup;
2056 }
2057
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_server_hello(ssl, buf,
2059 buf + buf_len,
2060 is_hrr));
2061 if (is_hrr) {
2062 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_reset_transcript_for_hrr(ssl));
Ronald Cronfb508b82022-05-31 14:49:55 +02002063 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002064
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002065 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2066 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, buf_len));
Gilles Peskine449bd832023-01-11 14:50:10 +01002067
2068 if (is_hrr) {
2069 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_hrr(ssl));
2070#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2071 /* If not offering early data, the client sends a dummy CCS record
2072 * immediately before its second flight. This may either be before
2073 * its second ClientHello or before its encrypted handshake flight.
2074 */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002075 mbedtls_ssl_handshake_set_state(
2076 ssl, MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO);
Gilles Peskine449bd832023-01-11 14:50:10 +01002077#else
2078 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
2079#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2080 } else {
2081 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_server_hello(ssl));
2082 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
Ronald Cronfb508b82022-05-31 14:49:55 +02002083 }
Jerry Yue1b9c292021-09-10 10:08:31 +08002084
2085cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 MBEDTLS_SSL_DEBUG_MSG(2, ("<= %s ( %s )", __func__,
2087 is_hrr ? "HelloRetryRequest" : "ServerHello"));
2088 return ret;
Jerry Yu687101b2021-09-14 16:03:56 +08002089}
2090
2091/*
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002092 *
Ronald Cron9d6a5452022-05-30 16:05:38 +02002093 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002094 *
2095 * The EncryptedExtensions message contains any extensions which
2096 * should be protected, i.e., any which are not needed to establish
2097 * the cryptographic context.
Jerry Yu687101b2021-09-14 16:03:56 +08002098 */
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002099
XiaokangQian08da26c2021-10-09 10:12:11 +00002100/* Parse EncryptedExtensions message
2101 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002102 * Extension extensions<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002103 * } EncryptedExtensions;
2104 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002105MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002106static int ssl_tls13_parse_encrypted_extensions(mbedtls_ssl_context *ssl,
2107 const unsigned char *buf,
2108 const unsigned char *end)
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002109{
2110 int ret = 0;
XiaokangQian08da26c2021-10-09 10:12:11 +00002111 size_t extensions_len;
XiaokangQian140f0452021-10-08 08:05:53 +00002112 const unsigned char *p = buf;
XiaokangQian8db25ff2021-10-13 05:56:18 +00002113 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002114 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002115
Gilles Peskine449bd832023-01-11 14:50:10 +01002116 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2117 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian08da26c2021-10-09 10:12:11 +00002118 p += 2;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002119
Gilles Peskine449bd832023-01-11 14:50:10 +01002120 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Ronald Cronc8083592022-05-31 16:24:05 +02002121 extensions_end = p + extensions_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002122
Jan Bruckner5a3629b2023-02-23 12:08:09 +01002123 MBEDTLS_SSL_DEBUG_BUF(3, "encrypted extensions", p, extensions_len);
2124
Jerry Yu9eba7502022-10-31 13:46:16 +08002125 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yucbd082f2022-08-04 16:55:10 +08002126
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 while (p < extensions_end) {
XiaokangQian08da26c2021-10-09 10:12:11 +00002128 unsigned int extension_type;
2129 size_t extension_data_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002130
XiaokangQian08da26c2021-10-09 10:12:11 +00002131 /*
2132 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002133 * ExtensionType extension_type; (2 bytes)
2134 * opaque extension_data<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002135 * } Extension;
2136 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
2138 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2139 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
XiaokangQian08da26c2021-10-09 10:12:11 +00002140 p += 4;
2141
Gilles Peskine449bd832023-01-11 14:50:10 +01002142 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002143
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002144 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002145 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, extension_type,
2146 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_EE);
2147 if (ret != 0) {
2148 return ret;
2149 }
Jerry Yucbd082f2022-08-04 16:55:10 +08002150
Gilles Peskine449bd832023-01-11 14:50:10 +01002151 switch (extension_type) {
lhuang0486cacac2022-01-21 07:34:27 -08002152#if defined(MBEDTLS_SSL_ALPN)
2153 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01002154 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
lhuang0486cacac2022-01-21 07:34:27 -08002155
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002156 if ((ret = ssl_tls13_parse_alpn_ext(
2157 ssl, p, (size_t) extension_data_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002158 return ret;
lhuang0486cacac2022-01-21 07:34:27 -08002159 }
2160
2161 break;
2162#endif /* MBEDTLS_SSL_ALPN */
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002163
2164#if defined(MBEDTLS_SSL_EARLY_DATA)
2165 case MBEDTLS_TLS_EXT_EARLY_DATA:
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002166
Gilles Peskine449bd832023-01-11 14:50:10 +01002167 if (extension_data_len != 0) {
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002168 /* The message must be empty. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002169 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2170 MBEDTLS_ERR_SSL_DECODE_ERROR);
2171 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002172 }
2173
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002174 break;
2175#endif /* MBEDTLS_SSL_EARLY_DATA */
2176
Jan Bruckner151f6422023-02-10 12:45:19 +01002177#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
2178 case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
2179 MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension"));
2180
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002181 ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(
2182 ssl, p, p + extension_data_len);
Jan Bruckner151f6422023-02-10 12:45:19 +01002183
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002184 /* TODO: Return unconditionally here until we handle the record
2185 * size limit correctly. Once handled correctly, only return in
2186 * case of errors. */
Jan Bruckner151f6422023-02-10 12:45:19 +01002187 return ret;
2188
2189 break;
2190#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
2191
XiaokangQian08da26c2021-10-09 10:12:11 +00002192 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002193 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu9eba7502022-10-31 13:46:16 +08002194 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 extension_type, "( ignored )");
Jerry Yucbd082f2022-08-04 16:55:10 +08002196 break;
XiaokangQian08da26c2021-10-09 10:12:11 +00002197 }
2198
XiaokangQian08da26c2021-10-09 10:12:11 +00002199 p += extension_data_len;
XiaokangQian97799ac2021-10-11 10:05:54 +00002200 }
XiaokangQian08da26c2021-10-09 10:12:11 +00002201
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2203 handshake->received_extensions);
Jerry Yucbd082f2022-08-04 16:55:10 +08002204
XiaokangQian97799ac2021-10-11 10:05:54 +00002205 /* Check that we consumed all the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002206 if (p != end) {
2207 MBEDTLS_SSL_DEBUG_MSG(1, ("EncryptedExtension lengths misaligned"));
2208 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2209 MBEDTLS_ERR_SSL_DECODE_ERROR);
2210 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002211 }
2212
Gilles Peskine449bd832023-01-11 14:50:10 +01002213 return ret;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002214}
2215
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002216MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002217static int ssl_tls13_process_encrypted_extensions(mbedtls_ssl_context *ssl)
Ronald Cron9d6a5452022-05-30 16:05:38 +02002218{
2219 int ret;
2220 unsigned char *buf;
2221 size_t buf_len;
2222
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse encrypted extensions"));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002224
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002225 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2226 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2227 &buf, &buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002228
2229 /* Process the message contents */
2230 MBEDTLS_SSL_PROC_CHK(
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 ssl_tls13_parse_encrypted_extensions(ssl, buf, buf + buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002232
Xiaokang Qianb157e912022-11-23 08:12:26 +00002233#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002234 if (ssl->handshake->received_extensions &
2235 MBEDTLS_SSL_EXT_MASK(EARLY_DATA)) {
Xiaokang Qianb157e912022-11-23 08:12:26 +00002236 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED;
2237 }
2238#endif
2239
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002240 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2241 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2242 buf, buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002243
Ronald Cron928cbd32022-10-04 16:14:26 +02002244#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002245 if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2246 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2247 } else {
2248 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST);
2249 }
Ronald Cronfb508b82022-05-31 14:49:55 +02002250#else
2251 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002252 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
Ronald Cronfb508b82022-05-31 14:49:55 +02002253#endif
Ronald Cron9d6a5452022-05-30 16:05:38 +02002254
2255cleanup:
2256
Gilles Peskine449bd832023-01-11 14:50:10 +01002257 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse encrypted extensions"));
2258 return ret;
Ronald Cron9d6a5452022-05-30 16:05:38 +02002259
2260}
2261
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002262/*
2263 * Handler for MBEDTLS_SSL_END_OF_EARLY_DATA
2264 *
Xiaokang Qianc81a15a2022-12-19 02:43:33 +00002265 * RFC 8446 section 4.5
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002266 *
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002267 * struct {} EndOfEarlyData;
Xiaokang Qianc81a15a2022-12-19 02:43:33 +00002268 *
2269 * If the server sent an "early_data" extension in EncryptedExtensions, the
2270 * client MUST send an EndOfEarlyData message after receiving the server
2271 * Finished. Otherwise, the client MUST NOT send an EndOfEarlyData message.
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002272 */
2273
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002274MBEDTLS_CHECK_RETURN_CRITICAL
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002275static int ssl_tls13_write_end_of_early_data(mbedtls_ssl_context *ssl)
2276{
2277 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaokang Qian742578c2022-12-19 06:34:44 +00002278 unsigned char *buf = NULL;
2279 size_t buf_len;
Xiaokang Qian57a138d2022-12-19 06:40:47 +00002280 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write EndOfEarlyData"));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002281
Xiaokang Qian742578c2022-12-19 06:34:44 +00002282 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
Xiaokang Qian0de0d862023-02-08 06:04:50 +00002283 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA,
2284 &buf, &buf_len));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002285
Manuel Pégourié-Gonnard63e33dd2023-02-21 15:45:15 +01002286 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_hdr_to_checksum(
2287 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA, 0));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002288
Xiaokang Qian742578c2022-12-19 06:34:44 +00002289 MBEDTLS_SSL_PROC_CHK(
2290 mbedtls_ssl_finish_handshake_msg(ssl, buf_len, 0));
Xiaokang Qianda8402d2022-12-15 14:55:35 +00002291
Xiaokang Qian19d44162023-01-03 03:39:50 +00002292 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002293
2294cleanup:
2295
2296 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write EndOfEarlyData"));
2297 return ret;
2298}
2299
Ronald Cron928cbd32022-10-04 16:14:26 +02002300#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu687101b2021-09-14 16:03:56 +08002301/*
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002302 * STATE HANDLING: CertificateRequest
2303 *
Jerry Yud2674312021-10-29 10:08:19 +08002304 */
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002305#define SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST 0
2306#define SSL_CERTIFICATE_REQUEST_SKIP 1
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002307/* Coordination:
2308 * Deals with the ambiguity of not knowing if a CertificateRequest
2309 * will be sent. Returns a negative code on failure, or
2310 * - SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST
2311 * - SSL_CERTIFICATE_REQUEST_SKIP
2312 * indicating if a Certificate Request is expected or not.
2313 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002314MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002315static int ssl_tls13_certificate_request_coordinate(mbedtls_ssl_context *ssl)
Jerry Yud2674312021-10-29 10:08:19 +08002316{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002317 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yud2674312021-10-29 10:08:19 +08002318
Gilles Peskine449bd832023-01-11 14:50:10 +01002319 if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
2320 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2321 return ret;
Jerry Yud2674312021-10-29 10:08:19 +08002322 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002323 ssl->keep_current_message = 1;
Jerry Yud2674312021-10-29 10:08:19 +08002324
Gilles Peskine449bd832023-01-11 14:50:10 +01002325 if ((ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) &&
2326 (ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST)) {
2327 MBEDTLS_SSL_DEBUG_MSG(3, ("got a certificate request"));
2328 return SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST;
Jerry Yud2674312021-10-29 10:08:19 +08002329 }
2330
Gilles Peskine449bd832023-01-11 14:50:10 +01002331 MBEDTLS_SSL_DEBUG_MSG(3, ("got no certificate request"));
Ronald Cron19385882022-06-15 16:26:13 +02002332
Gilles Peskine449bd832023-01-11 14:50:10 +01002333 return SSL_CERTIFICATE_REQUEST_SKIP;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002334}
2335
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002336/*
2337 * ssl_tls13_parse_certificate_request()
2338 * Parse certificate request
2339 * struct {
2340 * opaque certificate_request_context<0..2^8-1>;
2341 * Extension extensions<2..2^16-1>;
2342 * } CertificateRequest;
2343 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002344MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002345static int ssl_tls13_parse_certificate_request(mbedtls_ssl_context *ssl,
2346 const unsigned char *buf,
2347 const unsigned char *end)
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002348{
2349 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2350 const unsigned char *p = buf;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002351 size_t certificate_request_context_len = 0;
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002352 size_t extensions_len = 0;
2353 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002354 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002355
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002356 /* ...
2357 * opaque certificate_request_context<0..2^8-1>
2358 * ...
2359 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002360 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002361 certificate_request_context_len = (size_t) p[0];
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002362 p += 1;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002363
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 if (certificate_request_context_len > 0) {
2365 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_request_context_len);
2366 MBEDTLS_SSL_DEBUG_BUF(3, "Certificate Request Context",
2367 p, certificate_request_context_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002368
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002369 handshake->certificate_request_context =
Gilles Peskine449bd832023-01-11 14:50:10 +01002370 mbedtls_calloc(1, certificate_request_context_len);
2371 if (handshake->certificate_request_context == NULL) {
2372 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
2373 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002374 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002375 memcpy(handshake->certificate_request_context, p,
2376 certificate_request_context_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002377 p += certificate_request_context_len;
2378 }
2379
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002380 /* ...
2381 * Extension extensions<2..2^16-1>;
2382 * ...
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002383 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2385 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002386 p += 2;
2387
Gilles Peskine449bd832023-01-11 14:50:10 +01002388 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002389 extensions_end = p + extensions_len;
2390
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002391 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yuc55a6af2022-08-04 17:01:21 +08002392
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 while (p < extensions_end) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002394 unsigned int extension_type;
2395 size_t extension_data_len;
2396
Gilles Peskine449bd832023-01-11 14:50:10 +01002397 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
2398 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2399 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002400 p += 4;
2401
Gilles Peskine449bd832023-01-11 14:50:10 +01002402 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002403
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002404 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, extension_type,
2406 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR);
2407 if (ret != 0) {
2408 return ret;
2409 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002410
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 switch (extension_type) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002412 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01002413 MBEDTLS_SSL_DEBUG_MSG(3,
2414 ("found signature algorithms extension"));
2415 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, p,
2416 p + extension_data_len);
2417 if (ret != 0) {
2418 return ret;
2419 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002420
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002421 break;
2422
2423 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002424 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002425 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
Gilles Peskine449bd832023-01-11 14:50:10 +01002426 extension_type, "( ignored )");
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002427 break;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002428 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002429
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002430 p += extension_data_len;
2431 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002432
Gilles Peskine449bd832023-01-11 14:50:10 +01002433 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2434 handshake->received_extensions);
Jerry Yuc55a6af2022-08-04 17:01:21 +08002435
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002436 /* Check that we consumed all the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 if (p != end) {
2438 MBEDTLS_SSL_DEBUG_MSG(1,
2439 ("CertificateRequest misaligned"));
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002440 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002441 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002442
Jerry Yu0c354a22022-08-29 15:25:36 +08002443 /* RFC 8446 section 4.3.2
Jerry Yuc55a6af2022-08-04 17:01:21 +08002444 *
2445 * The "signature_algorithms" extension MUST be specified
2446 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002447 if ((handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(SIG_ALG)) == 0) {
2448 MBEDTLS_SSL_DEBUG_MSG(3,
2449 ("no signature algorithms extension found"));
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002450 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002451 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002452
Jerry Yu7840f812022-01-29 10:26:51 +08002453 ssl->handshake->client_auth = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002454 return 0;
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002455
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002456decode_error:
Gilles Peskine449bd832023-01-11 14:50:10 +01002457 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2458 MBEDTLS_ERR_SSL_DECODE_ERROR);
2459 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002460}
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002461
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002462/*
2463 * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST
2464 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002465MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002466static int ssl_tls13_process_certificate_request(mbedtls_ssl_context *ssl)
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002467{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002468 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002469
Gilles Peskine449bd832023-01-11 14:50:10 +01002470 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request"));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002471
Gilles Peskine449bd832023-01-11 14:50:10 +01002472 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_certificate_request_coordinate(ssl));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002473
Gilles Peskine449bd832023-01-11 14:50:10 +01002474 if (ret == SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002475 unsigned char *buf;
2476 size_t buf_len;
2477
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002478 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2479 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2480 &buf, &buf_len));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002481
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002482 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_request(
2483 ssl, buf, buf + buf_len));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002484
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002485 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2486 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2487 buf, buf_len));
Gilles Peskine449bd832023-01-11 14:50:10 +01002488 } else if (ret == SSL_CERTIFICATE_REQUEST_SKIP) {
Xiaofei Baif6d36962022-01-16 14:54:35 +00002489 ret = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002490 } else {
2491 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002492 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2493 goto cleanup;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002494 }
2495
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CERTIFICATE);
Jerry Yud2674312021-10-29 10:08:19 +08002497
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002498cleanup:
2499
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate request"));
2501 return ret;
Jerry Yud2674312021-10-29 10:08:19 +08002502}
2503
2504/*
Jerry Yu687101b2021-09-14 16:03:56 +08002505 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
2506 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002507MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002508static int ssl_tls13_process_server_certificate(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002509{
Xiaofei Bai947571e2021-09-29 09:12:03 +00002510 int ret;
2511
Gilles Peskine449bd832023-01-11 14:50:10 +01002512 ret = mbedtls_ssl_tls13_process_certificate(ssl);
2513 if (ret != 0) {
2514 return ret;
2515 }
Xiaofei Bai947571e2021-09-29 09:12:03 +00002516
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY);
2518 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002519}
2520
2521/*
2522 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
2523 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002524MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002525static int ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002526{
Jerry Yu30b071c2021-09-12 20:16:03 +08002527 int ret;
2528
Gilles Peskine449bd832023-01-11 14:50:10 +01002529 ret = mbedtls_ssl_tls13_process_certificate_verify(ssl);
2530 if (ret != 0) {
2531 return ret;
2532 }
Jerry Yu30b071c2021-09-12 20:16:03 +08002533
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2535 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002536}
Ronald Cron928cbd32022-10-04 16:14:26 +02002537#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Ronald Crond4c64022021-12-06 09:06:46 +01002538
Jerry Yu687101b2021-09-14 16:03:56 +08002539/*
2540 * Handler for MBEDTLS_SSL_SERVER_FINISHED
2541 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002542MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002543static int ssl_tls13_process_server_finished(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002544{
XiaokangQianac0385c2021-11-03 06:40:11 +00002545 int ret;
2546
Gilles Peskine449bd832023-01-11 14:50:10 +01002547 ret = mbedtls_ssl_tls13_process_finished_message(ssl);
2548 if (ret != 0) {
2549 return ret;
2550 }
XiaokangQianac0385c2021-11-03 06:40:11 +00002551
Gilles Peskine449bd832023-01-11 14:50:10 +01002552 ret = mbedtls_ssl_tls13_compute_application_transform(ssl);
2553 if (ret != 0) {
Jerry Yue3d67cb2022-05-19 15:33:10 +08002554 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2556 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2557 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002558 }
2559
Xiaokang Qianbc75bc02022-12-19 06:16:42 +00002560#if defined(MBEDTLS_SSL_EARLY_DATA)
2561 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED) {
2562 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_END_OF_EARLY_DATA);
Xiaokang Qianbd0ab062023-02-02 05:56:30 +00002563 } else if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) {
2564 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Xiaokang Qianbc75bc02022-12-19 06:16:42 +00002565 } else
2566#endif /* MBEDTLS_SSL_EARLY_DATA */
2567 {
2568#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2569 mbedtls_ssl_handshake_set_state(
2570 ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED);
2571#else
2572 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
2573#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2574 }
Ronald Cron49ad6192021-11-24 16:25:31 +01002575
Gilles Peskine449bd832023-01-11 14:50:10 +01002576 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002577}
2578
2579/*
Jerry Yu566c7812022-01-26 15:41:22 +08002580 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE
2581 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002582MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002583static int ssl_tls13_write_client_certificate(mbedtls_ssl_context *ssl)
Jerry Yu566c7812022-01-26 15:41:22 +08002584{
Ronald Cron7a94aca2022-03-09 07:44:27 +01002585 int non_empty_certificate_msg = 0;
2586
Gilles Peskine449bd832023-01-11 14:50:10 +01002587 MBEDTLS_SSL_DEBUG_MSG(1,
2588 ("Switch to handshake traffic keys for outbound traffic"));
2589 mbedtls_ssl_set_outbound_transform(ssl, ssl->handshake->transform_handshake);
Jerry Yu5cc35062022-01-28 16:16:08 +08002590
Ronald Cron928cbd32022-10-04 16:14:26 +02002591#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002592 if (ssl->handshake->client_auth) {
2593 int ret = mbedtls_ssl_tls13_write_certificate(ssl);
2594 if (ret != 0) {
2595 return ret;
2596 }
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002597
Gilles Peskine449bd832023-01-11 14:50:10 +01002598 if (mbedtls_ssl_own_cert(ssl) != NULL) {
Ronald Cron7a94aca2022-03-09 07:44:27 +01002599 non_empty_certificate_msg = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 }
2601 } else {
2602 MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate"));
Ronald Cron7a94aca2022-03-09 07:44:27 +01002603 }
Ronald Cron9df7c802022-03-08 18:38:54 +01002604#endif
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002605
Gilles Peskine449bd832023-01-11 14:50:10 +01002606 if (non_empty_certificate_msg) {
2607 mbedtls_ssl_handshake_set_state(ssl,
2608 MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY);
2609 } else {
2610 MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate verify"));
2611 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
2612 }
Ronald Cron7a94aca2022-03-09 07:44:27 +01002613
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 return 0;
Jerry Yu566c7812022-01-26 15:41:22 +08002615}
2616
Ronald Cron928cbd32022-10-04 16:14:26 +02002617#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002618/*
2619 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY
2620 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002621MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002622static int ssl_tls13_write_client_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu566c7812022-01-26 15:41:22 +08002623{
Gilles Peskine449bd832023-01-11 14:50:10 +01002624 int ret = mbedtls_ssl_tls13_write_certificate_verify(ssl);
Ronald Crona8b38872022-03-09 07:59:25 +01002625
Gilles Peskine449bd832023-01-11 14:50:10 +01002626 if (ret == 0) {
2627 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
2628 }
Ronald Crona8b38872022-03-09 07:59:25 +01002629
Gilles Peskine449bd832023-01-11 14:50:10 +01002630 return ret;
Jerry Yu566c7812022-01-26 15:41:22 +08002631}
Ronald Cron928cbd32022-10-04 16:14:26 +02002632#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08002633
2634/*
Jerry Yu687101b2021-09-14 16:03:56 +08002635 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
2636 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002637MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002638static int ssl_tls13_write_client_finished(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002639{
XiaokangQian0fa66432021-11-15 03:33:57 +00002640 int ret;
2641
Gilles Peskine449bd832023-01-11 14:50:10 +01002642 ret = mbedtls_ssl_tls13_write_finished_message(ssl);
2643 if (ret != 0) {
2644 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002645 }
2646
Gilles Peskine449bd832023-01-11 14:50:10 +01002647 ret = mbedtls_ssl_tls13_compute_resumption_master_secret(ssl);
2648 if (ret != 0) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002649 MBEDTLS_SSL_DEBUG_RET(
2650 1, "mbedtls_ssl_tls13_compute_resumption_master_secret ", ret);
Gilles Peskine449bd832023-01-11 14:50:10 +01002651 return ret;
2652 }
2653
2654 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_FLUSH_BUFFERS);
2655 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002656}
2657
2658/*
2659 * Handler for MBEDTLS_SSL_FLUSH_BUFFERS
2660 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002661MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002662static int ssl_tls13_flush_buffers(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002663{
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
2665 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
2666 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002667}
2668
2669/*
2670 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
2671 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002672MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002673static int ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002674{
Jerry Yu378254d2021-10-30 21:44:47 +08002675
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 mbedtls_ssl_tls13_handshake_wrapup(ssl);
Jerry Yu378254d2021-10-30 21:44:47 +08002677
Gilles Peskine449bd832023-01-11 14:50:10 +01002678 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
2679 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002680}
2681
Jerry Yuf8a49942022-07-07 11:32:32 +00002682#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2683
Jerry Yua0446a02022-07-13 11:22:55 +08002684MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002685static int ssl_tls13_parse_new_session_ticket_exts(mbedtls_ssl_context *ssl,
2686 const unsigned char *buf,
2687 const unsigned char *end)
Jerry Yuf8a49942022-07-07 11:32:32 +00002688{
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002689 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yuaf2c0c82022-07-12 05:47:21 +00002690 const unsigned char *p = buf;
Jerry Yuf8a49942022-07-07 11:32:32 +00002691
Jerry Yuf8a49942022-07-07 11:32:32 +00002692
Jerry Yuedab6372022-10-31 14:37:31 +08002693 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002694
Gilles Peskine449bd832023-01-11 14:50:10 +01002695 while (p < end) {
Jerry Yuf8a49942022-07-07 11:32:32 +00002696 unsigned int extension_type;
2697 size_t extension_data_len;
Jerry Yu0c354a22022-08-29 15:25:36 +08002698 int ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002699
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
2701 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2702 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yuf8a49942022-07-07 11:32:32 +00002703 p += 4;
2704
Gilles Peskine449bd832023-01-11 14:50:10 +01002705 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extension_data_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002706
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002707 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002708 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, extension_type,
2709 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_NST);
2710 if (ret != 0) {
2711 return ret;
2712 }
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002713
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 switch (extension_type) {
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002715#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002716 case MBEDTLS_TLS_EXT_EARLY_DATA:
Gilles Peskine449bd832023-01-11 14:50:10 +01002717 if (extension_data_len != 4) {
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002718 MBEDTLS_SSL_PEND_FATAL_ALERT(
2719 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +01002720 MBEDTLS_ERR_SSL_DECODE_ERROR);
2721 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002722 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002723 if (ssl->session != NULL) {
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002724 ssl->session->ticket_flags |=
Gilles Peskine449bd832023-01-11 14:50:10 +01002725 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA;
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002726 }
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002727 break;
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002728#endif /* MBEDTLS_SSL_EARLY_DATA */
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002729
Jerry Yuf8a49942022-07-07 11:32:32 +00002730 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002731 MBEDTLS_SSL_PRINT_EXT(
Jerry Yuedab6372022-10-31 14:37:31 +08002732 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
Gilles Peskine449bd832023-01-11 14:50:10 +01002733 extension_type, "( ignored )");
Jerry Yuf8a49942022-07-07 11:32:32 +00002734 break;
2735 }
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002736
Jerry Yuf8a49942022-07-07 11:32:32 +00002737 p += extension_data_len;
2738 }
2739
Gilles Peskine449bd832023-01-11 14:50:10 +01002740 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2741 handshake->received_extensions);
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002742
Gilles Peskine449bd832023-01-11 14:50:10 +01002743 return 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002744}
2745
2746/*
Jerry Yu08aed4d2022-07-20 10:36:12 +08002747 * From RFC8446, page 74
2748 *
Jerry Yuf8a49942022-07-07 11:32:32 +00002749 * struct {
2750 * uint32 ticket_lifetime;
2751 * uint32 ticket_age_add;
2752 * opaque ticket_nonce<0..255>;
2753 * opaque ticket<1..2^16-1>;
2754 * Extension extensions<0..2^16-2>;
2755 * } NewSessionTicket;
2756 *
2757 */
Jerry Yua0446a02022-07-13 11:22:55 +08002758MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002759static int ssl_tls13_parse_new_session_ticket(mbedtls_ssl_context *ssl,
2760 unsigned char *buf,
2761 unsigned char *end,
2762 unsigned char **ticket_nonce,
2763 size_t *ticket_nonce_len)
Jerry Yuf8a49942022-07-07 11:32:32 +00002764{
2765 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2766 unsigned char *p = buf;
2767 mbedtls_ssl_session *session = ssl->session;
Jerry Yuf8a49942022-07-07 11:32:32 +00002768 size_t ticket_len;
2769 unsigned char *ticket;
2770 size_t extensions_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002771
Jerry Yucb3b1392022-07-12 06:09:38 +00002772 *ticket_nonce = NULL;
2773 *ticket_nonce_len = 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002774 /*
2775 * ticket_lifetime 4 bytes
2776 * ticket_age_add 4 bytes
Jerry Yu08aed4d2022-07-20 10:36:12 +08002777 * ticket_nonce_len 1 byte
Jerry Yuf8a49942022-07-07 11:32:32 +00002778 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002779 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 9);
Jerry Yuf8a49942022-07-07 11:32:32 +00002780
Gilles Peskine449bd832023-01-11 14:50:10 +01002781 session->ticket_lifetime = MBEDTLS_GET_UINT32_BE(p, 0);
2782 MBEDTLS_SSL_DEBUG_MSG(3,
2783 ("ticket_lifetime: %u",
2784 (unsigned int) session->ticket_lifetime));
Jerry Yuf8a49942022-07-07 11:32:32 +00002785
Gilles Peskine449bd832023-01-11 14:50:10 +01002786 session->ticket_age_add = MBEDTLS_GET_UINT32_BE(p, 4);
2787 MBEDTLS_SSL_DEBUG_MSG(3,
2788 ("ticket_age_add: %u",
2789 (unsigned int) session->ticket_age_add));
Jerry Yuf8a49942022-07-07 11:32:32 +00002790
Jerry Yucb3b1392022-07-12 06:09:38 +00002791 *ticket_nonce_len = p[8];
2792 p += 9;
2793
Gilles Peskine449bd832023-01-11 14:50:10 +01002794 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, *ticket_nonce_len);
Jerry Yucb3b1392022-07-12 06:09:38 +00002795 *ticket_nonce = p;
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 MBEDTLS_SSL_DEBUG_BUF(3, "ticket_nonce:", *ticket_nonce, *ticket_nonce_len);
Jerry Yucb3b1392022-07-12 06:09:38 +00002797 p += *ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002798
2799 /* Ticket */
Gilles Peskine449bd832023-01-11 14:50:10 +01002800 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2801 ticket_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yuf8a49942022-07-07 11:32:32 +00002802 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002803 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, ticket_len);
2804 MBEDTLS_SSL_DEBUG_BUF(3, "received ticket", p, ticket_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002805
2806 /* Check if we previously received a ticket already. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002807 if (session->ticket != NULL || session->ticket_len > 0) {
2808 mbedtls_free(session->ticket);
Jerry Yuf8a49942022-07-07 11:32:32 +00002809 session->ticket = NULL;
2810 session->ticket_len = 0;
2811 }
2812
Gilles Peskine449bd832023-01-11 14:50:10 +01002813 if ((ticket = mbedtls_calloc(1, ticket_len)) == NULL) {
2814 MBEDTLS_SSL_DEBUG_MSG(1, ("ticket alloc failed"));
2815 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Jerry Yuf8a49942022-07-07 11:32:32 +00002816 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002817 memcpy(ticket, p, ticket_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002818 p += ticket_len;
2819 session->ticket = ticket;
2820 session->ticket_len = ticket_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002821
Pengyu Lv9f926952022-11-17 15:22:33 +08002822 /* Clear all flags in ticket_flags */
Pengyu Lv80270b22023-01-12 11:54:04 +08002823 mbedtls_ssl_session_clear_ticket_flags(
Pengyu Lv9eacb442022-12-09 14:39:19 +08002824 session, MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
Pengyu Lv9f926952022-11-17 15:22:33 +08002825
Gilles Peskine449bd832023-01-11 14:50:10 +01002826 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2827 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yuf8a49942022-07-07 11:32:32 +00002828 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002829 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002830
Gilles Peskine449bd832023-01-11 14:50:10 +01002831 MBEDTLS_SSL_DEBUG_BUF(3, "ticket extension", p, extensions_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002832
Gilles Peskine449bd832023-01-11 14:50:10 +01002833 ret = ssl_tls13_parse_new_session_ticket_exts(ssl, p, p + extensions_len);
2834 if (ret != 0) {
2835 MBEDTLS_SSL_DEBUG_RET(1,
2836 "ssl_tls13_parse_new_session_ticket_exts",
2837 ret);
2838 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002839 }
Jerry Yucb3b1392022-07-12 06:09:38 +00002840
Jerry Yudb8c5fa2022-08-03 12:10:13 +08002841 /* session has been updated, allow export */
2842 session->exported = 0;
2843
Gilles Peskine449bd832023-01-11 14:50:10 +01002844 return 0;
Jerry Yucb3b1392022-07-12 06:09:38 +00002845}
2846
Jerry Yua0446a02022-07-13 11:22:55 +08002847MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002848static int ssl_tls13_postprocess_new_session_ticket(mbedtls_ssl_context *ssl,
2849 unsigned char *ticket_nonce,
2850 size_t ticket_nonce_len)
Jerry Yucb3b1392022-07-12 06:09:38 +00002851{
2852 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2853 mbedtls_ssl_session *session = ssl->session;
2854 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2855 psa_algorithm_t psa_hash_alg;
2856 int hash_length;
2857
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002858#if defined(MBEDTLS_HAVE_TIME)
2859 /* Store ticket creation time */
Gilles Peskine449bd832023-01-11 14:50:10 +01002860 session->ticket_received = mbedtls_time(NULL);
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002861#endif
2862
Gilles Peskine449bd832023-01-11 14:50:10 +01002863 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(session->ciphersuite);
2864 if (ciphersuite_info == NULL) {
2865 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2866 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yuf8a49942022-07-07 11:32:32 +00002867 }
2868
Gilles Peskine449bd832023-01-11 14:50:10 +01002869 psa_hash_alg = mbedtls_psa_translate_md(ciphersuite_info->mac);
2870 hash_length = PSA_HASH_LENGTH(psa_hash_alg);
2871 if (hash_length == -1 ||
2872 (size_t) hash_length > sizeof(session->resumption_key)) {
2873 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu3afdf362022-07-20 17:34:14 +08002874 }
2875
Jerry Yuf8a49942022-07-07 11:32:32 +00002876
Gilles Peskine449bd832023-01-11 14:50:10 +01002877 MBEDTLS_SSL_DEBUG_BUF(3, "resumption_master_secret",
2878 session->app_secrets.resumption_master_secret,
2879 hash_length);
Jerry Yuf8a49942022-07-07 11:32:32 +00002880
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002881 /* Compute resumption key
Jerry Yuf8a49942022-07-07 11:32:32 +00002882 *
2883 * HKDF-Expand-Label( resumption_master_secret,
2884 * "resumption", ticket_nonce, Hash.length )
2885 */
2886 ret = mbedtls_ssl_tls13_hkdf_expand_label(
Gilles Peskine449bd832023-01-11 14:50:10 +01002887 psa_hash_alg,
2888 session->app_secrets.resumption_master_secret,
2889 hash_length,
2890 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(resumption),
2891 ticket_nonce,
2892 ticket_nonce_len,
2893 session->resumption_key,
2894 hash_length);
Jerry Yuf8a49942022-07-07 11:32:32 +00002895
Gilles Peskine449bd832023-01-11 14:50:10 +01002896 if (ret != 0) {
2897 MBEDTLS_SSL_DEBUG_RET(2,
2898 "Creating the ticket-resumed PSK failed",
2899 ret);
2900 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002901 }
2902
Jerry Yu0a430c82022-07-20 11:02:48 +08002903 session->resumption_key_len = hash_length;
Jerry Yuf8a49942022-07-07 11:32:32 +00002904
Gilles Peskine449bd832023-01-11 14:50:10 +01002905 MBEDTLS_SSL_DEBUG_BUF(3, "Ticket-resumed PSK",
2906 session->resumption_key,
2907 session->resumption_key_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002908
Pengyu Lv9f926952022-11-17 15:22:33 +08002909 /* Set ticket_flags depends on the selected key exchange modes */
Pengyu Lv80270b22023-01-12 11:54:04 +08002910 mbedtls_ssl_session_set_ticket_flags(
Pengyu Lv9eacb442022-12-09 14:39:19 +08002911 session, ssl->conf->tls13_kex_modes);
Pengyu Lv4938a562023-01-16 11:28:49 +08002912 MBEDTLS_SSL_PRINT_TICKET_FLAGS(4, session->ticket_flags);
Pengyu Lv9f926952022-11-17 15:22:33 +08002913
Gilles Peskine449bd832023-01-11 14:50:10 +01002914 return 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002915}
2916
2917/*
Jerry Yua8d3c502022-10-30 14:51:23 +08002918 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yuf8a49942022-07-07 11:32:32 +00002919 */
Jerry Yua0446a02022-07-13 11:22:55 +08002920MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002921static int ssl_tls13_process_new_session_ticket(mbedtls_ssl_context *ssl)
Jerry Yuf8a49942022-07-07 11:32:32 +00002922{
2923 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2924 unsigned char *buf;
2925 size_t buf_len;
Jerry Yucb3b1392022-07-12 06:09:38 +00002926 unsigned char *ticket_nonce;
2927 size_t ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002928
Gilles Peskine449bd832023-01-11 14:50:10 +01002929 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse new session ticket"));
Jerry Yuf8a49942022-07-07 11:32:32 +00002930
Gilles Peskine449bd832023-01-11 14:50:10 +01002931 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2932 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2933 &buf, &buf_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002934
Gilles Peskine449bd832023-01-11 14:50:10 +01002935 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_new_session_ticket(
2936 ssl, buf, buf + buf_len,
2937 &ticket_nonce, &ticket_nonce_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002938
Gilles Peskine449bd832023-01-11 14:50:10 +01002939 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_new_session_ticket(
2940 ssl, ticket_nonce, ticket_nonce_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002941
Gilles Peskine449bd832023-01-11 14:50:10 +01002942 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002943
Jerry Yuf8a49942022-07-07 11:32:32 +00002944cleanup:
2945
Gilles Peskine449bd832023-01-11 14:50:10 +01002946 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse new session ticket"));
2947 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002948}
2949#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2950
Gilles Peskine449bd832023-01-11 14:50:10 +01002951int mbedtls_ssl_tls13_handshake_client_step(mbedtls_ssl_context *ssl)
Jerry Yubc20bdd2021-08-24 15:59:48 +08002952{
Jerry Yu92c6b402021-08-27 16:59:09 +08002953 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +08002954
Gilles Peskine449bd832023-01-11 14:50:10 +01002955 switch (ssl->state) {
Jerry Yu92c6b402021-08-27 16:59:09 +08002956 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002957 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Jerry Yuddda0502022-12-01 19:43:12 +08002958 break;
2959
Jerry Yu92c6b402021-08-27 16:59:09 +08002960 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002961 ret = mbedtls_ssl_write_client_hello(ssl);
Jerry Yu92c6b402021-08-27 16:59:09 +08002962 break;
2963
2964 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002965 ret = ssl_tls13_process_server_hello(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002966 break;
2967
2968 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01002969 ret = ssl_tls13_process_encrypted_extensions(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002970 break;
2971
Ronald Cron928cbd32022-10-04 16:14:26 +02002972#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yud2674312021-10-29 10:08:19 +08002973 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 ret = ssl_tls13_process_certificate_request(ssl);
Jerry Yud2674312021-10-29 10:08:19 +08002975 break;
2976
Jerry Yu687101b2021-09-14 16:03:56 +08002977 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002978 ret = ssl_tls13_process_server_certificate(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002979 break;
2980
2981 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01002982 ret = ssl_tls13_process_certificate_verify(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002983 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002984#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu687101b2021-09-14 16:03:56 +08002985
2986 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01002987 ret = ssl_tls13_process_server_finished(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002988 break;
2989
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002990 case MBEDTLS_SSL_END_OF_EARLY_DATA:
2991 ret = ssl_tls13_write_end_of_early_data(ssl);
2992 break;
2993
Jerry Yu566c7812022-01-26 15:41:22 +08002994 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002995 ret = ssl_tls13_write_client_certificate(ssl);
Jerry Yu566c7812022-01-26 15:41:22 +08002996 break;
2997
Ronald Cron928cbd32022-10-04 16:14:26 +02002998#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002999 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003000 ret = ssl_tls13_write_client_certificate_verify(ssl);
Jerry Yu566c7812022-01-26 15:41:22 +08003001 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02003002#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08003003
Jerry Yu687101b2021-09-14 16:03:56 +08003004 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003005 ret = ssl_tls13_write_client_finished(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08003006 break;
3007
3008 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003009 ret = ssl_tls13_flush_buffers(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08003010 break;
3011
3012 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003013 ret = ssl_tls13_handshake_wrapup(ssl);
Jerry Yu92c6b402021-08-27 16:59:09 +08003014 break;
3015
Gilles Peskine449bd832023-01-11 14:50:10 +01003016 /*
3017 * Injection of dummy-CCS's for middlebox compatibility
3018 */
Ronald Cron49ad6192021-11-24 16:25:31 +01003019#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
XiaokangQian0b56a8f2021-12-22 02:39:32 +00003020 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003021 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3022 if (ret == 0) {
3023 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
3024 }
Ronald Cron9f55f632022-02-02 16:02:47 +01003025 break;
3026
3027 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003028 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3029 if (ret == 0) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00003030 mbedtls_ssl_handshake_set_state(
3031 ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +01003032 }
Ronald Cron49ad6192021-11-24 16:25:31 +01003033 break;
Xiaokang Qianf6d8fd32023-02-02 02:46:26 +00003034
Xiaokang Qian592021a2023-01-04 10:47:05 +00003035 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
3036 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3037 if (ret == 0) {
3038 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
3039
Xiaokang Qian33ff8682023-01-10 06:32:12 +00003040#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qian592021a2023-01-04 10:47:05 +00003041 MBEDTLS_SSL_DEBUG_MSG(
3042 1, ("Switch to early data keys for outbound traffic"));
3043 mbedtls_ssl_set_outbound_transform(
3044 ssl, ssl->handshake->transform_earlydata);
Xiaokang Qian33ff8682023-01-10 06:32:12 +00003045#endif
Xiaokang Qian592021a2023-01-04 10:47:05 +00003046 }
3047 break;
Ronald Cron49ad6192021-11-24 16:25:31 +01003048#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
3049
Jerry Yuf8a49942022-07-07 11:32:32 +00003050#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yua8d3c502022-10-30 14:51:23 +08003051 case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01003052 ret = ssl_tls13_process_new_session_ticket(ssl);
3053 if (ret != 0) {
Jerry Yuf8a49942022-07-07 11:32:32 +00003054 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01003055 }
Jerry Yuf8a49942022-07-07 11:32:32 +00003056 ret = MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET;
3057 break;
3058#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3059
Jerry Yu92c6b402021-08-27 16:59:09 +08003060 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3062 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jerry Yu92c6b402021-08-27 16:59:09 +08003063 }
3064
Gilles Peskine449bd832023-01-11 14:50:10 +01003065 return ret;
Jerry Yu92c6b402021-08-27 16:59:09 +08003066}
Jerry Yu65dd2cc2021-08-18 16:38:40 +08003067
Jerry Yufb4b6472022-01-27 15:03:26 +08003068#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_TLS1_3 */