blob: 07641cb3e8fa0ecf2377f892b8cbb22efd4a365a [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
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
7
Harry Ramsey0f6bc412024-10-04 10:36:54 +01008#include "ssl_misc.h"
Paul Bakker5121ce52009-01-03 21:22:43 +00009
Jerry Yufb4b6472022-01-27 15:03:26 +080010#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080011
SimonBd5800b72016-04-26 07:43:27 +010012#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010013
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000014#include "mbedtls/ssl.h"
Valerio Settib4f50762024-01-17 10:24:52 +010015#include "debug_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000016#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050017#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020018#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020019#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000020
21#include <string.h>
22
Andrzej Kurek00644842023-05-30 05:45:00 -040023/* Define a local translating function to save code size by not using too many
24 * arguments in each translating place. */
Ben Taylor558766d2025-07-11 08:37:22 +010025#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040026static int local_err_translation(psa_status_t status)
27{
28 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040029 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040030 psa_generic_status_to_mbedtls);
31}
32#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050033#endif
34
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_ECP_C)
Anton Matkinbc487252025-06-16 13:37:03 +020036#include "mbedtls/private/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010037#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000038
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010040#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020041#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010044int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
45 const unsigned char *info,
46 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020047{
Gilles Peskine449bd832023-01-11 14:50:10 +010048 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
49 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
50 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020051
Gilles Peskine449bd832023-01-11 14:50:10 +010052 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020053
Gilles Peskine449bd832023-01-11 14:50:10 +010054 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
55 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
56 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020057
Gilles Peskine449bd832023-01-11 14:50:10 +010058 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020059 ssl->cli_id_len = ilen;
60
Gilles Peskine449bd832023-01-11 14:50:10 +010061 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020062}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020063
Gilles Peskine449bd832023-01-11 14:50:10 +010064void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
65 mbedtls_ssl_cookie_write_t *f_cookie_write,
66 mbedtls_ssl_cookie_check_t *f_cookie_check,
67 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020068{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020069 conf->f_cookie_write = f_cookie_write;
70 conf->f_cookie_check = f_cookie_check;
71 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020072}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020074
Gilles Peskineeccd8882020-03-10 12:19:08 +010075#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020076MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010077static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010078{
Gilles Peskine449bd832023-01-11 14:50:10 +010079 if (conf->f_psk != NULL) {
80 return 1;
81 }
Hanno Becker845b9462018-10-26 12:07:29 +010082
Gilles Peskine449bd832023-01-11 14:50:10 +010083 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
84 return 0;
85 }
Hanno Becker845b9462018-10-26 12:07:29 +010086
Hanno Becker845b9462018-10-26 12:07:29 +010087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
89 return 1;
90 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020091
Gilles Peskine449bd832023-01-11 14:50:10 +010092 if (conf->psk != NULL && conf->psk_len != 0) {
93 return 1;
94 }
Hanno Becker845b9462018-10-26 12:07:29 +010095
Gilles Peskine449bd832023-01-11 14:50:10 +010096 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +010097}
Gilles Peskineeccd8882020-03-10 12:19:08 +010098#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +010099
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200100MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100101static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
102 const unsigned char *buf,
103 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000104{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100107 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100109 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
111 ssl->verify_data_len) != 0) {
112 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
113 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
114 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
115 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100116 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000119 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 if (len != 1 || buf[0] != 0x0) {
121 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
122 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
123 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
124 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000125 }
126
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000128 }
Paul Bakker48916f92012-09-16 19:57:18 +0000129
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000131}
132
Valerio Setti60d3b912023-07-25 10:43:53 +0200133#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200134 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100135 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800136/*
Jerry Yud491ea42022-01-13 16:15:25 +0800137 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
138 * curves (TLS 1.2) extension.
139 *
140 * The "extension_data" field of a supported groups extension contains a
141 * "NamedGroupList" value (TLS 1.3 RFC8446):
142 * enum {
143 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
144 * x25519(0x001D), x448(0x001E),
145 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
146 * ffdhe6144(0x0103), ffdhe8192(0x0104),
147 * ffdhe_private_use(0x01FC..0x01FF),
148 * ecdhe_private_use(0xFE00..0xFEFF),
149 * (0xFFFF)
150 * } NamedGroup;
151 * struct {
152 * NamedGroup named_group_list<2..2^16-1>;
153 * } NamedGroupList;
154 *
155 * The "extension_data" field of a supported elliptic curves extension contains
156 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
157 * enum {
158 * deprecated(1..22),
159 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
160 * x25519(29), x448(30),
161 * reserved (0xFE00..0xFEFF),
162 * deprecated(0xFF01..0xFF02),
163 * (0xFFFF)
164 * } NamedCurve;
165 * struct {
166 * NamedCurve named_curve_list<2..2^16-1>
167 * } NamedCurveList;
168 *
Jerry Yub925f212022-01-12 11:17:02 +0800169 * The TLS 1.3 supported groups extension was defined to be a compatible
170 * generalization of the TLS 1.2 supported elliptic curves extension. They both
171 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800172 *
Jerry Yub925f212022-01-12 11:17:02 +0800173 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200174MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100175static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
176 const unsigned char *buf,
177 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100178{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200179 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100180 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100181 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100182
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 if (len < 2) {
184 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
185 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
186 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
187 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200188 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000189 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 if (list_size + 2 != len ||
191 list_size % 2 != 0) {
192 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
193 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
194 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
195 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100196 }
197
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200198 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100199 if (ssl->handshake->curves_tls_id != NULL) {
200 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
201 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
202 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
203 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200204 }
205
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100206 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200207 * and leave room for a final 0 */
208 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100211 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200212
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 if ((curves_tls_id = mbedtls_calloc(our_size,
214 sizeof(*curves_tls_id))) == NULL) {
215 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
216 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
217 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200218 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200219
Valerio Setti18c9fed2022-12-30 17:44:24 +0100220 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200221
Paul Bakker41c83d32013-03-20 14:39:14 +0100222 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 while (list_size > 0 && our_size > 1) {
224 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200225
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
227 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100228 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200229 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100230 }
231
232 list_size -= 2;
233 p += 2;
234 }
235
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100237}
238
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200239MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100240static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
241 const unsigned char *buf,
242 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100243{
244 size_t list_size;
245 const unsigned char *p;
246
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 if (len == 0 || (size_t) (buf[0] + 1) != len) {
248 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
249 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
250 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
251 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100252 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200253 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100254
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200255 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 while (list_size > 0) {
257 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
258 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
260 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100261 }
262
263 list_size--;
264 p++;
265 }
266
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100268}
Valerio Setti60d3b912023-07-25 10:43:53 +0200269#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200270 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200271 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100272
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200273#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200274MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100275static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
276 const unsigned char *buf,
277 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200278{
Janos Follath865b3eb2019-12-16 11:46:15 +0000279 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200280
Manuel Pégourié-Gonnard58916762025-01-23 10:48:45 +0100281 if (ssl->handshake->psa_pake_ctx_is_ok != 1) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
283 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200284 }
285
Gilles Peskine449bd832023-01-11 14:50:10 +0100286 if ((ret = mbedtls_psa_ecjpake_read_round(
287 &ssl->handshake->psa_pake_ctx, buf, len,
288 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
289 psa_destroy_key(ssl->handshake->psa_pake_password);
290 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200291
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100293 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 ssl,
295 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
296 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200297
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200299 }
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200300
301 /* Only mark the extension as OK when we're sure it is */
302 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
303
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200305}
306#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
307
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200309MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100310static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
311 const unsigned char *buf,
312 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200313{
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
315 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
316 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
317 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
318 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200319 }
320
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200321 ssl->session_negotiate->mfl_code = buf[0];
322
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200324}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200325#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200326
Hanno Beckera0e20d02019-05-15 14:03:01 +0100327#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200328MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100329static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
330 const unsigned char *buf,
331 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100332{
333 size_t peer_cid_len;
334
335 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
337 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
338 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
339 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
340 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100341 }
342
343 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100344 * struct {
345 * opaque cid<0..2^8-1>;
346 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100348
Gilles Peskine449bd832023-01-11 14:50:10 +0100349 if (len < 1) {
350 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
351 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
352 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
353 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100354 }
355
356 peer_cid_len = *buf++;
357 len--;
358
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 if (len != peer_cid_len) {
360 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
361 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
362 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
363 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100364 }
365
366 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100368 /* Leave ssl->handshake->cid_in_use in its default
369 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
371 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100372 }
373
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
375 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
376 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
377 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
378 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100379 }
380
Hanno Becker08556bf2019-05-03 12:43:44 +0100381 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100382 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100384
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
386 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100387
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100389}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100390#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100391
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200393MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100394static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
395 const unsigned char *buf,
396 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100397{
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 if (len != 0) {
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;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100403 }
404
405 ((void) buf);
406
Gilles Peskine449bd832023-01-11 14:50:10 +0100407 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200408 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100409 }
410
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100412}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200416MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100417static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
418 const unsigned char *buf,
419 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200420{
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 if (len != 0) {
422 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
423 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
424 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
425 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200426 }
427
428 ((void) buf);
429
Gilles Peskine449bd832023-01-11 14:50:10 +0100430 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200432 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200433
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200435}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200439MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100440static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
441 unsigned char *buf,
442 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200443{
Janos Follath865b3eb2019-12-16 11:46:15 +0000444 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200445 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200448
Gilles Peskine449bd832023-01-11 14:50:10 +0100449 if (ssl->conf->f_ticket_parse == NULL ||
450 ssl->conf->f_ticket_write == NULL) {
451 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200452 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200453
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200454 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200455 ssl->handshake->new_session_ticket = 1;
456
Gilles Peskine449bd832023-01-11 14:50:10 +0100457 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200458
Gilles Peskine449bd832023-01-11 14:50:10 +0100459 if (len == 0) {
460 return 0;
461 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200463#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
465 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
466 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200467 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200469
470 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200471 * Failures are ok: just ignore the ticket and proceed.
472 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100473 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
474 buf, len)) != 0) {
475 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200476
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
478 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
479 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
480 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
481 } else {
482 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
483 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200484
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200486 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200487
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200488 /*
489 * Keep the session ID sent by the client, since we MUST send it back to
490 * inform them we're accepting the ticket (RFC 5077 section 3.4)
491 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200492 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200494
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 mbedtls_ssl_session_free(ssl->session_negotiate);
496 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200497
498 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200500
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200502
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200503 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200504
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200505 /* Don't send a new ticket after all, this one is OK */
506 ssl->handshake->new_session_ticket = 0;
507
Gilles Peskine449bd832023-01-11 14:50:10 +0100508 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200509}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200511
Johan Pascalb62bb512015-12-03 21:56:45 +0100512#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200513MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100514static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
515 const unsigned char *buf,
516 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100517{
Johan Pascal43f94902020-09-22 12:25:52 +0200518 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200520 size_t profile_length;
521 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200522 /*! 2 bytes for profile length and 1 byte for mki len */
523 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100524
525 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100526 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
527 (ssl->conf->dtls_srtp_profile_list == NULL) ||
528 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
529 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200530 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100531
532 /* RFC5764 section 4.1.1
533 * uint8 SRTPProtectionProfile[2];
534 *
535 * struct {
536 * SRTPProtectionProfiles SRTPProtectionProfiles;
537 * opaque srtp_mki<0..255>;
538 * } UseSRTPData;
539
540 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100541 */
542
Ron Eldoref72faf2018-07-12 11:54:20 +0300543 /*
544 * Min length is 5: at least one protection profile(2 bytes)
545 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200546 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200547 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300548 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 if (len < size_of_lengths) {
550 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
551 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
552 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200553 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100554
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200556
Ron Eldoref72faf2018-07-12 11:54:20 +0300557 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100558 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200559 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200560
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200561 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100562 if (profile_length > len - size_of_lengths ||
563 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
564 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
565 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
566 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200567 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300568 /*
569 * parse the extension list values are defined in
570 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
571 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200573 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100575
Gilles Peskine449bd832023-01-11 14:50:10 +0100576 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
577 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
578 mbedtls_ssl_get_srtp_profile_as_string(
579 client_protection)));
580 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200581 continue;
582 }
Ron Eldor591f1622018-01-22 12:30:04 +0200583 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
585 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200586 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100587 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
588 mbedtls_ssl_get_srtp_profile_as_string(
589 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200590 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100591 }
592 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200594 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 }
Ron Eldor591f1622018-01-22 12:30:04 +0200596 }
Johan Pascal042d4562020-08-25 12:14:02 +0200597 buf += profile_length; /* buf points to the mki length */
598 mki_length = *buf;
599 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200600
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
602 mki_length + profile_length + size_of_lengths != len) {
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;
Johan Pascal042d4562020-08-25 12:14:02 +0200606 }
607
608 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
610 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200611 ssl->dtls_srtp_info.mki_len = mki_length;
612
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300614
Gilles Peskine449bd832023-01-11 14:50:10 +0100615 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
616 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100617 }
618
Gilles Peskine449bd832023-01-11 14:50:10 +0100619 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100620}
621#endif /* MBEDTLS_SSL_DTLS_SRTP */
622
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100623/*
624 * Auxiliary functions for ServerHello parsing and related actions
625 */
626
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100628/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100629 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100630 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200631#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200632MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100633static int ssl_check_key_curve(mbedtls_pk_context *pk,
634 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100635{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100636 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100637 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100638 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100639
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 while (*curr_tls_id != 0) {
641 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
642 if (curr_grp_id == grp_id) {
643 return 0;
644 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100645 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100646 }
647
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100649}
Valerio Settie9646ec2023-08-02 20:02:28 +0200650#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100651
652/*
653 * Try picking a certificate for this ciphersuite,
654 * return 0 on success and -1 on failure.
655 */
Gabor Mezei58535da2025-03-03 15:43:50 +0100656#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200657MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100658static int ssl_pick_cert(mbedtls_ssl_context *ssl,
659 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100660{
Glenn Strauss041a3762022-03-15 06:08:29 -0400661 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200662 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200664 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200666 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100670 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100671 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100672#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100674
David Horstmann3a334c22022-10-25 10:53:44 +0100675 int pk_alg_is_none = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 if (pk_alg_is_none) {
678 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200679 }
680
Gilles Peskine449bd832023-01-11 14:50:10 +0100681 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
682
683 if (list == NULL) {
684 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
685 return -1;
686 }
687
688 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400689 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
691 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000692
David Horstmann3a334c22022-10-25 10:53:44 +0100693 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200694#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
Valerio Setti0009b042025-07-30 22:51:53 +0200696 mbedtls_pk_can_do_psa(cur->key, pk_alg, pk_usage)) &&
Valerio Settibc611fe2025-09-08 13:41:58 +0200697 mbedtls_pk_can_do_psa(&cur->cert->pk, pk_alg,
698 PSA_KEY_USAGE_VERIFY_HASH));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200699#else
David Horstmann3a334c22022-10-25 10:53:44 +0100700 key_type_matches = (
Valerio Setti0009b042025-07-30 22:51:53 +0200701 mbedtls_pk_can_do_psa(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200702#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (!key_type_matches) {
704 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100705 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000706 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100707
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200708 /*
709 * This avoids sending the client a cert it'll reject based on
710 * keyUsage or other extensions.
711 *
712 * It also allows the user to provision different certificates for
713 * different uses based on keyUsage, eg if they want to avoid signing
714 * and decrypting with the same RSA key.
715 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200717 MBEDTLS_SSL_IS_CLIENT,
718 MBEDTLS_SSL_VERSION_TLS1_2,
719 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
721 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200722 continue;
723 }
724
Valerio Settie9646ec2023-08-02 20:02:28 +0200725#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100726 if (pk_alg == MBEDTLS_PK_ECDSA &&
727 ssl_check_key_curve(&cur->cert->pk,
728 ssl->handshake->curves_tls_id) != 0) {
729 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100730 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000731 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100732#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100733
734 /* If we get there, we got a winner */
735 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100736 }
737
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200738 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100740 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
742 ssl->handshake->key_cert->cert);
743 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100744 }
745
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747}
Gabor Mezei58535da2025-03-03 15:43:50 +0100748#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200750#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100751
752/*
753 * Check if a given ciphersuite is suitable for use with our config/keys/etc
754 * Sets ciphersuite_info only if the suite matches.
755 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200756MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100757static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
758 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100759{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100761
Jerry Yue7541932022-01-28 10:21:24 +0800762#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100763 mbedtls_pk_type_t sig_type;
764#endif
765
Gilles Peskine449bd832023-01-11 14:50:10 +0100766 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
767 if (suite_info == NULL) {
768 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
769 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100770 }
771
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
773 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000774
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 if (suite_info->min_tls_version > ssl->tls_version ||
776 suite_info->max_tls_version < ssl->tls_version) {
777 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
778 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000779 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100780
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200781#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
783 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
784 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
785 "not configured or ext missing"));
786 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200787 }
788#endif
789
790
Valerio Setti60d3b912023-07-25 10:43:53 +0200791#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200792 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
794 (ssl->handshake->curves_tls_id == NULL ||
795 ssl->handshake->curves_tls_id[0] == 0)) {
796 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
797 "no common elliptic curve"));
798 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000799 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100800#endif
801
Gilles Peskineeccd8882020-03-10 12:19:08 +0100802#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100803 /* If the ciphersuite requires a pre-shared key and we don't
804 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100805 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
806 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
807 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
808 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000809 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810#endif
811
Gabor Mezei58535da2025-03-03 15:43:50 +0100812#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
813
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100815 /*
816 * Final check: if ciphersuite requires us to have a
817 * certificate/key of a particular type:
818 * - select the appropriate certificate if we have one, or
819 * - try the next ciphersuite if we don't
820 * This must be done last since we modify the key_cert list.
821 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 if (ssl_pick_cert(ssl, suite_info) != 0) {
823 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
824 "no suitable certificate"));
825 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000826 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100827#endif
828
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200829 /* If the ciphersuite requires signing, check whether
830 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
832 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200833 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100834 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
835 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
836 "for signature algorithm %u", (unsigned) sig_type));
837 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200838 }
839
840#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
841
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100842 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100844}
845
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200846/* This function doesn't alert on errors that happen early during
847 ClientHello parsing because they might indicate that the client is
848 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200849MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100850static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000851{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100852 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200853 size_t i, j;
854 size_t ciph_offset, comp_offset, ext_offset;
855 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200857 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100858#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000859 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000861 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100862#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000863 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200864 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000866
Hanno Becker7e5437a2017-04-28 17:15:26 +0100867 /* If there is no signature-algorithm extension present,
868 * we need to fall back to the default values for allowed
869 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800870#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100871 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800872#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100873
Gilles Peskine449bd832023-01-11 14:50:10 +0100874 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000875
David Horstmanne0af39a2022-10-06 18:19:18 +0100876 int renegotiating;
877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200879read_record_header:
880#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100881 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200882 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100883 * otherwise read it ourselves manually in order to support SSLv2
884 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100885 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
886 * ClientHello has been already fully fetched by the TLS 1.3 code and the
887 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100888 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100889 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100892#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100893 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200895 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
897 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000898 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000899 }
900
901 buf = ssl->in_hdr;
902
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000904
Paul Bakkerec636f32012-09-09 19:17:02 +0000905 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100906 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000907 *
908 * Record layer:
909 * 0 . 0 message type
910 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200911 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000912 * 3 . 4 message length
913 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
915 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100916
Gilles Peskine449bd832023-01-11 14:50:10 +0100917 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
918 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
919 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100920 }
921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000923 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100924
Gilles Peskine449bd832023-01-11 14:50:10 +0100925 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
926 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100927
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200928 /* For DTLS if this is the initial handshake, remember the client sequence
929 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932#if defined(MBEDTLS_SSL_RENEGOTIATION)
933 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000934#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200936 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
938 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
939 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200940 }
941
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
943 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
947 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200948 ssl->next_record_offset = 0;
949 ssl->in_left = 0;
950 goto read_record_header;
951 }
952
953 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200955#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200956 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200958
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000959 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000960
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200963 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000964 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100966#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000967 {
Ronald Cron6291b232023-03-08 15:51:25 +0100968 if (ssl->keep_current_message) {
969 ssl->keep_current_message = 0;
970 } else {
971 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
972 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
973 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
974 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000975
Ronald Cron6291b232023-03-08 15:51:25 +0100976 if ((ret = mbedtls_ssl_fetch_input(ssl,
977 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
978 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
979 return ret;
980 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200981
Ronald Cron6291b232023-03-08 15:51:25 +0100982 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100984 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
985 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
986 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200987#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100988 ssl->in_left = 0;
989 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100990 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000991
992 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000993
Gilles Peskine449bd832023-01-11 14:50:10 +0100994 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +0100995
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +0100996 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
997 if (0 != ret) {
998 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
999 return ret;
1000 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001001
1002 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001003 * Handshake layer:
1004 * 0 . 0 handshake type
1005 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001006 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001007 * 6 . 8 DTLS only: fragment offset
1008 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001009 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1011 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1012 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001013 }
1014
Gilles Peskine449bd832023-01-11 14:50:10 +01001015 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001016
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1018 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1019 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001020 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001024 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001025 * Copy the client's handshake message_seq on initial handshakes,
1026 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001027 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001030 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001031 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1033 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1034 "%u (expected %u)", cli_msg_seq,
1035 ssl->handshake->in_msg_seq));
1036 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001037 }
1038
1039 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001040 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001041#endif
1042 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001043 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001044 ssl->handshake->out_msg_seq = cli_msg_seq;
1045 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1046 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001047 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001048 /*
1049 * For now we don't support fragmentation, so make sure
1050 * fragment_offset == 0 and fragment_length == length
1051 */
1052 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1054 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1055 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001056 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 4, ("fragment_offset=%u fragment_length=%u length=%u",
1058 (unsigned) fragment_offset, (unsigned) fragment_length,
1059 (unsigned) length));
1060 if (fragment_offset != 0 || length != fragment_length) {
1061 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1062 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001063 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001064 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001065 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001067
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 buf += mbedtls_ssl_hs_hdr_len(ssl);
1069 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001070
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001071 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001072 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001073 * 0 . 1 protocol version
1074 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001075 * 34 . 34 session id length (1 byte)
1076 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001077 * 35+x . 35+x DTLS only: cookie length (1 byte)
1078 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001079 * .. . .. ciphersuite list length (2 bytes)
1080 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001081 * .. . .. compression alg. list length (1 byte)
1082 * .. . .. compression alg. list
1083 * .. . .. extensions length (2 bytes, optional)
1084 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001085 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001086
1087 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001088 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001089 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1090 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001091 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 if (msg_len < 38) {
1093 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1094 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001095 }
1096
1097 /*
1098 * Check and save the protocol version
1099 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001101
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001102 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1103 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001104 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001105 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1108 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1109 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1110 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1111 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001112 }
1113
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001114 /*
1115 * Save client random (inc. Unix time)
1116 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001117 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001118
Gilles Peskine449bd832023-01-11 14:50:10 +01001119 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001120
1121 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001122 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001123 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001124 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1127 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1128 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1129 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1130 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1131 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001132 }
1133
Gilles Peskine449bd832023-01-11 14:50:10 +01001134 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001135
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001136 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 memset(ssl->session_negotiate->id, 0,
1138 sizeof(ssl->session_negotiate->id));
1139 memcpy(ssl->session_negotiate->id, buf + 35,
1140 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001141
1142 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001143 * Check the cookie length and content
1144 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001145#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001147 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001148 cookie_len = buf[cookie_offset];
1149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1151 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1152 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1153 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1154 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001155 }
1156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1158 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001159
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001160#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001162#if defined(MBEDTLS_SSL_RENEGOTIATION)
1163 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001164#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 ) {
1166 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1167 buf + cookie_offset + 1, cookie_len,
1168 ssl->cli_id, ssl->cli_id_len) != 0) {
1169 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001170 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001171 } else {
1172 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001173 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001174 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001176#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001177 {
1178 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001179 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001180 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1182 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001183 }
1184
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001186 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 /*
1189 * Check the ciphersuitelist length (will be parsed later)
1190 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001191 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001195
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001196 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001197
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001199 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 (ciph_len % 2) != 0) {
1201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1203 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001205 }
1206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1208 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001209
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001210 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001211 * Check the compression algorithm's length.
1212 * The list contents are ignored because implementing
1213 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1214 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001215 */
1216 comp_offset = ciph_offset + 2 + ciph_len;
1217
1218 comp_len = buf[comp_offset];
1219
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001221 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 comp_len + comp_offset + 1 > msg_len) {
1223 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1224 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1225 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1226 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001227 }
1228
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1230 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001231
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 /*
1233 * Check the extension length
1234 */
1235 ext_offset = comp_offset + 1 + comp_len;
1236 if (msg_len > ext_offset) {
1237 if (msg_len < ext_offset + 2) {
1238 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1239 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1240 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1241 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001242 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001243
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001244 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001245
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 if (msg_len != ext_offset + 2 + ext_len) {
1247 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1248 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1249 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1250 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1251 }
1252 } else {
1253 ext_len = 0;
1254 }
Paul Bakker48916f92012-09-16 19:57:18 +00001255
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 ext = buf + ext_offset + 2;
1257 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1258
1259 while (ext_len != 0) {
1260 unsigned int ext_id;
1261 unsigned int ext_size;
1262 if (ext_len < 4) {
1263 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1264 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1265 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1266 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1267 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001268 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1269 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001270
1271 if (ext_size + 4 > ext_len) {
1272 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1273 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1274 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1275 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1276 }
1277 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001279 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1281 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1282 ext + 4 + ext_size);
1283 if (ret != 0) {
1284 return ret;
1285 }
Simon Butcher584a5472016-05-23 16:24:52 +01001286 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001287#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001288
Simon Butcher584a5472016-05-23 16:24:52 +01001289 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001291#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001292 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001293#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1296 if (ret != 0) {
1297 return ret;
1298 }
Simon Butcher584a5472016-05-23 16:24:52 +01001299 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001300
Jerry Yue7541932022-01-28 10:21:24 +08001301#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001302 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001304
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1306 if (ret != 0) {
1307 return ret;
1308 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001309
1310 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001311 break;
Jerry Yue7541932022-01-28 10:21:24 +08001312#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001313
Valerio Setti60d3b912023-07-25 10:43:53 +02001314#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001315 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001316 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001317 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001319
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1321 if (ret != 0) {
1322 return ret;
1323 }
Simon Butcher584a5472016-05-23 16:24:52 +01001324 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001325
Simon Butcher584a5472016-05-23 16:24:52 +01001326 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001328 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001329
Gilles Peskine449bd832023-01-11 14:50:10 +01001330 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1331 if (ret != 0) {
1332 return ret;
1333 }
Simon Butcher584a5472016-05-23 16:24:52 +01001334 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001335#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001336 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001337 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001338
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001339#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001340 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001342
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1344 if (ret != 0) {
1345 return ret;
1346 }
Simon Butcher584a5472016-05-23 16:24:52 +01001347 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001348#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001351 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001353
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1355 if (ret != 0) {
1356 return ret;
1357 }
Simon Butcher584a5472016-05-23 16:24:52 +01001358 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001360
Hanno Beckera0e20d02019-05-15 14:03:01 +01001361#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001362 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1366 if (ret != 0) {
1367 return ret;
1368 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001369 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001370#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001373 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001374 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001375
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1377 if (ret != 0) {
1378 return ret;
1379 }
Simon Butcher584a5472016-05-23 16:24:52 +01001380 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001381#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001383#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001384 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1388 if (ret != 0) {
1389 return ret;
1390 }
Simon Butcher584a5472016-05-23 16:24:52 +01001391 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001392#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001394#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001395 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001397
Gilles Peskine449bd832023-01-11 14:50:10 +01001398 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1399 if (ret != 0) {
1400 return ret;
1401 }
Simon Butcher584a5472016-05-23 16:24:52 +01001402 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001403#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001405#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001406 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1410 ext + 4 + ext_size);
1411 if (ret != 0) {
1412 return ret;
1413 }
Simon Butcher584a5472016-05-23 16:24:52 +01001414 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001416
Johan Pascalb62bb512015-12-03 21:56:45 +01001417#if defined(MBEDTLS_SSL_DTLS_SRTP)
1418 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001420
Gilles Peskine449bd832023-01-11 14:50:10 +01001421 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1422 if (ret != 0) {
1423 return ret;
1424 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001425 break;
1426#endif /* MBEDTLS_SSL_DTLS_SRTP */
1427
Simon Butcher584a5472016-05-23 16:24:52 +01001428 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1430 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001431 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001432
Gilles Peskine449bd832023-01-11 14:50:10 +01001433 ext_len -= 4 + ext_size;
1434 ext += 4 + ext_size;
1435 }
1436
Jerry Yue7541932022-01-28 10:21:24 +08001437#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001438
1439 /*
1440 * Try to fall back to default hash SHA1 if the client
1441 * hasn't provided any preferred signature-hash combinations.
1442 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001444 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1445 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001446#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1448 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001449#endif
1450#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1452 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001453#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001454 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001455 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001456
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001457 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1458 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1459 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001460
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001462 }
1463
Jerry Yue7541932022-01-28 10:21:24 +08001464#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001465
Paul Bakker48916f92012-09-16 19:57:18 +00001466 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001467 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1468 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1470 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1471 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001472#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001473 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1474 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1475 "during renegotiation"));
1476 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1477 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1478 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001479 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001480#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001482 break;
1483 }
1484 }
1485
1486 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001487 * Renegotiation security checks
1488 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1490 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1491 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001492 handshake_failure = 1;
1493 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001497 renegotiation_info_seen == 0) {
1498 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001499 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001500 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1501 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1502 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1503 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001504 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1506 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1507 renegotiation_info_seen == 1) {
1508 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001509 handshake_failure = 1;
1510 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001511#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001512
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 if (handshake_failure == 1) {
1514 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1515 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1516 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001517 }
Paul Bakker380da532012-04-18 16:10:25 +00001518
Paul Bakker41c83d32013-03-20 14:39:14 +01001519 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001520 * Server certification selection (after processing TLS extensions)
1521 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001522 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1523 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1524 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001525 }
Glenn Strauss69894072022-01-24 12:58:00 -05001526#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1527 ssl->handshake->sni_name = NULL;
1528 ssl->handshake->sni_name_len = 0;
1529#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001530
1531 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001532 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001533 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001534 * and certificate from the SNI callback triggered by the SNI extension
1535 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001536 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001537 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001538 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001539 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001540
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1542 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1543 for (i = 0; ciphersuites[i] != 0; i++) {
1544 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001545 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001547
TRodziewicz8476f2f2021-06-02 14:34:47 +02001548 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001549
Gilles Peskine449bd832023-01-11 14:50:10 +01001550 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1551 &ciphersuite_info)) != 0) {
1552 return ret;
1553 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001554
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001556 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001557 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001558 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001559 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001560 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 for (i = 0; ciphersuites[i] != 0; i++) {
1562 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1563 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001564 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001566
1567 got_common_suite = 1;
1568
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1570 &ciphersuite_info)) != 0) {
1571 return ret;
1572 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001573
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001575 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001576 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001577 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001578 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001579 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001580
Gilles Peskine449bd832023-01-11 14:50:10 +01001581 if (got_common_suite) {
1582 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1583 "but none of them usable"));
1584 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1585 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1586 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1587 } else {
1588 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1589 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1590 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1591 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001592 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001593
1594have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001595 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001596
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001597 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001598 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001599
Gilles Peskinef670ba52025-03-07 15:09:32 +01001600 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00001601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1604 mbedtls_ssl_recv_flight_completed(ssl);
1605 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001606#endif
1607
Hanno Becker7e5437a2017-04-28 17:15:26 +01001608 /* Debugging-only output for testsuite */
1609#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001610 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1612 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001613 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001614 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1615 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1616 sig_hash));
1617 } else {
1618 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1619 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001620 }
1621#endif
1622
Gilles Peskine449bd832023-01-11 14:50:10 +01001623 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001624
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001626}
1627
Hanno Beckera0e20d02019-05-15 14:03:01 +01001628#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001629static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1630 unsigned char *buf,
1631 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001632{
1633 unsigned char *p = buf;
1634 size_t ext_len;
1635 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1636
1637 *olen = 0;
1638
1639 /* Skip writing the extension if we don't want to use it or if
1640 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001642 return;
1643 }
1644
Gilles Peskine449bd832023-01-11 14:50:10 +01001645 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1646 * which is at most 255, so the increment cannot overflow. */
1647 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1648 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1649 return;
1650 }
1651
1652 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001653
1654 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001655 * struct {
1656 * opaque cid<0..2^8-1>;
1657 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001658 */
1659 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001660 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001661 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001662 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001663 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001664
1665 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001666 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001667
1668 *olen = ssl->own_cid_len + 5;
1669}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001670#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001671
Neil Armstrong76b74072022-04-06 13:43:54 +02001672#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001673static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1674 unsigned char *buf,
1675 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001676{
1677 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001679
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001680 /*
1681 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1682 * from a client and then selects a stream or Authenticated Encryption
1683 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1684 * encrypt-then-MAC response extension back to the client."
1685 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001686 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001687 ssl->session_negotiate->ciphersuite);
1688 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001689 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001691 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001692 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001693 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001694 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001695
Gilles Peskine449bd832023-01-11 14:50:10 +01001696 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001697 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001698 }
Ronald Cron862902d2022-03-24 14:15:28 +01001699 }
1700
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001702 *olen = 0;
1703 return;
1704 }
1705
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001707
Gilles Peskine449bd832023-01-11 14:50:10 +01001708 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001709 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001710
1711 *p++ = 0x00;
1712 *p++ = 0x00;
1713
1714 *olen = 4;
1715}
Neil Armstrong76b74072022-04-06 13:43:54 +02001716#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001717
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001718#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001719static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1720 unsigned char *buf,
1721 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001722{
1723 unsigned char *p = buf;
1724
Gilles Peskine449bd832023-01-11 14:50:10 +01001725 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001726 *olen = 0;
1727 return;
1728 }
1729
Gilles Peskine449bd832023-01-11 14:50:10 +01001730 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1731 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001732
Gilles Peskine449bd832023-01-11 14:50:10 +01001733 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001734 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001735
1736 *p++ = 0x00;
1737 *p++ = 0x00;
1738
1739 *olen = 4;
1740}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001741#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001742
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001743#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001744static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1745 unsigned char *buf,
1746 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001747{
1748 unsigned char *p = buf;
1749
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001751 *olen = 0;
1752 return;
1753 }
1754
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001756
Gilles Peskine449bd832023-01-11 14:50:10 +01001757 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001758 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001759
1760 *p++ = 0x00;
1761 *p++ = 0x00;
1762
1763 *olen = 4;
1764}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001765#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001766
Gilles Peskine449bd832023-01-11 14:50:10 +01001767static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1768 unsigned char *buf,
1769 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001770{
1771 unsigned char *p = buf;
1772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001774 *olen = 0;
1775 return;
1776 }
1777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001779
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001781 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001782
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001783#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001784 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001785 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001787 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001788
Gilles Peskine449bd832023-01-11 14:50:10 +01001789 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001790 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001792 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001794#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001795 {
1796 *p++ = 0x00;
1797 *p++ = 0x01;
1798 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001799 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001800
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001801 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001802}
1803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001805static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1806 unsigned char *buf,
1807 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001808{
1809 unsigned char *p = buf;
1810
Gilles Peskine449bd832023-01-11 14:50:10 +01001811 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001812 *olen = 0;
1813 return;
1814 }
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001817
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001819 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001820
1821 *p++ = 0x00;
1822 *p++ = 1;
1823
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001824 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001825
1826 *olen = 5;
1827}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001828#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001829
Valerio Setti7aeec542023-07-05 18:57:21 +02001830#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001831 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001832 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001833static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1834 unsigned char *buf,
1835 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001836{
1837 unsigned char *p = buf;
1838 ((void) ssl);
1839
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 if ((ssl->handshake->cli_exts &
1841 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001842 *olen = 0;
1843 return;
1844 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001845
Gilles Peskine449bd832023-01-11 14:50:10 +01001846 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001847
Gilles Peskine449bd832023-01-11 14:50:10 +01001848 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001849 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001850
1851 *p++ = 0x00;
1852 *p++ = 2;
1853
1854 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001855 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001856
1857 *olen = 6;
1858}
Valerio Setti45d56f32023-07-13 17:23:20 +02001859#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001860 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001861 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001862
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001863#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001864static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1865 unsigned char *buf,
1866 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001867{
Janos Follath865b3eb2019-12-16 11:46:15 +00001868 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001869 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001870 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001871 size_t kkpp_len;
1872
1873 *olen = 0;
1874
1875 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 if (ssl->handshake->ciphersuite_info->key_exchange !=
1877 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001878 return;
1879 }
1880
Gilles Peskine449bd832023-01-11 14:50:10 +01001881 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1882
1883 if (end - p < 4) {
1884 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1885 return;
1886 }
1887
1888 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001889 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001890
Gilles Peskine449bd832023-01-11 14:50:10 +01001891 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001892 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001893 MBEDTLS_ECJPAKE_ROUND_ONE);
1894 if (ret != 0) {
1895 psa_destroy_key(ssl->handshake->psa_pake_password);
1896 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1897 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001898 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001899 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001900
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001902 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001903
1904 *olen = kkpp_len + 4;
1905}
1906#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1907
Gilles Peskine449bd832023-01-11 14:50:10 +01001908#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1909static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1910 unsigned char *buf,
1911 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001912{
Ron Eldor75870ec2018-12-06 17:31:55 +02001913 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001914 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001915 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1916
1917 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001918
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1920 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001921 return;
1922 }
1923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001925
Gilles Peskine449bd832023-01-11 14:50:10 +01001926 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001927 mki_len = ssl->dtls_srtp_info.mki_len;
1928 }
1929
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001930 /* The extension total size is 9 bytes :
1931 * - 2 bytes for the extension tag
1932 * - 2 bytes for the total size
1933 * - 2 bytes for the protection profile length
1934 * - 2 bytes for the protection profile
1935 * - 1 byte for the mki length
1936 * + the actual mki length
1937 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001938 if ((size_t) (end - buf) < mki_len + 9) {
1939 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001940 return;
1941 }
1942
Johan Pascalb62bb512015-12-03 21:56:45 +01001943 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001944 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001945 /*
1946 * total length 5 and mki value: only one profile(2 bytes)
1947 * and length(2 bytes) and srtp_mki )
1948 */
Ron Eldor591f1622018-01-22 12:30:04 +02001949 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001951
1952 /* protection profile length: 2 */
1953 buf[4] = 0x00;
1954 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001955 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001956 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1957 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1958 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1959 } else {
1960 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001961 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001962 }
1963
Ron Eldor591f1622018-01-22 12:30:04 +02001964 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001965 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001966
Ron Eldor591f1622018-01-22 12:30:04 +02001967 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001968}
1969#endif /* MBEDTLS_SSL_DTLS_SRTP */
1970
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001971#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001972MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001973static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001974{
Janos Follath865b3eb2019-12-16 11:46:15 +00001975 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001976 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001977 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001978
Gilles Peskine449bd832023-01-11 14:50:10 +01001979 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001980
1981 /*
1982 * struct {
1983 * ProtocolVersion server_version;
1984 * opaque cookie<0..2^8-1>;
1985 * } HelloVerifyRequest;
1986 */
1987
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001988 /* The RFC is not clear on this point, but sending the actual negotiated
1989 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
1991 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001992 p += 2;
1993
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001994 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 if (ssl->conf->f_cookie_write == NULL) {
1996 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
1997 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001998 }
1999
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002000 /* Skip length byte until we know the length */
2001 cookie_len_byte = p++;
2002
Gilles Peskine449bd832023-01-11 14:50:10 +01002003 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2004 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2005 ssl->cli_id, ssl->cli_id_len)) != 0) {
2006 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2007 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002008 }
2009
Gilles Peskine449bd832023-01-11 14:50:10 +01002010 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002011
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002013
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002014 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002015 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2016 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002017
Gilles Peskinef670ba52025-03-07 15:09:32 +01002018 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002019
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2021 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2022 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002023 }
2024
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002025#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2027 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2028 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2029 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002030 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002031#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002032
Gilles Peskine449bd832023-01-11 14:50:10 +01002033 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002034
Gilles Peskine449bd832023-01-11 14:50:10 +01002035 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002036}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002037#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002038
Gilles Peskine449bd832023-01-11 14:50:10 +01002039static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002040{
2041 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002042 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002043 mbedtls_ssl_session * const session = ssl->session_negotiate;
2044
2045 /* Resume is 0 by default, see ssl_handshake_init().
2046 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002048 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 }
2050 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002051 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002052 }
2053 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002054 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002055 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002056#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002057 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002058 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002060#endif
2061
Gilles Peskine449bd832023-01-11 14:50:10 +01002062 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002063
Gilles Peskine449bd832023-01-11 14:50:10 +01002064 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2065 session->id,
2066 session->id_len,
2067 &session_tmp);
2068 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002069 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002070 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002071
Gilles Peskine449bd832023-01-11 14:50:10 +01002072 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002073 /* Mismatch between cached and negotiated session */
2074 goto exit;
2075 }
2076
2077 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002079 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002081
Gilles Peskine449bd832023-01-11 14:50:10 +01002082 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002083 ssl->handshake->resume = 1;
2084
2085exit:
2086
Gilles Peskine449bd832023-01-11 14:50:10 +01002087 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002088}
2089
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002090MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002091static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002092{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002093#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002094 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002095#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002096 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002097 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002098 unsigned char *buf, *p;
2099
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002102#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2104 ssl->handshake->cookie_verify_result != 0) {
2105 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2106 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002107
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002109 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002110#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002111
Paul Bakker5121ce52009-01-03 21:22:43 +00002112 /*
2113 * 0 . 0 handshake type
2114 * 1 . 3 handshake length
2115 * 4 . 5 protocol version
2116 * 6 . 9 UNIX time()
2117 * 10 . 37 random bytes
2118 */
2119 buf = ssl->out_msg;
2120 p = buf + 4;
2121
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002123 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002124
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2126 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002128#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 t = mbedtls_time(NULL);
2130 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002131 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002132
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2134 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002135#else
Ben Taylorfd529842025-03-10 08:27:42 +00002136 if ((ret = psa_generate_random(p, 4)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 return ret;
2138 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002139
2140 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002141#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002142
Ben Taylor602b2962025-03-07 15:52:50 +00002143 if ((ret = psa_generate_random(p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 return ret;
2145 }
Ronald Cronc5649382023-04-04 15:33:42 +02002146 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002147
Ronald Cronc5649382023-04-04 15:33:42 +02002148#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2149 /*
2150 * RFC 8446
2151 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2152 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2153 * response to a ClientHello MUST set the last 8 bytes of their Random
2154 * value specially in their ServerHello.
2155 */
2156 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2157 static const unsigned char magic_tls12_downgrade_string[] =
2158 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2159
2160 MBEDTLS_STATIC_ASSERT(
2161 sizeof(magic_tls12_downgrade_string) == 8,
2162 "magic_tls12_downgrade_string does not have the expected size");
2163
Ronald Cronfe01ec22023-04-06 09:56:53 +02002164 memcpy(p, magic_tls12_downgrade_string,
2165 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002166 } else
2167#endif
2168 {
Ben Taylor602b2962025-03-07 15:52:50 +00002169 if ((ret = psa_generate_random(p, 8)) != 0) {
Ronald Cronc5649382023-04-04 15:33:42 +02002170 return ret;
2171 }
2172 }
2173 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002174
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002178
Gilles Peskine449bd832023-01-11 14:50:10 +01002179 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002183 * New session, create a new session id,
2184 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002185 */
Gilles Peskinef670ba52025-03-07 15:09:32 +01002186 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002188#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002190#endif
2191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002192#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002194 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 memset(ssl->session_negotiate->id, 0, 32);
2196 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002197#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002198 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002199 ssl->session_negotiate->id_len = n = 32;
Ben Taylor602b2962025-03-07 15:52:50 +00002200 if ((ret = psa_generate_random(ssl->session_negotiate->id,
Ben Taylor1cd1e012025-03-18 11:50:39 +00002201 n)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 return ret;
2203 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002204 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002205 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002206 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002207 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002208 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002209 n = ssl->session_negotiate->id_len;
Gilles Peskinef670ba52025-03-07 15:09:32 +01002210 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC);
Paul Bakkerff60ee62010-03-16 21:09:09 +00002211
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2213 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2214 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002215 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002216 }
2217
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002218 /*
2219 * 38 . 38 session id length
2220 * 39 . 38+n session id
2221 * 39+n . 40+n chosen ciphersuite
2222 * 41+n . 41+n chosen compression alg.
2223 * 42+n . 43+n extensions length
2224 * 44+n . 43+n+m extensions
2225 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002226 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002228 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2231 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2232 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2233 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002236 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002237 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002238
Gilles Peskine449bd832023-01-11 14:50:10 +01002239 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2240 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2241 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2242 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002243
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002244 /*
2245 * First write extensions, then the total length
2246 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002248 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002250#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002251 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002252 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002253#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002254
Hanno Beckera0e20d02019-05-15 14:03:01 +01002255#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002257 ext_len += olen;
2258#endif
2259
Neil Armstrong76b74072022-04-06 13:43:54 +02002260#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002261 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002262 ext_len += olen;
2263#endif
2264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002265#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002267 ext_len += olen;
2268#endif
2269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002270#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002271 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002272 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002273#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002274
Valerio Setti7aeec542023-07-05 18:57:21 +02002275#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002276 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002277 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002278 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2280 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2281 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002282 ext_len += olen;
2283 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002284#endif
2285
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002286#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002287 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002288 ext_len += olen;
2289#endif
2290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002291#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002292 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002293 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2294 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002295 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002296 }
Paul Elliottf518f812022-07-11 12:36:20 +01002297
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002298 ext_len += olen;
2299#endif
2300
Johan Pascalb62bb512015-12-03 21:56:45 +01002301#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002302 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002303 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002304#endif
2305
Gilles Peskine449bd832023-01-11 14:50:10 +01002306 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2307 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002308
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 if (ext_len > 0) {
2310 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002311 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002312 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002313
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002314 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002315 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2316 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002317
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002319
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002321
Gilles Peskine449bd832023-01-11 14:50:10 +01002322 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002323}
2324
Gilles Peskineeccd8882020-03-10 12:19:08 +01002325#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002326MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002327static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002328{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002329 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002330 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002331
Gilles Peskine449bd832023-01-11 14:50:10 +01002332 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002333
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2335 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002336 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002338 }
2339
Gilles Peskine449bd832023-01-11 14:50:10 +01002340 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2341 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002342}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002343#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002344MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002345static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002346{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002348 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002349 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002350 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002351 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002352 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002353 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002354 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002355 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002356
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002358
Gilles Peskinef670ba52025-03-07 15:09:32 +01002359 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002360
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002361#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002363 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002365#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002367
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2369 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2370 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2371 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002372 }
2373
2374 /*
2375 * 0 . 0 handshake type
2376 * 1 . 3 handshake length
2377 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002378 * 5 .. m-1 cert types
2379 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002380 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002381 * n .. n+1 length of all DNs
2382 * n+2 .. n+3 length of DN 1
2383 * n+4 .. ... Distinguished Name #1
2384 * ... .. ... length of DN 2, etc.
2385 */
2386 buf = ssl->out_msg;
2387 p = buf + 4;
2388
2389 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002390 * Supported certificate types
2391 *
2392 * ClientCertificateType certificate_types<1..2^8-1>;
2393 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002395 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002397#if defined(MBEDTLS_RSA_C)
2398 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002399#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002400#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002401 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002402#endif
2403
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002404 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002405 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002406
Paul Bakker577e0062013-08-28 11:57:20 +02002407 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002408
Paul Bakker926af752012-11-23 13:38:07 +01002409 /*
2410 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002411 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002412 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2413 *
2414 * struct {
2415 * HashAlgorithm hash;
2416 * SignatureAlgorithm signature;
2417 * } SignatureAndHashAlgorithm;
2418 *
2419 * enum { (255) } HashAlgorithm;
2420 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002421 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002422 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2423 if (sig_alg == NULL) {
2424 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2425 }
Ronald Cron8457c122022-03-07 11:32:54 +01002426
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2428 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002429
Gilles Peskine449bd832023-01-11 14:50:10 +01002430 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002431 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002432 }
2433 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002434 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002435 }
Simon Butcher99000142016-10-13 17:21:01 +01002436
Paul Elliott96a0fd92022-11-08 17:09:56 +00002437 /* Write elements at offsets starting from 1 (offset 0 is for the
2438 * length). Thus the offset of each element is the length of the
2439 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002440 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002441 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002442
Paul Bakker926af752012-11-23 13:38:07 +01002443 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002444
Paul Elliott96a0fd92022-11-08 17:09:56 +00002445 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002446 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002447 sa_len += 2;
2448 p += sa_len;
2449
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002450 /*
2451 * DistinguishedName certificate_authorities<0..2^16-1>;
2452 * opaque DistinguishedName<1..2^16-1>;
2453 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002455
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002456 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002457
Gilles Peskine449bd832023-01-11 14:50:10 +01002458 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002459 /* NOTE: If trusted certificates are provisioned
2460 * via a CA callback (configured through
2461 * `mbedtls_ssl_conf_ca_cb()`, then the
2462 * CertificateRequest is currently left empty. */
2463
Glenn Strauss999ef702022-03-11 01:37:23 -05002464#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2465#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002466 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002467 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002468 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002469#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002470 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002471 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002472 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002473#endif
Janos Follath088ce432017-04-10 12:42:31 +01002474#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002476 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002477 } else
Janos Follath088ce432017-04-10 12:42:31 +01002478#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002479 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002480
Gilles Peskine449bd832023-01-11 14:50:10 +01002481 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002482 /* It follows from RFC 5280 A.1 that this length
2483 * can be represented in at most 11 bits. */
2484 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002485
Gilles Peskine449bd832023-01-11 14:50:10 +01002486 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2487 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002488 break;
2489 }
2490
Gilles Peskine449bd832023-01-11 14:50:10 +01002491 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002492 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002493 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002494 p += dn_size;
2495
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002497
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002498 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002499 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002500 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002501 }
2502
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002503 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002504 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2505 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002509
Gilles Peskine449bd832023-01-11 14:50:10 +01002510 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002511
Gilles Peskine449bd832023-01-11 14:50:10 +01002512 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002513}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002514#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002515
Gilles Peskineeccd8882020-03-10 12:19:08 +01002516#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002517 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002518MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002519static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2520 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002521{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002522 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2523 * signature length which will be added in ssl_write_server_key_exchange
2524 * after the call to ssl_prepare_server_key_exchange.
2525 * ssl_write_server_key_exchange also takes care of incrementing
2526 * ssl->out_msglen. */
2527 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2529 - sig_start);
2530 int ret = ssl->conf->f_async_resume(ssl,
2531 sig_start, signature_len, sig_max_len);
2532 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002533 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002535 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2537 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002538}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002539#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002540 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002541
Gilles Peskined3eb0612018-01-08 17:07:44 +01002542/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002543 * calculating the signature if any, but excluding formatting the
2544 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002545MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002546static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2547 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002548{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002549 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002550 ssl->handshake->ciphersuite_info;
2551
Gilles Peskineeccd8882020-03-10 12:19:08 +01002552#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002553#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002554 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002555#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002556#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002557
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002558 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002559#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002560 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002561#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002562
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002563#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002564#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002565 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002566#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002567 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002568#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002569#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002570
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002571 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002572
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002573 /*
2574 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002575 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002576 *
2577 */
2578
2579 /*
2580 * - ECJPAKE key exchanges
2581 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002582#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002583 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002584 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002585 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2586 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2587 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002588 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002589 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002590
Valerio Setti6f1b5742022-11-16 10:00:32 +01002591 /*
2592 * The first 3 bytes are:
2593 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2594 * [1, 2] elliptic curve's TLS ID
2595 *
2596 * However since we only support secp256r1 for now, we hardcode its
2597 * TLS ID here
2598 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002599 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 MBEDTLS_ECP_DP_SECP256R1);
2601 if (tls_id == 0) {
2602 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002603 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002604 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002605 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002606 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002607
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2609 out_p + output_offset,
2610 end_p - out_p - output_offset, &output_len,
2611 MBEDTLS_ECJPAKE_ROUND_TWO);
2612 if (ret != 0) {
2613 psa_destroy_key(ssl->handshake->psa_pake_password);
2614 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2615 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2616 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002617 }
2618
Valerio Setti02c25b52022-11-15 14:08:42 +01002619 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002620 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002621 }
2622#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2623
Hanno Becker1aa267c2017-04-28 17:08:27 +01002624 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002625 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002626 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2627 * we use empty support identity hints here.
2628 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002629#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2630 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002631 ssl->out_msg[ssl->out_msglen++] = 0x00;
2632 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002633 }
Valerio Setti48659a12025-01-15 14:22:28 +01002634#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002635
Hanno Becker7e5437a2017-04-28 17:15:26 +01002636 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002637 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002638 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002639#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002641 /*
2642 * Ephemeral ECDH parameters:
2643 *
2644 * struct {
2645 * ECParameters curve_params;
2646 * ECPoint public;
2647 * } ServerECDHParams;
2648 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002649 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002650 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002651 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002652 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002653
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002654 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002655 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2656 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2657 }
2658 for (; *group_list != 0; group_list++) {
2659 for (curr_tls_id = ssl->handshake->curves_tls_id;
2660 *curr_tls_id != 0; curr_tls_id++) {
2661 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002662 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 }
2664 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002665 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002666
Gilles Peskine449bd832023-01-11 14:50:10 +01002667curve_matching_done:
2668 if (*curr_tls_id == 0) {
2669 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2670 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2671 }
2672
2673 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2674 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002675
Neil Armstrongd91526c2022-04-12 14:38:52 +02002676 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2677 psa_key_attributes_t key_attributes;
2678 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002679 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2680 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2681 // data length(1)
2682 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002683 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002684 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002685
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002687
Valerio Setti40d9ca92023-01-04 16:08:04 +01002688 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002689 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002690 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002691 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2692 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2693 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002694 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002695 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002696 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002697
2698 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002699 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2700 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002701 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002702 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002703
2704 /*
2705 * ECParameters curve_params
2706 *
2707 * First byte is curve_type, always named_curve
2708 */
2709 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2710
2711 /*
2712 * Next two bytes are the namedcurve value
2713 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002715 p += 2;
2716
2717 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002718 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002719 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002720 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002721 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2723 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002724 }
2725
2726 /*
2727 * ECPoint public
2728 *
2729 * First byte is data length.
2730 * It will be filled later. p holds now the data length location.
2731 */
2732
2733 /* Export the public part of the ECDH private key from PSA.
2734 * Make one byte space for the length.
2735 */
2736 unsigned char *own_pubkey = p + data_length_size;
2737
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2739 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002740
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002741 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002742 own_pubkey, own_pubkey_max_len,
2743 &len);
2744 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002745 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002746 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002747 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2748 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002749 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002750 }
2751
2752 /* Store the length of the exported public key. */
2753 *p = (uint8_t) len;
2754
2755 /* Determine full message length. */
2756 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002757
Jerry Yuc5aef882021-12-23 20:15:02 +08002758#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002759 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002760#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002761
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002762 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002763 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002764#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002765
Hanno Becker1aa267c2017-04-28 17:08:27 +01002766 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002767 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002768 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002769 * exchange parameters, compute and add the signature here.
2770 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002771 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002772#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002773 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2774 if (dig_signed == NULL) {
2775 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2776 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002777 }
2778
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002779 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02002780 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002781 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02002782
Janos Follath865b3eb2019-12-16 11:46:15 +00002783 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002784
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002785 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002786 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002787 * For TLS 1.2, obey signature-hash-algorithm extension
2788 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002789 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002790
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002791 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01002792 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01002793
Dave Rodgmanc37ad442023-11-03 23:36:06 +00002794 unsigned char sig_hash =
2795 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002797
Gilles Peskine449bd832023-01-11 14:50:10 +01002798 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002799
Ronald Cron8457c122022-03-07 11:32:54 +01002800 /* For TLS 1.2, obey signature-hash-algorithm extension
2801 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
2803 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01002804 /* (... because we choose a cipher suite
2805 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01002806 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002807 }
2808
Gilles Peskine449bd832023-01-11 14:50:10 +01002809 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01002810
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002811 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002812 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002813 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002814 if (md_alg != MBEDTLS_MD_NONE) {
2815 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2816 dig_signed,
2817 dig_signed_len,
2818 md_alg);
2819 if (ret != 0) {
2820 return ret;
2821 }
2822 } else {
2823 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2824 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002825 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02002826
Gilles Peskine449bd832023-01-11 14:50:10 +01002827 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002828
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002829 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002830 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002831 */
Ronald Cron8457c122022-03-07 11:32:54 +01002832 /*
2833 * We need to specify signature and hash algorithm explicitly through
2834 * a prefix to the signature.
2835 *
2836 * struct {
2837 * HashAlgorithm hash;
2838 * SignatureAlgorithm signature;
2839 * } SignatureAndHashAlgorithm;
2840 *
2841 * struct {
2842 * SignatureAndHashAlgorithm algorithm;
2843 * opaque signature<0..2^16-1>;
2844 * } DigitallySigned;
2845 *
2846 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002847
Gilles Peskine449bd832023-01-11 14:50:10 +01002848 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
2849 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002850
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002851#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002852 if (ssl->conf->f_async_sign_start != NULL) {
2853 ret = ssl->conf->f_async_sign_start(ssl,
2854 mbedtls_ssl_own_cert(ssl),
2855 md_alg, hash, hashlen);
2856 switch (ret) {
2857 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
2858 /* act as if f_async_sign was null */
2859 break;
2860 case 0:
2861 ssl->handshake->async_in_progress = 1;
2862 return ssl_resume_server_key_exchange(ssl, signature_len);
2863 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
2864 ssl->handshake->async_in_progress = 1;
2865 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
2866 default:
2867 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
2868 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002869 }
2870 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002871#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002872
Gilles Peskine449bd832023-01-11 14:50:10 +01002873 if (mbedtls_ssl_own_key(ssl) == NULL) {
2874 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
2875 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002876 }
2877
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002878 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2879 * signature length which will be added in ssl_write_server_key_exchange
2880 * after the call to ssl_prepare_server_key_exchange.
2881 * ssl_write_server_key_exchange also takes care of incrementing
2882 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002883 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
2884 md_alg, hash, hashlen,
2885 ssl->out_msg + ssl->out_msglen + 2,
2886 out_buf_len - ssl->out_msglen - 2,
Ben Taylor440cb2a2025-03-05 09:40:08 +00002887 signature_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002888 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
2889 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00002890 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002891 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002892#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002893
Gilles Peskine449bd832023-01-11 14:50:10 +01002894 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002895}
Paul Bakker1ef83d62012-04-11 12:09:53 +00002896
Gilles Peskined3eb0612018-01-08 17:07:44 +01002897/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02002898 * that do not include a ServerKeyExchange message, do nothing. Either
2899 * way, if successful, move on to the next step in the SSL state
2900 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002901MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002902static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002903{
Janos Follath865b3eb2019-12-16 11:46:15 +00002904 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002905 size_t signature_len = 0;
Ben Taylor5cdbe302025-09-08 13:12:43 +01002906#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002907 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01002908 ssl->handshake->ciphersuite_info;
Ben Taylor5cdbe302025-09-08 13:12:43 +01002909#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002910
Gilles Peskine449bd832023-01-11 14:50:10 +01002911 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01002912
Ben Taylor5cdbe302025-09-08 13:12:43 +01002913#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002914 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002915 /* Key exchanges not involving ephemeral keys don't use
2916 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002917 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002918 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002919 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002920 }
Ben Taylor5cdbe302025-09-08 13:12:43 +01002921#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002922
Gilles Peskineeccd8882020-03-10 12:19:08 +01002923#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002924 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01002925 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02002926 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002927 if (ssl->handshake->async_in_progress != 0) {
2928 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
2929 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
2930 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01002931#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002932 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002933 {
2934 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002935 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01002936 }
2937
Gilles Peskine449bd832023-01-11 14:50:10 +01002938 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02002939 /* If we're starting to write a new message, set ssl->out_msglen
2940 * to 0. But if we're resuming after an asynchronous message,
2941 * out_msglen is the amount of data written so far and mst be
2942 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
2944 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
2945 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01002946 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002947 }
2948 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002949 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002950
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002951 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02002952 * ssl_prepare_server_key_exchange already wrote the signature
2953 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002954#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002955 if (signature_len != 0) {
2956 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
2957 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002958
Gilles Peskine449bd832023-01-11 14:50:10 +01002959 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
2960 ssl->out_msg + ssl->out_msglen,
2961 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002962
2963 /* Skip over the already-written signature */
2964 ssl->out_msglen += signature_len;
2965 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002966#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002967
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002968 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002969 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2970 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002971
Gilles Peskinef670ba52025-03-07 15:09:32 +01002972 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002973
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2975 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2976 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002977 }
2978
Gilles Peskine449bd832023-01-11 14:50:10 +01002979 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
2980 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002981}
2982
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002983MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002984static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002985{
Janos Follath865b3eb2019-12-16 11:46:15 +00002986 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00002987
Gilles Peskine449bd832023-01-11 14:50:10 +01002988 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002989
2990 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002991 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2992 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002993
Gilles Peskinef670ba52025-03-07 15:09:32 +01002994 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002995
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002996#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002997 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2998 mbedtls_ssl_send_flight_completed(ssl);
2999 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003000#endif
3001
Gilles Peskine449bd832023-01-11 14:50:10 +01003002 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3003 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3004 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003005 }
3006
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003007#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003008 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3009 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3010 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3011 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003012 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003013#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003014
Gilles Peskine449bd832023-01-11 14:50:10 +01003015 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003016
Gilles Peskine449bd832023-01-11 14:50:10 +01003017 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003018}
3019
Gilles Peskineeccd8882020-03-10 12:19:08 +01003020#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003021MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003022static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3023 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003024{
Paul Bakker6db455e2013-09-18 17:29:31 +02003025 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003026 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003027
Gilles Peskine449bd832023-01-11 14:50:10 +01003028 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3029 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3030 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003031 }
3032
3033 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003034 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003035 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003036 if (end - *p < 2) {
3037 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3038 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003039 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003040
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003041 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003042 *p += 2;
3043
Gilles Peskine449bd832023-01-11 14:50:10 +01003044 if (n == 0 || n > end - *p) {
3045 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3046 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003047 }
3048
Gilles Peskine449bd832023-01-11 14:50:10 +01003049 if (ssl->conf->f_psk != NULL) {
3050 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003051 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003052 }
3053 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003054 /* Identity is not a big secret since clients send it in the clear,
3055 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003056 if (n != ssl->conf->psk_identity_len ||
3057 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003058 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003059 }
3060 }
3061
Gilles Peskine449bd832023-01-11 14:50:10 +01003062 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3063 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3064 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3065 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3066 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003067 }
3068
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003069 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003070
Gilles Peskine449bd832023-01-11 14:50:10 +01003071 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003072}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003073#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003074
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003075MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003076static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003077{
Janos Follath865b3eb2019-12-16 11:46:15 +00003078 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003079 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003080 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003081
Hanno Beckere694c3e2017-12-27 21:34:08 +00003082 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003083
Gilles Peskine449bd832023-01-11 14:50:10 +01003084 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003085
Gilles Peskine449bd832023-01-11 14:50:10 +01003086 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3087 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3088 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003089 }
3090
Gilles Peskine449bd832023-01-11 14:50:10 +01003091 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003092 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003093
Gilles Peskine449bd832023-01-11 14:50:10 +01003094 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3095 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3096 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003097 }
3098
Gilles Peskine449bd832023-01-11 14:50:10 +01003099 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3100 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3101 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003102 }
3103
Neil Armstrongd91526c2022-04-12 14:38:52 +02003104#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003105 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003106 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003107 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003108 size_t data_len = (size_t) (*p++);
3109 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003110 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3111 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3112
Gilles Peskine530c4232023-10-02 15:37:23 +02003113 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003114
3115 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003116 * We must have at least two bytes (1 for length, at least 1 for data)
3117 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003119 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3120 buf_len));
3121 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003122 }
3123
Gilles Peskine449bd832023-01-11 14:50:10 +01003124 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003125 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3126 " > %" MBEDTLS_PRINTF_SIZET,
3127 data_len, buf_len));
3128 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003129 }
3130
3131 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003132 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003133 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3134 " > %" MBEDTLS_PRINTF_SIZET,
3135 data_len,
3136 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003137 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3138 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003139 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3140 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003141
3142 /* Compute ECDH shared secret. */
3143 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003144 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3145 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003146 handshake->premaster, sizeof(handshake->premaster),
3147 &handshake->pmslen);
3148 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003149 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003150 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003151 if (handshake->xxdh_psa_privkey_is_external == 0) {
3152 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003153 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003154 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003155 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003156 }
3157
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003158 if (handshake->xxdh_psa_privkey_is_external == 0) {
3159 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003160
Gilles Peskine449bd832023-01-11 14:50:10 +01003161 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003162 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003163 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3164 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003165 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003166 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003167 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003168 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003169#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003170 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003171#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003172 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3173 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3174 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3175 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003176 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003177
Gilles Peskine449bd832023-01-11 14:50:10 +01003178 if (p != end) {
3179 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3180 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003181 }
3182
Gilles Peskine449bd832023-01-11 14:50:10 +01003183 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003184#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003185#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003186 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003187 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3188 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003189 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003190
3191 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3192
Gilles Peskine449bd832023-01-11 14:50:10 +01003193 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3194 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003195 psa_destroy_key(handshake->xxdh_psa_privkey);
3196 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003197 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003198 }
3199
3200 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003201 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003202 psa_destroy_key(handshake->xxdh_psa_privkey);
3203 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003205 }
3206
Neil Armstrong039db292022-03-09 11:38:34 +01003207 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003208 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003209 psa_destroy_key(handshake->xxdh_psa_privkey);
3210 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003211 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003212 }
3213
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003214 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3215 the sizes of the FFDH keys which are at least 2048 bits.
3216 The size of the array is thus greater than 256 bytes which is greater than any
3217 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003218#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003219 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3220 psa_destroy_key(handshake->xxdh_psa_privkey);
3221 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003222 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003223 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003224#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003225 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3226 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003227#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003228
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003229 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3230 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003231 p += ecpoint_len;
3232
Neil Armstrong3bcef082022-03-23 18:16:54 +01003233 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003234 * - a uint16 containing the length (in octets) of the ECDH computation
3235 * - the octet string produced by the ECDH computation
3236 * - a uint16 containing the length (in octets) of the PSK
3237 * - the PSK itself
3238 */
Neil Armstrong039db292022-03-09 11:38:34 +01003239 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003240 const unsigned char * const psm_end =
3241 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003242 /* uint16 to store length (in octets) of the ECDH computation */
3243 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003244 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003245
3246 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003247 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003248 handshake->xxdh_psa_privkey,
3249 handshake->xxdh_psa_peerkey,
3250 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003251 psm + zlen_size,
3252 psm_end - (psm + zlen_size),
3253 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003254
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003255 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3256 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003257
Gilles Peskine449bd832023-01-11 14:50:10 +01003258 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003259 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003260 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003261 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003262 }
Neil Armstrong039db292022-03-09 11:38:34 +01003263
Neil Armstrong3bcef082022-03-23 18:16:54 +01003264 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003265 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003266 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003267
Gilles Peskine449bd832023-01-11 14:50:10 +01003268 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003269#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003270#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003272 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003273 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3275 psa_destroy_key(ssl->handshake->psa_pake_password);
3276 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003277
Gilles Peskine449bd832023-01-11 14:50:10 +01003278 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3279 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003280 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003281 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003282#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003283 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3285 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003286 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003287
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3289 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3290 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003291 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003292
Gilles Peskinef670ba52025-03-07 15:09:32 +01003293 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003294
Gilles Peskine449bd832023-01-11 14:50:10 +01003295 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003296
Gilles Peskine449bd832023-01-11 14:50:10 +01003297 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003298}
3299
Gilles Peskineeccd8882020-03-10 12:19:08 +01003300#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003301MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003302static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003303{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003304 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003305 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003306
Gilles Peskine449bd832023-01-11 14:50:10 +01003307 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003308
Gilles Peskine449bd832023-01-11 14:50:10 +01003309 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3310 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003311 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003312 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003313 }
3314
Gilles Peskine449bd832023-01-11 14:50:10 +01003315 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3316 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003317}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003318#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003319MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003320static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003321{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003322 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003323 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003324 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003325 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003326 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003327 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003328 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003329 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003330 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003331 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003332
Gilles Peskine449bd832023-01-11 14:50:10 +01003333 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003334
Gilles Peskine449bd832023-01-11 14:50:10 +01003335 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3336 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003337 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003338 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003339 }
3340
Hanno Becker2a831a42019-02-07 13:17:25 +00003341#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003342 if (ssl->session_negotiate->peer_cert == NULL) {
3343 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003344 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003345 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003346 }
3347#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003348 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3349 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003350 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003351 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003352 }
3353#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3354
Simon Butcher99000142016-10-13 17:21:01 +01003355 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003356 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3357 if (0 != ret) {
3358 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3359 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003360 }
3361
Gilles Peskinef670ba52025-03-07 15:09:32 +01003362 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003363
Simon Butcher99000142016-10-13 17:21:01 +01003364 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003365 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3366 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3367 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3368 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003369 }
3370
Gilles Peskine449bd832023-01-11 14:50:10 +01003371 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003372
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003373#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3374 peer_pk = &ssl->handshake->peer_pubkey;
3375#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003376 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003377 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003378 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003379 }
3380 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3381#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3382
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003383 /*
3384 * struct {
3385 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3386 * opaque signature<0..2^16-1>;
3387 * } DigitallySigned;
3388 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003389 if (i + 2 > ssl->in_hslen) {
3390 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3391 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003392 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003393
Ronald Cron8457c122022-03-07 11:32:54 +01003394 /*
3395 * Hash
3396 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003397 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003398
Gilles Peskine449bd832023-01-11 14:50:10 +01003399 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3400 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3401 " for verify message"));
3402 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003403 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003404
Simon Butcher99000142016-10-13 17:21:01 +01003405#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003406 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003407 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003408 }
Simon Butcher99000142016-10-13 17:21:01 +01003409#endif
Paul Bakker926af752012-11-23 13:38:07 +01003410
Ronald Cron8457c122022-03-07 11:32:54 +01003411 /* Info from md_alg will be used instead */
3412 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003413
Ronald Cron8457c122022-03-07 11:32:54 +01003414 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003415
Ronald Cron8457c122022-03-07 11:32:54 +01003416 /*
3417 * Signature
3418 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003419 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3420 == MBEDTLS_PK_NONE) {
3421 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3422 " for verify message"));
3423 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003424 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003425
Ronald Cron8457c122022-03-07 11:32:54 +01003426 /*
3427 * Check the certificate's key type matches the signature alg
3428 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003429 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3430 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3431 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003432 }
3433
3434 i++;
3435
Gilles Peskine449bd832023-01-11 14:50:10 +01003436 if (i + 2 > ssl->in_hslen) {
3437 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3438 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003439 }
3440
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003441 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003442 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003443
Gilles Peskine449bd832023-01-11 14:50:10 +01003444 if (i + sig_len != ssl->in_hslen) {
3445 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3446 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003447 }
3448
Simon Butcher99000142016-10-13 17:21:01 +01003449 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003450 {
3451 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003452 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3453 if (0 != ret) {
3454 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3455 return ret;
3456 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003457 }
Simon Butcher99000142016-10-13 17:21:01 +01003458
Gilles Peskine449bd832023-01-11 14:50:10 +01003459 if ((ret = mbedtls_pk_verify(peer_pk,
3460 md_alg, hash_start, hashlen,
3461 ssl->in_msg + i, sig_len)) != 0) {
3462 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3463 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003464 }
3465
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003466 ret = mbedtls_ssl_update_handshake_status(ssl);
3467 if (0 != ret) {
3468 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3469 return ret;
3470 }
Simon Butcher99000142016-10-13 17:21:01 +01003471
Gilles Peskine449bd832023-01-11 14:50:10 +01003472 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003473
Gilles Peskine449bd832023-01-11 14:50:10 +01003474 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003475}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003476#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003478#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003479MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003480static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003481{
Janos Follath865b3eb2019-12-16 11:46:15 +00003482 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003483 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003484 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003485
Gilles Peskine449bd832023-01-11 14:50:10 +01003486 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003488 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3489 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003490
3491 /*
3492 * struct {
3493 * uint32 ticket_lifetime_hint;
3494 * opaque ticket<0..2^16-1>;
3495 * } NewSessionTicket;
3496 *
3497 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3498 * 8 . 9 ticket_len (n)
3499 * 10 . 9+n ticket content
3500 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003501
Ronald Cron3c0072b2023-11-22 10:00:14 +01003502#if defined(MBEDTLS_HAVE_TIME)
3503 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3504#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003505 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3506 ssl->session_negotiate,
3507 ssl->out_msg + 10,
3508 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3509 &tlen, &lifetime)) != 0) {
3510 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003511 tlen = 0;
3512 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003513
Gilles Peskine449bd832023-01-11 14:50:10 +01003514 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3515 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003516 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003517
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003518 /*
3519 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3520 * ChangeCipherSpec share the same state.
3521 */
3522 ssl->handshake->new_session_ticket = 0;
3523
Gilles Peskine449bd832023-01-11 14:50:10 +01003524 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3525 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3526 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003527 }
3528
Gilles Peskine449bd832023-01-11 14:50:10 +01003529 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003530
Gilles Peskine449bd832023-01-11 14:50:10 +01003531 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003532}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003533#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003534
Paul Bakker5121ce52009-01-03 21:22:43 +00003535/*
Paul Bakker1961b702013-01-25 14:49:24 +01003536 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003537 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003538int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003539{
3540 int ret = 0;
3541
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003543
Gilles Peskine449bd832023-01-11 14:50:10 +01003544 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003545 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskinef670ba52025-03-07 15:09:32 +01003546 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Paul Bakker5121ce52009-01-03 21:22:43 +00003547 break;
3548
Paul Bakker1961b702013-01-25 14:49:24 +01003549 /*
3550 * <== ClientHello
3551 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003552 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003553 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003554 break;
Paul Bakker1961b702013-01-25 14:49:24 +01003555
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003556#if defined(MBEDTLS_SSL_PROTO_DTLS)
3557 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01003558 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02003559#endif
3560
Paul Bakker1961b702013-01-25 14:49:24 +01003561 /*
3562 * ==> ServerHello
3563 * Certificate
3564 * ( ServerKeyExchange )
3565 * ( CertificateRequest )
3566 * ServerHelloDone
3567 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003568 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003569 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003570 break;
3571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003572 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003573 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003574 break;
3575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003576 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003577 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003578 break;
3579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003580 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003582 break;
3583
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003584 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003585 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003586 break;
3587
3588 /*
3589 * <== ( Certificate/Alert )
3590 * ClientKeyExchange
3591 * ( CertificateVerify )
3592 * ChangeCipherSpec
3593 * Finished
3594 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003595 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003596 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003597 break;
3598
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003599 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003600 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003601 break;
3602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003603 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003604 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003605 break;
3606
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003607 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01003608 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003609 break;
3610
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003611 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003612 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003613 break;
3614
3615 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003616 * ==> ( NewSessionTicket )
3617 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003618 * Finished
3619 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003620 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3621#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003622 if (ssl->handshake->new_session_ticket != 0) {
3623 ret = ssl_write_new_session_ticket(ssl);
3624 } else
Paul Bakkera503a632013-08-14 13:48:06 +02003625#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003626 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003627 break;
3628
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003629 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003630 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003631 break;
3632
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003633 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003635 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
Paul Bakker1961b702013-01-25 14:49:24 +01003636 break;
3637
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003638 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003639 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003640 break;
3641
3642 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003643 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3644 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00003645 }
3646
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003648}
TRodziewicz8476f2f2021-06-02 14:34:47 +02003649
Gilles Peskine449bd832023-01-11 14:50:10 +01003650void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02003651{
TRodziewicz3946f792021-06-14 12:11:18 +02003652 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02003653}
3654
Jerry Yufb4b6472022-01-27 15:03:26 +08003655#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */