blob: 3dffc1df4aa13fb274efd4d6d9e490e562101877 [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"
Manuel Pégourié-Gonnard02b10d82023-03-28 12:33:20 +020036#include "md_psa.h"
Jerry Yubdc71882021-09-14 19:30:36 +080037
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050038#define PSA_TO_MBEDTLS_ERR(status) PSA_TO_MBEDTLS_ERR_LIST(status, \
39 psa_to_ssl_errors, \
40 psa_generic_status_to_mbedtls)
41
Jerry Yubc20bdd2021-08-24 15:59:48 +080042/* Write extensions */
43
Jerry Yu92c6b402021-08-27 16:59:09 +080044/*
45 * ssl_tls13_write_supported_versions_ext():
46 *
47 * struct {
48 * ProtocolVersion versions<2..254>;
49 * } SupportedVersions;
50 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020051MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010052static int ssl_tls13_write_supported_versions_ext(mbedtls_ssl_context *ssl,
53 unsigned char *buf,
54 unsigned char *end,
55 size_t *out_len)
Jerry Yu92c6b402021-08-27 16:59:09 +080056{
57 unsigned char *p = buf;
Gilles Peskine449bd832023-01-11 14:50:10 +010058 unsigned char versions_len = (ssl->handshake->min_tls_version <=
59 MBEDTLS_SSL_VERSION_TLS1_2) ? 4 : 2;
Jerry Yu92c6b402021-08-27 16:59:09 +080060
Xiaofei Baid25fab62021-12-02 06:36:27 +000061 *out_len = 0;
Jerry Yu92c6b402021-08-27 16:59:09 +080062
Gilles Peskine449bd832023-01-11 14:50:10 +010063 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding supported versions extension"));
Jerry Yu92c6b402021-08-27 16:59:09 +080064
Jerry Yu388bd0d2021-09-15 18:41:02 +080065 /* Check if we have space to write the extension:
Jerry Yub60e3cf2021-09-08 16:41:02 +080066 * - extension_type (2 bytes)
67 * - extension_data_length (2 bytes)
68 * - versions_length (1 byte )
Ronald Crona77fc272022-03-30 17:20:47 +020069 * - versions (2 or 4 bytes)
Jerry Yu159c5a02021-08-31 12:51:25 +080070 */
Gilles Peskine449bd832023-01-11 14:50:10 +010071 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5 + versions_len);
Ronald Crondbe87f02022-02-10 14:35:27 +010072
Gilles Peskine449bd832023-01-11 14:50:10 +010073 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0);
74 MBEDTLS_PUT_UINT16_BE(versions_len + 1, p, 2);
Jerry Yueecfbf02021-08-30 18:32:07 +080075 p += 4;
Jerry Yu92c6b402021-08-27 16:59:09 +080076
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080077 /* Length of versions */
Ronald Crondbe87f02022-02-10 14:35:27 +010078 *p++ = versions_len;
Jerry Yu92c6b402021-08-27 16:59:09 +080079
Jerry Yu0c63af62021-09-02 12:59:12 +080080 /* Write values of supported versions.
Jerry Yu0c63af62021-09-02 12:59:12 +080081 * They are defined by the configuration.
Ronald Crondbe87f02022-02-10 14:35:27 +010082 * Currently, we advertise only TLS 1.3 or both TLS 1.3 and TLS 1.2.
Jerry Yu92c6b402021-08-27 16:59:09 +080083 */
Gilles Peskine449bd832023-01-11 14:50:10 +010084 mbedtls_ssl_write_version(p, MBEDTLS_SSL_TRANSPORT_STREAM,
85 MBEDTLS_SSL_VERSION_TLS1_3);
86 MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:4]"));
Jerry Yu92c6b402021-08-27 16:59:09 +080087
Jerry Yu92c6b402021-08-27 16:59:09 +080088
Gilles Peskine449bd832023-01-11 14:50:10 +010089 if (ssl->handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2) {
90 mbedtls_ssl_write_version(p + 2, MBEDTLS_SSL_TRANSPORT_STREAM,
91 MBEDTLS_SSL_VERSION_TLS1_2);
92 MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:3]"));
Ronald Crondbe87f02022-02-10 14:35:27 +010093 }
94
95 *out_len = 5 + versions_len;
Jerry Yu4b8f2f72022-10-31 13:31:22 +080096
Jerry Yuc4bf5d62022-10-29 09:08:47 +080097 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +010098 ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS);
Jerry Yu4b8f2f72022-10-31 13:31:22 +080099
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 return 0;
Jerry Yu92c6b402021-08-27 16:59:09 +0800101}
Jerry Yubc20bdd2021-08-24 15:59:48 +0800102
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200103MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100104static int ssl_tls13_parse_supported_versions_ext(mbedtls_ssl_context *ssl,
105 const unsigned char *buf,
106 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +0800107{
Jerry Yue1b9c292021-09-10 10:08:31 +0800108 ((void) ssl);
109
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2);
111 if (mbedtls_ssl_read_version(buf, ssl->conf->transport) !=
112 MBEDTLS_SSL_VERSION_TLS1_3) {
113 MBEDTLS_SSL_DEBUG_MSG(1, ("unexpected version"));
Jerry Yu4a173382021-10-11 21:45:31 +0800114
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
116 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
117 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +0800118 }
119
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 if (&buf[2] != end) {
Xiaokang Qian91bb3f02023-04-03 09:07:03 +0000121 MBEDTLS_SSL_DEBUG_MSG(
122 1, ("supported_versions ext data length incorrect"));
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
124 MBEDTLS_ERR_SSL_DECODE_ERROR);
125 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron98473382022-03-30 20:04:10 +0200126 }
127
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 return 0;
Jerry Yue1b9c292021-09-10 10:08:31 +0800129}
130
lhuang0486cacac2022-01-21 07:34:27 -0800131#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200132MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100133static int ssl_tls13_parse_alpn_ext(mbedtls_ssl_context *ssl,
134 const unsigned char *buf, size_t len)
lhuang0486cacac2022-01-21 07:34:27 -0800135{
lhuang0486cacac2022-01-21 07:34:27 -0800136 const unsigned char *p = buf;
137 const unsigned char *end = buf + len;
Ronald Cron81a334f2022-05-31 16:04:11 +0200138 size_t protocol_name_list_len, protocol_name_len;
139 const unsigned char *protocol_name_list_end;
lhuang0486cacac2022-01-21 07:34:27 -0800140
141 /* If we didn't send it, the server shouldn't send it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 if (ssl->conf->alpn_list == NULL) {
143 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
144 }
lhuang0486cacac2022-01-21 07:34:27 -0800145
146 /*
147 * opaque ProtocolName<1..2^8-1>;
148 *
149 * struct {
150 * ProtocolName protocol_name_list<2..2^16-1>
151 * } ProtocolNameList;
152 *
153 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
154 */
155
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
157 protocol_name_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
lhuang0486cacac2022-01-21 07:34:27 -0800158 p += 2;
lhuang0486cacac2022-01-21 07:34:27 -0800159
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, protocol_name_list_len);
Ronald Cron81a334f2022-05-31 16:04:11 +0200161 protocol_name_list_end = p + protocol_name_list_len;
162
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, 1);
Ronald Cron81a334f2022-05-31 16:04:11 +0200164 protocol_name_len = *p++;
lhuang0486cacac2022-01-21 07:34:27 -0800165
166 /* Check that the server chosen protocol was in our list and save it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100167 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, protocol_name_len);
168 for (const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++) {
169 if (protocol_name_len == strlen(*alpn) &&
170 memcmp(p, *alpn, protocol_name_len) == 0) {
lhuang0486cacac2022-01-21 07:34:27 -0800171 ssl->alpn_chosen = *alpn;
Gilles Peskine449bd832023-01-11 14:50:10 +0100172 return 0;
lhuang0486cacac2022-01-21 07:34:27 -0800173 }
174 }
175
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
lhuang0486cacac2022-01-21 07:34:27 -0800177}
178#endif /* MBEDTLS_SSL_ALPN */
179
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200180MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100181static int ssl_tls13_reset_key_share(mbedtls_ssl_context *ssl)
XiaokangQian647719a2021-12-07 09:16:29 +0000182{
183 uint16_t group_id = ssl->handshake->offered_group_id;
Ronald Cron5b98ac92022-03-15 10:19:18 +0100184
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 if (group_id == 0) {
186 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
187 }
XiaokangQian647719a2021-12-07 09:16:29 +0000188
Valerio Setti080a22b2023-03-20 15:22:47 +0100189#if defined(PSA_WANT_ALG_ECDH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 if (mbedtls_ssl_tls13_named_group_is_ecdhe(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
Valerio Setti080a22b2023-03-20 15:22:47 +0100205#endif /* PSA_WANT_ALG_ECDH */
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
Valerio Setti080a22b2023-03-20 15:22:47 +0100224#if defined(PSA_WANT_ALG_ECDH)
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 }
Jerry Yu388bd0d2021-09-15 18:41:02 +0800230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 for (; *group_list != 0; group_list++) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +0000232 if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(
233 *group_list, NULL, NULL) == PSA_SUCCESS) &&
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list)) {
Brett Warren14efd332021-10-06 09:32:11 +0100235 *group_id = *group_list;
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 return 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800237 }
238 }
239#else
240 ((void) ssl);
Jerry Yub60e3cf2021-09-08 16:41:02 +0800241 ((void) group_id);
Valerio Setti080a22b2023-03-20 15:22:47 +0100242#endif /* PSA_WANT_ALG_ECDH */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800243
244 /*
245 * Add DHE named groups here.
Jerry Yu388bd0d2021-09-15 18:41:02 +0800246 * Pick first available DHE group compatible with TLS 1.3
Jerry Yu56fc07f2021-09-01 17:48:49 +0800247 */
248
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 return ret;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800250}
251
252/*
253 * ssl_tls13_write_key_share_ext
254 *
Jerry Yu388bd0d2021-09-15 18:41:02 +0800255 * Structure of key_share extension in ClientHello:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800256 *
257 * struct {
258 * NamedGroup group;
259 * opaque key_exchange<1..2^16-1>;
260 * } KeyShareEntry;
261 * struct {
262 * KeyShareEntry client_shares<0..2^16-1>;
263 * } KeyShareClientHello;
264 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200265MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100266static int ssl_tls13_write_key_share_ext(mbedtls_ssl_context *ssl,
267 unsigned char *buf,
268 unsigned char *end,
269 size_t *out_len)
Jerry Yu56fc07f2021-09-01 17:48:49 +0800270{
271 unsigned char *p = buf;
Xiaofei Baieef15042021-11-18 07:29:56 +0000272 unsigned char *client_shares; /* Start of client_shares */
273 size_t client_shares_len; /* Length of client_shares */
Jerry Yu56fc07f2021-09-01 17:48:49 +0800274 uint16_t group_id;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800275 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
276
Xiaofei Baid25fab62021-12-02 06:36:27 +0000277 *out_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800278
Jerry Yub60e3cf2021-09-08 16:41:02 +0800279 /* Check if we have space for header and length fields:
Jerry Yu56fc07f2021-09-01 17:48:49 +0800280 * - extension_type (2 bytes)
281 * - extension_data_length (2 bytes)
282 * - client_shares_length (2 bytes)
283 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800285 p += 6;
286
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello: adding key share extension"));
Jerry Yu56fc07f2021-09-01 17:48:49 +0800288
289 /* HRR could already have requested something else. */
290 group_id = ssl->handshake->offered_group_id;
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 if (!mbedtls_ssl_tls13_named_group_is_ecdhe(group_id) &&
292 !mbedtls_ssl_tls13_named_group_is_dhe(group_id)) {
293 MBEDTLS_SSL_PROC_CHK(ssl_tls13_get_default_group_id(ssl,
294 &group_id));
Jerry Yu56fc07f2021-09-01 17:48:49 +0800295 }
296
297 /*
298 * Dispatch to type-specific key generation function.
299 *
300 * So far, we're only supporting ECDHE. With the introduction
301 * of PQC KEMs, we'll want to have multiple branches, one per
302 * type of KEM, and dispatch to the corresponding crypto. And
303 * only one key share entry is allowed.
304 */
Xiaofei Baieef15042021-11-18 07:29:56 +0000305 client_shares = p;
Valerio Setti080a22b2023-03-20 15:22:47 +0100306#if defined(PSA_WANT_ALG_ECDH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group_id)) {
Jerry Yu388bd0d2021-09-15 18:41:02 +0800308 /* Pointer to group */
Xiaofei Baieef15042021-11-18 07:29:56 +0000309 unsigned char *group = p;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800310 /* Length of key_exchange */
Przemyslaw Stekiel4f419e52022-02-10 15:56:26 +0100311 size_t key_exchange_len = 0;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800312
313 /* Check there is space for header of KeyShareEntry
314 * - group (2 bytes)
315 * - key_exchange_length (2 bytes)
316 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800318 p += 4;
Jerry Yu89e103c2022-03-30 22:43:29 +0800319 ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 ssl, group_id, p, end, &key_exchange_len);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800321 p += key_exchange_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 if (ret != 0) {
323 return ret;
324 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800325
326 /* Write group */
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 MBEDTLS_PUT_UINT16_BE(group_id, group, 0);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800328 /* Write key_exchange_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 MBEDTLS_PUT_UINT16_BE(key_exchange_len, group, 2);
330 } else
Valerio Setti080a22b2023-03-20 15:22:47 +0100331#endif /* PSA_WANT_ALG_ECDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 if (0 /* other KEMs? */) {
Jerry Yu56fc07f2021-09-01 17:48:49 +0800333 /* Do something */
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 } else {
335 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800336 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800337
Jerry Yub60e3cf2021-09-08 16:41:02 +0800338 /* Length of client_shares */
Xiaofei Baieef15042021-11-18 07:29:56 +0000339 client_shares_len = p - client_shares;
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 if (client_shares_len == 0) {
341 MBEDTLS_SSL_DEBUG_MSG(1, ("No key share defined."));
342 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu7c522d42021-09-08 17:55:09 +0800343 }
Jerry Yu56fc07f2021-09-01 17:48:49 +0800344 /* Write extension_type */
Gilles Peskine449bd832023-01-11 14:50:10 +0100345 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800346 /* Write extension_data_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 MBEDTLS_PUT_UINT16_BE(client_shares_len + 2, buf, 2);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800348 /* Write client_shares_length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100349 MBEDTLS_PUT_UINT16_BE(client_shares_len, buf, 4);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800350
351 /* Update offered_group_id field */
352 ssl->handshake->offered_group_id = group_id;
353
354 /* Output the total length of key_share extension. */
Xiaofei Baid25fab62021-12-02 06:36:27 +0000355 *out_len = p - buf;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800356
Xiaokang Qian91bb3f02023-04-03 09:07:03 +0000357 MBEDTLS_SSL_DEBUG_BUF(
358 3, "client hello, key_share extension", buf, *out_len);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800359
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
Jerry Yu56fc07f2021-09-01 17:48:49 +0800361
362cleanup:
363
Gilles Peskine449bd832023-01-11 14:50:10 +0100364 return ret;
Jerry Yu56fc07f2021-09-01 17:48:49 +0800365}
Ronald Cron766c0cd2022-10-18 12:17:11 +0200366#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
Jerry Yue1b9c292021-09-10 10:08:31 +0800367
XiaokangQiand59be772022-01-24 10:12:51 +0000368/*
369 * ssl_tls13_parse_hrr_key_share_ext()
370 * Parse key_share extension in Hello Retry Request
371 *
372 * struct {
373 * NamedGroup selected_group;
374 * } KeyShareHelloRetryRequest;
375 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200376MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100377static int ssl_tls13_parse_hrr_key_share_ext(mbedtls_ssl_context *ssl,
378 const unsigned char *buf,
379 const unsigned char *end)
XiaokangQianb851da82022-01-14 04:03:11 +0000380{
Valerio Setti080a22b2023-03-20 15:22:47 +0100381#if defined(PSA_WANT_ALG_ECDH)
XiaokangQianb851da82022-01-14 04:03:11 +0000382 const unsigned char *p = buf;
XiaokangQiand59be772022-01-24 10:12:51 +0000383 int selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000384 int found = 0;
385
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
387 if (group_list == NULL) {
388 return MBEDTLS_ERR_SSL_BAD_CONFIG;
389 }
XiaokangQianb851da82022-01-14 04:03:11 +0000390
Gilles Peskine449bd832023-01-11 14:50:10 +0100391 MBEDTLS_SSL_DEBUG_BUF(3, "key_share extension", p, end - buf);
XiaokangQianb851da82022-01-14 04:03:11 +0000392
393 /* Read selected_group */
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
395 selected_group = MBEDTLS_GET_UINT16_BE(p, 0);
396 MBEDTLS_SSL_DEBUG_MSG(3, ("selected_group ( %d )", selected_group));
XiaokangQianb851da82022-01-14 04:03:11 +0000397
398 /* Upon receipt of this extension in a HelloRetryRequest, the client
399 * MUST first verify that the selected_group field corresponds to a
400 * group which was provided in the "supported_groups" extension in the
401 * original ClientHello.
402 * The supported_group was based on the info in ssl->conf->group_list.
403 *
404 * If the server provided a key share that was not sent in the ClientHello
405 * then the client MUST abort the handshake with an "illegal_parameter" alert.
406 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100407 for (; *group_list != 0; group_list++) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +0000408 if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(
409 *group_list, NULL, NULL) == PSA_ERROR_NOT_SUPPORTED) ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 *group_list != selected_group) {
XiaokangQianb851da82022-01-14 04:03:11 +0000411 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 }
XiaokangQianb851da82022-01-14 04:03:11 +0000413
414 /* We found a match */
415 found = 1;
416 break;
417 }
418
419 /* Client MUST verify that the selected_group field does not
420 * correspond to a group which was provided in the "key_share"
421 * extension in the original ClientHello. If the server sent an
422 * HRR message with a key share already provided in the
423 * ClientHello then the client MUST abort the handshake with
424 * an "illegal_parameter" alert.
425 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 if (found == 0 || selected_group == ssl->handshake->offered_group_id) {
427 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid key share in HRR"));
XiaokangQianb851da82022-01-14 04:03:11 +0000428 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +0100429 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
430 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
431 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
XiaokangQianb851da82022-01-14 04:03:11 +0000432 }
433
434 /* Remember server's preference for next ClientHello */
XiaokangQiand59be772022-01-24 10:12:51 +0000435 ssl->handshake->offered_group_id = selected_group;
XiaokangQianb851da82022-01-14 04:03:11 +0000436
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 return 0;
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400438#else
439 (void) ssl;
440 (void) buf;
441 (void) end;
Gilles Peskine449bd832023-01-11 14:50:10 +0100442 return MBEDTLS_ERR_SSL_BAD_CONFIG;
Andrzej Kurekc19fb082022-10-03 10:52:24 -0400443#endif
XiaokangQianb851da82022-01-14 04:03:11 +0000444}
445
Jerry Yue1b9c292021-09-10 10:08:31 +0800446/*
Jerry Yub85277e2021-10-13 13:36:05 +0800447 * ssl_tls13_parse_key_share_ext()
448 * Parse key_share extension in Server Hello
449 *
Jerry Yue1b9c292021-09-10 10:08:31 +0800450 * struct {
451 * KeyShareEntry server_share;
452 * } KeyShareServerHello;
453 * struct {
454 * NamedGroup group;
455 * opaque key_exchange<1..2^16-1>;
456 * } KeyShareEntry;
457 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200458MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100459static int ssl_tls13_parse_key_share_ext(mbedtls_ssl_context *ssl,
460 const unsigned char *buf,
461 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +0800462{
Jerry Yub85277e2021-10-13 13:36:05 +0800463 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +0800464 const unsigned char *p = buf;
Jerry Yu4a173382021-10-11 21:45:31 +0800465 uint16_t group, offered_group;
Jerry Yue1b9c292021-09-10 10:08:31 +0800466
Jerry Yu4a173382021-10-11 21:45:31 +0800467 /* ...
468 * NamedGroup group; (2 bytes)
469 * ...
470 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100471 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
472 group = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +0800473 p += 2;
474
Jerry Yu4a173382021-10-11 21:45:31 +0800475 /* Check that the chosen group matches the one we offered. */
Jerry Yue1b9c292021-09-10 10:08:31 +0800476 offered_group = ssl->handshake->offered_group_id;
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 if (offered_group != group) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +0000478 MBEDTLS_SSL_DEBUG_MSG(
479 1, ("Invalid server key share, our group %u, their group %u",
480 (unsigned) offered_group, (unsigned) group));
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
482 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
483 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yue1b9c292021-09-10 10:08:31 +0800484 }
485
Valerio Setti080a22b2023-03-20 15:22:47 +0100486#if defined(PSA_WANT_ALG_ECDH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 if (mbedtls_ssl_tls13_named_group_is_ecdhe(group)) {
488 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(group, NULL, NULL)
489 == PSA_ERROR_NOT_SUPPORTED) {
490 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid TLS curve group id"));
491 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Przemyslaw Stekiel9e23ddb2022-02-10 10:32:02 +0100492 }
493
Xiaokang Qian91bb3f02023-04-03 09:07:03 +0000494 MBEDTLS_SSL_DEBUG_MSG(
495 2,
496 ("ECDH curve: %s", mbedtls_ssl_get_curve_name_from_tls_id(group)));
Przemyslaw Stekiel9e23ddb2022-02-10 10:32:02 +0100497
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 ret = mbedtls_ssl_tls13_read_public_ecdhe_share(ssl, p, end - p);
499 if (ret != 0) {
500 return ret;
501 }
502 } else
Valerio Setti080a22b2023-03-20 15:22:47 +0100503#endif /* PSA_WANT_ALG_ECDH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 if (0 /* other KEMs? */) {
Jerry Yue1b9c292021-09-10 10:08:31 +0800505 /* Do something */
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 } else {
507 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yue1b9c292021-09-10 10:08:31 +0800508 }
Jerry Yue1b9c292021-09-10 10:08:31 +0800509
Gilles Peskine449bd832023-01-11 14:50:10 +0100510 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +0800511}
512
XiaokangQiand59be772022-01-24 10:12:51 +0000513/*
514 * ssl_tls13_parse_cookie_ext()
515 * Parse cookie extension in Hello Retry Request
516 *
517 * struct {
518 * opaque cookie<1..2^16-1>;
519 * } Cookie;
520 *
521 * When sending a HelloRetryRequest, the server MAY provide a "cookie"
522 * extension to the client (this is an exception to the usual rule that
523 * the only extensions that may be sent are those that appear in the
524 * ClientHello). When sending the new ClientHello, the client MUST copy
525 * the contents of the extension received in the HelloRetryRequest into
526 * a "cookie" extension in the new ClientHello. Clients MUST NOT use
527 * cookies in their initial ClientHello in subsequent connections.
528 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200529MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100530static int ssl_tls13_parse_cookie_ext(mbedtls_ssl_context *ssl,
531 const unsigned char *buf,
532 const unsigned char *end)
XiaokangQian43550bd2022-01-21 04:32:58 +0000533{
XiaokangQian25c9c902022-02-08 10:49:53 +0000534 uint16_t cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000535 const unsigned char *p = buf;
536 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
537
538 /* Retrieve length field of cookie */
Gilles Peskine449bd832023-01-11 14:50:10 +0100539 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
540 cookie_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian43550bd2022-01-21 04:32:58 +0000541 p += 2;
542
Gilles Peskine449bd832023-01-11 14:50:10 +0100543 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, cookie_len);
544 MBEDTLS_SSL_DEBUG_BUF(3, "cookie extension", p, cookie_len);
XiaokangQian43550bd2022-01-21 04:32:58 +0000545
Gilles Peskine449bd832023-01-11 14:50:10 +0100546 mbedtls_free(handshake->cookie);
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800547 handshake->cookie_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 handshake->cookie = mbedtls_calloc(1, cookie_len);
549 if (handshake->cookie == NULL) {
550 MBEDTLS_SSL_DEBUG_MSG(1,
551 ("alloc failed ( %ud bytes )",
552 cookie_len));
553 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
XiaokangQian43550bd2022-01-21 04:32:58 +0000554 }
555
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 memcpy(handshake->cookie, p, cookie_len);
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800557 handshake->cookie_len = cookie_len;
XiaokangQian43550bd2022-01-21 04:32:58 +0000558
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 return 0;
XiaokangQian43550bd2022-01-21 04:32:58 +0000560}
XiaokangQian43550bd2022-01-21 04:32:58 +0000561
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200562MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100563static int ssl_tls13_write_cookie_ext(mbedtls_ssl_context *ssl,
564 unsigned char *buf,
565 unsigned char *end,
566 size_t *out_len)
XiaokangQian0b64eed2022-01-27 10:36:51 +0000567{
568 unsigned char *p = buf;
XiaokangQian9deb90f2022-02-08 10:31:07 +0000569 *out_len = 0;
XiaokangQianc02768a2022-02-10 07:31:25 +0000570 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000571
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 if (handshake->cookie == NULL) {
573 MBEDTLS_SSL_DEBUG_MSG(3, ("no cookie to send; skip extension"));
574 return 0;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000575 }
576
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
578 handshake->cookie,
579 handshake->cookie_len);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000580
Gilles Peskine449bd832023-01-11 14:50:10 +0100581 MBEDTLS_SSL_CHK_BUF_PTR(p, end, handshake->cookie_len + 6);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000582
Gilles Peskine449bd832023-01-11 14:50:10 +0100583 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding cookie extension"));
XiaokangQian0b64eed2022-01-27 10:36:51 +0000584
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_COOKIE, p, 0);
586 MBEDTLS_PUT_UINT16_BE(handshake->cookie_len + 2, p, 2);
587 MBEDTLS_PUT_UINT16_BE(handshake->cookie_len, p, 4);
XiaokangQian233397e2022-02-07 08:32:16 +0000588 p += 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000589
590 /* Cookie */
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 memcpy(p, handshake->cookie, handshake->cookie_len);
XiaokangQian0b64eed2022-01-27 10:36:51 +0000592
Jerry Yuac5ca5a2022-03-04 12:50:46 +0800593 *out_len = handshake->cookie_len + 6;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000594
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_COOKIE);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800596
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 return 0;
XiaokangQian0b64eed2022-01-27 10:36:51 +0000598}
599
Ronald Cron41a443a2022-10-04 16:38:25 +0200600#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000601/*
602 * ssl_tls13_write_psk_key_exchange_modes_ext() structure:
603 *
604 * enum { psk_ke( 0 ), psk_dhe_ke( 1 ), ( 255 ) } PskKeyExchangeMode;
605 *
606 * struct {
607 * PskKeyExchangeMode ke_modes<1..255>;
608 * } PskKeyExchangeModes;
609 */
XiaokangQian86981952022-07-19 09:51:50 +0000610MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100611static int ssl_tls13_write_psk_key_exchange_modes_ext(mbedtls_ssl_context *ssl,
612 unsigned char *buf,
613 unsigned char *end,
614 size_t *out_len)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000615{
XiaokangQianeb69aee2022-07-05 08:21:43 +0000616 unsigned char *p = buf;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000617 int ke_modes_len = 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000618
Gilles Peskine449bd832023-01-11 14:50:10 +0100619 ((void) ke_modes_len);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000620 *out_len = 0;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000621
XiaokangQianeb69aee2022-07-05 08:21:43 +0000622 /* Skip writing extension if no PSK key exchange mode
XiaokangQian7c12d312022-07-20 07:25:43 +0000623 * is enabled in the config.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000624 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 if (!mbedtls_ssl_conf_tls13_some_psk_enabled(ssl)) {
626 MBEDTLS_SSL_DEBUG_MSG(3, ("skip psk_key_exchange_modes extension"));
627 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000628 }
629
630 /* Require 7 bytes of data, otherwise fail,
631 * even if extension might be shorter.
632 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 7);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000634 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 3, ("client hello, adding psk_key_exchange_modes extension"));
XiaokangQianeb69aee2022-07-05 08:21:43 +0000636
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES, p, 0);
XiaokangQianeb69aee2022-07-05 08:21:43 +0000638
XiaokangQian008d2bf2022-07-14 07:54:01 +0000639 /* Skip extension length (2 bytes) and
640 * ke_modes length (1 byte) for now.
XiaokangQianeb69aee2022-07-05 08:21:43 +0000641 */
642 p += 5;
643
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 if (mbedtls_ssl_conf_tls13_psk_ephemeral_enabled(ssl)) {
XiaokangQianeb69aee2022-07-05 08:21:43 +0000645 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE;
XiaokangQian008d2bf2022-07-14 07:54:01 +0000646 ke_modes_len++;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000647
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 MBEDTLS_SSL_DEBUG_MSG(4, ("Adding PSK-ECDHE key exchange mode"));
XiaokangQianeb69aee2022-07-05 08:21:43 +0000649 }
650
Gilles Peskine449bd832023-01-11 14:50:10 +0100651 if (mbedtls_ssl_conf_tls13_psk_enabled(ssl)) {
Ronald Crona709a0f2022-09-27 16:46:11 +0200652 *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE;
653 ke_modes_len++;
654
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 MBEDTLS_SSL_DEBUG_MSG(4, ("Adding pure PSK key exchange mode"));
Ronald Crona709a0f2022-09-27 16:46:11 +0200656 }
657
XiaokangQian008d2bf2022-07-14 07:54:01 +0000658 /* Now write the extension and ke_modes length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 MBEDTLS_PUT_UINT16_BE(ke_modes_len + 1, buf, 2);
XiaokangQian008d2bf2022-07-14 07:54:01 +0000660 buf[4] = ke_modes_len;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000661
662 *out_len = p - buf;
Jerry Yu0c354a22022-08-29 15:25:36 +0800663
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800664 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 ssl, MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800666
Gilles Peskine449bd832023-01-11 14:50:10 +0100667 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +0000668}
Jerry Yudb8c5fa2022-08-03 12:10:13 +0800669
Gilles Peskine449bd832023-01-11 14:50:10 +0100670static psa_algorithm_t ssl_tls13_get_ciphersuite_hash_alg(int ciphersuite)
Jerry Yuf7c12592022-09-28 22:09:38 +0800671{
Jerry Yu21f90952022-10-08 10:30:53 +0800672 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
Jerry Yuf7c12592022-09-28 22:09:38 +0800674
Gilles Peskine449bd832023-01-11 14:50:10 +0100675 if (ciphersuite_info != NULL) {
Manuel Pégourié-Gonnard1f2a5872023-03-28 11:46:17 +0200676 return mbedtls_md_psa_alg_from_type(ciphersuite_info->mac);
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 }
Jerry Yua99cbfa2022-10-08 11:17:14 +0800678
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 return PSA_ALG_NONE;
Jerry Yuf7c12592022-09-28 22:09:38 +0800680}
681
Jerry Yuf75364b2022-09-30 10:30:31 +0800682#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100683static int ssl_tls13_has_configured_ticket(mbedtls_ssl_context *ssl)
Xiaokang Qianb781a232022-11-01 07:39:46 +0000684{
685 mbedtls_ssl_session *session = ssl->session_negotiate;
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 return ssl->handshake->resume &&
Pengyu Lv93566782022-12-07 12:10:05 +0800687 session != NULL && session->ticket != NULL &&
Pengyu Lv9b84ea72023-01-16 14:08:23 +0800688 mbedtls_ssl_conf_tls13_check_kex_modes(
689 ssl, mbedtls_ssl_session_get_ticket_flags(
690 session, MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL));
Xiaokang Qianb781a232022-11-01 07:39:46 +0000691}
692
Xiaokang Qian01323a42022-11-03 02:27:35 +0000693#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +0100694static int ssl_tls13_early_data_has_valid_ticket(mbedtls_ssl_context *ssl)
Xiaokang Qian01323a42022-11-03 02:27:35 +0000695{
696 mbedtls_ssl_session *session = ssl->session_negotiate;
Gilles Peskine449bd832023-01-11 14:50:10 +0100697 return ssl->handshake->resume &&
698 session->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
699 (session->ticket_flags &
700 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA) &&
701 mbedtls_ssl_tls13_cipher_suite_is_offered(
702 ssl, session->ciphersuite);
Xiaokang Qian01323a42022-11-03 02:27:35 +0000703}
704#endif
705
Xiaokang Qianb781a232022-11-01 07:39:46 +0000706MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100707static int ssl_tls13_ticket_get_identity(mbedtls_ssl_context *ssl,
708 psa_algorithm_t *hash_alg,
709 const unsigned char **identity,
710 size_t *identity_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800711{
712 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu8b41e892022-09-30 10:00:20 +0800713
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 if (!ssl_tls13_has_configured_ticket(ssl)) {
715 return -1;
716 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800717
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite);
Jerry Yuf7c12592022-09-28 22:09:38 +0800719 *identity = session->ticket;
720 *identity_len = session->ticket_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100721 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800722}
723
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800724MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100725static int ssl_tls13_ticket_get_psk(mbedtls_ssl_context *ssl,
726 psa_algorithm_t *hash_alg,
727 const unsigned char **psk,
728 size_t *psk_len)
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800729{
730
731 mbedtls_ssl_session *session = ssl->session_negotiate;
732
Gilles Peskine449bd832023-01-11 14:50:10 +0100733 if (!ssl_tls13_has_configured_ticket(ssl)) {
734 return -1;
735 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800736
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite);
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800738 *psk = session->resumption_key;
739 *psk_len = session->resumption_key_len;
740
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 return 0;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800742}
Jerry Yuf7c12592022-09-28 22:09:38 +0800743#endif /* MBEDTLS_SSL_SESSION_TICKETS */
744
745MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100746static int ssl_tls13_psk_get_identity(mbedtls_ssl_context *ssl,
747 psa_algorithm_t *hash_alg,
748 const unsigned char **identity,
749 size_t *identity_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800750{
Jerry Yu8b41e892022-09-30 10:00:20 +0800751
Gilles Peskine449bd832023-01-11 14:50:10 +0100752 if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
753 return -1;
754 }
Jerry Yuf7c12592022-09-28 22:09:38 +0800755
Jerry Yua99cbfa2022-10-08 11:17:14 +0800756 *hash_alg = PSA_ALG_SHA_256;
Jerry Yuf7c12592022-09-28 22:09:38 +0800757 *identity = ssl->conf->psk_identity;
758 *identity_len = ssl->conf->psk_identity_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100759 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800760}
761
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800762MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100763static int ssl_tls13_psk_get_psk(mbedtls_ssl_context *ssl,
764 psa_algorithm_t *hash_alg,
765 const unsigned char **psk,
766 size_t *psk_len)
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800767{
Jerry Yu8b41e892022-09-30 10:00:20 +0800768
Gilles Peskine449bd832023-01-11 14:50:10 +0100769 if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
770 return -1;
771 }
Jerry Yu8b41e892022-09-30 10:00:20 +0800772
Jerry Yua99cbfa2022-10-08 11:17:14 +0800773 *hash_alg = PSA_ALG_SHA_256;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800774 *psk = ssl->conf->psk;
775 *psk_len = ssl->conf->psk_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100776 return 0;
Jerry Yu1a0a0f42022-09-28 22:11:02 +0800777}
778
Gilles Peskine449bd832023-01-11 14:50:10 +0100779static int ssl_tls13_get_configured_psk_count(mbedtls_ssl_context *ssl)
Jerry Yuf75364b2022-09-30 10:30:31 +0800780{
781 int configured_psk_count = 0;
782#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 if (ssl_tls13_has_configured_ticket(ssl)) {
784 MBEDTLS_SSL_DEBUG_MSG(3, ("Ticket is configured"));
Jerry Yuf75364b2022-09-30 10:30:31 +0800785 configured_psk_count++;
786 }
787#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
789 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK is configured"));
Jerry Yuf75364b2022-09-30 10:30:31 +0800790 configured_psk_count++;
791 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100792 return configured_psk_count;
Jerry Yuf75364b2022-09-30 10:30:31 +0800793}
794
Jerry Yuf7c12592022-09-28 22:09:38 +0800795MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100796static int ssl_tls13_write_identity(mbedtls_ssl_context *ssl,
797 unsigned char *buf,
798 unsigned char *end,
799 const unsigned char *identity,
800 size_t identity_len,
801 uint32_t obfuscated_ticket_age,
802 size_t *out_len)
Jerry Yuf7c12592022-09-28 22:09:38 +0800803{
Jerry Yuf75364b2022-09-30 10:30:31 +0800804 ((void) ssl);
Jerry Yuf7c12592022-09-28 22:09:38 +0800805 *out_len = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800806
807 /*
808 * - identity_len (2 bytes)
809 * - identity (psk_identity_len bytes)
810 * - obfuscated_ticket_age (4 bytes)
811 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 MBEDTLS_PUT_UINT16_BE(identity_len, buf, 0);
815 memcpy(buf + 2, identity, identity_len);
816 MBEDTLS_PUT_UINT32_BE(obfuscated_ticket_age, buf, 2 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800817
Gilles Peskine449bd832023-01-11 14:50:10 +0100818 MBEDTLS_SSL_DEBUG_BUF(4, "write identity", buf, 6 + identity_len);
Jerry Yuf7c12592022-09-28 22:09:38 +0800819
820 *out_len = 6 + identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800821
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800823}
824
Jerry Yu8b41e892022-09-30 10:00:20 +0800825MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100826static int ssl_tls13_write_binder(mbedtls_ssl_context *ssl,
827 unsigned char *buf,
828 unsigned char *end,
829 int psk_type,
830 psa_algorithm_t hash_alg,
831 const unsigned char *psk,
832 size_t psk_len,
833 size_t *out_len)
Jerry Yu8b41e892022-09-30 10:00:20 +0800834{
835 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu8b41e892022-09-30 10:00:20 +0800836 unsigned char binder_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu8b41e892022-09-30 10:00:20 +0800838 size_t transcript_len = 0;
839
840 *out_len = 0;
841
Gilles Peskine449bd832023-01-11 14:50:10 +0100842 binder_len = PSA_HASH_LENGTH(hash_alg);
Jerry Yu8b41e892022-09-30 10:00:20 +0800843
844 /*
845 * - binder_len (1 bytes)
846 * - binder (binder_len bytes)
847 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100848 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1 + binder_len);
Jerry Yu8b41e892022-09-30 10:00:20 +0800849
Jerry Yua99cbfa2022-10-08 11:17:14 +0800850 buf[0] = binder_len;
Jerry Yu8b41e892022-09-30 10:00:20 +0800851
852 /* Get current state of handshake transcript. */
853 ret = mbedtls_ssl_get_handshake_transcript(
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +0200854 ssl, mbedtls_md_type_from_psa_alg(hash_alg),
Gilles Peskine449bd832023-01-11 14:50:10 +0100855 transcript, sizeof(transcript), &transcript_len);
856 if (ret != 0) {
857 return ret;
Jerry Yu8b41e892022-09-30 10:00:20 +0800858 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100859
860 ret = mbedtls_ssl_tls13_create_psk_binder(ssl, hash_alg,
861 psk, psk_len, psk_type,
862 transcript, buf + 1);
863 if (ret != 0) {
864 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_create_psk_binder", ret);
865 return ret;
866 }
867 MBEDTLS_SSL_DEBUG_BUF(4, "write binder", buf, 1 + binder_len);
Jerry Yu8b41e892022-09-30 10:00:20 +0800868
869 *out_len = 1 + binder_len;
870
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 return 0;
Jerry Yu8b41e892022-09-30 10:00:20 +0800872}
873
874/*
875 * mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext() structure:
876 *
877 * struct {
878 * opaque identity<1..2^16-1>;
879 * uint32 obfuscated_ticket_age;
880 * } PskIdentity;
881 *
882 * opaque PskBinderEntry<32..255>;
883 *
884 * struct {
885 * PskIdentity identities<7..2^16-1>;
886 * PskBinderEntry binders<33..2^16-1>;
887 * } OfferedPsks;
888 *
889 * struct {
890 * select (Handshake.msg_type) {
891 * case client_hello: OfferedPsks;
892 * ...
893 * };
894 * } PreSharedKeyExtension;
895 *
896 */
XiaokangQian3ad67bf2022-07-21 02:26:21 +0000897int mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +0100898 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end,
899 size_t *out_len, size_t *binders_len)
XiaokangQianeb69aee2022-07-05 08:21:43 +0000900{
Jerry Yuf7c12592022-09-28 22:09:38 +0800901 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yuf75364b2022-09-30 10:30:31 +0800902 int configured_psk_count = 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800903 unsigned char *p = buf;
Xiaokang Qian854db282022-12-19 07:31:27 +0000904 psa_algorithm_t hash_alg = PSA_ALG_NONE;
Jerry Yuf75364b2022-09-30 10:30:31 +0800905 const unsigned char *identity;
906 size_t identity_len;
Jerry Yuf7c12592022-09-28 22:09:38 +0800907 size_t l_binders_len = 0;
Jerry Yuf75364b2022-09-30 10:30:31 +0800908 size_t output_len;
Xiaokang Qian7179f812023-02-03 03:38:44 +0000909
Jerry Yuf7c12592022-09-28 22:09:38 +0800910 *out_len = 0;
911 *binders_len = 0;
912
913 /* Check if we have any PSKs to offer. If no, skip pre_shared_key */
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 configured_psk_count = ssl_tls13_get_configured_psk_count(ssl);
915 if (configured_psk_count == 0) {
916 MBEDTLS_SSL_DEBUG_MSG(3, ("skip pre_shared_key extensions"));
917 return 0;
Jerry Yuf7c12592022-09-28 22:09:38 +0800918 }
919
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 MBEDTLS_SSL_DEBUG_MSG(4, ("Pre-configured PSK number = %d",
921 configured_psk_count));
Jerry Yuf75364b2022-09-30 10:30:31 +0800922
Jerry Yuf7c12592022-09-28 22:09:38 +0800923 /* Check if we have space to write the extension, binders included.
924 * - extension_type (2 bytes)
925 * - extension_data_len (2 bytes)
926 * - identities_len (2 bytes)
927 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Jerry Yuf7c12592022-09-28 22:09:38 +0800929 p += 6;
930
Jerry Yuf75364b2022-09-30 10:30:31 +0800931#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100932 if (ssl_tls13_ticket_get_identity(
933 ssl, &hash_alg, &identity, &identity_len) == 0) {
Jerry Yuf75364b2022-09-30 10:30:31 +0800934#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 mbedtls_time_t now = mbedtls_time(NULL);
Jerry Yuf75364b2022-09-30 10:30:31 +0800936 mbedtls_ssl_session *session = ssl->session_negotiate;
Jerry Yu6916e702022-10-10 21:33:51 +0800937 uint32_t obfuscated_ticket_age =
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 (uint32_t) (now - session->ticket_received);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800939
Jerry Yu3e60cad2023-01-10 14:58:08 +0800940 /*
941 * The ticket timestamp is in seconds but the ticket age is in
942 * milliseconds. If the ticket was received at the end of a second and
943 * re-used here just at the beginning of the next second, the computed
944 * age `now - session->ticket_received` is equal to 1s thus 1000 ms
945 * while the actual age could be just a few milliseconds or tens of
946 * milliseconds. If the server has more accurate ticket timestamps
947 * (typically timestamps in milliseconds), as part of the processing of
948 * the ClientHello, it may compute a ticket lifetime smaller than the
949 * one computed here and potentially reject the ticket. To avoid that,
950 * remove one second to the ticket age if possible.
Jerry Yubdb936b2023-01-07 16:07:46 +0800951 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 if (obfuscated_ticket_age > 0) {
Jerry Yubdb936b2023-01-07 16:07:46 +0800953 obfuscated_ticket_age -= 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 }
Jerry Yubdb936b2023-01-07 16:07:46 +0800955
Jerry Yuf75364b2022-09-30 10:30:31 +0800956 obfuscated_ticket_age *= 1000;
957 obfuscated_ticket_age += session->ticket_age_add;
Jerry Yua99cbfa2022-10-08 11:17:14 +0800958
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 ret = ssl_tls13_write_identity(ssl, p, end,
960 identity, identity_len,
961 obfuscated_ticket_age,
962 &output_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800963#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len,
965 0, &output_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800966#endif /* MBEDTLS_HAVE_TIME */
Gilles Peskine449bd832023-01-11 14:50:10 +0100967 if (ret != 0) {
968 return ret;
969 }
Jerry Yuf7c12592022-09-28 22:09:38 +0800970
Jerry Yuf75364b2022-09-30 10:30:31 +0800971 p += output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100972 l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg);
Jerry Yuf75364b2022-09-30 10:30:31 +0800973 }
974#endif /* MBEDTLS_SSL_SESSION_TICKETS */
975
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 if (ssl_tls13_psk_get_identity(
977 ssl, &hash_alg, &identity, &identity_len) == 0) {
Jerry Yuf75364b2022-09-30 10:30:31 +0800978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len, 0,
980 &output_len);
981 if (ret != 0) {
982 return ret;
983 }
Jerry Yuf75364b2022-09-30 10:30:31 +0800984
Jerry Yuf7c12592022-09-28 22:09:38 +0800985 p += output_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100986 l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg);
Jerry Yuf7c12592022-09-28 22:09:38 +0800987 }
988
Gilles Peskine449bd832023-01-11 14:50:10 +0100989 MBEDTLS_SSL_DEBUG_MSG(3,
990 ("client hello, adding pre_shared_key extension, "
991 "omitting PSK binder list"));
Jerry Yua99cbfa2022-10-08 11:17:14 +0800992
993 /* Take into account the two bytes for the length of the binders. */
994 l_binders_len += 2;
Jerry Yu6916e702022-10-10 21:33:51 +0800995 /* Check if there is enough space for binders */
Gilles Peskine449bd832023-01-11 14:50:10 +0100996 MBEDTLS_SSL_CHK_BUF_PTR(p, end, l_binders_len);
Jerry Yua99cbfa2022-10-08 11:17:14 +0800997
Jerry Yuf7c12592022-09-28 22:09:38 +0800998 /*
999 * - extension_type (2 bytes)
1000 * - extension_data_len (2 bytes)
1001 * - identities_len (2 bytes)
1002 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001003 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PRE_SHARED_KEY, buf, 0);
1004 MBEDTLS_PUT_UINT16_BE(p - buf - 4 + l_binders_len, buf, 2);
1005 MBEDTLS_PUT_UINT16_BE(p - buf - 6, buf, 4);
Jerry Yuf7c12592022-09-28 22:09:38 +08001006
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 *out_len = (p - buf) + l_binders_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001008 *binders_len = l_binders_len;
Jerry Yuf7c12592022-09-28 22:09:38 +08001009
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key identities", buf, p - buf);
Jerry Yuf7c12592022-09-28 22:09:38 +08001011
Gilles Peskine449bd832023-01-11 14:50:10 +01001012 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001013}
1014
XiaokangQian86981952022-07-19 09:51:50 +00001015int mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext(
Gilles Peskine449bd832023-01-11 14:50:10 +01001016 mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end)
XiaokangQianeb69aee2022-07-05 08:21:43 +00001017{
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001018 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1019 unsigned char *p = buf;
Jerry Yu6183cc72022-09-30 11:08:57 +08001020 psa_algorithm_t hash_alg = PSA_ALG_NONE;
1021 const unsigned char *psk;
1022 size_t psk_len;
1023 size_t output_len;
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001024
1025 /* Check if we have space to write binders_len.
1026 * - binders_len (2 bytes)
1027 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001029 p += 2;
1030
Jerry Yu6183cc72022-09-30 11:08:57 +08001031#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) {
Jerry Yu6183cc72022-09-30 11:08:57 +08001033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 ret = ssl_tls13_write_binder(ssl, p, end,
1035 MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION,
1036 hash_alg, psk, psk_len,
1037 &output_len);
1038 if (ret != 0) {
1039 return ret;
1040 }
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001041 p += output_len;
1042 }
Jerry Yu6183cc72022-09-30 11:08:57 +08001043#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001044
Gilles Peskine449bd832023-01-11 14:50:10 +01001045 if (ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) {
Jerry Yu6183cc72022-09-30 11:08:57 +08001046
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 ret = ssl_tls13_write_binder(ssl, p, end,
1048 MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL,
1049 hash_alg, psk, psk_len,
1050 &output_len);
1051 if (ret != 0) {
1052 return ret;
1053 }
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001054 p += output_len;
1055 }
1056
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding PSK binder list."));
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001058
1059 /*
1060 * - binders_len (2 bytes)
1061 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001062 MBEDTLS_PUT_UINT16_BE(p - buf - 2, buf, 0);
Jerry Yu1a0a0f42022-09-28 22:11:02 +08001063
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key binders", buf, p - buf);
XiaokangQianeb69aee2022-07-05 08:21:43 +00001065
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001066 mbedtls_ssl_tls13_set_hs_sent_ext_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY);
Jerry Yu0c354a22022-08-29 15:25:36 +08001068
Gilles Peskine449bd832023-01-11 14:50:10 +01001069 return 0;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001070}
Jerry Yu0c6105b2022-08-12 17:26:40 +08001071
1072/*
1073 * struct {
1074 * opaque identity<1..2^16-1>;
1075 * uint32 obfuscated_ticket_age;
1076 * } PskIdentity;
1077 *
1078 * opaque PskBinderEntry<32..255>;
1079 *
1080 * struct {
1081 *
1082 * select (Handshake.msg_type) {
1083 * ...
1084 * case server_hello: uint16 selected_identity;
1085 * };
1086 *
1087 * } PreSharedKeyExtension;
1088 *
1089 */
1090MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001091static int ssl_tls13_parse_server_pre_shared_key_ext(mbedtls_ssl_context *ssl,
1092 const unsigned char *buf,
1093 const unsigned char *end)
Jerry Yu0c6105b2022-08-12 17:26:40 +08001094{
Jerry Yua99cbfa2022-10-08 11:17:14 +08001095 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub300e3c2022-09-28 22:12:07 +08001096 int selected_identity;
Jerry Yub300e3c2022-09-28 22:12:07 +08001097 const unsigned char *psk;
1098 size_t psk_len;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001099 psa_algorithm_t hash_alg;
Jerry Yub300e3c2022-09-28 22:12:07 +08001100
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2);
1102 selected_identity = MBEDTLS_GET_UINT16_BE(buf, 0);
Xiaokang Qian2a674932023-01-04 03:15:09 +00001103 ssl->handshake->selected_identity = (uint16_t) selected_identity;
Jerry Yua99cbfa2022-10-08 11:17:14 +08001104
Gilles Peskine449bd832023-01-11 14:50:10 +01001105 MBEDTLS_SSL_DEBUG_MSG(3, ("selected_identity = %d", selected_identity));
Jerry Yua99cbfa2022-10-08 11:17:14 +08001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 if (selected_identity >= ssl_tls13_get_configured_psk_count(ssl)) {
1108 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid PSK identity."));
Jerry Yu4a698342022-09-30 12:22:01 +08001109
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1111 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1112 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yub300e3c2022-09-28 22:12:07 +08001113 }
Jerry Yua99cbfa2022-10-08 11:17:14 +08001114
Jerry Yu4a698342022-09-30 12:22:01 +08001115#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 if (selected_identity == 0 && ssl_tls13_has_configured_ticket(ssl)) {
1117 ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len);
1118 } else
Jerry Yu4a698342022-09-30 12:22:01 +08001119#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) {
1121 ret = ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len);
1122 } else {
1123 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1124 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yub300e3c2022-09-28 22:12:07 +08001125 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 if (ret != 0) {
1127 return ret;
Jerry Yub300e3c2022-09-28 22:12:07 +08001128 }
Jerry Yub300e3c2022-09-28 22:12:07 +08001129
Manuel Pégourié-Gonnard1f2a5872023-03-28 11:46:17 +02001130 if (mbedtls_md_psa_alg_from_type(ssl->handshake->ciphersuite_info->mac)
Xiaokang Qianeb31cbc2023-02-07 02:08:56 +00001131 != hash_alg) {
1132 MBEDTLS_SSL_DEBUG_MSG(
1133 1, ("Invalid ciphersuite for external psk."));
1134
1135 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1136 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1137 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1138 }
1139
Gilles Peskine449bd832023-01-11 14:50:10 +01001140 ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len);
1141 if (ret != 0) {
1142 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
1143 return ret;
1144 }
1145
1146 return 0;
Jerry Yu0c6105b2022-08-12 17:26:40 +08001147}
Ronald Cron41a443a2022-10-04 16:38:25 +02001148#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
XiaokangQianeb69aee2022-07-05 08:21:43 +00001149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150int mbedtls_ssl_tls13_write_client_hello_exts(mbedtls_ssl_context *ssl,
1151 unsigned char *buf,
1152 unsigned char *end,
1153 size_t *out_len)
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001154{
1155 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1156 unsigned char *p = buf;
1157 size_t ext_len;
1158
1159 *out_len = 0;
1160
1161 /* Write supported_versions extension
1162 *
1163 * Supported Versions Extension is mandatory with TLS 1.3.
1164 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 ret = ssl_tls13_write_supported_versions_ext(ssl, p, end, &ext_len);
1166 if (ret != 0) {
1167 return ret;
1168 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001169 p += ext_len;
1170
1171 /* Echo the cookie if the server provided one in its preceding
1172 * HelloRetryRequest message.
1173 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001174 ret = ssl_tls13_write_cookie_ext(ssl, p, end, &ext_len);
1175 if (ret != 0) {
1176 return ret;
1177 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001178 p += ext_len;
1179
Ronald Cron766c0cd2022-10-18 12:17:11 +02001180#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1182 ret = ssl_tls13_write_key_share_ext(ssl, p, end, &ext_len);
1183 if (ret != 0) {
1184 return ret;
1185 }
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001186 p += ext_len;
1187 }
Ronald Cron766c0cd2022-10-18 12:17:11 +02001188#endif
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001189
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001190#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 if (mbedtls_ssl_conf_tls13_some_psk_enabled(ssl) &&
1192 ssl_tls13_early_data_has_valid_ticket(ssl) &&
1193 ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED) {
1194 ret = mbedtls_ssl_tls13_write_early_data_ext(ssl, p, end, &ext_len);
1195 if (ret != 0) {
1196 return ret;
1197 }
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001198 p += ext_len;
1199
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001200 /* Initializes the status to `rejected`. It will be updated to
1201 * `accepted` if the EncryptedExtension message contain an early data
1202 * indication extension.
Xiaokang Qiana042b842022-11-09 01:59:33 +00001203 */
Ronald Cron4a8c9e22022-10-26 18:49:09 +02001204 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001205 } else {
1206 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write early_data extension"));
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00001207 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001208 }
1209#endif /* MBEDTLS_SSL_EARLY_DATA */
1210
Ronald Cron41a443a2022-10-04 16:38:25 +02001211#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
XiaokangQianeb69aee2022-07-05 08:21:43 +00001212 /* For PSK-based key exchange we need the pre_shared_key extension
1213 * and the psk_key_exchange_modes extension.
1214 *
1215 * The pre_shared_key extension MUST be the last extension in the
1216 * ClientHello. Servers MUST check that it is the last extension and
1217 * otherwise fail the handshake with an "illegal_parameter" alert.
1218 *
1219 * Add the psk_key_exchange_modes extension.
1220 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 ret = ssl_tls13_write_psk_key_exchange_modes_ext(ssl, p, end, &ext_len);
1222 if (ret != 0) {
1223 return ret;
1224 }
XiaokangQianeb69aee2022-07-05 08:21:43 +00001225 p += ext_len;
Ronald Cron41a443a2022-10-04 16:38:25 +02001226#endif
XiaokangQianeb69aee2022-07-05 08:21:43 +00001227
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001228 *out_len = p - buf;
1229
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 return 0;
Ronald Cron04fbd2b2022-02-18 12:06:07 +01001231}
1232
Xiaokang Qian934ce6f2023-02-06 10:23:04 +00001233int mbedtls_ssl_tls13_finalize_client_hello(mbedtls_ssl_context *ssl)
Xiaokang Qian126929f2023-01-03 10:29:41 +00001234{
Xiaokang Qian90746132023-01-06 05:54:59 +00001235 ((void) ssl);
Xiaokang Qian79f77522023-01-28 10:35:29 +00001236
Xiaokang Qian126929f2023-01-03 10:29:41 +00001237#if defined(MBEDTLS_SSL_EARLY_DATA)
1238 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1239 psa_algorithm_t hash_alg = PSA_ALG_NONE;
1240 const unsigned char *psk;
1241 size_t psk_len;
1242 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Xiaokang Qian592021a2023-01-04 10:47:05 +00001243
Xiaokang Qian126929f2023-01-03 10:29:41 +00001244 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) {
Xiaokang Qian6be82902023-02-03 06:04:43 +00001245#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1246 mbedtls_ssl_handshake_set_state(
1247 ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO);
1248#endif
Xiaokang Qian126929f2023-01-03 10:29:41 +00001249 MBEDTLS_SSL_DEBUG_MSG(
1250 1, ("Set hs psk for early data when writing the first psk"));
1251
1252 ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len);
1253 if (ret != 0) {
1254 MBEDTLS_SSL_DEBUG_RET(
1255 1, "ssl_tls13_ticket_get_psk", ret);
1256 return ret;
1257 }
1258
1259 ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len);
1260 if (ret != 0) {
1261 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
1262 return ret;
1263 }
1264
Xiaokang Qian64bc9bc2023-02-07 02:32:23 +00001265 /*
1266 * Early data are going to be encrypted using the ciphersuite
1267 * associated with the pre-shared key used for the handshake.
1268 * Note that if the server rejects early data, the handshake
1269 * based on the pre-shared key may complete successfully
1270 * with a selected ciphersuite different from the ciphersuite
1271 * associated with the pre-shared key. Only the hashes of the
1272 * two ciphersuites have to be the same. In that case, the
1273 * encrypted handshake data and application data are
1274 * encrypted using a different ciphersuite than the one used for
1275 * the rejected early data.
1276 */
Xiaokang Qian126929f2023-01-03 10:29:41 +00001277 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(
1278 ssl->session_negotiate->ciphersuite);
1279 ssl->handshake->ciphersuite_info = ciphersuite_info;
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001280
Tom Cosgrove5c8505f2023-03-07 11:39:52 +00001281 /* Enable psk and psk_ephemeral to make stage early happy */
Xiaokang Qian126929f2023-01-03 10:29:41 +00001282 ssl->handshake->key_exchange_mode =
1283 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
1284
1285 /* Start the TLS 1.3 key schedule:
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001286 * Set the PSK and derive early secret.
Xiaokang Qian126929f2023-01-03 10:29:41 +00001287 */
1288 ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1289 if (ret != 0) {
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001290 MBEDTLS_SSL_DEBUG_RET(
1291 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret);
Xiaokang Qian126929f2023-01-03 10:29:41 +00001292 return ret;
1293 }
1294
1295 /* Derive early data key material */
1296 ret = mbedtls_ssl_tls13_compute_early_transform(ssl);
1297 if (ret != 0) {
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001298 MBEDTLS_SSL_DEBUG_RET(
1299 1, "mbedtls_ssl_tls13_compute_early_transform", ret);
Xiaokang Qian126929f2023-01-03 10:29:41 +00001300 return ret;
1301 }
1302
Xiaokang Qian126929f2023-01-03 10:29:41 +00001303 }
1304#endif /* MBEDTLS_SSL_EARLY_DATA */
1305 return 0;
1306}
Jerry Yu1bc2c1f2021-09-01 12:57:29 +08001307/*
Jerry Yu4a173382021-10-11 21:45:31 +08001308 * Functions for parsing and processing Server Hello
Jerry Yue1b9c292021-09-10 10:08:31 +08001309 */
Ronald Cronfd6193c2022-04-05 11:04:20 +02001310
Ronald Cronda41b382022-03-30 09:57:11 +02001311/**
1312 * \brief Detect if the ServerHello contains a supported_versions extension
1313 * or not.
1314 *
1315 * \param[in] ssl SSL context
1316 * \param[in] buf Buffer containing the ServerHello message
1317 * \param[in] end End of the buffer containing the ServerHello message
1318 *
1319 * \return 0 if the ServerHello does not contain a supported_versions extension
1320 * \return 1 if the ServerHello contains a supported_versions extension
1321 * \return A negative value if an error occurred while parsing the ServerHello.
1322 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001323MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Cron9f0fba32022-02-10 16:45:15 +01001324static int ssl_tls13_is_supported_versions_ext_present(
1325 mbedtls_ssl_context *ssl,
1326 const unsigned char *buf,
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 const unsigned char *end)
Ronald Cron9f0fba32022-02-10 16:45:15 +01001328{
1329 const unsigned char *p = buf;
1330 size_t legacy_session_id_echo_len;
Ronald Croneff56732023-04-03 17:36:31 +02001331 const unsigned char *supported_versions_data;
1332 const unsigned char *supported_versions_data_end;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001333
1334 /*
1335 * Check there is enough data to access the legacy_session_id_echo vector
Ronald Cronda41b382022-03-30 09:57:11 +02001336 * length:
1337 * - legacy_version 2 bytes
1338 * - random MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes
1339 * - legacy_session_id_echo length 1 byte
Ronald Cron9f0fba32022-02-10 16:45:15 +01001340 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 3);
Ronald Cron9f0fba32022-02-10 16:45:15 +01001342 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2;
1343 legacy_session_id_echo_len = *p;
1344
1345 /*
1346 * Jump to the extensions, jumping over:
1347 * - legacy_session_id_echo (legacy_session_id_echo_len + 1) bytes
1348 * - cipher_suite 2 bytes
1349 * - legacy_compression_method 1 byte
1350 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len + 4);
1352 p += legacy_session_id_echo_len + 4;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001353
Ronald Cron47dce632023-02-08 17:38:29 +01001354 return mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
1355 ssl, p, end,
Ronald Croneff56732023-04-03 17:36:31 +02001356 &supported_versions_data, &supported_versions_data_end);
Ronald Cron9f0fba32022-02-10 16:45:15 +01001357}
1358
Jerry Yu7a186a02021-10-15 18:46:14 +08001359/* Returns a negative value on failure, and otherwise
Ronald Cronfd6193c2022-04-05 11:04:20 +02001360 * - 1 if the last eight bytes of the ServerHello random bytes indicate that
1361 * the server is TLS 1.3 capable but negotiating TLS 1.2 or below.
1362 * - 0 otherwise
1363 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001364MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001365static int ssl_tls13_is_downgrade_negotiation(mbedtls_ssl_context *ssl,
1366 const unsigned char *buf,
1367 const unsigned char *end)
Ronald Cronfd6193c2022-04-05 11:04:20 +02001368{
1369 /* First seven bytes of the magic downgrade strings, see RFC 8446 4.1.3 */
1370 static const unsigned char magic_downgrade_string[] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 { 0x44, 0x4F, 0x57, 0x4E, 0x47, 0x52, 0x44 };
Ronald Cronfd6193c2022-04-05 11:04:20 +02001372 const unsigned char *last_eight_bytes_of_random;
1373 unsigned char last_byte_of_random;
1374
Gilles Peskine449bd832023-01-11 14:50:10 +01001375 MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2);
Ronald Cronfd6193c2022-04-05 11:04:20 +02001376 last_eight_bytes_of_random = buf + 2 + MBEDTLS_SERVER_HELLO_RANDOM_LEN - 8;
1377
Gilles Peskine449bd832023-01-11 14:50:10 +01001378 if (memcmp(last_eight_bytes_of_random,
1379 magic_downgrade_string,
1380 sizeof(magic_downgrade_string)) == 0) {
Ronald Cronfd6193c2022-04-05 11:04:20 +02001381 last_byte_of_random = last_eight_bytes_of_random[7];
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 return last_byte_of_random == 0 ||
1383 last_byte_of_random == 1;
Ronald Cronfd6193c2022-04-05 11:04:20 +02001384 }
1385
Gilles Peskine449bd832023-01-11 14:50:10 +01001386 return 0;
Ronald Cronfd6193c2022-04-05 11:04:20 +02001387}
1388
1389/* Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001390 * - SSL_SERVER_HELLO or
1391 * - SSL_SERVER_HELLO_HRR
XiaokangQian51eff222021-12-10 10:33:56 +00001392 * to indicate which message is expected and to be parsed next.
1393 */
Ronald Cron828aff62022-05-31 12:04:31 +02001394#define SSL_SERVER_HELLO 0
1395#define SSL_SERVER_HELLO_HRR 1
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001396MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001397static int ssl_server_hello_is_hrr(mbedtls_ssl_context *ssl,
1398 const unsigned char *buf,
1399 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001400{
Jerry Yue1b9c292021-09-10 10:08:31 +08001401
1402 /* Check whether this message is a HelloRetryRequest ( HRR ) message.
1403 *
Jerry Yu4a173382021-10-11 21:45:31 +08001404 * Server Hello and HRR are only distinguished by Random set to the
Jerry Yue1b9c292021-09-10 10:08:31 +08001405 * special value of the SHA-256 of "HelloRetryRequest".
1406 *
1407 * struct {
1408 * ProtocolVersion legacy_version = 0x0303;
1409 * Random random;
1410 * opaque legacy_session_id_echo<0..32>;
1411 * CipherSuite cipher_suite;
1412 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001413 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001414 * } ServerHello;
1415 *
1416 */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001417 MBEDTLS_SSL_CHK_BUF_READ_PTR(
1418 buf, end, 2 + sizeof(mbedtls_ssl_tls13_hello_retry_request_magic));
Jerry Yu4a173382021-10-11 21:45:31 +08001419
Gilles Peskine449bd832023-01-11 14:50:10 +01001420 if (memcmp(buf + 2, mbedtls_ssl_tls13_hello_retry_request_magic,
1421 sizeof(mbedtls_ssl_tls13_hello_retry_request_magic)) == 0) {
1422 return SSL_SERVER_HELLO_HRR;
Jerry Yue1b9c292021-09-10 10:08:31 +08001423 }
1424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 return SSL_SERVER_HELLO;
Jerry Yue1b9c292021-09-10 10:08:31 +08001426}
1427
Ronald Cron828aff62022-05-31 12:04:31 +02001428/*
Jerry Yu745bb612021-10-13 22:01:04 +08001429 * Returns a negative value on failure, and otherwise
Ronald Cron828aff62022-05-31 12:04:31 +02001430 * - SSL_SERVER_HELLO or
1431 * - SSL_SERVER_HELLO_HRR or
1432 * - SSL_SERVER_HELLO_TLS1_2
Jerry Yu745bb612021-10-13 22:01:04 +08001433 */
Ronald Cron828aff62022-05-31 12:04:31 +02001434#define SSL_SERVER_HELLO_TLS1_2 2
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001435MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001436static int ssl_tls13_preprocess_server_hello(mbedtls_ssl_context *ssl,
1437 const unsigned char *buf,
1438 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001439{
Jerry Yu4a173382021-10-11 21:45:31 +08001440 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Ronald Cron5afb9042022-05-31 12:11:39 +02001441 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yue1b9c292021-09-10 10:08:31 +08001442
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_is_supported_versions_ext_present(
1444 ssl, buf, end));
Jerry Yua66fece2022-07-13 14:30:29 +08001445
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 if (ret == 0) {
Ronald Cronfd6193c2022-04-05 11:04:20 +02001447 MBEDTLS_SSL_PROC_CHK_NEG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 ssl_tls13_is_downgrade_negotiation(ssl, buf, end));
Ronald Cronfd6193c2022-04-05 11:04:20 +02001449
1450 /* If the server is negotiating TLS 1.2 or below and:
1451 * . we did not propose TLS 1.2 or
1452 * . the server responded it is TLS 1.3 capable but negotiating a lower
1453 * version of the protocol and thus we are under downgrade attack
1454 * abort the handshake with an "illegal parameter" alert.
Ronald Cron9f0fba32022-02-10 16:45:15 +01001455 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 if (handshake->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2 || ret) {
1457 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1458 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1459 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001460 }
1461
Ronald Cronb828c7d2023-04-03 16:37:22 +02001462 /*
1463 * Version 1.2 of the protocol has been negotiated, set the
1464 * ssl->keep_current_message flag for the ServerHello to be kept and
1465 * parsed as a TLS 1.2 ServerHello. We also change ssl->tls_version to
1466 * MBEDTLS_SSL_VERSION_TLS1_2 thus from now on mbedtls_ssl_handshake_step()
1467 * will dispatch to the TLS 1.2 state machine.
1468 */
Ronald Cron9f0fba32022-02-10 16:45:15 +01001469 ssl->keep_current_message = 1;
Glenn Strauss60bfe602022-03-14 19:04:24 -04001470 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001471 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1472 ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
1473 buf, (size_t) (end - buf)));
Ronald Cron9f0fba32022-02-10 16:45:15 +01001474
Gilles Peskine449bd832023-01-11 14:50:10 +01001475 if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1476 ret = ssl_tls13_reset_key_share(ssl);
1477 if (ret != 0) {
1478 return ret;
1479 }
Ronald Cron9f0fba32022-02-10 16:45:15 +01001480 }
1481
Gilles Peskine449bd832023-01-11 14:50:10 +01001482 return SSL_SERVER_HELLO_TLS1_2;
Ronald Cron9f0fba32022-02-10 16:45:15 +01001483 }
1484
Jerry Yua66fece2022-07-13 14:30:29 +08001485#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1486 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
1487 ssl->session_negotiate->tls_version = ssl->tls_version;
1488#endif /* MBEDTLS_SSL_SESSION_TICKETS */
1489
Jerry Yu50e00e32022-10-31 14:45:01 +08001490 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Ronald Cron5afb9042022-05-31 12:11:39 +02001491
Gilles Peskine449bd832023-01-11 14:50:10 +01001492 ret = ssl_server_hello_is_hrr(ssl, buf, end);
1493 switch (ret) {
Ronald Cron828aff62022-05-31 12:04:31 +02001494 case SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 MBEDTLS_SSL_DEBUG_MSG(2, ("received ServerHello message"));
Jerry Yu745bb612021-10-13 22:01:04 +08001496 break;
Ronald Cron828aff62022-05-31 12:04:31 +02001497 case SSL_SERVER_HELLO_HRR:
Gilles Peskine449bd832023-01-11 14:50:10 +01001498 MBEDTLS_SSL_DEBUG_MSG(2, ("received HelloRetryRequest message"));
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001499 /* If a client receives a second HelloRetryRequest in the same
1500 * connection (i.e., where the ClientHello was itself in response
1501 * to a HelloRetryRequest), it MUST abort the handshake with an
1502 * "unexpected_message" alert.
Gilles Peskine449bd832023-01-11 14:50:10 +01001503 */
1504 if (handshake->hello_retry_request_count > 0) {
1505 MBEDTLS_SSL_DEBUG_MSG(1, ("Multiple HRRs received"));
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001506 MBEDTLS_SSL_PEND_FATAL_ALERT(
1507 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
1508 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
XiaokangQian16acd4b2022-01-14 07:35:47 +00001510 }
XiaokangQian2b01dc32022-01-21 02:53:13 +00001511 /*
1512 * Clients must abort the handshake with an "illegal_parameter"
1513 * alert if the HelloRetryRequest would not result in any change
1514 * in the ClientHello.
1515 * In a PSK only key exchange that what we expect.
1516 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
1518 MBEDTLS_SSL_DEBUG_MSG(1,
1519 ("Unexpected HRR in pure PSK key exchange."));
XiaokangQian2b01dc32022-01-21 02:53:13 +00001520 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001521 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1522 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1523 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
XiaokangQian2b01dc32022-01-21 02:53:13 +00001524 }
XiaokangQian16acd4b2022-01-14 07:35:47 +00001525
Ronald Cron5afb9042022-05-31 12:11:39 +02001526 handshake->hello_retry_request_count++;
XiaokangQian16acd4b2022-01-14 07:35:47 +00001527
Jerry Yu745bb612021-10-13 22:01:04 +08001528 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001529 }
1530
1531cleanup:
1532
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08001534}
1535
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001536MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001537static int ssl_tls13_check_server_hello_session_id_echo(mbedtls_ssl_context *ssl,
1538 const unsigned char **buf,
1539 const unsigned char *end)
Jerry Yue1b9c292021-09-10 10:08:31 +08001540{
1541 const unsigned char *p = *buf;
Jerry Yu4a173382021-10-11 21:45:31 +08001542 size_t legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001543
Gilles Peskine449bd832023-01-11 14:50:10 +01001544 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
1545 legacy_session_id_echo_len = *p++;
Jerry Yue1b9c292021-09-10 10:08:31 +08001546
Gilles Peskine449bd832023-01-11 14:50:10 +01001547 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len);
Jerry Yue1b9c292021-09-10 10:08:31 +08001548
1549 /* legacy_session_id_echo */
Gilles Peskine449bd832023-01-11 14:50:10 +01001550 if (ssl->session_negotiate->id_len != legacy_session_id_echo_len ||
1551 memcmp(ssl->session_negotiate->id, p, legacy_session_id_echo_len) != 0) {
1552 MBEDTLS_SSL_DEBUG_BUF(3, "Expected Session ID",
1553 ssl->session_negotiate->id,
1554 ssl->session_negotiate->id_len);
1555 MBEDTLS_SSL_DEBUG_BUF(3, "Received Session ID", p,
1556 legacy_session_id_echo_len);
Jerry Yu4a173382021-10-11 21:45:31 +08001557
Gilles Peskine449bd832023-01-11 14:50:10 +01001558 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1559 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
Jerry Yu4a173382021-10-11 21:45:31 +08001560
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +08001562 }
1563
Jerry Yu4a173382021-10-11 21:45:31 +08001564 p += legacy_session_id_echo_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001565 *buf = p;
1566
Gilles Peskine449bd832023-01-11 14:50:10 +01001567 MBEDTLS_SSL_DEBUG_BUF(3, "Session ID", ssl->session_negotiate->id,
1568 ssl->session_negotiate->id_len);
1569 return 0;
Jerry Yue1b9c292021-09-10 10:08:31 +08001570}
1571
Jerry Yue1b9c292021-09-10 10:08:31 +08001572/* Parse ServerHello message and configure context
1573 *
1574 * struct {
1575 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1576 * Random random;
1577 * opaque legacy_session_id_echo<0..32>;
1578 * CipherSuite cipher_suite;
1579 * uint8 legacy_compression_method = 0;
Jerry Yub85277e2021-10-13 13:36:05 +08001580 * Extension extensions<6..2^16-1>;
Jerry Yue1b9c292021-09-10 10:08:31 +08001581 * } ServerHello;
1582 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001583MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001584static int ssl_tls13_parse_server_hello(mbedtls_ssl_context *ssl,
1585 const unsigned char *buf,
1586 const unsigned char *end,
1587 int is_hrr)
Jerry Yue1b9c292021-09-10 10:08:31 +08001588{
Jerry Yub85277e2021-10-13 13:36:05 +08001589 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yue1b9c292021-09-10 10:08:31 +08001590 const unsigned char *p = buf;
XiaokangQian355e09a2022-01-20 11:14:50 +00001591 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yub85277e2021-10-13 13:36:05 +08001592 size_t extensions_len;
1593 const unsigned char *extensions_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001594 uint16_t cipher_suite;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001595 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
XiaokangQianb119a352022-01-26 03:29:10 +00001596 int fatal_alert = 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001597 uint32_t allowed_extensions_mask;
Jerry Yu50e00e32022-10-31 14:45:01 +08001598 int hs_msg_type = is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST :
Gilles Peskine449bd832023-01-11 14:50:10 +01001599 MBEDTLS_SSL_HS_SERVER_HELLO;
Jerry Yue1b9c292021-09-10 10:08:31 +08001600
1601 /*
1602 * Check there is space for minimal fields
1603 *
1604 * - legacy_version ( 2 bytes)
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001605 * - random (MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes)
Jerry Yue1b9c292021-09-10 10:08:31 +08001606 * - legacy_session_id_echo ( 1 byte ), minimum size
1607 * - cipher_suite ( 2 bytes)
1608 * - legacy_compression_method ( 1 byte )
1609 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001610 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 6);
Jerry Yue1b9c292021-09-10 10:08:31 +08001611
Gilles Peskine449bd832023-01-11 14:50:10 +01001612 MBEDTLS_SSL_DEBUG_BUF(4, "server hello", p, end - p);
1613 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, version", p, 2);
Jerry Yue1b9c292021-09-10 10:08:31 +08001614
Jerry Yu4a173382021-10-11 21:45:31 +08001615 /* ...
Jerry Yub85277e2021-10-13 13:36:05 +08001616 * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
Jerry Yu4a173382021-10-11 21:45:31 +08001617 * ...
1618 * with ProtocolVersion defined as:
1619 * uint16 ProtocolVersion;
1620 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001621 if (mbedtls_ssl_read_version(p, ssl->conf->transport) !=
1622 MBEDTLS_SSL_VERSION_TLS1_2) {
1623 MBEDTLS_SSL_DEBUG_MSG(1, ("Unsupported version of TLS."));
1624 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1625 MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
XiaokangQiand59be772022-01-24 10:12:51 +00001626 ret = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1627 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001628 }
1629 p += 2;
Jerry Yue1b9c292021-09-10 10:08:31 +08001630
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001631 /* ...
Jerry Yu4a173382021-10-11 21:45:31 +08001632 * Random random;
1633 * ...
1634 * with Random defined as:
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001635 * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
Jerry Yu4a173382021-10-11 21:45:31 +08001636 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 if (!is_hrr) {
1638 memcpy(&handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN], p,
1639 MBEDTLS_SERVER_HELLO_RANDOM_LEN);
1640 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes",
1641 p, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
XiaokangQian53f20b72022-01-18 10:47:33 +00001642 }
Jerry Yue6d7e5c2021-10-26 10:44:32 +08001643 p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
Jerry Yue1b9c292021-09-10 10:08:31 +08001644
Jerry Yu4a173382021-10-11 21:45:31 +08001645 /* ...
1646 * opaque legacy_session_id_echo<0..32>;
1647 * ...
1648 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001649 if (ssl_tls13_check_server_hello_session_id_echo(ssl, &p, end) != 0) {
XiaokangQian52da5582022-01-26 09:49:29 +00001650 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001651 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001652 }
1653
Jerry Yu4a173382021-10-11 21:45:31 +08001654 /* ...
1655 * CipherSuite cipher_suite;
1656 * ...
1657 * with CipherSuite defined as:
1658 * uint8 CipherSuite[2];
1659 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001660 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1661 cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +08001662 p += 2;
1663
Jerry Yu4a173382021-10-11 21:45:31 +08001664
Gilles Peskine449bd832023-01-11 14:50:10 +01001665 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
Jerry Yu4a173382021-10-11 21:45:31 +08001666 /*
Ronald Cronba120bb2022-03-30 22:09:48 +02001667 * Check whether this ciphersuite is valid and offered.
Jerry Yu4a173382021-10-11 21:45:31 +08001668 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001669 if ((mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info,
1670 ssl->tls_version,
1671 ssl->tls_version) != 0) ||
1672 !mbedtls_ssl_tls13_cipher_suite_is_offered(ssl, cipher_suite)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001673 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
Jerry Yue1b9c292021-09-10 10:08:31 +08001674 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001675 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00001676 * If we received an HRR before and that the proposed selected
1677 * ciphersuite in this server hello is not the same as the one
1678 * proposed in the HRR, we abort the handshake and send an
1679 * "illegal_parameter" alert.
XiaokangQian53f20b72022-01-18 10:47:33 +00001680 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 else if ((!is_hrr) && (handshake->hello_retry_request_count > 0) &&
1682 (cipher_suite != ssl->session_negotiate->ciphersuite)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001683 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQian355e09a2022-01-20 11:14:50 +00001684 }
XiaokangQian53f20b72022-01-18 10:47:33 +00001685
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) {
1687 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid ciphersuite(%04x) parameter",
1688 cipher_suite));
XiaokangQiand59be772022-01-24 10:12:51 +00001689 goto cleanup;
XiaokangQian53f20b72022-01-18 10:47:33 +00001690 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001691
Jerry Yu4a173382021-10-11 21:45:31 +08001692 /* Configure ciphersuites */
Gilles Peskine449bd832023-01-11 14:50:10 +01001693 mbedtls_ssl_optimize_checksum(ssl, ciphersuite_info);
Jerry Yu4a173382021-10-11 21:45:31 +08001694
XiaokangQian355e09a2022-01-20 11:14:50 +00001695 handshake->ciphersuite_info = ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01001696 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: ( %04x ) - %s",
1697 cipher_suite, ciphersuite_info->name));
Jerry Yue1b9c292021-09-10 10:08:31 +08001698
1699#if defined(MBEDTLS_HAVE_TIME)
YxCda609132023-05-22 12:08:12 -07001700 ssl->session_negotiate->start = mbedtls_time(NULL);
Jerry Yue1b9c292021-09-10 10:08:31 +08001701#endif /* MBEDTLS_HAVE_TIME */
1702
Jerry Yu4a173382021-10-11 21:45:31 +08001703 /* ...
1704 * uint8 legacy_compression_method = 0;
1705 * ...
Jerry Yue1b9c292021-09-10 10:08:31 +08001706 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001707 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
1708 if (p[0] != MBEDTLS_SSL_COMPRESS_NULL) {
1709 MBEDTLS_SSL_DEBUG_MSG(1, ("bad legacy compression method"));
XiaokangQian52da5582022-01-26 09:49:29 +00001710 fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER;
XiaokangQiand59be772022-01-24 10:12:51 +00001711 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001712 }
1713 p++;
1714
Jerry Yub85277e2021-10-13 13:36:05 +08001715 /* ...
1716 * Extension extensions<6..2^16-1>;
1717 * ...
Jerry Yu4a173382021-10-11 21:45:31 +08001718 * struct {
1719 * ExtensionType extension_type; (2 bytes)
1720 * opaque extension_data<0..2^16-1>;
1721 * } Extension;
1722 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001723 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1724 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yue1b9c292021-09-10 10:08:31 +08001725 p += 2;
Jerry Yude4fb2c2021-09-19 18:05:08 +08001726
Jerry Yu4a173382021-10-11 21:45:31 +08001727 /* Check extensions do not go beyond the buffer of data. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001728 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Jerry Yu4a173382021-10-11 21:45:31 +08001729 extensions_end = p + extensions_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001730
Gilles Peskine449bd832023-01-11 14:50:10 +01001731 MBEDTLS_SSL_DEBUG_BUF(3, "server hello extensions", p, extensions_len);
Jerry Yue1b9c292021-09-10 10:08:31 +08001732
Jerry Yu50e00e32022-10-31 14:45:01 +08001733 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu0c354a22022-08-29 15:25:36 +08001734 allowed_extensions_mask = is_hrr ?
Gilles Peskine449bd832023-01-11 14:50:10 +01001735 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_HRR :
1736 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_SH;
Jerry Yu2c5363e2022-08-04 17:42:49 +08001737
Gilles Peskine449bd832023-01-11 14:50:10 +01001738 while (p < extensions_end) {
Jerry Yue1b9c292021-09-10 10:08:31 +08001739 unsigned int extension_type;
1740 size_t extension_data_len;
XiaokangQian43550bd2022-01-21 04:32:58 +00001741 const unsigned char *extension_data_end;
Jerry Yue1b9c292021-09-10 10:08:31 +08001742
Gilles Peskine449bd832023-01-11 14:50:10 +01001743 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
1744 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
1745 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yue1b9c292021-09-10 10:08:31 +08001746 p += 4;
1747
Gilles Peskine449bd832023-01-11 14:50:10 +01001748 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
XiaokangQian43550bd2022-01-21 04:32:58 +00001749 extension_data_end = p + extension_data_len;
Jerry Yue1b9c292021-09-10 10:08:31 +08001750
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001751 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 ssl, hs_msg_type, extension_type, allowed_extensions_mask);
1753 if (ret != 0) {
1754 return ret;
1755 }
Jerry Yu2c5363e2022-08-04 17:42:49 +08001756
Gilles Peskine449bd832023-01-11 14:50:10 +01001757 switch (extension_type) {
XiaokangQianb851da82022-01-14 04:03:11 +00001758 case MBEDTLS_TLS_EXT_COOKIE:
1759
Gilles Peskine449bd832023-01-11 14:50:10 +01001760 ret = ssl_tls13_parse_cookie_ext(ssl,
1761 p, extension_data_end);
1762 if (ret != 0) {
1763 MBEDTLS_SSL_DEBUG_RET(1,
1764 "ssl_tls13_parse_cookie_ext",
1765 ret);
XiaokangQiand59be772022-01-24 10:12:51 +00001766 goto cleanup;
XiaokangQianb851da82022-01-14 04:03:11 +00001767 }
XiaokangQianb851da82022-01-14 04:03:11 +00001768 break;
XiaokangQianb851da82022-01-14 04:03:11 +00001769
Jerry Yue1b9c292021-09-10 10:08:31 +08001770 case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001771 ret = ssl_tls13_parse_supported_versions_ext(ssl,
1772 p,
1773 extension_data_end);
1774 if (ret != 0) {
XiaokangQiand59be772022-01-24 10:12:51 +00001775 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001776 }
Jerry Yue1b9c292021-09-10 10:08:31 +08001777 break;
1778
Ronald Cron41a443a2022-10-04 16:38:25 +02001779#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
Jerry Yue1b9c292021-09-10 10:08:31 +08001780 case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
Gilles Peskine449bd832023-01-11 14:50:10 +01001781 MBEDTLS_SSL_DEBUG_MSG(3, ("found pre_shared_key extension"));
Jerry Yu4a173382021-10-11 21:45:31 +08001782
Gilles Peskine449bd832023-01-11 14:50:10 +01001783 if ((ret = ssl_tls13_parse_server_pre_shared_key_ext(
1784 ssl, p, extension_data_end)) != 0) {
XiaokangQianeb69aee2022-07-05 08:21:43 +00001785 MBEDTLS_SSL_DEBUG_RET(
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 1, ("ssl_tls13_parse_server_pre_shared_key_ext"), ret);
1787 return ret;
XiaokangQianeb69aee2022-07-05 08:21:43 +00001788 }
1789 break;
Ronald Cron41a443a2022-10-04 16:38:25 +02001790#endif
Jerry Yue1b9c292021-09-10 10:08:31 +08001791
Jerry Yue1b9c292021-09-10 10:08:31 +08001792 case MBEDTLS_TLS_EXT_KEY_SHARE:
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 MBEDTLS_SSL_DEBUG_MSG(3, ("found key_shares extension"));
1794 if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) {
XiaokangQian52da5582022-01-26 09:49:29 +00001795 fatal_alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT;
XiaokangQiand59be772022-01-24 10:12:51 +00001796 goto cleanup;
1797 }
1798
Gilles Peskine449bd832023-01-11 14:50:10 +01001799 if (is_hrr) {
1800 ret = ssl_tls13_parse_hrr_key_share_ext(ssl,
1801 p, extension_data_end);
1802 } else {
1803 ret = ssl_tls13_parse_key_share_ext(ssl,
1804 p, extension_data_end);
1805 }
1806 if (ret != 0) {
1807 MBEDTLS_SSL_DEBUG_RET(1,
1808 "ssl_tls13_parse_key_share_ext",
1809 ret);
XiaokangQiand59be772022-01-24 10:12:51 +00001810 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001811 }
1812 break;
Jerry Yue1b9c292021-09-10 10:08:31 +08001813
1814 default:
Jerry Yu9872eb22022-08-29 13:42:01 +08001815 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1816 goto cleanup;
Jerry Yue1b9c292021-09-10 10:08:31 +08001817 }
1818
1819 p += extension_data_len;
1820 }
1821
Gilles Peskine449bd832023-01-11 14:50:10 +01001822 MBEDTLS_SSL_PRINT_EXTS(3, hs_msg_type, handshake->received_extensions);
Jerry Yu2c5363e2022-08-04 17:42:49 +08001823
XiaokangQiand59be772022-01-24 10:12:51 +00001824cleanup:
1825
Gilles Peskine449bd832023-01-11 14:50:10 +01001826 if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT) {
1827 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
1828 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
XiaokangQiand59be772022-01-24 10:12:51 +00001829 ret = MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Gilles Peskine449bd832023-01-11 14:50:10 +01001830 } else if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) {
1831 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1832 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
XiaokangQiand59be772022-01-24 10:12:51 +00001833 ret = MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1834 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001835 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08001836}
1837
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001838#if defined(MBEDTLS_DEBUG_C)
1839static const char *ssl_tls13_get_kex_mode_str(int mode)
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001840{
Gilles Peskine449bd832023-01-11 14:50:10 +01001841 switch (mode) {
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001842 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK:
1843 return "psk";
1844 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL:
1845 return "ephemeral";
1846 case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL:
1847 return "psk_ephemeral";
1848 default:
1849 return "unknown mode";
1850 }
1851}
Xiaokang Qiancb6e9632022-09-26 11:59:32 +00001852#endif /* MBEDTLS_DEBUG_C */
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001853
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001854MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001855static int ssl_tls13_postprocess_server_hello(mbedtls_ssl_context *ssl)
Jerry Yue1b9c292021-09-10 10:08:31 +08001856{
Jerry Yub85277e2021-10-13 13:36:05 +08001857 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yub85277e2021-10-13 13:36:05 +08001858 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yu0b177842021-09-05 19:41:30 +08001859
Jerry Yub85277e2021-10-13 13:36:05 +08001860 /* Determine the key exchange mode:
1861 * 1) If both the pre_shared_key and key_share extensions were received
1862 * then the key exchange mode is PSK with EPHEMERAL.
1863 * 2) If only the pre_shared_key extension was received then the key
1864 * exchange mode is PSK-only.
1865 * 3) If only the key_share extension was received then the key
1866 * exchange mode is EPHEMERAL-only.
Jerry Yu0b177842021-09-05 19:41:30 +08001867 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001868 switch (handshake->received_extensions &
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001869 (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
1870 MBEDTLS_SSL_EXT_MASK(KEY_SHARE))) {
Jerry Yu745bb612021-10-13 22:01:04 +08001871 /* Only the pre_shared_key extension was received */
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 case MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY):
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001873 handshake->key_exchange_mode =
1874 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
Jerry Yu745bb612021-10-13 22:01:04 +08001875 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001876
Jerry Yu745bb612021-10-13 22:01:04 +08001877 /* Only the key_share extension was received */
Gilles Peskine449bd832023-01-11 14:50:10 +01001878 case MBEDTLS_SSL_EXT_MASK(KEY_SHARE):
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001879 handshake->key_exchange_mode =
1880 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001881 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001882
Jerry Yu745bb612021-10-13 22:01:04 +08001883 /* Both the pre_shared_key and key_share extensions were received */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001884 case (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) |
1885 MBEDTLS_SSL_EXT_MASK(KEY_SHARE)):
1886 handshake->key_exchange_mode =
1887 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
Jerry Yu745bb612021-10-13 22:01:04 +08001888 break;
Jerry Yub85277e2021-10-13 13:36:05 +08001889
Jerry Yu745bb612021-10-13 22:01:04 +08001890 /* Neither pre_shared_key nor key_share extension was received */
1891 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001892 MBEDTLS_SSL_DEBUG_MSG(1, ("Unknown key exchange."));
Jerry Yu745bb612021-10-13 22:01:04 +08001893 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1894 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001895 }
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001896#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qian02f5e142023-02-06 10:44:17 +00001897 if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(EARLY_DATA) &&
1898 (handshake->selected_identity != 0 ||
1899 handshake->ciphersuite_info->id !=
1900 ssl->session_negotiate->ciphersuite)) {
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001901 /* RFC8446 4.2.11
1902 * If the server supplies an "early_data" extension, the
1903 * client MUST verify that the server's selected_identity
1904 * is 0. If any other value is returned, the client MUST
1905 * abort the handshake with an "illegal_parameter" alert.
Xiaokang Qian02f5e142023-02-06 10:44:17 +00001906 *
Xiaokang Qian53c4c272023-02-07 02:42:01 +00001907 * RFC 8446 4.2.10
1908 * In order to accept early data, the server MUST have accepted a PSK
1909 * cipher suite and selected the first key offered in the client's
1910 * "pre_shared_key" extension. In addition, it MUST verify that the
1911 * following values are the same as those associated with the
1912 * selected PSK:
1913 * - The TLS version number
1914 * - The selected cipher suite
Xiaokang Qian8dc4ce72023-02-07 10:49:50 +00001915 * - The selected ALPN [RFC7301] protocol, if any
1916 *
1917 * We check here that when early data is involved the server
1918 * selected the cipher suite associated to the pre-shared key
1919 * as it must have.
Xiaokang Qian3f616c22023-01-12 03:36:31 +00001920 */
1921 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1922 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1923 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1924 }
1925#endif
Jerry Yu0b177842021-09-05 19:41:30 +08001926
Xiaokang Qian0de0d862023-02-08 06:04:50 +00001927 if (!mbedtls_ssl_conf_tls13_check_kex_modes(
1928 ssl, handshake->key_exchange_mode)) {
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001929 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001930 MBEDTLS_SSL_DEBUG_MSG(
1931 2, ("Key exchange mode(%s) is not supported.",
1932 ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode)));
Xiaokang Qianac8195f2022-09-26 04:01:06 +00001933 goto cleanup;
1934 }
1935
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00001936 MBEDTLS_SSL_DEBUG_MSG(
1937 3, ("Selected key exchange mode: %s",
1938 ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode)));
Xiaokang Qian5beec4b2022-09-26 08:23:45 +00001939
Xiaokang Qian7892b6c2023-02-02 06:05:48 +00001940 /* Start the TLS 1.3 key scheduling if not already done.
Jerry Yu0b177842021-09-05 19:41:30 +08001941 *
Xiaokang Qian7892b6c2023-02-02 06:05:48 +00001942 * If we proposed early data then we have already derived an
1943 * early secret using the selected PSK and its associated hash.
1944 * It means that if the negotiated key exchange mode is psk or
1945 * psk_ephemeral, we have already correctly computed the
1946 * early secret and thus we do not do it again. In all other
1947 * cases we compute it here.
Xiaokang Qian303f82c52023-01-04 08:43:46 +00001948 */
Xiaokang Qian90746132023-01-06 05:54:59 +00001949#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qiane04afdc2023-02-07 02:19:42 +00001950 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT ||
1951 handshake->key_exchange_mode ==
1952 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL)
Xiaokang Qian90746132023-01-06 05:54:59 +00001953#endif
1954 {
Xiaokang Qian303f82c52023-01-04 08:43:46 +00001955 ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1956 if (ret != 0) {
1957 MBEDTLS_SSL_DEBUG_RET(
1958 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret);
1959 goto cleanup;
1960 }
Jerry Yu0b177842021-09-05 19:41:30 +08001961 }
1962
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 ret = mbedtls_ssl_tls13_compute_handshake_transform(ssl);
1964 if (ret != 0) {
1965 MBEDTLS_SSL_DEBUG_RET(1,
1966 "mbedtls_ssl_tls13_compute_handshake_transform",
1967 ret);
Jerry Yu4a173382021-10-11 21:45:31 +08001968 goto cleanup;
Jerry Yu0b177842021-09-05 19:41:30 +08001969 }
1970
Gilles Peskine449bd832023-01-11 14:50:10 +01001971 mbedtls_ssl_set_inbound_transform(ssl, handshake->transform_handshake);
1972 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to handshake keys for inbound traffic"));
Xiaokang Qian4ef8ba22023-02-06 11:06:16 +00001973 ssl->session_negotiate->ciphersuite = handshake->ciphersuite_info->id;
Jerry Yu0b177842021-09-05 19:41:30 +08001974 ssl->session_in = ssl->session_negotiate;
1975
Jerry Yu4a173382021-10-11 21:45:31 +08001976cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001977 if (ret != 0) {
Jerry Yu4a173382021-10-11 21:45:31 +08001978 MBEDTLS_SSL_PEND_FATAL_ALERT(
1979 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
Gilles Peskine449bd832023-01-11 14:50:10 +01001980 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
Jerry Yu4a173382021-10-11 21:45:31 +08001981 }
Jerry Yue110d252022-05-05 10:19:22 +08001982
Gilles Peskine449bd832023-01-11 14:50:10 +01001983 return ret;
Jerry Yue1b9c292021-09-10 10:08:31 +08001984}
1985
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001986MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001987static int ssl_tls13_postprocess_hrr(mbedtls_ssl_context *ssl)
XiaokangQian647719a2021-12-07 09:16:29 +00001988{
1989 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1990
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 mbedtls_ssl_session_reset_msg_layer(ssl, 0);
XiaokangQian647719a2021-12-07 09:16:29 +00001992
XiaokangQian78b1fa72022-01-19 06:56:30 +00001993 /*
XiaokangQian355e09a2022-01-20 11:14:50 +00001994 * We are going to re-generate a shared secret corresponding to the group
1995 * selected by the server, which is different from the group for which we
1996 * generated a shared secret in the first client hello.
1997 * Thus, reset the shared secret.
XiaokangQian51eff222021-12-10 10:33:56 +00001998 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001999 ret = ssl_tls13_reset_key_share(ssl);
2000 if (ret != 0) {
2001 return ret;
2002 }
XiaokangQian647719a2021-12-07 09:16:29 +00002003
Xiaokang Qian4ef8ba22023-02-06 11:06:16 +00002004 ssl->session_negotiate->ciphersuite = ssl->handshake->ciphersuite_info->id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 return 0;
XiaokangQian647719a2021-12-07 09:16:29 +00002006}
2007
Jerry Yue1b9c292021-09-10 10:08:31 +08002008/*
Jerry Yu4a173382021-10-11 21:45:31 +08002009 * Wait and parse ServerHello handshake message.
Jerry Yu687101b2021-09-14 16:03:56 +08002010 * Handler for MBEDTLS_SSL_SERVER_HELLO
2011 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002012MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002013static int ssl_tls13_process_server_hello(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002014{
Jerry Yu4a173382021-10-11 21:45:31 +08002015 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian647719a2021-12-07 09:16:29 +00002016 unsigned char *buf = NULL;
2017 size_t buf_len = 0;
XiaokangQian78b1fa72022-01-19 06:56:30 +00002018 int is_hrr = 0;
Jerry Yue1b9c292021-09-10 10:08:31 +08002019
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 MBEDTLS_SSL_DEBUG_MSG(2, ("=> %s", __func__));
Jerry Yue1b9c292021-09-10 10:08:31 +08002021
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002022 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2023 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, &buf, &buf_len));
Ronald Crondb5dfa12022-05-31 11:44:38 +02002024
Gilles Peskine449bd832023-01-11 14:50:10 +01002025 ret = ssl_tls13_preprocess_server_hello(ssl, buf, buf + buf_len);
2026 if (ret < 0) {
XiaokangQian16acd4b2022-01-14 07:35:47 +00002027 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01002028 } else {
2029 is_hrr = (ret == SSL_SERVER_HELLO_HRR);
2030 }
XiaokangQiand59be772022-01-24 10:12:51 +00002031
Gilles Peskine449bd832023-01-11 14:50:10 +01002032 if (ret == SSL_SERVER_HELLO_TLS1_2) {
Ronald Cron9f0fba32022-02-10 16:45:15 +01002033 ret = 0;
2034 goto cleanup;
2035 }
2036
Gilles Peskine449bd832023-01-11 14:50:10 +01002037 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_server_hello(ssl, buf,
2038 buf + buf_len,
2039 is_hrr));
2040 if (is_hrr) {
2041 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_reset_transcript_for_hrr(ssl));
Ronald Cronfb508b82022-05-31 14:49:55 +02002042 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002043
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002044 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2045 ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, buf_len));
Gilles Peskine449bd832023-01-11 14:50:10 +01002046
2047 if (is_hrr) {
2048 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_hrr(ssl));
2049#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2050 /* If not offering early data, the client sends a dummy CCS record
2051 * immediately before its second flight. This may either be before
2052 * its second ClientHello or before its encrypted handshake flight.
2053 */
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002054 mbedtls_ssl_handshake_set_state(
2055 ssl, MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO);
Gilles Peskine449bd832023-01-11 14:50:10 +01002056#else
2057 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
2058#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2059 } else {
2060 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_server_hello(ssl));
2061 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
Ronald Cronfb508b82022-05-31 14:49:55 +02002062 }
Jerry Yue1b9c292021-09-10 10:08:31 +08002063
2064cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01002065 MBEDTLS_SSL_DEBUG_MSG(2, ("<= %s ( %s )", __func__,
2066 is_hrr ? "HelloRetryRequest" : "ServerHello"));
2067 return ret;
Jerry Yu687101b2021-09-14 16:03:56 +08002068}
2069
2070/*
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002071 *
Ronald Cron9d6a5452022-05-30 16:05:38 +02002072 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002073 *
2074 * The EncryptedExtensions message contains any extensions which
2075 * should be protected, i.e., any which are not needed to establish
2076 * the cryptographic context.
Jerry Yu687101b2021-09-14 16:03:56 +08002077 */
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002078
XiaokangQian08da26c2021-10-09 10:12:11 +00002079/* Parse EncryptedExtensions message
2080 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002081 * Extension extensions<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002082 * } EncryptedExtensions;
2083 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002084MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002085static int ssl_tls13_parse_encrypted_extensions(mbedtls_ssl_context *ssl,
2086 const unsigned char *buf,
2087 const unsigned char *end)
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002088{
2089 int ret = 0;
XiaokangQian08da26c2021-10-09 10:12:11 +00002090 size_t extensions_len;
XiaokangQian140f0452021-10-08 08:05:53 +00002091 const unsigned char *p = buf;
XiaokangQian8db25ff2021-10-13 05:56:18 +00002092 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002093 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002094
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2096 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian08da26c2021-10-09 10:12:11 +00002097 p += 2;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002098
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Ronald Cronc8083592022-05-31 16:24:05 +02002100 extensions_end = p + extensions_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002101
Jan Bruckner5a3629b2023-02-23 12:08:09 +01002102 MBEDTLS_SSL_DEBUG_BUF(3, "encrypted extensions", p, extensions_len);
2103
Jerry Yu9eba7502022-10-31 13:46:16 +08002104 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yucbd082f2022-08-04 16:55:10 +08002105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 while (p < extensions_end) {
XiaokangQian08da26c2021-10-09 10:12:11 +00002107 unsigned int extension_type;
2108 size_t extension_data_len;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002109
XiaokangQian08da26c2021-10-09 10:12:11 +00002110 /*
2111 * struct {
XiaokangQian97799ac2021-10-11 10:05:54 +00002112 * ExtensionType extension_type; (2 bytes)
2113 * opaque extension_data<0..2^16-1>;
XiaokangQian08da26c2021-10-09 10:12:11 +00002114 * } Extension;
2115 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002116 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
2117 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2118 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
XiaokangQian08da26c2021-10-09 10:12:11 +00002119 p += 4;
2120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002122
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002123 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002124 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, extension_type,
2125 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_EE);
2126 if (ret != 0) {
2127 return ret;
2128 }
Jerry Yucbd082f2022-08-04 16:55:10 +08002129
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 switch (extension_type) {
lhuang0486cacac2022-01-21 07:34:27 -08002131#if defined(MBEDTLS_SSL_ALPN)
2132 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
lhuang0486cacac2022-01-21 07:34:27 -08002134
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002135 if ((ret = ssl_tls13_parse_alpn_ext(
2136 ssl, p, (size_t) extension_data_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 return ret;
lhuang0486cacac2022-01-21 07:34:27 -08002138 }
2139
2140 break;
2141#endif /* MBEDTLS_SSL_ALPN */
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002142
2143#if defined(MBEDTLS_SSL_EARLY_DATA)
2144 case MBEDTLS_TLS_EXT_EARLY_DATA:
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002145
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 if (extension_data_len != 0) {
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002147 /* The message must be empty. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2149 MBEDTLS_ERR_SSL_DECODE_ERROR);
2150 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaokang Qianca09afc2022-11-22 10:05:19 +00002151 }
2152
Xiaokang Qian8bee8992022-10-27 10:21:05 +00002153 break;
2154#endif /* MBEDTLS_SSL_EARLY_DATA */
2155
Jan Bruckner151f6422023-02-10 12:45:19 +01002156#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
2157 case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
2158 MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension"));
2159
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002160 ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(
2161 ssl, p, p + extension_data_len);
Jan Bruckner151f6422023-02-10 12:45:19 +01002162
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002163 /* TODO: Return unconditionally here until we handle the record
2164 * size limit correctly. Once handled correctly, only return in
2165 * case of errors. */
Jan Bruckner151f6422023-02-10 12:45:19 +01002166 return ret;
2167
2168 break;
2169#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
2170
XiaokangQian08da26c2021-10-09 10:12:11 +00002171 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002172 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu9eba7502022-10-31 13:46:16 +08002173 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 extension_type, "( ignored )");
Jerry Yucbd082f2022-08-04 16:55:10 +08002175 break;
XiaokangQian08da26c2021-10-09 10:12:11 +00002176 }
2177
XiaokangQian08da26c2021-10-09 10:12:11 +00002178 p += extension_data_len;
XiaokangQian97799ac2021-10-11 10:05:54 +00002179 }
XiaokangQian08da26c2021-10-09 10:12:11 +00002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2182 handshake->received_extensions);
Jerry Yucbd082f2022-08-04 16:55:10 +08002183
XiaokangQian97799ac2021-10-11 10:05:54 +00002184 /* Check that we consumed all the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002185 if (p != end) {
2186 MBEDTLS_SSL_DEBUG_MSG(1, ("EncryptedExtension lengths misaligned"));
2187 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2188 MBEDTLS_ERR_SSL_DECODE_ERROR);
2189 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002190 }
2191
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 return ret;
XiaokangQian2d5c72b2021-09-13 07:30:09 +00002193}
2194
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002195MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002196static int ssl_tls13_process_encrypted_extensions(mbedtls_ssl_context *ssl)
Ronald Cron9d6a5452022-05-30 16:05:38 +02002197{
2198 int ret;
2199 unsigned char *buf;
2200 size_t buf_len;
2201
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse encrypted extensions"));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002203
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002204 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2205 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2206 &buf, &buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002207
2208 /* Process the message contents */
2209 MBEDTLS_SSL_PROC_CHK(
Gilles Peskine449bd832023-01-11 14:50:10 +01002210 ssl_tls13_parse_encrypted_extensions(ssl, buf, buf + buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002211
Xiaokang Qianb157e912022-11-23 08:12:26 +00002212#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002213 if (ssl->handshake->received_extensions &
2214 MBEDTLS_SSL_EXT_MASK(EARLY_DATA)) {
Xiaokang Qianb157e912022-11-23 08:12:26 +00002215 ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED;
2216 }
2217#endif
2218
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002219 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2220 ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2221 buf, buf_len));
Ronald Cron9d6a5452022-05-30 16:05:38 +02002222
Ronald Cron928cbd32022-10-04 16:14:26 +02002223#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002224 if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2225 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2226 } else {
2227 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST);
2228 }
Ronald Cronfb508b82022-05-31 14:49:55 +02002229#else
2230 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
Ronald Cronfb508b82022-05-31 14:49:55 +02002232#endif
Ronald Cron9d6a5452022-05-30 16:05:38 +02002233
2234cleanup:
2235
Gilles Peskine449bd832023-01-11 14:50:10 +01002236 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse encrypted extensions"));
2237 return ret;
Ronald Cron9d6a5452022-05-30 16:05:38 +02002238
2239}
2240
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002241/*
2242 * Handler for MBEDTLS_SSL_END_OF_EARLY_DATA
2243 *
Xiaokang Qianc81a15a2022-12-19 02:43:33 +00002244 * RFC 8446 section 4.5
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002245 *
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002246 * struct {} EndOfEarlyData;
Xiaokang Qianc81a15a2022-12-19 02:43:33 +00002247 *
2248 * If the server sent an "early_data" extension in EncryptedExtensions, the
2249 * client MUST send an EndOfEarlyData message after receiving the server
2250 * Finished. Otherwise, the client MUST NOT send an EndOfEarlyData message.
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002251 */
2252
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002253MBEDTLS_CHECK_RETURN_CRITICAL
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002254static int ssl_tls13_write_end_of_early_data(mbedtls_ssl_context *ssl)
2255{
2256 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaokang Qian742578c2022-12-19 06:34:44 +00002257 unsigned char *buf = NULL;
2258 size_t buf_len;
Xiaokang Qian57a138d2022-12-19 06:40:47 +00002259 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write EndOfEarlyData"));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002260
Xiaokang Qian742578c2022-12-19 06:34:44 +00002261 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
Xiaokang Qian0de0d862023-02-08 06:04:50 +00002262 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA,
2263 &buf, &buf_len));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002264
Manuel Pégourié-Gonnard63e33dd2023-02-21 15:45:15 +01002265 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_hdr_to_checksum(
2266 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA, 0));
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002267
Xiaokang Qian742578c2022-12-19 06:34:44 +00002268 MBEDTLS_SSL_PROC_CHK(
2269 mbedtls_ssl_finish_handshake_msg(ssl, buf_len, 0));
Xiaokang Qianda8402d2022-12-15 14:55:35 +00002270
Xiaokang Qian19d44162023-01-03 03:39:50 +00002271 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002272
2273cleanup:
2274
2275 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write EndOfEarlyData"));
2276 return ret;
2277}
2278
Ronald Cron928cbd32022-10-04 16:14:26 +02002279#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu687101b2021-09-14 16:03:56 +08002280/*
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002281 * STATE HANDLING: CertificateRequest
2282 *
Jerry Yud2674312021-10-29 10:08:19 +08002283 */
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002284#define SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST 0
2285#define SSL_CERTIFICATE_REQUEST_SKIP 1
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002286/* Coordination:
2287 * Deals with the ambiguity of not knowing if a CertificateRequest
2288 * will be sent. Returns a negative code on failure, or
2289 * - SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST
2290 * - SSL_CERTIFICATE_REQUEST_SKIP
2291 * indicating if a Certificate Request is expected or not.
2292 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002293MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002294static int ssl_tls13_certificate_request_coordinate(mbedtls_ssl_context *ssl)
Jerry Yud2674312021-10-29 10:08:19 +08002295{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002296 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yud2674312021-10-29 10:08:19 +08002297
Gilles Peskine449bd832023-01-11 14:50:10 +01002298 if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
2299 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2300 return ret;
Jerry Yud2674312021-10-29 10:08:19 +08002301 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002302 ssl->keep_current_message = 1;
Jerry Yud2674312021-10-29 10:08:19 +08002303
Gilles Peskine449bd832023-01-11 14:50:10 +01002304 if ((ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) &&
2305 (ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST)) {
2306 MBEDTLS_SSL_DEBUG_MSG(3, ("got a certificate request"));
2307 return SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST;
Jerry Yud2674312021-10-29 10:08:19 +08002308 }
2309
Gilles Peskine449bd832023-01-11 14:50:10 +01002310 MBEDTLS_SSL_DEBUG_MSG(3, ("got no certificate request"));
Ronald Cron19385882022-06-15 16:26:13 +02002311
Gilles Peskine449bd832023-01-11 14:50:10 +01002312 return SSL_CERTIFICATE_REQUEST_SKIP;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002313}
2314
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002315/*
2316 * ssl_tls13_parse_certificate_request()
2317 * Parse certificate request
2318 * struct {
2319 * opaque certificate_request_context<0..2^8-1>;
2320 * Extension extensions<2..2^16-1>;
2321 * } CertificateRequest;
2322 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002323MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002324static int ssl_tls13_parse_certificate_request(mbedtls_ssl_context *ssl,
2325 const unsigned char *buf,
2326 const unsigned char *end)
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002327{
2328 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2329 const unsigned char *p = buf;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002330 size_t certificate_request_context_len = 0;
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002331 size_t extensions_len = 0;
2332 const unsigned char *extensions_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002333 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002334
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002335 /* ...
2336 * opaque certificate_request_context<0..2^8-1>
2337 * ...
2338 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002339 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002340 certificate_request_context_len = (size_t) p[0];
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002341 p += 1;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002342
Gilles Peskine449bd832023-01-11 14:50:10 +01002343 if (certificate_request_context_len > 0) {
2344 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_request_context_len);
2345 MBEDTLS_SSL_DEBUG_BUF(3, "Certificate Request Context",
2346 p, certificate_request_context_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002347
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002348 handshake->certificate_request_context =
Gilles Peskine449bd832023-01-11 14:50:10 +01002349 mbedtls_calloc(1, certificate_request_context_len);
2350 if (handshake->certificate_request_context == NULL) {
2351 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
2352 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002353 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002354 memcpy(handshake->certificate_request_context, p,
2355 certificate_request_context_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002356 p += certificate_request_context_len;
2357 }
2358
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002359 /* ...
2360 * Extension extensions<2..2^16-1>;
2361 * ...
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002362 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002363 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2364 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002365 p += 2;
2366
Gilles Peskine449bd832023-01-11 14:50:10 +01002367 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002368 extensions_end = p + extensions_len;
2369
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002370 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yuc55a6af2022-08-04 17:01:21 +08002371
Gilles Peskine449bd832023-01-11 14:50:10 +01002372 while (p < extensions_end) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002373 unsigned int extension_type;
2374 size_t extension_data_len;
2375
Gilles Peskine449bd832023-01-11 14:50:10 +01002376 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
2377 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2378 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002379 p += 4;
2380
Gilles Peskine449bd832023-01-11 14:50:10 +01002381 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002382
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002383 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, extension_type,
2385 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR);
2386 if (ret != 0) {
2387 return ret;
2388 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002389
Gilles Peskine449bd832023-01-11 14:50:10 +01002390 switch (extension_type) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002391 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01002392 MBEDTLS_SSL_DEBUG_MSG(3,
2393 ("found signature algorithms extension"));
2394 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, p,
2395 p + extension_data_len);
2396 if (ret != 0) {
2397 return ret;
2398 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002399
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002400 break;
2401
2402 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002403 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu6d0e78b2022-10-31 14:13:25 +08002404 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 extension_type, "( ignored )");
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +00002406 break;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002407 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002408
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002409 p += extension_data_len;
2410 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002411
Gilles Peskine449bd832023-01-11 14:50:10 +01002412 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2413 handshake->received_extensions);
Jerry Yuc55a6af2022-08-04 17:01:21 +08002414
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002415 /* Check that we consumed all the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002416 if (p != end) {
2417 MBEDTLS_SSL_DEBUG_MSG(1,
2418 ("CertificateRequest misaligned"));
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002419 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002420 }
Jerry Yuc55a6af2022-08-04 17:01:21 +08002421
Jerry Yu0c354a22022-08-29 15:25:36 +08002422 /* RFC 8446 section 4.3.2
Jerry Yuc55a6af2022-08-04 17:01:21 +08002423 *
2424 * The "signature_algorithms" extension MUST be specified
2425 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002426 if ((handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(SIG_ALG)) == 0) {
2427 MBEDTLS_SSL_DEBUG_MSG(3,
2428 ("no signature algorithms extension found"));
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002429 goto decode_error;
Xiaofei Bai69fcd392022-01-20 08:25:00 +00002430 }
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002431
Jerry Yu7840f812022-01-29 10:26:51 +08002432 ssl->handshake->client_auth = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002433 return 0;
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002434
Xiaofei Baic234ecf2022-02-08 09:59:23 +00002435decode_error:
Gilles Peskine449bd832023-01-11 14:50:10 +01002436 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2437 MBEDTLS_ERR_SSL_DECODE_ERROR);
2438 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002439}
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002440
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002441/*
2442 * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST
2443 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002444MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002445static int ssl_tls13_process_certificate_request(mbedtls_ssl_context *ssl)
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002446{
Xiaofei Baide3f13e2022-01-18 05:47:05 +00002447 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002448
Gilles Peskine449bd832023-01-11 14:50:10 +01002449 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request"));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002450
Gilles Peskine449bd832023-01-11 14:50:10 +01002451 MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_certificate_request_coordinate(ssl));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002452
Gilles Peskine449bd832023-01-11 14:50:10 +01002453 if (ret == SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST) {
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002454 unsigned char *buf;
2455 size_t buf_len;
2456
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002457 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2458 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2459 &buf, &buf_len));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002460
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002461 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_request(
2462 ssl, buf, buf + buf_len));
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002463
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002464 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2465 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2466 buf, buf_len));
Gilles Peskine449bd832023-01-11 14:50:10 +01002467 } else if (ret == SSL_CERTIFICATE_REQUEST_SKIP) {
Xiaofei Baif6d36962022-01-16 14:54:35 +00002468 ret = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002469 } else {
2470 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Xiaofei Bai51f515a2022-02-08 07:28:04 +00002471 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2472 goto cleanup;
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002473 }
2474
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CERTIFICATE);
Jerry Yud2674312021-10-29 10:08:19 +08002476
Xiaofei Baia0ab7772022-01-16 12:14:45 +00002477cleanup:
2478
Gilles Peskine449bd832023-01-11 14:50:10 +01002479 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate request"));
2480 return ret;
Jerry Yud2674312021-10-29 10:08:19 +08002481}
2482
2483/*
Jerry Yu687101b2021-09-14 16:03:56 +08002484 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
2485 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002486MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002487static int ssl_tls13_process_server_certificate(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002488{
Xiaofei Bai947571e2021-09-29 09:12:03 +00002489 int ret;
2490
Gilles Peskine449bd832023-01-11 14:50:10 +01002491 ret = mbedtls_ssl_tls13_process_certificate(ssl);
2492 if (ret != 0) {
2493 return ret;
2494 }
Xiaofei Bai947571e2021-09-29 09:12:03 +00002495
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY);
2497 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002498}
2499
2500/*
2501 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
2502 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002503MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002504static int ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002505{
Jerry Yu30b071c2021-09-12 20:16:03 +08002506 int ret;
2507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 ret = mbedtls_ssl_tls13_process_certificate_verify(ssl);
2509 if (ret != 0) {
2510 return ret;
2511 }
Jerry Yu30b071c2021-09-12 20:16:03 +08002512
Gilles Peskine449bd832023-01-11 14:50:10 +01002513 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2514 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002515}
Ronald Cron928cbd32022-10-04 16:14:26 +02002516#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Ronald Crond4c64022021-12-06 09:06:46 +01002517
Jerry Yu687101b2021-09-14 16:03:56 +08002518/*
2519 * Handler for MBEDTLS_SSL_SERVER_FINISHED
2520 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002521MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002522static int ssl_tls13_process_server_finished(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002523{
XiaokangQianac0385c2021-11-03 06:40:11 +00002524 int ret;
2525
Gilles Peskine449bd832023-01-11 14:50:10 +01002526 ret = mbedtls_ssl_tls13_process_finished_message(ssl);
2527 if (ret != 0) {
2528 return ret;
2529 }
XiaokangQianac0385c2021-11-03 06:40:11 +00002530
Gilles Peskine449bd832023-01-11 14:50:10 +01002531 ret = mbedtls_ssl_tls13_compute_application_transform(ssl);
2532 if (ret != 0) {
Jerry Yue3d67cb2022-05-19 15:33:10 +08002533 MBEDTLS_SSL_PEND_FATAL_ALERT(
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2535 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2536 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002537 }
2538
Xiaokang Qianbc75bc02022-12-19 06:16:42 +00002539#if defined(MBEDTLS_SSL_EARLY_DATA)
2540 if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED) {
2541 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_END_OF_EARLY_DATA);
Xiaokang Qianbd0ab062023-02-02 05:56:30 +00002542 } else if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) {
2543 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Xiaokang Qianbc75bc02022-12-19 06:16:42 +00002544 } else
2545#endif /* MBEDTLS_SSL_EARLY_DATA */
2546 {
2547#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2548 mbedtls_ssl_handshake_set_state(
2549 ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED);
2550#else
2551 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
2552#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2553 }
Ronald Cron49ad6192021-11-24 16:25:31 +01002554
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002556}
2557
2558/*
Jerry Yu566c7812022-01-26 15:41:22 +08002559 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE
2560 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002561MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002562static int ssl_tls13_write_client_certificate(mbedtls_ssl_context *ssl)
Jerry Yu566c7812022-01-26 15:41:22 +08002563{
Ronald Cron7a94aca2022-03-09 07:44:27 +01002564 int non_empty_certificate_msg = 0;
2565
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 MBEDTLS_SSL_DEBUG_MSG(1,
2567 ("Switch to handshake traffic keys for outbound traffic"));
2568 mbedtls_ssl_set_outbound_transform(ssl, ssl->handshake->transform_handshake);
Jerry Yu5cc35062022-01-28 16:16:08 +08002569
Ronald Cron928cbd32022-10-04 16:14:26 +02002570#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002571 if (ssl->handshake->client_auth) {
2572 int ret = mbedtls_ssl_tls13_write_certificate(ssl);
2573 if (ret != 0) {
2574 return ret;
2575 }
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002576
Gilles Peskine449bd832023-01-11 14:50:10 +01002577 if (mbedtls_ssl_own_cert(ssl) != NULL) {
Ronald Cron7a94aca2022-03-09 07:44:27 +01002578 non_empty_certificate_msg = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 }
2580 } else {
2581 MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate"));
Ronald Cron7a94aca2022-03-09 07:44:27 +01002582 }
Ronald Cron9df7c802022-03-08 18:38:54 +01002583#endif
Ronald Cron5bb8fc82022-03-09 07:00:13 +01002584
Gilles Peskine449bd832023-01-11 14:50:10 +01002585 if (non_empty_certificate_msg) {
2586 mbedtls_ssl_handshake_set_state(ssl,
2587 MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY);
2588 } else {
2589 MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate verify"));
2590 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
2591 }
Ronald Cron7a94aca2022-03-09 07:44:27 +01002592
Gilles Peskine449bd832023-01-11 14:50:10 +01002593 return 0;
Jerry Yu566c7812022-01-26 15:41:22 +08002594}
2595
Ronald Cron928cbd32022-10-04 16:14:26 +02002596#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002597/*
2598 * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY
2599 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002600MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002601static int ssl_tls13_write_client_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu566c7812022-01-26 15:41:22 +08002602{
Gilles Peskine449bd832023-01-11 14:50:10 +01002603 int ret = mbedtls_ssl_tls13_write_certificate_verify(ssl);
Ronald Crona8b38872022-03-09 07:59:25 +01002604
Gilles Peskine449bd832023-01-11 14:50:10 +01002605 if (ret == 0) {
2606 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
2607 }
Ronald Crona8b38872022-03-09 07:59:25 +01002608
Gilles Peskine449bd832023-01-11 14:50:10 +01002609 return ret;
Jerry Yu566c7812022-01-26 15:41:22 +08002610}
Ronald Cron928cbd32022-10-04 16:14:26 +02002611#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08002612
2613/*
Jerry Yu687101b2021-09-14 16:03:56 +08002614 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
2615 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002616MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002617static int ssl_tls13_write_client_finished(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002618{
XiaokangQian0fa66432021-11-15 03:33:57 +00002619 int ret;
2620
Gilles Peskine449bd832023-01-11 14:50:10 +01002621 ret = mbedtls_ssl_tls13_write_finished_message(ssl);
2622 if (ret != 0) {
2623 return ret;
Jerry Yue3d67cb2022-05-19 15:33:10 +08002624 }
2625
Gilles Peskine449bd832023-01-11 14:50:10 +01002626 ret = mbedtls_ssl_tls13_compute_resumption_master_secret(ssl);
2627 if (ret != 0) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00002628 MBEDTLS_SSL_DEBUG_RET(
2629 1, "mbedtls_ssl_tls13_compute_resumption_master_secret ", ret);
Gilles Peskine449bd832023-01-11 14:50:10 +01002630 return ret;
2631 }
2632
2633 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_FLUSH_BUFFERS);
2634 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002635}
2636
2637/*
2638 * Handler for MBEDTLS_SSL_FLUSH_BUFFERS
2639 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002640MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002641static int ssl_tls13_flush_buffers(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002642{
Gilles Peskine449bd832023-01-11 14:50:10 +01002643 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
2644 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
2645 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002646}
2647
2648/*
2649 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
2650 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002651MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002652static int ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu687101b2021-09-14 16:03:56 +08002653{
Jerry Yu378254d2021-10-30 21:44:47 +08002654
Gilles Peskine449bd832023-01-11 14:50:10 +01002655 mbedtls_ssl_tls13_handshake_wrapup(ssl);
Jerry Yu378254d2021-10-30 21:44:47 +08002656
Gilles Peskine449bd832023-01-11 14:50:10 +01002657 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
2658 return 0;
Jerry Yu687101b2021-09-14 16:03:56 +08002659}
2660
Jerry Yuf8a49942022-07-07 11:32:32 +00002661#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2662
Jerry Yua0446a02022-07-13 11:22:55 +08002663MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002664static int ssl_tls13_parse_new_session_ticket_exts(mbedtls_ssl_context *ssl,
2665 const unsigned char *buf,
2666 const unsigned char *end)
Jerry Yuf8a49942022-07-07 11:32:32 +00002667{
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002668 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yuaf2c0c82022-07-12 05:47:21 +00002669 const unsigned char *p = buf;
Jerry Yuf8a49942022-07-07 11:32:32 +00002670
Jerry Yuf8a49942022-07-07 11:32:32 +00002671
Jerry Yuedab6372022-10-31 14:37:31 +08002672 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002673
Gilles Peskine449bd832023-01-11 14:50:10 +01002674 while (p < end) {
Jerry Yuf8a49942022-07-07 11:32:32 +00002675 unsigned int extension_type;
2676 size_t extension_data_len;
Jerry Yu0c354a22022-08-29 15:25:36 +08002677 int ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002678
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
2680 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
2681 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yuf8a49942022-07-07 11:32:32 +00002682 p += 4;
2683
Gilles Peskine449bd832023-01-11 14:50:10 +01002684 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extension_data_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002685
Jerry Yuc4bf5d62022-10-29 09:08:47 +08002686 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01002687 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, extension_type,
2688 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_NST);
2689 if (ret != 0) {
2690 return ret;
2691 }
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002692
Gilles Peskine449bd832023-01-11 14:50:10 +01002693 switch (extension_type) {
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002694#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002695 case MBEDTLS_TLS_EXT_EARLY_DATA:
Gilles Peskine449bd832023-01-11 14:50:10 +01002696 if (extension_data_len != 4) {
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002697 MBEDTLS_SSL_PEND_FATAL_ALERT(
2698 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +01002699 MBEDTLS_ERR_SSL_DECODE_ERROR);
2700 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002701 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002702 if (ssl->session != NULL) {
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002703 ssl->session->ticket_flags |=
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA;
Xiaokang Qian2d87a9e2022-11-09 07:55:48 +00002705 }
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002706 break;
Xiaokang Qian0cc43202022-11-16 08:43:50 +00002707#endif /* MBEDTLS_SSL_EARLY_DATA */
Xiaokang Qianf447e8a2022-11-08 07:02:27 +00002708
Jerry Yuf8a49942022-07-07 11:32:32 +00002709 default:
Jerry Yu79aa7212022-11-08 21:30:21 +08002710 MBEDTLS_SSL_PRINT_EXT(
Jerry Yuedab6372022-10-31 14:37:31 +08002711 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
Gilles Peskine449bd832023-01-11 14:50:10 +01002712 extension_type, "( ignored )");
Jerry Yuf8a49942022-07-07 11:32:32 +00002713 break;
2714 }
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002715
Jerry Yuf8a49942022-07-07 11:32:32 +00002716 p += extension_data_len;
2717 }
2718
Gilles Peskine449bd832023-01-11 14:50:10 +01002719 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2720 handshake->received_extensions);
Jerry Yu6ba9f1c2022-08-04 17:53:25 +08002721
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 return 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002723}
2724
2725/*
Jerry Yu08aed4d2022-07-20 10:36:12 +08002726 * From RFC8446, page 74
2727 *
Jerry Yuf8a49942022-07-07 11:32:32 +00002728 * struct {
2729 * uint32 ticket_lifetime;
2730 * uint32 ticket_age_add;
2731 * opaque ticket_nonce<0..255>;
2732 * opaque ticket<1..2^16-1>;
2733 * Extension extensions<0..2^16-2>;
2734 * } NewSessionTicket;
2735 *
2736 */
Jerry Yua0446a02022-07-13 11:22:55 +08002737MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002738static int ssl_tls13_parse_new_session_ticket(mbedtls_ssl_context *ssl,
2739 unsigned char *buf,
2740 unsigned char *end,
2741 unsigned char **ticket_nonce,
2742 size_t *ticket_nonce_len)
Jerry Yuf8a49942022-07-07 11:32:32 +00002743{
2744 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2745 unsigned char *p = buf;
2746 mbedtls_ssl_session *session = ssl->session;
Jerry Yuf8a49942022-07-07 11:32:32 +00002747 size_t ticket_len;
2748 unsigned char *ticket;
2749 size_t extensions_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002750
Jerry Yucb3b1392022-07-12 06:09:38 +00002751 *ticket_nonce = NULL;
2752 *ticket_nonce_len = 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002753 /*
2754 * ticket_lifetime 4 bytes
2755 * ticket_age_add 4 bytes
Jerry Yu08aed4d2022-07-20 10:36:12 +08002756 * ticket_nonce_len 1 byte
Jerry Yuf8a49942022-07-07 11:32:32 +00002757 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002758 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 9);
Jerry Yuf8a49942022-07-07 11:32:32 +00002759
Gilles Peskine449bd832023-01-11 14:50:10 +01002760 session->ticket_lifetime = MBEDTLS_GET_UINT32_BE(p, 0);
2761 MBEDTLS_SSL_DEBUG_MSG(3,
2762 ("ticket_lifetime: %u",
2763 (unsigned int) session->ticket_lifetime));
Jerry Yuf8a49942022-07-07 11:32:32 +00002764
Gilles Peskine449bd832023-01-11 14:50:10 +01002765 session->ticket_age_add = MBEDTLS_GET_UINT32_BE(p, 4);
2766 MBEDTLS_SSL_DEBUG_MSG(3,
2767 ("ticket_age_add: %u",
2768 (unsigned int) session->ticket_age_add));
Jerry Yuf8a49942022-07-07 11:32:32 +00002769
Jerry Yucb3b1392022-07-12 06:09:38 +00002770 *ticket_nonce_len = p[8];
2771 p += 9;
2772
Gilles Peskine449bd832023-01-11 14:50:10 +01002773 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, *ticket_nonce_len);
Jerry Yucb3b1392022-07-12 06:09:38 +00002774 *ticket_nonce = p;
Gilles Peskine449bd832023-01-11 14:50:10 +01002775 MBEDTLS_SSL_DEBUG_BUF(3, "ticket_nonce:", *ticket_nonce, *ticket_nonce_len);
Jerry Yucb3b1392022-07-12 06:09:38 +00002776 p += *ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002777
2778 /* Ticket */
Gilles Peskine449bd832023-01-11 14:50:10 +01002779 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2780 ticket_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yuf8a49942022-07-07 11:32:32 +00002781 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002782 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, ticket_len);
2783 MBEDTLS_SSL_DEBUG_BUF(3, "received ticket", p, ticket_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002784
2785 /* Check if we previously received a ticket already. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002786 if (session->ticket != NULL || session->ticket_len > 0) {
2787 mbedtls_free(session->ticket);
Jerry Yuf8a49942022-07-07 11:32:32 +00002788 session->ticket = NULL;
2789 session->ticket_len = 0;
2790 }
2791
Gilles Peskine449bd832023-01-11 14:50:10 +01002792 if ((ticket = mbedtls_calloc(1, ticket_len)) == NULL) {
2793 MBEDTLS_SSL_DEBUG_MSG(1, ("ticket alloc failed"));
2794 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Jerry Yuf8a49942022-07-07 11:32:32 +00002795 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 memcpy(ticket, p, ticket_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002797 p += ticket_len;
2798 session->ticket = ticket;
2799 session->ticket_len = ticket_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002800
Pengyu Lv9f926952022-11-17 15:22:33 +08002801 /* Clear all flags in ticket_flags */
Pengyu Lv80270b22023-01-12 11:54:04 +08002802 mbedtls_ssl_session_clear_ticket_flags(
Pengyu Lv9eacb442022-12-09 14:39:19 +08002803 session, MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
Pengyu Lv9f926952022-11-17 15:22:33 +08002804
Gilles Peskine449bd832023-01-11 14:50:10 +01002805 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2806 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yuf8a49942022-07-07 11:32:32 +00002807 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002808 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002809
Gilles Peskine449bd832023-01-11 14:50:10 +01002810 MBEDTLS_SSL_DEBUG_BUF(3, "ticket extension", p, extensions_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002811
Gilles Peskine449bd832023-01-11 14:50:10 +01002812 ret = ssl_tls13_parse_new_session_ticket_exts(ssl, p, p + extensions_len);
2813 if (ret != 0) {
2814 MBEDTLS_SSL_DEBUG_RET(1,
2815 "ssl_tls13_parse_new_session_ticket_exts",
2816 ret);
2817 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002818 }
Jerry Yucb3b1392022-07-12 06:09:38 +00002819
Jerry Yudb8c5fa2022-08-03 12:10:13 +08002820 /* session has been updated, allow export */
2821 session->exported = 0;
2822
Gilles Peskine449bd832023-01-11 14:50:10 +01002823 return 0;
Jerry Yucb3b1392022-07-12 06:09:38 +00002824}
2825
Jerry Yua0446a02022-07-13 11:22:55 +08002826MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002827static int ssl_tls13_postprocess_new_session_ticket(mbedtls_ssl_context *ssl,
2828 unsigned char *ticket_nonce,
2829 size_t ticket_nonce_len)
Jerry Yucb3b1392022-07-12 06:09:38 +00002830{
2831 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2832 mbedtls_ssl_session *session = ssl->session;
2833 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2834 psa_algorithm_t psa_hash_alg;
2835 int hash_length;
2836
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002837#if defined(MBEDTLS_HAVE_TIME)
2838 /* Store ticket creation time */
Gilles Peskine449bd832023-01-11 14:50:10 +01002839 session->ticket_received = mbedtls_time(NULL);
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002840#endif
2841
Gilles Peskine449bd832023-01-11 14:50:10 +01002842 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(session->ciphersuite);
2843 if (ciphersuite_info == NULL) {
2844 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2845 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yuf8a49942022-07-07 11:32:32 +00002846 }
2847
Manuel Pégourié-Gonnard1f2a5872023-03-28 11:46:17 +02002848 psa_hash_alg = mbedtls_md_psa_alg_from_type(ciphersuite_info->mac);
Gilles Peskine449bd832023-01-11 14:50:10 +01002849 hash_length = PSA_HASH_LENGTH(psa_hash_alg);
2850 if (hash_length == -1 ||
2851 (size_t) hash_length > sizeof(session->resumption_key)) {
2852 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu3afdf362022-07-20 17:34:14 +08002853 }
2854
Jerry Yuf8a49942022-07-07 11:32:32 +00002855
Gilles Peskine449bd832023-01-11 14:50:10 +01002856 MBEDTLS_SSL_DEBUG_BUF(3, "resumption_master_secret",
2857 session->app_secrets.resumption_master_secret,
2858 hash_length);
Jerry Yuf8a49942022-07-07 11:32:32 +00002859
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002860 /* Compute resumption key
Jerry Yuf8a49942022-07-07 11:32:32 +00002861 *
2862 * HKDF-Expand-Label( resumption_master_secret,
2863 * "resumption", ticket_nonce, Hash.length )
2864 */
2865 ret = mbedtls_ssl_tls13_hkdf_expand_label(
Gilles Peskine449bd832023-01-11 14:50:10 +01002866 psa_hash_alg,
2867 session->app_secrets.resumption_master_secret,
2868 hash_length,
2869 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(resumption),
2870 ticket_nonce,
2871 ticket_nonce_len,
2872 session->resumption_key,
2873 hash_length);
Jerry Yuf8a49942022-07-07 11:32:32 +00002874
Gilles Peskine449bd832023-01-11 14:50:10 +01002875 if (ret != 0) {
2876 MBEDTLS_SSL_DEBUG_RET(2,
2877 "Creating the ticket-resumed PSK failed",
2878 ret);
2879 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002880 }
2881
Jerry Yu0a430c82022-07-20 11:02:48 +08002882 session->resumption_key_len = hash_length;
Jerry Yuf8a49942022-07-07 11:32:32 +00002883
Gilles Peskine449bd832023-01-11 14:50:10 +01002884 MBEDTLS_SSL_DEBUG_BUF(3, "Ticket-resumed PSK",
2885 session->resumption_key,
2886 session->resumption_key_len);
Jerry Yuf8a49942022-07-07 11:32:32 +00002887
Pengyu Lv9f926952022-11-17 15:22:33 +08002888 /* Set ticket_flags depends on the selected key exchange modes */
Pengyu Lv80270b22023-01-12 11:54:04 +08002889 mbedtls_ssl_session_set_ticket_flags(
Pengyu Lv9eacb442022-12-09 14:39:19 +08002890 session, ssl->conf->tls13_kex_modes);
Pengyu Lv4938a562023-01-16 11:28:49 +08002891 MBEDTLS_SSL_PRINT_TICKET_FLAGS(4, session->ticket_flags);
Pengyu Lv9f926952022-11-17 15:22:33 +08002892
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 return 0;
Jerry Yuf8a49942022-07-07 11:32:32 +00002894}
2895
2896/*
Jerry Yua8d3c502022-10-30 14:51:23 +08002897 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
Jerry Yuf8a49942022-07-07 11:32:32 +00002898 */
Jerry Yua0446a02022-07-13 11:22:55 +08002899MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002900static int ssl_tls13_process_new_session_ticket(mbedtls_ssl_context *ssl)
Jerry Yuf8a49942022-07-07 11:32:32 +00002901{
2902 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2903 unsigned char *buf;
2904 size_t buf_len;
Jerry Yucb3b1392022-07-12 06:09:38 +00002905 unsigned char *ticket_nonce;
2906 size_t ticket_nonce_len;
Jerry Yuf8a49942022-07-07 11:32:32 +00002907
Gilles Peskine449bd832023-01-11 14:50:10 +01002908 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse new session ticket"));
Jerry Yuf8a49942022-07-07 11:32:32 +00002909
Gilles Peskine449bd832023-01-11 14:50:10 +01002910 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
2911 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
2912 &buf, &buf_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002913
Gilles Peskine449bd832023-01-11 14:50:10 +01002914 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_new_session_ticket(
2915 ssl, buf, buf + buf_len,
2916 &ticket_nonce, &ticket_nonce_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002917
Gilles Peskine449bd832023-01-11 14:50:10 +01002918 MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_new_session_ticket(
2919 ssl, ticket_nonce, ticket_nonce_len));
Jerry Yuf8a49942022-07-07 11:32:32 +00002920
Gilles Peskine449bd832023-01-11 14:50:10 +01002921 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
Jerry Yu4e6c42a2022-07-13 11:16:51 +08002922
Jerry Yuf8a49942022-07-07 11:32:32 +00002923cleanup:
2924
Gilles Peskine449bd832023-01-11 14:50:10 +01002925 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse new session ticket"));
2926 return ret;
Jerry Yuf8a49942022-07-07 11:32:32 +00002927}
2928#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2929
Gilles Peskine449bd832023-01-11 14:50:10 +01002930int mbedtls_ssl_tls13_handshake_client_step(mbedtls_ssl_context *ssl)
Jerry Yubc20bdd2021-08-24 15:59:48 +08002931{
Jerry Yu92c6b402021-08-27 16:59:09 +08002932 int ret = 0;
Jerry Yuc8a392c2021-08-18 16:46:28 +08002933
Gilles Peskine449bd832023-01-11 14:50:10 +01002934 switch (ssl->state) {
Jerry Yu92c6b402021-08-27 16:59:09 +08002935 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002936 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Jerry Yuddda0502022-12-01 19:43:12 +08002937 break;
2938
Jerry Yu92c6b402021-08-27 16:59:09 +08002939 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002940 ret = mbedtls_ssl_write_client_hello(ssl);
Jerry Yu92c6b402021-08-27 16:59:09 +08002941 break;
2942
2943 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01002944 ret = ssl_tls13_process_server_hello(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002945 break;
2946
2947 case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 ret = ssl_tls13_process_encrypted_extensions(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002949 break;
2950
Ronald Cron928cbd32022-10-04 16:14:26 +02002951#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yud2674312021-10-29 10:08:19 +08002952 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 ret = ssl_tls13_process_certificate_request(ssl);
Jerry Yud2674312021-10-29 10:08:19 +08002954 break;
2955
Jerry Yu687101b2021-09-14 16:03:56 +08002956 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002957 ret = ssl_tls13_process_server_certificate(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002958 break;
2959
2960 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01002961 ret = ssl_tls13_process_certificate_verify(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002962 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002963#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu687101b2021-09-14 16:03:56 +08002964
2965 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01002966 ret = ssl_tls13_process_server_finished(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002967 break;
2968
Xiaokang Qian125afcb2022-10-28 06:04:06 +00002969 case MBEDTLS_SSL_END_OF_EARLY_DATA:
2970 ret = ssl_tls13_write_end_of_early_data(ssl);
2971 break;
2972
Jerry Yu566c7812022-01-26 15:41:22 +08002973 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 ret = ssl_tls13_write_client_certificate(ssl);
Jerry Yu566c7812022-01-26 15:41:22 +08002975 break;
2976
Ronald Cron928cbd32022-10-04 16:14:26 +02002977#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu566c7812022-01-26 15:41:22 +08002978 case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01002979 ret = ssl_tls13_write_client_certificate_verify(ssl);
Jerry Yu566c7812022-01-26 15:41:22 +08002980 break;
Ronald Cron928cbd32022-10-04 16:14:26 +02002981#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu566c7812022-01-26 15:41:22 +08002982
Jerry Yu687101b2021-09-14 16:03:56 +08002983 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01002984 ret = ssl_tls13_write_client_finished(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002985 break;
2986
2987 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01002988 ret = ssl_tls13_flush_buffers(ssl);
Jerry Yu687101b2021-09-14 16:03:56 +08002989 break;
2990
2991 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01002992 ret = ssl_tls13_handshake_wrapup(ssl);
Jerry Yu92c6b402021-08-27 16:59:09 +08002993 break;
2994
Gilles Peskine449bd832023-01-11 14:50:10 +01002995 /*
2996 * Injection of dummy-CCS's for middlebox compatibility
2997 */
Ronald Cron49ad6192021-11-24 16:25:31 +01002998#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
XiaokangQian0b56a8f2021-12-22 02:39:32 +00002999 case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003000 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3001 if (ret == 0) {
3002 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
3003 }
Ronald Cron9f55f632022-02-02 16:02:47 +01003004 break;
3005
3006 case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003007 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3008 if (ret == 0) {
Xiaokang Qian958b6ff2023-03-29 10:37:35 +00003009 mbedtls_ssl_handshake_set_state(
3010 ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +01003011 }
Ronald Cron49ad6192021-11-24 16:25:31 +01003012 break;
Xiaokang Qianf6d8fd32023-02-02 02:46:26 +00003013
Xiaokang Qian592021a2023-01-04 10:47:05 +00003014 case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO:
3015 ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3016 if (ret == 0) {
3017 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
3018
Xiaokang Qian33ff8682023-01-10 06:32:12 +00003019#if defined(MBEDTLS_SSL_EARLY_DATA)
Xiaokang Qian592021a2023-01-04 10:47:05 +00003020 MBEDTLS_SSL_DEBUG_MSG(
3021 1, ("Switch to early data keys for outbound traffic"));
3022 mbedtls_ssl_set_outbound_transform(
3023 ssl, ssl->handshake->transform_earlydata);
Xiaokang Qian33ff8682023-01-10 06:32:12 +00003024#endif
Xiaokang Qian592021a2023-01-04 10:47:05 +00003025 }
3026 break;
Ronald Cron49ad6192021-11-24 16:25:31 +01003027#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
3028
Jerry Yuf8a49942022-07-07 11:32:32 +00003029#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Jerry Yua8d3c502022-10-30 14:51:23 +08003030 case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01003031 ret = ssl_tls13_process_new_session_ticket(ssl);
3032 if (ret != 0) {
Jerry Yuf8a49942022-07-07 11:32:32 +00003033 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01003034 }
Jerry Yuf8a49942022-07-07 11:32:32 +00003035 ret = MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET;
3036 break;
3037#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3038
Jerry Yu92c6b402021-08-27 16:59:09 +08003039 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003040 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3041 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jerry Yu92c6b402021-08-27 16:59:09 +08003042 }
3043
Gilles Peskine449bd832023-01-11 14:50:10 +01003044 return ret;
Jerry Yu92c6b402021-08-27 16:59:09 +08003045}
Jerry Yu65dd2cc2021-08-18 16:38:40 +08003046
Jerry Yufb4b6472022-01-27 15:03:26 +08003047#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_TLS1_3 */