blob: c49c97fe86e7969bd69ac851c68f976529d26a2e [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS server-side functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * 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.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19
Gilles Peskinedb09ef62020-06-03 01:43:33 +020020#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000021
Jerry Yufb4b6472022-01-27 15:03:26 +080022#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080023
SimonBd5800b72016-04-26 07:43:27 +010024#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010025
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000026#include "mbedtls/ssl.h"
Chris Jones84a773f2021-03-05 18:38:47 +000027#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000028#include "mbedtls/debug.h"
29#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050030#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020031#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020032#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000033
34#include <string.h>
35
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050036#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek00644842023-05-30 05:45:00 -040037/* Define a local translating function to save code size by not using too many
38 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040039#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
40 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040041static int local_err_translation(psa_status_t status)
42{
43 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040044 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040045 psa_generic_status_to_mbedtls);
46}
47#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050048#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050049#endif
50
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000052#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010053#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010056#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020057#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010060int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
61 const unsigned char *info,
62 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063{
Gilles Peskine449bd832023-01-11 14:50:10 +010064 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
65 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
66 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020067
Gilles Peskine449bd832023-01-11 14:50:10 +010068 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020069
Gilles Peskine449bd832023-01-11 14:50:10 +010070 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
71 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
72 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020073
Gilles Peskine449bd832023-01-11 14:50:10 +010074 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020075 ssl->cli_id_len = ilen;
76
Gilles Peskine449bd832023-01-11 14:50:10 +010077 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020078}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020079
Gilles Peskine449bd832023-01-11 14:50:10 +010080void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
81 mbedtls_ssl_cookie_write_t *f_cookie_write,
82 mbedtls_ssl_cookie_check_t *f_cookie_check,
83 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020084{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020085 conf->f_cookie_write = f_cookie_write;
86 conf->f_cookie_check = f_cookie_check;
87 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020088}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020090
Gilles Peskineeccd8882020-03-10 12:19:08 +010091#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020092MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010093static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010094{
Gilles Peskine449bd832023-01-11 14:50:10 +010095 if (conf->f_psk != NULL) {
96 return 1;
97 }
Hanno Becker845b9462018-10-26 12:07:29 +010098
Gilles Peskine449bd832023-01-11 14:50:10 +010099 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
100 return 0;
101 }
Hanno Becker845b9462018-10-26 12:07:29 +0100102
Hanno Becker845b9462018-10-26 12:07:29 +0100103
104#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
106 return 1;
107 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +0200108#endif /* MBEDTLS_USE_PSA_CRYPTO */
109
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 if (conf->psk != NULL && conf->psk_len != 0) {
111 return 1;
112 }
Hanno Becker845b9462018-10-26 12:07:29 +0100113
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100115}
Gilles Peskineeccd8882020-03-10 12:19:08 +0100116#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100117
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200118MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100119static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
120 const unsigned char *buf,
121 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000122{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100125 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100127 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
129 ssl->verify_data_len) != 0) {
130 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
131 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
132 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
133 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100134 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200136#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000137 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 if (len != 1 || buf[0] != 0x0) {
139 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
140 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
141 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
142 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000143 }
144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000146 }
Paul Bakker48916f92012-09-16 19:57:18 +0000147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000149}
150
Valerio Setti1fa5c562023-03-20 13:56:38 +0100151#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100152 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800153/*
Jerry Yud491ea42022-01-13 16:15:25 +0800154 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
155 * curves (TLS 1.2) extension.
156 *
157 * The "extension_data" field of a supported groups extension contains a
158 * "NamedGroupList" value (TLS 1.3 RFC8446):
159 * enum {
160 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
161 * x25519(0x001D), x448(0x001E),
162 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
163 * ffdhe6144(0x0103), ffdhe8192(0x0104),
164 * ffdhe_private_use(0x01FC..0x01FF),
165 * ecdhe_private_use(0xFE00..0xFEFF),
166 * (0xFFFF)
167 * } NamedGroup;
168 * struct {
169 * NamedGroup named_group_list<2..2^16-1>;
170 * } NamedGroupList;
171 *
172 * The "extension_data" field of a supported elliptic curves extension contains
173 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
174 * enum {
175 * deprecated(1..22),
176 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
177 * x25519(29), x448(30),
178 * reserved (0xFE00..0xFEFF),
179 * deprecated(0xFF01..0xFF02),
180 * (0xFFFF)
181 * } NamedCurve;
182 * struct {
183 * NamedCurve named_curve_list<2..2^16-1>
184 * } NamedCurveList;
185 *
Jerry Yub925f212022-01-12 11:17:02 +0800186 * The TLS 1.3 supported groups extension was defined to be a compatible
187 * generalization of the TLS 1.2 supported elliptic curves extension. They both
188 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800189 *
Jerry Yub925f212022-01-12 11:17:02 +0800190 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200191MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100192static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
193 const unsigned char *buf,
194 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100195{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200196 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100197 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100198 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100199
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 if (len < 2) {
201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
203 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200205 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 list_size = ((buf[0] << 8) | (buf[1]));
207 if (list_size + 2 != len ||
208 list_size % 2 != 0) {
209 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
210 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
211 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
212 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100213 }
214
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200215 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 if (ssl->handshake->curves_tls_id != NULL) {
217 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
218 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
219 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
220 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200221 }
222
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100223 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200224 * and leave room for a final 0 */
225 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200227 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200229
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 if ((curves_tls_id = mbedtls_calloc(our_size,
231 sizeof(*curves_tls_id))) == NULL) {
232 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
233 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
234 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200235 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200236
Valerio Setti18c9fed2022-12-30 17:44:24 +0100237 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200238
Paul Bakker41c83d32013-03-20 14:39:14 +0100239 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 while (list_size > 0 && our_size > 1) {
241 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200242
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
244 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100245 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200246 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100247 }
248
249 list_size -= 2;
250 p += 2;
251 }
252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100254}
255
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200256MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100257static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
258 const unsigned char *buf,
259 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100260{
261 size_t list_size;
262 const unsigned char *p;
263
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 if (len == 0 || (size_t) (buf[0] + 1) != len) {
265 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
266 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
267 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
268 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100269 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200270 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100271
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200272 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 while (list_size > 0) {
274 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
275 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti77a904c2023-03-24 07:28:49 +0100276#if !defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_ECDH_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200277 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti77a904c2023-03-24 07:28:49 +0100278#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_ECDH_C */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200279#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
281 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
282 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200283#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
285 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100286 }
287
288 list_size--;
289 p++;
290 }
291
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100293}
Valerio Setti1fa5c562023-03-20 13:56:38 +0100294#endif /* MBEDTLS_PK_CAN_ECDH || MBEDTLS_PK_CAN_ECDSA_SOME ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100295 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100296
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200297#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200298MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100299static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
300 const unsigned char *buf,
301 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200302{
Janos Follath865b3eb2019-12-16 11:46:15 +0000303 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200304
Neil Armstrongca7d5062022-05-31 14:43:23 +0200305#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200307#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200309#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200310 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
312 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200313 }
314
Neil Armstrongca7d5062022-05-31 14:43:23 +0200315#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 if ((ret = mbedtls_psa_ecjpake_read_round(
317 &ssl->handshake->psa_pake_ctx, buf, len,
318 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
319 psa_destroy_key(ssl->handshake->psa_pake_password);
320 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200321
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100323 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 ssl,
325 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
326 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200327
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200329 }
330#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
332 buf, len)) != 0) {
333 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
334 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
335 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
336 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200337 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200338#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200339
340 /* Only mark the extension as OK when we're sure it is */
341 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
342
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200344}
345#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200348MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100349static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
350 const unsigned char *buf,
351 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200352{
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
354 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
355 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
356 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
357 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200358 }
359
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200360 ssl->session_negotiate->mfl_code = buf[0];
361
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200363}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200365
Hanno Beckera0e20d02019-05-15 14:03:01 +0100366#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200367MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100368static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
369 const unsigned char *buf,
370 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100371{
372 size_t peer_cid_len;
373
374 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
376 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
377 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
378 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
379 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100380 }
381
382 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100383 * struct {
384 * opaque cid<0..2^8-1>;
385 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100387
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 if (len < 1) {
389 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
390 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
391 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
392 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100393 }
394
395 peer_cid_len = *buf++;
396 len--;
397
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 if (len != peer_cid_len) {
399 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
400 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
401 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
402 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100403 }
404
405 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100407 /* Leave ssl->handshake->cid_in_use in its default
408 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
410 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100411 }
412
Gilles Peskine449bd832023-01-11 14:50:10 +0100413 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
414 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
415 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
416 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
417 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100418 }
419
Hanno Becker08556bf2019-05-03 12:43:44 +0100420 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100421 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100423
Gilles Peskine449bd832023-01-11 14:50:10 +0100424 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
425 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100426
Gilles Peskine449bd832023-01-11 14:50:10 +0100427 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100428}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100429#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200432MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100433static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
434 const unsigned char *buf,
435 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100436{
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 if (len != 0) {
438 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
439 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
440 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
441 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100442 }
443
444 ((void) buf);
445
Gilles Peskine449bd832023-01-11 14:50:10 +0100446 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100448 }
449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100451}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200455MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100456static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
457 const unsigned char *buf,
458 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200459{
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (len != 0) {
461 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
462 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
463 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
464 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200465 }
466
467 ((void) buf);
468
Gilles Peskine449bd832023-01-11 14:50:10 +0100469 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200471 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200472
Gilles Peskine449bd832023-01-11 14:50:10 +0100473 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200474}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200475#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200478MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100479static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
480 unsigned char *buf,
481 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200482{
Janos Follath865b3eb2019-12-16 11:46:15 +0000483 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200484 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200487
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 if (ssl->conf->f_ticket_parse == NULL ||
489 ssl->conf->f_ticket_write == NULL) {
490 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200491 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200492
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200493 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200494 ssl->handshake->new_session_ticket = 1;
495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200497
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 if (len == 0) {
499 return 0;
500 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
504 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
505 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200506 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200508
509 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200510 * Failures are ok: just ignore the ticket and proceed.
511 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100512 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
513 buf, len)) != 0) {
514 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200515
Gilles Peskine449bd832023-01-11 14:50:10 +0100516 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
517 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
518 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
519 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
520 } else {
521 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
522 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200523
Gilles Peskine449bd832023-01-11 14:50:10 +0100524 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200525 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200526
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200527 /*
528 * Keep the session ID sent by the client, since we MUST send it back to
529 * inform them we're accepting the ticket (RFC 5077 section 3.4)
530 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200531 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100532 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200533
Gilles Peskine449bd832023-01-11 14:50:10 +0100534 mbedtls_ssl_session_free(ssl->session_negotiate);
535 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200536
537 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200539
Gilles Peskine449bd832023-01-11 14:50:10 +0100540 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200541
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200542 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200543
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200544 /* Don't send a new ticket after all, this one is OK */
545 ssl->handshake->new_session_ticket = 0;
546
Gilles Peskine449bd832023-01-11 14:50:10 +0100547 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200548}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200550
Johan Pascalb62bb512015-12-03 21:56:45 +0100551#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200552MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100553static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
554 const unsigned char *buf,
555 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100556{
Johan Pascal43f94902020-09-22 12:25:52 +0200557 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100558 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200559 size_t profile_length;
560 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200561 /*! 2 bytes for profile length and 1 byte for mki len */
562 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100563
564 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
566 (ssl->conf->dtls_srtp_profile_list == NULL) ||
567 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
568 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200569 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100570
571 /* RFC5764 section 4.1.1
572 * uint8 SRTPProtectionProfile[2];
573 *
574 * struct {
575 * SRTPProtectionProfiles SRTPProtectionProfiles;
576 * opaque srtp_mki<0..255>;
577 * } UseSRTPData;
578
579 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100580 */
581
Ron Eldoref72faf2018-07-12 11:54:20 +0300582 /*
583 * Min length is 5: at least one protection profile(2 bytes)
584 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200585 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200586 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300587 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 if (len < size_of_lengths) {
589 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
590 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
591 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200592 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100593
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200595
Ron Eldoref72faf2018-07-12 11:54:20 +0300596 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200598 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200599
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200600 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 if (profile_length > len - size_of_lengths ||
602 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
603 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
604 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
605 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200606 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300607 /*
608 * parse the extension list values are defined in
609 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
610 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200612 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100614
Gilles Peskine449bd832023-01-11 14:50:10 +0100615 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
616 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
617 mbedtls_ssl_get_srtp_profile_as_string(
618 client_protection)));
619 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200620 continue;
621 }
Ron Eldor591f1622018-01-22 12:30:04 +0200622 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
624 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200625 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100626 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
627 mbedtls_ssl_get_srtp_profile_as_string(
628 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200629 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100630 }
631 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200633 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100634 }
Ron Eldor591f1622018-01-22 12:30:04 +0200635 }
Johan Pascal042d4562020-08-25 12:14:02 +0200636 buf += profile_length; /* buf points to the mki length */
637 mki_length = *buf;
638 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200639
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
641 mki_length + profile_length + size_of_lengths != len) {
642 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
643 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
644 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200645 }
646
647 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
649 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200650 ssl->dtls_srtp_info.mki_len = mki_length;
651
Gilles Peskine449bd832023-01-11 14:50:10 +0100652 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300653
Gilles Peskine449bd832023-01-11 14:50:10 +0100654 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
655 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100656 }
657
Gilles Peskine449bd832023-01-11 14:50:10 +0100658 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100659}
660#endif /* MBEDTLS_SSL_DTLS_SRTP */
661
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100662/*
663 * Auxiliary functions for ServerHello parsing and related actions
664 */
665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100667/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100668 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100669 */
Valerio Setti1fa5c562023-03-20 13:56:38 +0100670#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200671MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100672static int ssl_check_key_curve(mbedtls_pk_context *pk,
673 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100674{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100675 uint16_t *curr_tls_id = curves_tls_id;
Valerio Setti77a75682023-05-15 11:18:46 +0200676 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec_ro(*pk)->grp.id;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100677 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100678
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 while (*curr_tls_id != 0) {
680 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
681 if (curr_grp_id == grp_id) {
682 return 0;
683 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100684 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100685 }
686
Gilles Peskine449bd832023-01-11 14:50:10 +0100687 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100688}
Valerio Setti1fa5c562023-03-20 13:56:38 +0100689#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100690
691/*
692 * Try picking a certificate for this ciphersuite,
693 * return 0 on success and -1 on failure.
694 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200695MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100696static int ssl_pick_cert(mbedtls_ssl_context *ssl,
697 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100698{
Glenn Strauss041a3762022-03-15 06:08:29 -0400699 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200700#if defined(MBEDTLS_USE_PSA_CRYPTO)
701 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200703 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100704 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200705#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100706 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200708#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200709 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100710
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100712 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100713 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100715#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100717
David Horstmann3a334c22022-10-25 10:53:44 +0100718 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200719#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200721#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100722 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200723#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100724 if (pk_alg_is_none) {
725 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200726 }
727
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
729
730 if (list == NULL) {
731 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
732 return -1;
733 }
734
735 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400736 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
738 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000739
David Horstmann3a334c22022-10-25 10:53:44 +0100740 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200741#if defined(MBEDTLS_USE_PSA_CRYPTO)
742#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100743 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
744 ssl->conf->f_async_decrypt_start != NULL ||
745 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
746 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200747#else
David Horstmann3a334c22022-10-25 10:53:44 +0100748 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100749 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200750#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
751#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100752 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200753#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100754 if (!key_type_matches) {
755 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100756 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000757 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100758
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200759 /*
760 * This avoids sending the client a cert it'll reject based on
761 * keyUsage or other extensions.
762 *
763 * It also allows the user to provision different certificates for
764 * different uses based on keyUsage, eg if they want to avoid signing
765 * and decrypting with the same RSA key.
766 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
768 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
769 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
770 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200771 continue;
772 }
773
Valerio Setti1fa5c562023-03-20 13:56:38 +0100774#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 if (pk_alg == MBEDTLS_PK_ECDSA &&
776 ssl_check_key_curve(&cur->cert->pk,
777 ssl->handshake->curves_tls_id) != 0) {
778 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100779 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000780 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100781#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100782
783 /* If we get there, we got a winner */
784 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100785 }
786
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200787 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100789 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
791 ssl->handshake->key_cert->cert);
792 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100793 }
794
Gilles Peskine449bd832023-01-11 14:50:10 +0100795 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100796}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200797#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100798
799/*
800 * Check if a given ciphersuite is suitable for use with our config/keys/etc
801 * Sets ciphersuite_info only if the suite matches.
802 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200803MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100804static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
805 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100806{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100808
Jerry Yue7541932022-01-28 10:21:24 +0800809#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100810 mbedtls_pk_type_t sig_type;
811#endif
812
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
814 if (suite_info == NULL) {
815 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
816 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100817 }
818
Gilles Peskine449bd832023-01-11 14:50:10 +0100819 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
820 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000821
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 if (suite_info->min_tls_version > ssl->tls_version ||
823 suite_info->max_tls_version < ssl->tls_version) {
824 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
825 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000826 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100827
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200828#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100829 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
830 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
831 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
832 "not configured or ext missing"));
833 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200834 }
835#endif
836
837
Valerio Setti1fa5c562023-03-20 13:56:38 +0100838#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100839 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
840 (ssl->handshake->curves_tls_id == NULL ||
841 ssl->handshake->curves_tls_id[0] == 0)) {
842 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
843 "no common elliptic curve"));
844 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000845 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100846#endif
847
Gilles Peskineeccd8882020-03-10 12:19:08 +0100848#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100849 /* If the ciphersuite requires a pre-shared key and we don't
850 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100851 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
852 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
853 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
854 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000855 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100856#endif
857
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200858#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100859 /*
860 * Final check: if ciphersuite requires us to have a
861 * certificate/key of a particular type:
862 * - select the appropriate certificate if we have one, or
863 * - try the next ciphersuite if we don't
864 * This must be done last since we modify the key_cert list.
865 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 if (ssl_pick_cert(ssl, suite_info) != 0) {
867 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
868 "no suitable certificate"));
869 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000870 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100871#endif
872
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200873#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
874 /* If the ciphersuite requires signing, check whether
875 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
877 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200878 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
880 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
881 "for signature algorithm %u", (unsigned) sig_type));
882 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200883 }
884
885#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
886
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100887 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100889}
890
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200891/* This function doesn't alert on errors that happen early during
892 ClientHello parsing because they might indicate that the client is
893 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200894MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100895static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000896{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100897 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200898 size_t i, j;
899 size_t ciph_offset, comp_offset, ext_offset;
900 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200902 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100903#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000904 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000906 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100907#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000908 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200909 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000911
Hanno Becker7e5437a2017-04-28 17:15:26 +0100912 /* If there is no signature-algorithm extension present,
913 * we need to fall back to the default values for allowed
914 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800915#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100916 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800917#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100918
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000920
David Horstmanne0af39a2022-10-06 18:19:18 +0100921 int renegotiating;
922
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200924read_record_header:
925#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100926 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100928 * otherwise read it ourselves manually in order to support SSLv2
929 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100930 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
931 * ClientHello has been already fully fetched by the TLS 1.3 code and the
932 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100933 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100934 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200935#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100937#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100938 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200940 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
942 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000943 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000944 }
945
946 buf = ssl->in_hdr;
947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000949
Paul Bakkerec636f32012-09-09 19:17:02 +0000950 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100951 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000952 *
953 * Record layer:
954 * 0 . 0 message type
955 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200956 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000957 * 3 . 4 message length
958 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
960 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100961
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
963 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
964 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100965 }
966
Gilles Peskine449bd832023-01-11 14:50:10 +0100967 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
968 (ssl->in_len[0] << 8) | ssl->in_len[1]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100969
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
971 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100972
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200973 /* For DTLS if this is the initial handshake, remember the client sequence
974 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200975#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200977#if defined(MBEDTLS_SSL_RENEGOTIATION)
978 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000979#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100980 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200981 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100982 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
983 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
984 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200985 }
986
Gilles Peskine449bd832023-01-11 14:50:10 +0100987 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
988 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200989
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
992 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200993 ssl->next_record_offset = 0;
994 ssl->in_left = 0;
995 goto read_record_header;
996 }
997
998 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100999 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001000#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001001 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001003
Gilles Peskine449bd832023-01-11 14:50:10 +01001004 msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001005
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001009 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001011#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001012 {
Ronald Cron6291b232023-03-08 15:51:25 +01001013 if (ssl->keep_current_message) {
1014 ssl->keep_current_message = 0;
1015 } else {
1016 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1017 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1018 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1019 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001020
Ronald Cron6291b232023-03-08 15:51:25 +01001021 if ((ret = mbedtls_ssl_fetch_input(ssl,
1022 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1023 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1024 return ret;
1025 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001026
Ronald Cron6291b232023-03-08 15:51:25 +01001027 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001029 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1030 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1031 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001032#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001033 ssl->in_left = 0;
1034 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001035 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001036
1037 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001038
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001040
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001041 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1042 if (0 != ret) {
1043 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1044 return ret;
1045 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001046
1047 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001048 * Handshake layer:
1049 * 0 . 0 handshake type
1050 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001051 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001052 * 6 . 8 DTLS only: fragment offset
1053 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001054 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1056 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1057 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001058 }
1059
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001061
Gilles Peskine449bd832023-01-11 14:50:10 +01001062 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1063 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1064 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001065 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001066 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1068 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1069 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001070
1071 /* The record layer has a record size limit of 2^14 - 1 and
1072 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 if (buf[1] != 0) {
1074 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1075 (unsigned) buf[1]));
1076 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001077 }
1078
1079 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001080 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1081 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1082 (unsigned) msg_len,
1083 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1084 (unsigned) handshake_len));
1085 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001086 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001087 }
1088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001091 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001092 * Copy the client's handshake message_seq on initial handshakes,
1093 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001094 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001097 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001098 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1100 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1101 "%u (expected %u)", cli_msg_seq,
1102 ssl->handshake->in_msg_seq));
1103 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001104 }
1105
1106 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001108#endif
1109 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001110 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001111 ssl->handshake->out_msg_seq = cli_msg_seq;
1112 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1113 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001114 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001115 /*
1116 * For now we don't support fragmentation, so make sure
1117 * fragment_offset == 0 and fragment_length == length
1118 */
1119 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1121 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1122 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001123 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001124 4, ("fragment_offset=%u fragment_length=%u length=%u",
1125 (unsigned) fragment_offset, (unsigned) fragment_length,
1126 (unsigned) length));
1127 if (fragment_offset != 0 || length != fragment_length) {
1128 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1129 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001130 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001131 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001132 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001134
Gilles Peskine449bd832023-01-11 14:50:10 +01001135 buf += mbedtls_ssl_hs_hdr_len(ssl);
1136 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001137
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001138 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001139 * ClientHello layer:
1140 * 0 . 1 protocol version
1141 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1142 * 34 . 35 session id length (1 byte)
1143 * 35 . 34+x session id
1144 * 35+x . 35+x DTLS only: cookie length (1 byte)
1145 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001146 * .. . .. ciphersuite list length (2 bytes)
1147 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001148 * .. . .. compression alg. list length (1 byte)
1149 * .. . .. compression alg. list
1150 * .. . .. extensions length (2 bytes, optional)
1151 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001152 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001153
1154 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001155 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001156 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1157 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001158 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 if (msg_len < 38) {
1160 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1161 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001162 }
1163
1164 /*
1165 * Check and save the protocol version
1166 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001168
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 ssl->tls_version = mbedtls_ssl_read_version(buf, ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001170 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakkerec636f32012-09-09 19:17:02 +00001171
Gilles Peskine449bd832023-01-11 14:50:10 +01001172 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1173 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1174 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1175 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1176 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001177 }
1178
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001179 /*
1180 * Save client random (inc. Unix time)
1181 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001182 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001183
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001185
1186 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001187 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001188 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001189 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001190
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1192 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1193 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1194 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1195 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1196 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001197 }
1198
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001200
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001201 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001202 memset(ssl->session_negotiate->id, 0,
1203 sizeof(ssl->session_negotiate->id));
1204 memcpy(ssl->session_negotiate->id, buf + 35,
1205 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001206
1207 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001208 * Check the cookie length and content
1209 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001212 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001213 cookie_len = buf[cookie_offset];
1214
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1216 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1217 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1218 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1219 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001220 }
1221
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1223 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001225#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227#if defined(MBEDTLS_SSL_RENEGOTIATION)
1228 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001229#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 ) {
1231 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1232 buf + cookie_offset + 1, cookie_len,
1233 ssl->cli_id, ssl->cli_id_len) != 0) {
1234 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001235 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001236 } else {
1237 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001238 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001239 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001240 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001242 {
1243 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001244 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001245 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1247 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001248 }
1249
Gilles Peskine449bd832023-01-11 14:50:10 +01001250 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001251 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001252
Gilles Peskine449bd832023-01-11 14:50:10 +01001253 /*
1254 * Check the ciphersuitelist length (will be parsed later)
1255 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001256 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001257 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001260
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 ciph_len = (buf[ciph_offset + 0] << 8)
1262 | (buf[ciph_offset + 1]);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001263
Gilles Peskine449bd832023-01-11 14:50:10 +01001264 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001265 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001266 (ciph_len % 2) != 0) {
1267 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1268 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1269 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1270 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001271 }
1272
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1274 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001275
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001276 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001277 * Check the compression algorithm's length.
1278 * The list contents are ignored because implementing
1279 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1280 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001281 */
1282 comp_offset = ciph_offset + 2 + ciph_len;
1283
1284 comp_len = buf[comp_offset];
1285
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001287 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001288 comp_len + comp_offset + 1 > msg_len) {
1289 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1290 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1291 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1292 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001293 }
1294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1296 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001297
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 /*
1299 * Check the extension length
1300 */
1301 ext_offset = comp_offset + 1 + comp_len;
1302 if (msg_len > ext_offset) {
1303 if (msg_len < ext_offset + 2) {
1304 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1305 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1306 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1307 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001308 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001309
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 ext_len = (buf[ext_offset + 0] << 8)
1311 | (buf[ext_offset + 1]);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001312
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 if (msg_len != ext_offset + 2 + ext_len) {
1314 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1315 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1316 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1317 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1318 }
1319 } else {
1320 ext_len = 0;
1321 }
Paul Bakker48916f92012-09-16 19:57:18 +00001322
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 ext = buf + ext_offset + 2;
1324 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1325
1326 while (ext_len != 0) {
1327 unsigned int ext_id;
1328 unsigned int ext_size;
1329 if (ext_len < 4) {
1330 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1331 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1332 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1333 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1334 }
1335 ext_id = ((ext[0] << 8) | (ext[1]));
1336 ext_size = ((ext[2] << 8) | (ext[3]));
1337
1338 if (ext_size + 4 > ext_len) {
1339 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1340 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1341 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1342 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1343 }
1344 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001346 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1348 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1349 ext + 4 + ext_size);
1350 if (ret != 0) {
1351 return ret;
1352 }
Simon Butcher584a5472016-05-23 16:24:52 +01001353 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001355
Simon Butcher584a5472016-05-23 16:24:52 +01001356 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001357 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001358#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001359 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001360#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001361
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1363 if (ret != 0) {
1364 return ret;
1365 }
Simon Butcher584a5472016-05-23 16:24:52 +01001366 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001367
Jerry Yue7541932022-01-28 10:21:24 +08001368#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001369 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001371
Gilles Peskine449bd832023-01-11 14:50:10 +01001372 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1373 if (ret != 0) {
1374 return ret;
1375 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001376
1377 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001378 break;
Jerry Yue7541932022-01-28 10:21:24 +08001379#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001380
Valerio Setti1fa5c562023-03-20 13:56:38 +01001381#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001383 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001385
Gilles Peskine449bd832023-01-11 14:50:10 +01001386 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1387 if (ret != 0) {
1388 return ret;
1389 }
Simon Butcher584a5472016-05-23 16:24:52 +01001390 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001391
Simon Butcher584a5472016-05-23 16:24:52 +01001392 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001394 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001395
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1397 if (ret != 0) {
1398 return ret;
1399 }
Simon Butcher584a5472016-05-23 16:24:52 +01001400 break;
Valerio Setti1fa5c562023-03-20 13:56:38 +01001401#endif /* MBEDTLS_PK_CAN_ECDH || MBEDTLS_PK_CAN_ECDSA_SOME ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001402 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001403
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001404#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001405 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001407
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1409 if (ret != 0) {
1410 return ret;
1411 }
Simon Butcher584a5472016-05-23 16:24:52 +01001412 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001413#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001416 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001418
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1420 if (ret != 0) {
1421 return ret;
1422 }
Simon Butcher584a5472016-05-23 16:24:52 +01001423 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001424#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001425
Hanno Beckera0e20d02019-05-15 14:03:01 +01001426#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001427 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001429
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1431 if (ret != 0) {
1432 return ret;
1433 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001434 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001435#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001438 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1442 if (ret != 0) {
1443 return ret;
1444 }
Simon Butcher584a5472016-05-23 16:24:52 +01001445 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001449 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001451
Gilles Peskine449bd832023-01-11 14:50:10 +01001452 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1453 if (ret != 0) {
1454 return ret;
1455 }
Simon Butcher584a5472016-05-23 16:24:52 +01001456 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001459#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001460 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001462
Gilles Peskine449bd832023-01-11 14:50:10 +01001463 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1464 if (ret != 0) {
1465 return ret;
1466 }
Simon Butcher584a5472016-05-23 16:24:52 +01001467 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001471 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001473
Gilles Peskine449bd832023-01-11 14:50:10 +01001474 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1475 ext + 4 + ext_size);
1476 if (ret != 0) {
1477 return ret;
1478 }
Simon Butcher584a5472016-05-23 16:24:52 +01001479 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001481
Johan Pascalb62bb512015-12-03 21:56:45 +01001482#if defined(MBEDTLS_SSL_DTLS_SRTP)
1483 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001484 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001485
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1487 if (ret != 0) {
1488 return ret;
1489 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001490 break;
1491#endif /* MBEDTLS_SSL_DTLS_SRTP */
1492
Simon Butcher584a5472016-05-23 16:24:52 +01001493 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001494 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1495 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001496 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001497
Gilles Peskine449bd832023-01-11 14:50:10 +01001498 ext_len -= 4 + ext_size;
1499 ext += 4 + ext_size;
1500 }
1501
Jerry Yue7541932022-01-28 10:21:24 +08001502#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001503
1504 /*
1505 * Try to fall back to default hash SHA1 if the client
1506 * hasn't provided any preferred signature-hash combinations.
1507 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001508 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001509 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1510 const uint16_t default_sig_algs[] = {
Valerio Setti1fa5c562023-03-20 13:56:38 +01001511#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1513 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001514#endif
1515#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001516 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1517 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001518#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001519 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001520 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001521
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001522 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1523 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1524 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001525
Gilles Peskine449bd832023-01-11 14:50:10 +01001526 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001527 }
1528
Jerry Yue7541932022-01-28 10:21:24 +08001529#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001530
Paul Bakker48916f92012-09-16 19:57:18 +00001531 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001532 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1533 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001534 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1535 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1536 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001537#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001538 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1539 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1540 "during renegotiation"));
1541 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1542 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1543 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001544 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001545#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001546 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001547 break;
1548 }
1549 }
1550
1551 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001552 * Renegotiation security checks
1553 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001554 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1555 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1556 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001557 handshake_failure = 1;
1558 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001559#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001560 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001561 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001562 renegotiation_info_seen == 0) {
1563 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001564 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1566 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1567 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1568 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001569 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001570 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1571 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1572 renegotiation_info_seen == 1) {
1573 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001574 handshake_failure = 1;
1575 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001576#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001577
Gilles Peskine449bd832023-01-11 14:50:10 +01001578 if (handshake_failure == 1) {
1579 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1580 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1581 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001582 }
Paul Bakker380da532012-04-18 16:10:25 +00001583
Paul Bakker41c83d32013-03-20 14:39:14 +01001584 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001585 * Server certification selection (after processing TLS extensions)
1586 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001587 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1588 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1589 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001590 }
Glenn Strauss69894072022-01-24 12:58:00 -05001591#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1592 ssl->handshake->sni_name = NULL;
1593 ssl->handshake->sni_name_len = 0;
1594#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001595
1596 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001597 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001598 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001599 * and certificate from the SNI callback triggered by the SNI extension
1600 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001601 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001602 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001603 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001604 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001605
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1607 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1608 for (i = 0; ciphersuites[i] != 0; i++) {
1609 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001610 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001612
TRodziewicz8476f2f2021-06-02 14:34:47 +02001613 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001614
Gilles Peskine449bd832023-01-11 14:50:10 +01001615 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1616 &ciphersuite_info)) != 0) {
1617 return ret;
1618 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001619
Gilles Peskine449bd832023-01-11 14:50:10 +01001620 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001621 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001623 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001624 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001625 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001626 for (i = 0; ciphersuites[i] != 0; i++) {
1627 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1628 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001629 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001630 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001631
1632 got_common_suite = 1;
1633
Gilles Peskine449bd832023-01-11 14:50:10 +01001634 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1635 &ciphersuite_info)) != 0) {
1636 return ret;
1637 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001638
Gilles Peskine449bd832023-01-11 14:50:10 +01001639 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001640 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001642 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001643 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001644 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001645
Gilles Peskine449bd832023-01-11 14:50:10 +01001646 if (got_common_suite) {
1647 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1648 "but none of them usable"));
1649 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1650 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1651 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1652 } else {
1653 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1654 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1655 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1656 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001657 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001658
1659have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001660 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001661
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001662 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001663 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001664
Paul Bakker5121ce52009-01-03 21:22:43 +00001665 ssl->state++;
1666
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001667#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001668 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1669 mbedtls_ssl_recv_flight_completed(ssl);
1670 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001671#endif
1672
Hanno Becker7e5437a2017-04-28 17:15:26 +01001673 /* Debugging-only output for testsuite */
1674#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001675 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001676 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1677 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001678 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001679 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1680 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1681 sig_hash));
1682 } else {
1683 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1684 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001685 }
1686#endif
1687
Gilles Peskine449bd832023-01-11 14:50:10 +01001688 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001689
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001691}
1692
Hanno Beckera0e20d02019-05-15 14:03:01 +01001693#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001694static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1695 unsigned char *buf,
1696 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001697{
1698 unsigned char *p = buf;
1699 size_t ext_len;
1700 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1701
1702 *olen = 0;
1703
1704 /* Skip writing the extension if we don't want to use it or if
1705 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001707 return;
1708 }
1709
Gilles Peskine449bd832023-01-11 14:50:10 +01001710 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1711 * which is at most 255, so the increment cannot overflow. */
1712 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1713 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1714 return;
1715 }
1716
1717 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001718
1719 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001720 * struct {
1721 * opaque cid<0..2^8-1>;
1722 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001723 */
1724 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001725 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001726 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001727 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001728 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001729
1730 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001731 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001732
1733 *olen = ssl->own_cid_len + 5;
1734}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001735#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001736
Neil Armstrong76b74072022-04-06 13:43:54 +02001737#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001738static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1739 unsigned char *buf,
1740 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001741{
1742 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001743 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001744
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001745 /*
1746 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1747 * from a client and then selects a stream or Authenticated Encryption
1748 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1749 * encrypt-then-MAC response extension back to the client."
1750 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001751 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 ssl->session_negotiate->ciphersuite);
1753 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001754 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001756 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001757 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001758 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001760
Gilles Peskine449bd832023-01-11 14:50:10 +01001761 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001762 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001763 }
Ronald Cron862902d2022-03-24 14:15:28 +01001764 }
1765
Gilles Peskine449bd832023-01-11 14:50:10 +01001766 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001767 *olen = 0;
1768 return;
1769 }
1770
Gilles Peskine449bd832023-01-11 14:50:10 +01001771 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001774 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001775
1776 *p++ = 0x00;
1777 *p++ = 0x00;
1778
1779 *olen = 4;
1780}
Neil Armstrong76b74072022-04-06 13:43:54 +02001781#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001782
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001783#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001784static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1785 unsigned char *buf,
1786 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001787{
1788 unsigned char *p = buf;
1789
Gilles Peskine449bd832023-01-11 14:50:10 +01001790 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001791 *olen = 0;
1792 return;
1793 }
1794
Gilles Peskine449bd832023-01-11 14:50:10 +01001795 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1796 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001797
Gilles Peskine449bd832023-01-11 14:50:10 +01001798 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001799 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001800
1801 *p++ = 0x00;
1802 *p++ = 0x00;
1803
1804 *olen = 4;
1805}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001806#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001807
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001808#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001809static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1810 unsigned char *buf,
1811 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001812{
1813 unsigned char *p = buf;
1814
Gilles Peskine449bd832023-01-11 14:50:10 +01001815 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001816 *olen = 0;
1817 return;
1818 }
1819
Gilles Peskine449bd832023-01-11 14:50:10 +01001820 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001821
Gilles Peskine449bd832023-01-11 14:50:10 +01001822 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001823 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001824
1825 *p++ = 0x00;
1826 *p++ = 0x00;
1827
1828 *olen = 4;
1829}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001830#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001831
Gilles Peskine449bd832023-01-11 14:50:10 +01001832static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1833 unsigned char *buf,
1834 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001835{
1836 unsigned char *p = buf;
1837
Gilles Peskine449bd832023-01-11 14:50:10 +01001838 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001839 *olen = 0;
1840 return;
1841 }
1842
Gilles Peskine449bd832023-01-11 14:50:10 +01001843 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001844
Gilles Peskine449bd832023-01-11 14:50:10 +01001845 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001846 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001847
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001848#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001850 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001851 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001852 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001853
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001855 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001857 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001858 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001860 {
1861 *p++ = 0x00;
1862 *p++ = 0x01;
1863 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001864 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001865
1866 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001867}
1868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001869#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001870static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1871 unsigned char *buf,
1872 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001873{
1874 unsigned char *p = buf;
1875
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001877 *olen = 0;
1878 return;
1879 }
1880
Gilles Peskine449bd832023-01-11 14:50:10 +01001881 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001882
Gilles Peskine449bd832023-01-11 14:50:10 +01001883 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001884 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001885
1886 *p++ = 0x00;
1887 *p++ = 1;
1888
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001889 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001890
1891 *olen = 5;
1892}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001893#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001894
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02001895#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001896 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001897static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1898 unsigned char *buf,
1899 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001900{
1901 unsigned char *p = buf;
1902 ((void) ssl);
1903
Gilles Peskine449bd832023-01-11 14:50:10 +01001904 if ((ssl->handshake->cli_exts &
1905 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001906 *olen = 0;
1907 return;
1908 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001909
Gilles Peskine449bd832023-01-11 14:50:10 +01001910 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001911
Gilles Peskine449bd832023-01-11 14:50:10 +01001912 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001913 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001914
1915 *p++ = 0x00;
1916 *p++ = 2;
1917
1918 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001919 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001920
1921 *olen = 6;
1922}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001923#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001924
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001925#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001926static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1927 unsigned char *buf,
1928 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001929{
Janos Follath865b3eb2019-12-16 11:46:15 +00001930 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001931 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001932 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001933 size_t kkpp_len;
1934
1935 *olen = 0;
1936
1937 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001938 if (ssl->handshake->ciphersuite_info->key_exchange !=
1939 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001940 return;
1941 }
1942
Gilles Peskine449bd832023-01-11 14:50:10 +01001943 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1944
1945 if (end - p < 4) {
1946 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1947 return;
1948 }
1949
1950 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001951 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001952
Neil Armstrongca7d5062022-05-31 14:43:23 +02001953#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
1955 p + 2, end - p - 2, &kkpp_len,
1956 MBEDTLS_ECJPAKE_ROUND_ONE);
1957 if (ret != 0) {
1958 psa_destroy_key(ssl->handshake->psa_pake_password);
1959 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1960 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001961 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001962 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001963#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
1965 p + 2, end - p - 2, &kkpp_len,
1966 ssl->conf->f_rng, ssl->conf->p_rng);
1967 if (ret != 0) {
1968 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001969 return;
1970 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001971#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001972
Gilles Peskine449bd832023-01-11 14:50:10 +01001973 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001974 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001975
1976 *olen = kkpp_len + 4;
1977}
1978#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1979
Gilles Peskine449bd832023-01-11 14:50:10 +01001980#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1981static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1982 unsigned char *buf,
1983 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001984{
Ron Eldor75870ec2018-12-06 17:31:55 +02001985 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001986 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001987 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1988
1989 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001990
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1992 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001993 return;
1994 }
1995
Gilles Peskine449bd832023-01-11 14:50:10 +01001996 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001997
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001999 mki_len = ssl->dtls_srtp_info.mki_len;
2000 }
2001
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002002 /* The extension total size is 9 bytes :
2003 * - 2 bytes for the extension tag
2004 * - 2 bytes for the total size
2005 * - 2 bytes for the protection profile length
2006 * - 2 bytes for the protection profile
2007 * - 1 byte for the mki length
2008 * + the actual mki length
2009 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002010 if ((size_t) (end - buf) < mki_len + 9) {
2011 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002012 return;
2013 }
2014
Johan Pascalb62bb512015-12-03 21:56:45 +01002015 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002016 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002017 /*
2018 * total length 5 and mki value: only one profile(2 bytes)
2019 * and length(2 bytes) and srtp_mki )
2020 */
Ron Eldor591f1622018-01-22 12:30:04 +02002021 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002022 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002023
2024 /* protection profile length: 2 */
2025 buf[4] = 0x00;
2026 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002027 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002028 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2029 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2030 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2031 } else {
2032 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002033 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002034 }
2035
Ron Eldor591f1622018-01-22 12:30:04 +02002036 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002037 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002038
Ron Eldor591f1622018-01-22 12:30:04 +02002039 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002040}
2041#endif /* MBEDTLS_SSL_DTLS_SRTP */
2042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002044MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002045static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002046{
Janos Follath865b3eb2019-12-16 11:46:15 +00002047 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002048 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002049 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002050
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002052
2053 /*
2054 * struct {
2055 * ProtocolVersion server_version;
2056 * opaque cookie<0..2^8-1>;
2057 * } HelloVerifyRequest;
2058 */
2059
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002060 /* The RFC is not clear on this point, but sending the actual negotiated
2061 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002062 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2063 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002064 p += 2;
2065
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002066 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002067 if (ssl->conf->f_cookie_write == NULL) {
2068 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2069 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002070 }
2071
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002072 /* Skip length byte until we know the length */
2073 cookie_len_byte = p++;
2074
Gilles Peskine449bd832023-01-11 14:50:10 +01002075 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2076 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2077 ssl->cli_id, ssl->cli_id_len)) != 0) {
2078 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2079 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002080 }
2081
Gilles Peskine449bd832023-01-11 14:50:10 +01002082 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002083
Gilles Peskine449bd832023-01-11 14:50:10 +01002084 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002085
2086 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002087 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2088 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002089
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002090 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002091
Gilles Peskine449bd832023-01-11 14:50:10 +01002092 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2093 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2094 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002095 }
2096
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002097#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2099 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2100 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2101 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002102 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002103#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002104
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002108}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002109#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002110
Gilles Peskine449bd832023-01-11 14:50:10 +01002111static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002112{
2113 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002114 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002115 mbedtls_ssl_session * const session = ssl->session_negotiate;
2116
2117 /* Resume is 0 by default, see ssl_handshake_init().
2118 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002120 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 }
2122 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002123 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002124 }
2125 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002126 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002128#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002130 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002132#endif
2133
Gilles Peskine449bd832023-01-11 14:50:10 +01002134 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002135
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2137 session->id,
2138 session->id_len,
2139 &session_tmp);
2140 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002141 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002142 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002143
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002145 /* Mismatch between cached and negotiated session */
2146 goto exit;
2147 }
2148
2149 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002151 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002153
Gilles Peskine449bd832023-01-11 14:50:10 +01002154 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002155 ssl->handshake->resume = 1;
2156
2157exit:
2158
Gilles Peskine449bd832023-01-11 14:50:10 +01002159 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002160}
2161
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002162MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002163static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002164{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002165#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002166 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002167#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002168 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002169 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002170 unsigned char *buf, *p;
2171
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002174#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2176 ssl->handshake->cookie_verify_result != 0) {
2177 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2178 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002181 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002182#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002183
Gilles Peskine449bd832023-01-11 14:50:10 +01002184 if (ssl->conf->f_rng == NULL) {
2185 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2186 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002187 }
2188
Paul Bakker5121ce52009-01-03 21:22:43 +00002189 /*
2190 * 0 . 0 handshake type
2191 * 1 . 3 handshake length
2192 * 4 . 5 protocol version
2193 * 6 . 9 UNIX time()
2194 * 10 . 37 random bytes
2195 */
2196 buf = ssl->out_msg;
2197 p = buf + 4;
2198
Gilles Peskine449bd832023-01-11 14:50:10 +01002199 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002200 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002201
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2203 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002205#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002206 t = mbedtls_time(NULL);
2207 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002208 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002209
Gilles Peskine449bd832023-01-11 14:50:10 +01002210 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2211 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002212#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002213 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2214 return ret;
2215 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002216
2217 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002218#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002219
Ronald Cronc5649382023-04-04 15:33:42 +02002220 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002221 return ret;
2222 }
Ronald Cronc5649382023-04-04 15:33:42 +02002223 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002224
Ronald Cronc5649382023-04-04 15:33:42 +02002225#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2226 /*
2227 * RFC 8446
2228 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2229 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2230 * response to a ClientHello MUST set the last 8 bytes of their Random
2231 * value specially in their ServerHello.
2232 */
2233 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2234 static const unsigned char magic_tls12_downgrade_string[] =
2235 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2236
2237 MBEDTLS_STATIC_ASSERT(
2238 sizeof(magic_tls12_downgrade_string) == 8,
2239 "magic_tls12_downgrade_string does not have the expected size");
2240
Ronald Cronfe01ec22023-04-06 09:56:53 +02002241 memcpy(p, magic_tls12_downgrade_string,
2242 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002243 } else
2244#endif
2245 {
2246 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2247 return ret;
2248 }
2249 }
2250 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002251
Gilles Peskine449bd832023-01-11 14:50:10 +01002252 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002255
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002257
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002260 * New session, create a new session id,
2261 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002262 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002263 ssl->state++;
2264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002265#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002267#endif
2268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002269#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002270 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002271 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002272 memset(ssl->session_negotiate->id, 0, 32);
2273 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002274#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002275 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002276 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002277 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2278 n)) != 0) {
2279 return ret;
2280 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002281 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002282 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002283 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002284 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002285 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002286 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002287 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002288
Gilles Peskine449bd832023-01-11 14:50:10 +01002289 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2290 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2291 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002292 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002293 }
2294
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002295 /*
2296 * 38 . 38 session id length
2297 * 39 . 38+n session id
2298 * 39+n . 40+n chosen ciphersuite
2299 * 41+n . 41+n chosen compression alg.
2300 * 42+n . 43+n extensions length
2301 * 44+n . 43+n+m extensions
2302 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002303 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002304 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002305 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002306
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2308 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2309 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2310 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002311
Gilles Peskine449bd832023-01-11 14:50:10 +01002312 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002313 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002315
Gilles Peskine449bd832023-01-11 14:50:10 +01002316 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2317 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2318 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2319 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002320
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002321 /*
2322 * First write extensions, then the total length
2323 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002325 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002327#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002329 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002330#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002331
Hanno Beckera0e20d02019-05-15 14:03:01 +01002332#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002333 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002334 ext_len += olen;
2335#endif
2336
Neil Armstrong76b74072022-04-06 13:43:54 +02002337#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002338 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002339 ext_len += olen;
2340#endif
2341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002342#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002343 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002344 ext_len += olen;
2345#endif
2346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002348 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002349 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002350#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002351
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02002352#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002353 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002354 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002355 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2356 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2357 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002358 ext_len += olen;
2359 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002360#endif
2361
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002362#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002363 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002364 ext_len += olen;
2365#endif
2366
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002367#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002368 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002369 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2370 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002371 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002372 }
Paul Elliottf518f812022-07-11 12:36:20 +01002373
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002374 ext_len += olen;
2375#endif
2376
Johan Pascalb62bb512015-12-03 21:56:45 +01002377#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002378 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002379 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002380#endif
2381
Gilles Peskine449bd832023-01-11 14:50:10 +01002382 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2383 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002384
Gilles Peskine449bd832023-01-11 14:50:10 +01002385 if (ext_len > 0) {
2386 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002387 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002388 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002389
2390 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002391 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2392 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002393
Gilles Peskine449bd832023-01-11 14:50:10 +01002394 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002395
Gilles Peskine449bd832023-01-11 14:50:10 +01002396 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Gilles Peskine449bd832023-01-11 14:50:10 +01002398 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002399}
2400
Gilles Peskineeccd8882020-03-10 12:19:08 +01002401#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002402MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002403static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002404{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002405 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002406 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002407
Gilles Peskine449bd832023-01-11 14:50:10 +01002408 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002409
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2411 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002412 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002413 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002414 }
2415
Gilles Peskine449bd832023-01-11 14:50:10 +01002416 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2417 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002418}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002419#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002420MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002421static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002422{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002423 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002424 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002425 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002426 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002427 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002429 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002430 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002431 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002432
Gilles Peskine449bd832023-01-11 14:50:10 +01002433 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002434
2435 ssl->state++;
2436
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002437#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002438 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002439 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002440 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002441#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002442 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002443
Gilles Peskine449bd832023-01-11 14:50:10 +01002444 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2445 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2446 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2447 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002448 }
2449
2450 /*
2451 * 0 . 0 handshake type
2452 * 1 . 3 handshake length
2453 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002454 * 5 .. m-1 cert types
2455 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002456 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002457 * n .. n+1 length of all DNs
2458 * n+2 .. n+3 length of DN 1
2459 * n+4 .. ... Distinguished Name #1
2460 * ... .. ... length of DN 2, etc.
2461 */
2462 buf = ssl->out_msg;
2463 p = buf + 4;
2464
2465 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002466 * Supported certificate types
2467 *
2468 * ClientCertificateType certificate_types<1..2^8-1>;
2469 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002470 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002471 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002473#if defined(MBEDTLS_RSA_C)
2474 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002475#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002476#if defined(MBEDTLS_ECDSA_C)
2477 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002478#endif
2479
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002480 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002481 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002482
Paul Bakker577e0062013-08-28 11:57:20 +02002483 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002484
Paul Bakker926af752012-11-23 13:38:07 +01002485 /*
2486 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002487 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002488 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2489 *
2490 * struct {
2491 * HashAlgorithm hash;
2492 * SignatureAlgorithm signature;
2493 * } SignatureAndHashAlgorithm;
2494 *
2495 * enum { (255) } HashAlgorithm;
2496 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002497 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2499 if (sig_alg == NULL) {
2500 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2501 }
Ronald Cron8457c122022-03-07 11:32:54 +01002502
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2504 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002505
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002507 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 }
2509 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002510 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002511 }
Simon Butcher99000142016-10-13 17:21:01 +01002512
Paul Elliott96a0fd92022-11-08 17:09:56 +00002513 /* Write elements at offsets starting from 1 (offset 0 is for the
2514 * length). Thus the offset of each element is the length of the
2515 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002516 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002518
Paul Bakker926af752012-11-23 13:38:07 +01002519 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002520
Paul Elliott96a0fd92022-11-08 17:09:56 +00002521 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002522 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002523 sa_len += 2;
2524 p += sa_len;
2525
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002526 /*
2527 * DistinguishedName certificate_authorities<0..2^16-1>;
2528 * opaque DistinguishedName<1..2^16-1>;
2529 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002530 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002531
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002532 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002533
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002535 /* NOTE: If trusted certificates are provisioned
2536 * via a CA callback (configured through
2537 * `mbedtls_ssl_conf_ca_cb()`, then the
2538 * CertificateRequest is currently left empty. */
2539
Glenn Strauss999ef702022-03-11 01:37:23 -05002540#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2541#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002542 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002543 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002544 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002545#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002546 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002547 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002548 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002549#endif
Janos Follath088ce432017-04-10 12:42:31 +01002550#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002551 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002552 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002553 } else
Janos Follath088ce432017-04-10 12:42:31 +01002554#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002556
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002558 /* It follows from RFC 5280 A.1 that this length
2559 * can be represented in at most 11 bits. */
2560 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002561
Gilles Peskine449bd832023-01-11 14:50:10 +01002562 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2563 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002564 break;
2565 }
2566
Gilles Peskine449bd832023-01-11 14:50:10 +01002567 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002568 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002569 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002570 p += dn_size;
2571
Gilles Peskine449bd832023-01-11 14:50:10 +01002572 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002573
2574 total_dn_size += 2 + dn_size;
2575 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002576 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002577 }
2578
Paul Bakker926af752012-11-23 13:38:07 +01002579 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002580 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2581 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002582 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002583
Gilles Peskine449bd832023-01-11 14:50:10 +01002584 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002585
Gilles Peskine449bd832023-01-11 14:50:10 +01002586 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002587
Gilles Peskine449bd832023-01-11 14:50:10 +01002588 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002589}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002590#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002591
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002592#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01002593 (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2594 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002595MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002596static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002597{
2598 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2599 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002600 mbedtls_pk_context *pk;
2601 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002602 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002603#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002604 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002605 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002606 size_t key_len;
Valerio Setti97207782023-05-18 18:59:06 +02002607 mbedtls_ecp_group_id grp_id;
Valerio Setti3589a4c2023-06-22 09:02:44 +02002608 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
Valerio Setti0813b6f2023-06-16 12:18:53 +02002609 mbedtls_ecp_keypair *key;
2610#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002611
Gilles Peskine449bd832023-01-11 14:50:10 +01002612 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002613
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 if (pk == NULL) {
2615 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2616 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002617
Valerio Setti0813b6f2023-06-16 12:18:53 +02002618 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002619
Valerio Setti0813b6f2023-06-16 12:18:53 +02002620 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002621 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002622#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2623 case MBEDTLS_PK_ECKEY:
2624 case MBEDTLS_PK_ECKEY_DH:
2625 case MBEDTLS_PK_ECDSA:
2626#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002627 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2628 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2629 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002630
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002631 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
Neil Armstronge88d1902022-04-04 11:25:23 +02002632
Przemek Stekiel6f199852023-06-29 08:59:26 +02002633 /* Key should not be destroyed in the TLS library */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002634 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Przemek Stekiel6f199852023-06-29 08:59:26 +02002635
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002636 status = psa_get_key_attributes(ssl->handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002637 &key_attributes);
2638 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002639 ssl->handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002640 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002641 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002642
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002643 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
2644 ssl->handshake->xxdh_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002645
Gilles Peskine449bd832023-01-11 14:50:10 +01002646 psa_reset_key_attributes(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002647
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 ret = 0;
2649 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002650#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002651 case MBEDTLS_PK_ECKEY:
2652 case MBEDTLS_PK_ECKEY_DH:
2653 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002654 key = mbedtls_pk_ec_rw(*pk);
Valerio Settid0405092023-05-24 13:16:40 +02002655 grp_id = mbedtls_pk_get_group_id(pk);
2656 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002657 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2658 }
Valerio Setti97207782023-05-18 18:59:06 +02002659 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002660 if (tls_id == 0) {
2661 /* This elliptic curve is not supported */
2662 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2663 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002664
Gilles Peskine449bd832023-01-11 14:50:10 +01002665 /* If the above conversion to TLS ID was fine, then also this one will
2666 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002667 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002668 &ssl->handshake->xxdh_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002669
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002670 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002671
Gilles Peskine449bd832023-01-11 14:50:10 +01002672 key_attributes = psa_key_attributes_init();
2673 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2674 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2675 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002676 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2677 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002678
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 key_len = PSA_BITS_TO_BYTES(key->grp.pbits);
2680 ret = mbedtls_ecp_write_key(key, buf, key_len);
2681 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002682 mbedtls_platform_zeroize(buf, sizeof(buf));
2683 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002684 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002685
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002687 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002689 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002690 mbedtls_platform_zeroize(buf, sizeof(buf));
2691 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002692 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002693
Valerio Setti6835b4a2023-06-22 09:06:31 +02002694 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002695 ret = 0;
2696 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002697#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002699 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002700 }
2701
Gilles Peskine449bd832023-01-11 14:50:10 +01002702 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002703}
2704#elif defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002705 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002706MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002707static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002708{
Janos Follath865b3eb2019-12-16 11:46:15 +00002709 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002710
Gilles Peskine449bd832023-01-11 14:50:10 +01002711 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2712 if (private_key == NULL) {
2713 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2714 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002715 }
2716
Gilles Peskine449bd832023-01-11 14:50:10 +01002717 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2718 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2719 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002720 }
2721
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002723 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002724 MBEDTLS_ECDH_OURS)) != 0) {
2725 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2726 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002727 }
2728
Gilles Peskine449bd832023-01-11 14:50:10 +01002729 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002730}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002731#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2732 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002733
Gilles Peskineeccd8882020-03-10 12:19:08 +01002734#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002735 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002736MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002737static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2738 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002739{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002740 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2741 * signature length which will be added in ssl_write_server_key_exchange
2742 * after the call to ssl_prepare_server_key_exchange.
2743 * ssl_write_server_key_exchange also takes care of incrementing
2744 * ssl->out_msglen. */
2745 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002746 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2747 - sig_start);
2748 int ret = ssl->conf->f_async_resume(ssl,
2749 sig_start, signature_len, sig_max_len);
2750 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002751 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002752 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002753 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002754 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2755 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002756}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002757#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002758 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002759
Gilles Peskined3eb0612018-01-08 17:07:44 +01002760/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002761 * calculating the signature if any, but excluding formatting the
2762 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002763MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002764static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2765 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002766{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002767 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002768 ssl->handshake->ciphersuite_info;
2769
Gilles Peskineeccd8882020-03-10 12:19:08 +01002770#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002771#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002772 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002773#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002774#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002775
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002776 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002777#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002778 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002779#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002780
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002781#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002782#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002783 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002784#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002785 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002786#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002787#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002788
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002789 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002790
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002791 /*
2792 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002793 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002794 *
2795 */
2796
2797 /*
2798 * - ECJPAKE key exchanges
2799 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002800#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002801 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002802 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002803#if defined(MBEDTLS_USE_PSA_CRYPTO)
2804 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2805 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2806 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002807 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002808 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002809
Valerio Setti6f1b5742022-11-16 10:00:32 +01002810 /*
2811 * The first 3 bytes are:
2812 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2813 * [1, 2] elliptic curve's TLS ID
2814 *
2815 * However since we only support secp256r1 for now, we hardcode its
2816 * TLS ID here
2817 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002818 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002819 MBEDTLS_ECP_DP_SECP256R1);
2820 if (tls_id == 0) {
2821 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002822 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002823 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002824 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002825 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002826
Gilles Peskine449bd832023-01-11 14:50:10 +01002827 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2828 out_p + output_offset,
2829 end_p - out_p - output_offset, &output_len,
2830 MBEDTLS_ECJPAKE_ROUND_TWO);
2831 if (ret != 0) {
2832 psa_destroy_key(ssl->handshake->psa_pake_password);
2833 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2834 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2835 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002836 }
2837
Valerio Setti02c25b52022-11-15 14:08:42 +01002838 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002839 ssl->out_msglen += output_offset;
2840#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002841 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002842
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002843 ret = mbedtls_ecjpake_write_round_two(
2844 &ssl->handshake->ecjpake_ctx,
2845 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002846 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002847 ssl->conf->f_rng, ssl->conf->p_rng);
2848 if (ret != 0) {
2849 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2850 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002851 }
2852
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002853 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002854#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002855 }
2856#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2857
Hanno Becker1aa267c2017-04-28 17:08:27 +01002858 /*
2859 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2860 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2861 * we use empty support identity hints here.
2862 **/
2863#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002864 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002865 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2866 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002867 ssl->out_msg[ssl->out_msglen++] = 0x00;
2868 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002869 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002870#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2871 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002872
Hanno Becker7e5437a2017-04-28 17:15:26 +01002873 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002874 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002875 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002876#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002877 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002878 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002879 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002880
Gilles Peskine449bd832023-01-11 14:50:10 +01002881 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2882 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2883 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002884 }
2885
Paul Bakker41c83d32013-03-20 14:39:14 +01002886 /*
2887 * Ephemeral DH parameters:
2888 *
2889 * struct {
2890 * opaque dh_p<1..2^16-1>;
2891 * opaque dh_g<1..2^16-1>;
2892 * opaque dh_Ys<1..2^16-1>;
2893 * } ServerDHParams;
2894 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002895 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2896 &ssl->conf->dhm_P,
2897 &ssl->conf->dhm_G)) != 0) {
2898 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2899 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002900 }
Paul Bakker48916f92012-09-16 19:57:18 +00002901
Gilles Peskine449bd832023-01-11 14:50:10 +01002902 if ((ret = mbedtls_dhm_make_params(
2903 &ssl->handshake->dhm_ctx,
2904 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2905 ssl->out_msg + ssl->out_msglen, &len,
2906 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2907 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2908 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002909 }
2910
Jerry Yuc5aef882021-12-23 20:15:02 +08002911#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002912 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002913#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002914
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002915 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002916
Gilles Peskine449bd832023-01-11 14:50:10 +01002917 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2918 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2919 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2920 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002921 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002922#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002923
Hanno Becker1aa267c2017-04-28 17:08:27 +01002924 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002925 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002926 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002927#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002928 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002929 /*
2930 * Ephemeral ECDH parameters:
2931 *
2932 * struct {
2933 * ECParameters curve_params;
2934 * ECPoint public;
2935 * } ServerECDHParams;
2936 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002937 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002938 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002939 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002940 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002941
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002942 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2944 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2945 }
2946 for (; *group_list != 0; group_list++) {
2947 for (curr_tls_id = ssl->handshake->curves_tls_id;
2948 *curr_tls_id != 0; curr_tls_id++) {
2949 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002950 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002951 }
2952 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002953 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002954
Gilles Peskine449bd832023-01-11 14:50:10 +01002955curve_matching_done:
2956 if (*curr_tls_id == 0) {
2957 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2958 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2959 }
2960
2961 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2962 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002963
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002964#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002965 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2966 psa_key_attributes_t key_attributes;
2967 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002968 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2969 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2970 // data length(1)
2971 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002972 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002973 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002974
Gilles Peskine449bd832023-01-11 14:50:10 +01002975 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002976
Valerio Setti40d9ca92023-01-04 16:08:04 +01002977 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002978 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002979 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002980 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2981 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2982 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002983 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002984 handshake->xxdh_psa_type = key_type;
2985 handshake->xxdh_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002986
2987 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002988 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2989 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002990 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
2991 psa_set_key_bits(&key_attributes, handshake->xxdh_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002992
2993 /*
2994 * ECParameters curve_params
2995 *
2996 * First byte is curve_type, always named_curve
2997 */
2998 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2999
3000 /*
3001 * Next two bytes are the namedcurve value
3002 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003003 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003004 p += 2;
3005
3006 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003007 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003008 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003009 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003010 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003011 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3012 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003013 }
3014
3015 /*
3016 * ECPoint public
3017 *
3018 * First byte is data length.
3019 * It will be filled later. p holds now the data length location.
3020 */
3021
3022 /* Export the public part of the ECDH private key from PSA.
3023 * Make one byte space for the length.
3024 */
3025 unsigned char *own_pubkey = p + data_length_size;
3026
Gilles Peskine449bd832023-01-11 14:50:10 +01003027 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3028 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003029
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003030 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003031 own_pubkey, own_pubkey_max_len,
3032 &len);
3033 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003034 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003035 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003036 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3037 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003038 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003039 }
3040
3041 /* Store the length of the exported public key. */
3042 *p = (uint8_t) len;
3043
3044 /* Determine full message length. */
3045 len += header_size;
3046#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003047 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003048 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003049
Gilles Peskine449bd832023-01-11 14:50:10 +01003050 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3051 curr_grp_id)) != 0) {
3052 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3053 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003054 }
3055
Gilles Peskine449bd832023-01-11 14:50:10 +01003056 if ((ret = mbedtls_ecdh_make_params(
3057 &ssl->handshake->ecdh_ctx, &len,
3058 ssl->out_msg + ssl->out_msglen,
3059 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3060 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3061 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3062 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003063 }
3064
Gilles Peskine449bd832023-01-11 14:50:10 +01003065 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3066 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003067#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003068
Jerry Yuc5aef882021-12-23 20:15:02 +08003069#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003070 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003071#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003072
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003073 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003074 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003075#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003076
Hanno Becker1aa267c2017-04-28 17:08:27 +01003077 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003078 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003079 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003080 * exchange parameters, compute and add the signature here.
3081 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003082 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003083#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003084 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3085 if (dig_signed == NULL) {
3086 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3087 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003088 }
3089
Gilles Peskine1004c192018-01-08 16:59:14 +01003090 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003091 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003092 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003093
Janos Follath865b3eb2019-12-16 11:46:15 +00003094 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003095
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003096 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003097 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003098 * For TLS 1.2, obey signature-hash-algorithm extension
3099 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003100 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003101
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003102 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003103 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003104
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003105 unsigned int sig_hash =
3106 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003107 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003108
Gilles Peskine449bd832023-01-11 14:50:10 +01003109 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003110
Ronald Cron8457c122022-03-07 11:32:54 +01003111 /* For TLS 1.2, obey signature-hash-algorithm extension
3112 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003113 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3114 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003115 /* (... because we choose a cipher suite
3116 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003118 }
3119
Gilles Peskine449bd832023-01-11 14:50:10 +01003120 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003121
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003122 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003123 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003124 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003125 if (md_alg != MBEDTLS_MD_NONE) {
3126 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3127 dig_signed,
3128 dig_signed_len,
3129 md_alg);
3130 if (ret != 0) {
3131 return ret;
3132 }
3133 } else {
3134 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3135 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003136 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003137
Gilles Peskine449bd832023-01-11 14:50:10 +01003138 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003139
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003140 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003141 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003142 */
Ronald Cron8457c122022-03-07 11:32:54 +01003143 /*
3144 * We need to specify signature and hash algorithm explicitly through
3145 * a prefix to the signature.
3146 *
3147 * struct {
3148 * HashAlgorithm hash;
3149 * SignatureAlgorithm signature;
3150 * } SignatureAndHashAlgorithm;
3151 *
3152 * struct {
3153 * SignatureAndHashAlgorithm algorithm;
3154 * opaque signature<0..2^16-1>;
3155 * } DigitallySigned;
3156 *
3157 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003158
Gilles Peskine449bd832023-01-11 14:50:10 +01003159 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3160 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003161
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003162#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003163 if (ssl->conf->f_async_sign_start != NULL) {
3164 ret = ssl->conf->f_async_sign_start(ssl,
3165 mbedtls_ssl_own_cert(ssl),
3166 md_alg, hash, hashlen);
3167 switch (ret) {
3168 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3169 /* act as if f_async_sign was null */
3170 break;
3171 case 0:
3172 ssl->handshake->async_in_progress = 1;
3173 return ssl_resume_server_key_exchange(ssl, signature_len);
3174 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3175 ssl->handshake->async_in_progress = 1;
3176 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3177 default:
3178 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3179 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003180 }
3181 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003182#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003183
Gilles Peskine449bd832023-01-11 14:50:10 +01003184 if (mbedtls_ssl_own_key(ssl) == NULL) {
3185 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3186 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003187 }
3188
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003189 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3190 * signature length which will be added in ssl_write_server_key_exchange
3191 * after the call to ssl_prepare_server_key_exchange.
3192 * ssl_write_server_key_exchange also takes care of incrementing
3193 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003194 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3195 md_alg, hash, hashlen,
3196 ssl->out_msg + ssl->out_msglen + 2,
3197 out_buf_len - ssl->out_msglen - 2,
3198 signature_len,
3199 ssl->conf->f_rng,
3200 ssl->conf->p_rng)) != 0) {
3201 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3202 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003203 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003204 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003205#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003206
Gilles Peskine449bd832023-01-11 14:50:10 +01003207 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003208}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003209
Gilles Peskined3eb0612018-01-08 17:07:44 +01003210/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003211 * that do not include a ServerKeyExchange message, do nothing. Either
3212 * way, if successful, move on to the next step in the SSL state
3213 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003214MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003215static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003216{
Janos Follath865b3eb2019-12-16 11:46:15 +00003217 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003218 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003219#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003220 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003221 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003222#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003223
Gilles Peskine449bd832023-01-11 14:50:10 +01003224 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003225
Gilles Peskineeccd8882020-03-10 12:19:08 +01003226#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003227 /* Extract static ECDH parameters and abort if ServerKeyExchange
3228 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003229 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003230 /* For suites involving ECDH, extract DH parameters
3231 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003232#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003233 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3234 ret = ssl_get_ecdh_params_from_cert(ssl);
3235 if (ret != 0) {
3236 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3237 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003238 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003239 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003240#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003241
3242 /* Key exchanges not involving ephemeral keys don't use
3243 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003244 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003245 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003246 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003247 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003248#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003249
Gilles Peskineeccd8882020-03-10 12:19:08 +01003250#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003251 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003252 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003253 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 if (ssl->handshake->async_in_progress != 0) {
3255 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3256 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3257 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003258#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003259 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003260 {
3261 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003262 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003263 }
3264
Gilles Peskine449bd832023-01-11 14:50:10 +01003265 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003266 /* If we're starting to write a new message, set ssl->out_msglen
3267 * to 0. But if we're resuming after an asynchronous message,
3268 * out_msglen is the amount of data written so far and mst be
3269 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003270 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3271 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3272 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003273 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 }
3275 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003276 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003277
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003278 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003279 * ssl_prepare_server_key_exchange already wrote the signature
3280 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003281#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003282 if (signature_len != 0) {
3283 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3284 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003285
Gilles Peskine449bd832023-01-11 14:50:10 +01003286 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3287 ssl->out_msg + ssl->out_msglen,
3288 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003289
3290 /* Skip over the already-written signature */
3291 ssl->out_msglen += signature_len;
3292 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003293#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003294
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003295 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003296 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3297 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003298
3299 ssl->state++;
3300
Gilles Peskine449bd832023-01-11 14:50:10 +01003301 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3302 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3303 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003304 }
3305
Gilles Peskine449bd832023-01-11 14:50:10 +01003306 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3307 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003308}
3309
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003310MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003311static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003312{
Janos Follath865b3eb2019-12-16 11:46:15 +00003313 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003314
Gilles Peskine449bd832023-01-11 14:50:10 +01003315 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003316
3317 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003318 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3319 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003320
3321 ssl->state++;
3322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003323#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003324 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3325 mbedtls_ssl_send_flight_completed(ssl);
3326 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003327#endif
3328
Gilles Peskine449bd832023-01-11 14:50:10 +01003329 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3330 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3331 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003332 }
3333
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003334#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003335 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3336 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3337 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3338 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003339 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003340#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003341
Gilles Peskine449bd832023-01-11 14:50:10 +01003342 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003343
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003345}
3346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003347#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3348 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003349MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003350static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3351 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003352{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003353 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003354 size_t n;
3355
3356 /*
3357 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3358 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003359 if (*p + 2 > end) {
3360 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3361 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003362 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003363
Gilles Peskine449bd832023-01-11 14:50:10 +01003364 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003365 *p += 2;
3366
Gilles Peskine449bd832023-01-11 14:50:10 +01003367 if (*p + n > end) {
3368 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3369 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003370 }
3371
Gilles Peskine449bd832023-01-11 14:50:10 +01003372 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3373 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3374 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003375 }
3376
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003377 *p += n;
3378
Gilles Peskine449bd832023-01-11 14:50:10 +01003379 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003380
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003382}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003383#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3384 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003386#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3387 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003388
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003389#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003390MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003391static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3392 unsigned char *peer_pms,
3393 size_t *peer_pmslen,
3394 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003395{
Gilles Peskine449bd832023-01-11 14:50:10 +01003396 int ret = ssl->conf->f_async_resume(ssl,
3397 peer_pms, peer_pmslen, peer_pmssize);
3398 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003399 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003400 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003401 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003402 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3403 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003404}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003405#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003406
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003407MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003408static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3409 const unsigned char *p,
3410 const unsigned char *end,
3411 unsigned char *peer_pms,
3412 size_t *peer_pmslen,
3413 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003414{
Janos Follath865b3eb2019-12-16 11:46:15 +00003415 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003416
Gilles Peskine449bd832023-01-11 14:50:10 +01003417 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3418 if (own_cert == NULL) {
3419 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3420 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003421 }
3422 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003423 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3424 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003425
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003426#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003427 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003428 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003429 if (ssl->handshake->async_in_progress != 0) {
3430 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3431 return ssl_resume_decrypt_pms(ssl,
3432 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003433 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003434#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003435
3436 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003437 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003438 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003439 if (p + 2 > end) {
3440 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3441 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003442 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 if (*p++ != MBEDTLS_BYTE_1(len) ||
3444 *p++ != MBEDTLS_BYTE_0(len)) {
3445 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3446 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003447 }
3448
Gilles Peskine449bd832023-01-11 14:50:10 +01003449 if (p + len != end) {
3450 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3451 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003452 }
3453
Gilles Peskine422ccab2018-01-11 18:29:01 +01003454 /*
3455 * Decrypt the premaster secret
3456 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003457#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003458 if (ssl->conf->f_async_decrypt_start != NULL) {
3459 ret = ssl->conf->f_async_decrypt_start(ssl,
3460 mbedtls_ssl_own_cert(ssl),
3461 p, len);
3462 switch (ret) {
3463 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3464 /* act as if f_async_decrypt_start was null */
3465 break;
3466 case 0:
3467 ssl->handshake->async_in_progress = 1;
3468 return ssl_resume_decrypt_pms(ssl,
3469 peer_pms,
3470 peer_pmslen,
3471 peer_pmssize);
3472 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3473 ssl->handshake->async_in_progress = 1;
3474 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3475 default:
3476 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3477 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003478 }
3479 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003480#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003481
Gilles Peskine449bd832023-01-11 14:50:10 +01003482 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3483 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3484 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003485 }
3486
Gilles Peskine449bd832023-01-11 14:50:10 +01003487 ret = mbedtls_pk_decrypt(private_key, p, len,
3488 peer_pms, peer_pmslen, peer_pmssize,
3489 ssl->conf->f_rng, ssl->conf->p_rng);
3490 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003491}
3492
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003493MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003494static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3495 const unsigned char *p,
3496 const unsigned char *end,
3497 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003498{
Janos Follath865b3eb2019-12-16 11:46:15 +00003499 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003500 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3501 unsigned char ver[2];
3502 unsigned char fake_pms[48], peer_pms[48];
3503 unsigned char mask;
3504 size_t i, peer_pmslen;
3505 unsigned int diff;
3506
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003507 /* In case of a failure in decryption, the decryption may write less than
3508 * 2 bytes of output, but we always read the first two bytes. It doesn't
3509 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003510 * ret being nonzero, and we only care whether diff is 0.
3511 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3512 * also makes memory analyzers happy (don't access uninitialized memory,
3513 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003514 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003515 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003516
Gilles Peskine449bd832023-01-11 14:50:10 +01003517 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3518 peer_pms,
3519 &peer_pmslen,
3520 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003521
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003522#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003523 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3524 return ret;
3525 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003526#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003527
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3529 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003530
3531 /* Avoid data-dependent branches while checking for invalid
3532 * padding, to protect against timing-based Bleichenbacher-type
3533 * attacks. */
3534 diff = (unsigned int) ret;
3535 diff |= peer_pmslen ^ 48;
3536 diff |= peer_pms[0] ^ ver[0];
3537 diff |= peer_pms[1] ^ ver[1];
3538
3539 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
Gilles Peskine449bd832023-01-11 14:50:10 +01003540 mask = mbedtls_ct_uint_mask(diff);
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003541
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003542 /*
3543 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3544 * must not cause the connection to end immediately; instead, send a
3545 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003546 * To protect against timing-based variants of the attack, we must
3547 * not have any branch that depends on whether the decryption was
3548 * successful. In particular, always generate the fake premaster secret,
3549 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003550 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003551 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3552 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003553 /* It's ok to abort on an RNG failure, since this does not reveal
3554 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003555 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003556 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003557
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003558#if defined(MBEDTLS_SSL_DEBUG_ALL)
Gilles Peskine449bd832023-01-11 14:50:10 +01003559 if (diff != 0) {
3560 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3561 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003562#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003563
Gilles Peskine449bd832023-01-11 14:50:10 +01003564 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3565 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3566 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3567 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003568 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003569 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003570
Gilles Peskine422ccab2018-01-11 18:29:01 +01003571 /* Set pms to either the true or the fake PMS, without
3572 * data-dependent branches. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003573 for (i = 0; i < ssl->handshake->pmslen; i++) {
3574 pms[i] = (mask & fake_pms[i]) | ((~mask) & peer_pms[i]);
3575 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003576
Gilles Peskine449bd832023-01-11 14:50:10 +01003577 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003578}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003579#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3580 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003581
Gilles Peskineeccd8882020-03-10 12:19:08 +01003582#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003583MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003584static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3585 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003586{
Paul Bakker6db455e2013-09-18 17:29:31 +02003587 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003588 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003589
Gilles Peskine449bd832023-01-11 14:50:10 +01003590 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3591 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3592 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003593 }
3594
3595 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003596 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003597 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003598 if (end - *p < 2) {
3599 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3600 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003601 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003602
Gilles Peskine449bd832023-01-11 14:50:10 +01003603 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003604 *p += 2;
3605
Gilles Peskine449bd832023-01-11 14:50:10 +01003606 if (n == 0 || n > end - *p) {
3607 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3608 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003609 }
3610
Gilles Peskine449bd832023-01-11 14:50:10 +01003611 if (ssl->conf->f_psk != NULL) {
3612 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003613 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003614 }
3615 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003616 /* Identity is not a big secret since clients send it in the clear,
3617 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003618 if (n != ssl->conf->psk_identity_len ||
3619 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003620 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003621 }
3622 }
3623
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3625 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3626 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3627 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3628 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003629 }
3630
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003631 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003632
Gilles Peskine449bd832023-01-11 14:50:10 +01003633 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003634}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003635#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003636
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003637MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003638static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003639{
Janos Follath865b3eb2019-12-16 11:46:15 +00003640 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003641 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003642 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003643
Hanno Beckere694c3e2017-12-27 21:34:08 +00003644 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003645
Gilles Peskine449bd832023-01-11 14:50:10 +01003646 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003647
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003648#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003649 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3650 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3651 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3652 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3653 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003654 /* We've already read a record and there is an asynchronous
3655 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003656 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003657 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3658 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003659#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003660 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3661 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3662 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003663 }
3664
Gilles Peskine449bd832023-01-11 14:50:10 +01003665 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003666 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003667
Gilles Peskine449bd832023-01-11 14:50:10 +01003668 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3669 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3670 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003671 }
3672
Gilles Peskine449bd832023-01-11 14:50:10 +01003673 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3674 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3675 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003676 }
3677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003678#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003679 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3680 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3681 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3682 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003683 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003684
Gilles Peskine449bd832023-01-11 14:50:10 +01003685 if (p != end) {
3686 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3687 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003688 }
3689
Gilles Peskine449bd832023-01-11 14:50:10 +01003690 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3691 ssl->handshake->premaster,
3692 MBEDTLS_PREMASTER_SIZE,
3693 &ssl->handshake->pmslen,
3694 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3695 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3696 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003697 }
3698
Gilles Peskine449bd832023-01-11 14:50:10 +01003699 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3700 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003701#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003702#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3703 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3704 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3705 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003706 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003707 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3708 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003709 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003710#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 size_t data_len = (size_t) (*p++);
3712 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003713 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3714 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3715
Gilles Peskine449bd832023-01-11 14:50:10 +01003716 MBEDTLS_SSL_DEBUG_MSG(1, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003717
3718 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003719 * We must have at least two bytes (1 for length, at least 1 for data)
3720 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003721 if (buf_len < 2) {
3722 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length"));
3723 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003724 }
3725
Gilles Peskine449bd832023-01-11 14:50:10 +01003726 if (data_len < 1 || data_len > buf_len) {
3727 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length"));
3728 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003729 }
3730
3731 /* Store peer's ECDH public key. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003732 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3733 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003734
3735 /* Compute ECDH shared secret. */
3736 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003737 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3738 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003739 handshake->premaster, sizeof(handshake->premaster),
3740 &handshake->pmslen);
3741 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003742 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003743 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003744 if (handshake->xxdh_psa_privkey_is_external == 0) {
3745 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003746 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003747 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003748 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003749 }
3750
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003751 if (handshake->xxdh_psa_privkey_is_external == 0) {
3752 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003753
Gilles Peskine449bd832023-01-11 14:50:10 +01003754 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003755 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003756 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3757 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003758 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003759 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003760 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003761#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003762 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3763 p, end - p)) != 0) {
3764 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3765 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003766 }
3767
Gilles Peskine449bd832023-01-11 14:50:10 +01003768 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3769 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003770
Gilles Peskine449bd832023-01-11 14:50:10 +01003771 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3772 &ssl->handshake->pmslen,
3773 ssl->handshake->premaster,
3774 MBEDTLS_MPI_MAX_SIZE,
3775 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3776 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3777 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003778 }
3779
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3781 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003782#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003783 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003784#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3785 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3786 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3787 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3788#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003789 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3790 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3791 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3792 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003793 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003794
Gilles Peskine449bd832023-01-11 14:50:10 +01003795 if (p != end) {
3796 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3797 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003798 }
3799
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003800#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003801 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3802 ciphersuite_info->key_exchange)) != 0) {
3803 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3804 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003805 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003806#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003808#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3809#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003810 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003811#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003813 /* There is an asynchronous operation in progress to
3814 * decrypt the encrypted premaster secret, so skip
3815 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003816 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003817 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3818 * won't actually use it, but maintain p anyway for robustness. */
3819 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003821#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003822 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3823 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3824 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003825 }
3826
Gilles Peskine449bd832023-01-11 14:50:10 +01003827 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3828 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3829 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003830 }
3831
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003832#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003833 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3834 ciphersuite_info->key_exchange)) != 0) {
3835 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3836 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003837 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003838#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003839 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003840#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3841#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003842 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3843 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3844 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3845 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003846 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003847 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3848 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3849 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003850 }
3851
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 if (p != end) {
3853 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3854 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003855 }
3856
Neil Armstrong80f6f322022-05-03 17:56:38 +02003857#if defined(MBEDTLS_USE_PSA_CRYPTO)
3858 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003859 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003860 size_t pms_len;
3861
3862 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003863 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3864 pms + 2, pms_end - (pms + 2), &pms_len,
3865 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3866 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3867 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003868 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003869 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003870 pms += 2 + pms_len;
3871
Gilles Peskine449bd832023-01-11 14:50:10 +01003872 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003873#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003874 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3875 ciphersuite_info->key_exchange)) != 0) {
3876 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3877 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003878 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003879#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003880 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003881#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003882#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003883 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003884#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003885 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3886 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3887 uint8_t ecpoint_len;
3888
3889 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3890
Gilles Peskine449bd832023-01-11 14:50:10 +01003891 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3892 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003893 psa_destroy_key(handshake->xxdh_psa_privkey);
3894 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003895 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003896 }
3897
3898 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003899 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003900 psa_destroy_key(handshake->xxdh_psa_privkey);
3901 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003902 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003903 }
3904
Neil Armstrong039db292022-03-09 11:38:34 +01003905 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003906 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003907 psa_destroy_key(handshake->xxdh_psa_privkey);
3908 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003909 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003910 }
3911
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003912 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3913 the sizes of the FFDH keys which are at least 2048 bits.
3914 The size of the array is thus greater than 256 bytes which is greater than any
3915 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003916#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003917 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3918 psa_destroy_key(handshake->xxdh_psa_privkey);
3919 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003920 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003921 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003922#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003923 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3924 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003925#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003926
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003927 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3928 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003929 p += ecpoint_len;
3930
Neil Armstrong3bcef082022-03-23 18:16:54 +01003931 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003932 * - a uint16 containing the length (in octets) of the ECDH computation
3933 * - the octet string produced by the ECDH computation
3934 * - a uint16 containing the length (in octets) of the PSK
3935 * - the PSK itself
3936 */
Neil Armstrong039db292022-03-09 11:38:34 +01003937 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003938 const unsigned char * const psm_end =
3939 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003940 /* uint16 to store length (in octets) of the ECDH computation */
3941 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003942 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003943
3944 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003945 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003946 handshake->xxdh_psa_privkey,
3947 handshake->xxdh_psa_peerkey,
3948 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003949 psm + zlen_size,
3950 psm_end - (psm + zlen_size),
3951 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003952
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003953 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3954 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003955
Gilles Peskine449bd832023-01-11 14:50:10 +01003956 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003957 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003959 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003960 }
Neil Armstrong039db292022-03-09 11:38:34 +01003961
Neil Armstrong3bcef082022-03-23 18:16:54 +01003962 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003963 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003964 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003965
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003966#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003967 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3968 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3969 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003970 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003971
Gilles Peskine449bd832023-01-11 14:50:10 +01003972 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3973 p, end - p)) != 0) {
3974 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3975 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003976 }
3977
Gilles Peskine449bd832023-01-11 14:50:10 +01003978 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3979 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003980
Gilles Peskine449bd832023-01-11 14:50:10 +01003981 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3982 ciphersuite_info->key_exchange)) != 0) {
3983 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3984 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003985 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003986#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003987 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003988#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3989#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003990 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3991 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3992 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3993 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003994 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003995 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003996#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003997#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003998 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02003999#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004000 if ((ret = mbedtls_psa_ecjpake_read_round(
4001 &ssl->handshake->psa_pake_ctx, p, end - p,
4002 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4003 psa_destroy_key(ssl->handshake->psa_pake_password);
4004 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004005
Gilles Peskine449bd832023-01-11 14:50:10 +01004006 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4007 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004008 }
4009#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004010 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
4011 p, end - p);
4012 if (ret != 0) {
4013 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4014 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004015 }
4016
Gilles Peskine449bd832023-01-11 14:50:10 +01004017 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4018 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4019 ssl->conf->f_rng, ssl->conf->p_rng);
4020 if (ret != 0) {
4021 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4022 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004023 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004024#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004025 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004026#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004027 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004028 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4029 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004030 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004031
Gilles Peskine449bd832023-01-11 14:50:10 +01004032 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4033 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4034 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004035 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004036
Paul Bakker5121ce52009-01-03 21:22:43 +00004037 ssl->state++;
4038
Gilles Peskine449bd832023-01-11 14:50:10 +01004039 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004040
Gilles Peskine449bd832023-01-11 14:50:10 +01004041 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004042}
4043
Gilles Peskineeccd8882020-03-10 12:19:08 +01004044#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004045MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004046static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004047{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004048 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004049 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004050
Gilles Peskine449bd832023-01-11 14:50:10 +01004051 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004052
Gilles Peskine449bd832023-01-11 14:50:10 +01004053 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4054 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004055 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004056 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004057 }
4058
Gilles Peskine449bd832023-01-11 14:50:10 +01004059 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4060 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004061}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004062#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004063MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004064static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004065{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004066 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004067 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004068 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004069 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004070 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004071 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004072 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004073 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004074 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004075 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004076
Gilles Peskine449bd832023-01-11 14:50:10 +01004077 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004078
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4080 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004081 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004082 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004083 }
4084
Hanno Becker2a831a42019-02-07 13:17:25 +00004085#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004086 if (ssl->session_negotiate->peer_cert == NULL) {
4087 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004088 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004089 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004090 }
4091#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004092 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4093 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004094 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004096 }
4097#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4098
Simon Butcher99000142016-10-13 17:21:01 +01004099 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4101 if (0 != ret) {
4102 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4103 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004104 }
4105
4106 ssl->state++;
4107
Simon Butcher99000142016-10-13 17:21:01 +01004108 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004109 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4110 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4111 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4112 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004113 }
4114
Gilles Peskine449bd832023-01-11 14:50:10 +01004115 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004116
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004117#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4118 peer_pk = &ssl->handshake->peer_pubkey;
4119#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004120 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004121 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004122 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004123 }
4124 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4125#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4126
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004127 /*
4128 * struct {
4129 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4130 * opaque signature<0..2^16-1>;
4131 * } DigitallySigned;
4132 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004133 if (i + 2 > ssl->in_hslen) {
4134 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4135 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004136 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004137
Ronald Cron8457c122022-03-07 11:32:54 +01004138 /*
4139 * Hash
4140 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004141 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004142
Gilles Peskine449bd832023-01-11 14:50:10 +01004143 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4144 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4145 " for verify message"));
4146 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004147 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004148
Simon Butcher99000142016-10-13 17:21:01 +01004149#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004150 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004151 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004152 }
Simon Butcher99000142016-10-13 17:21:01 +01004153#endif
Paul Bakker926af752012-11-23 13:38:07 +01004154
Ronald Cron8457c122022-03-07 11:32:54 +01004155 /* Info from md_alg will be used instead */
4156 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004157
Ronald Cron8457c122022-03-07 11:32:54 +01004158 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004159
Ronald Cron8457c122022-03-07 11:32:54 +01004160 /*
4161 * Signature
4162 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004163 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4164 == MBEDTLS_PK_NONE) {
4165 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4166 " for verify message"));
4167 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004168 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004169
Ronald Cron8457c122022-03-07 11:32:54 +01004170 /*
4171 * Check the certificate's key type matches the signature alg
4172 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004173 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4174 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4175 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004176 }
4177
4178 i++;
4179
Gilles Peskine449bd832023-01-11 14:50:10 +01004180 if (i + 2 > ssl->in_hslen) {
4181 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4182 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004183 }
4184
Gilles Peskine449bd832023-01-11 14:50:10 +01004185 sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i+1];
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004186 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004187
Gilles Peskine449bd832023-01-11 14:50:10 +01004188 if (i + sig_len != ssl->in_hslen) {
4189 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4190 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004191 }
4192
Simon Butcher99000142016-10-13 17:21:01 +01004193 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004194 {
4195 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004196 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4197 if (0 != ret) {
4198 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4199 return ret;
4200 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004201 }
Simon Butcher99000142016-10-13 17:21:01 +01004202
Gilles Peskine449bd832023-01-11 14:50:10 +01004203 if ((ret = mbedtls_pk_verify(peer_pk,
4204 md_alg, hash_start, hashlen,
4205 ssl->in_msg + i, sig_len)) != 0) {
4206 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4207 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004208 }
4209
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004210 ret = mbedtls_ssl_update_handshake_status(ssl);
4211 if (0 != ret) {
4212 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4213 return ret;
4214 }
Simon Butcher99000142016-10-13 17:21:01 +01004215
Gilles Peskine449bd832023-01-11 14:50:10 +01004216 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004217
Gilles Peskine449bd832023-01-11 14:50:10 +01004218 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004219}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004220#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004222#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004223MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004224static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004225{
Janos Follath865b3eb2019-12-16 11:46:15 +00004226 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004227 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004228 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004229
Gilles Peskine449bd832023-01-11 14:50:10 +01004230 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004232 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4233 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004234
4235 /*
4236 * struct {
4237 * uint32 ticket_lifetime_hint;
4238 * opaque ticket<0..2^16-1>;
4239 * } NewSessionTicket;
4240 *
4241 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4242 * 8 . 9 ticket_len (n)
4243 * 10 . 9+n ticket content
4244 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004245
Gilles Peskine449bd832023-01-11 14:50:10 +01004246 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4247 ssl->session_negotiate,
4248 ssl->out_msg + 10,
4249 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4250 &tlen, &lifetime)) != 0) {
4251 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004252 tlen = 0;
4253 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004254
Gilles Peskine449bd832023-01-11 14:50:10 +01004255 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4256 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004257 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004258
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004259 /*
4260 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4261 * ChangeCipherSpec share the same state.
4262 */
4263 ssl->handshake->new_session_ticket = 0;
4264
Gilles Peskine449bd832023-01-11 14:50:10 +01004265 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4266 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4267 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004268 }
4269
Gilles Peskine449bd832023-01-11 14:50:10 +01004270 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004271
Gilles Peskine449bd832023-01-11 14:50:10 +01004272 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004273}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004274#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004275
Paul Bakker5121ce52009-01-03 21:22:43 +00004276/*
Paul Bakker1961b702013-01-25 14:49:24 +01004277 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004278 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004279int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004280{
4281 int ret = 0;
4282
Gilles Peskine449bd832023-01-11 14:50:10 +01004283 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004284
Gilles Peskine449bd832023-01-11 14:50:10 +01004285 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004286 case MBEDTLS_SSL_HELLO_REQUEST:
4287 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004288 break;
4289
Paul Bakker1961b702013-01-25 14:49:24 +01004290 /*
4291 * <== ClientHello
4292 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004293 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004294 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004295 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004297#if defined(MBEDTLS_SSL_PROTO_DTLS)
4298 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004299 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004300#endif
4301
Paul Bakker1961b702013-01-25 14:49:24 +01004302 /*
4303 * ==> ServerHello
4304 * Certificate
4305 * ( ServerKeyExchange )
4306 * ( CertificateRequest )
4307 * ServerHelloDone
4308 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004309 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004310 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004311 break;
4312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004313 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004314 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004315 break;
4316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004317 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004318 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004319 break;
4320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004321 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004322 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004323 break;
4324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004325 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004326 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004327 break;
4328
4329 /*
4330 * <== ( Certificate/Alert )
4331 * ClientKeyExchange
4332 * ( CertificateVerify )
4333 * ChangeCipherSpec
4334 * Finished
4335 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004336 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004337 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004338 break;
4339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004340 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004341 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004342 break;
4343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004344 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004345 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004346 break;
4347
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004348 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004349 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004350 break;
4351
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004352 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004353 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004354 break;
4355
4356 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004357 * ==> ( NewSessionTicket )
4358 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004359 * Finished
4360 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004361 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4362#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004363 if (ssl->handshake->new_session_ticket != 0) {
4364 ret = ssl_write_new_session_ticket(ssl);
4365 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004366#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004367 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004368 break;
4369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004370 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004371 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004372 break;
4373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004374 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004375 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004376 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004377 break;
4378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004379 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004380 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004381 break;
4382
4383 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004384 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4385 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004386 }
4387
Gilles Peskine449bd832023-01-11 14:50:10 +01004388 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004389}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004390
Gilles Peskine449bd832023-01-11 14:50:10 +01004391void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004392{
TRodziewicz3946f792021-06-14 12:11:18 +02004393 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004394}
4395
Jerry Yufb4b6472022-01-27 15:03:26 +08004396#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */