blob: 256f1b1583e61899aeea4762f188bf7ee8443d76 [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 ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
697 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200698#else
David Horstmann3a334c22022-10-25 10:53:44 +0100699 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200701#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 if (!key_type_matches) {
703 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100704 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000705 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100706
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200707 /*
708 * This avoids sending the client a cert it'll reject based on
709 * keyUsage or other extensions.
710 *
711 * It also allows the user to provision different certificates for
712 * different uses based on keyUsage, eg if they want to avoid signing
713 * and decrypting with the same RSA key.
714 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200716 MBEDTLS_SSL_IS_CLIENT,
717 MBEDTLS_SSL_VERSION_TLS1_2,
718 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
720 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200721 continue;
722 }
723
Valerio Settie9646ec2023-08-02 20:02:28 +0200724#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (pk_alg == MBEDTLS_PK_ECDSA &&
726 ssl_check_key_curve(&cur->cert->pk,
727 ssl->handshake->curves_tls_id) != 0) {
728 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100729 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000730 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100731#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100732
733 /* If we get there, we got a winner */
734 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100735 }
736
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200737 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100739 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
741 ssl->handshake->key_cert->cert);
742 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100743 }
744
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100746}
Gabor Mezei58535da2025-03-03 15:43:50 +0100747#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
748
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100750
751/*
752 * Check if a given ciphersuite is suitable for use with our config/keys/etc
753 * Sets ciphersuite_info only if the suite matches.
754 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200755MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100756static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
757 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100758{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200759 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100760
Jerry Yue7541932022-01-28 10:21:24 +0800761#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100762 mbedtls_pk_type_t sig_type;
763#endif
764
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
766 if (suite_info == NULL) {
767 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
768 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100769 }
770
Gilles Peskine449bd832023-01-11 14:50:10 +0100771 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
772 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000773
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 if (suite_info->min_tls_version > ssl->tls_version ||
775 suite_info->max_tls_version < ssl->tls_version) {
776 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
777 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000778 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100779
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200780#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
782 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
783 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
784 "not configured or ext missing"));
785 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200786 }
787#endif
788
789
Valerio Setti60d3b912023-07-25 10:43:53 +0200790#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200791 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100792 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
793 (ssl->handshake->curves_tls_id == NULL ||
794 ssl->handshake->curves_tls_id[0] == 0)) {
795 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
796 "no common elliptic curve"));
797 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000798 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799#endif
800
Gilles Peskineeccd8882020-03-10 12:19:08 +0100801#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100802 /* If the ciphersuite requires a pre-shared key and we don't
803 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
805 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
806 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
807 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000808 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100809#endif
810
Gabor Mezei58535da2025-03-03 15:43:50 +0100811#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
812
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200813#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100814 /*
815 * Final check: if ciphersuite requires us to have a
816 * certificate/key of a particular type:
817 * - select the appropriate certificate if we have one, or
818 * - try the next ciphersuite if we don't
819 * This must be done last since we modify the key_cert list.
820 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 if (ssl_pick_cert(ssl, suite_info) != 0) {
822 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
823 "no suitable certificate"));
824 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000825 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100826#endif
827
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200828 /* If the ciphersuite requires signing, check whether
829 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
831 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200832 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100833 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
834 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
835 "for signature algorithm %u", (unsigned) sig_type));
836 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200837 }
838
839#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
840
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100841 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100842 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100843}
844
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200845/* This function doesn't alert on errors that happen early during
846 ClientHello parsing because they might indicate that the client is
847 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200848MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100849static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000850{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100851 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200852 size_t i, j;
853 size_t ciph_offset, comp_offset, ext_offset;
854 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200856 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100857#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000858 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200859#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000860 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100861#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000862 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200863 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000865
Hanno Becker7e5437a2017-04-28 17:15:26 +0100866 /* If there is no signature-algorithm extension present,
867 * we need to fall back to the default values for allowed
868 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800869#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100870 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800871#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100872
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000874
David Horstmanne0af39a2022-10-06 18:19:18 +0100875 int renegotiating;
876
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200878read_record_header:
879#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100880 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200881 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100882 * otherwise read it ourselves manually in order to support SSLv2
883 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100884 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
885 * ClientHello has been already fully fetched by the TLS 1.3 code and the
886 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100887 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100888 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100891#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100892 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100893 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200894 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100895 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
896 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000897 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000898 }
899
900 buf = ssl->in_hdr;
901
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000903
Paul Bakkerec636f32012-09-09 19:17:02 +0000904 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100905 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000906 *
907 * Record layer:
908 * 0 . 0 message type
909 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200910 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000911 * 3 . 4 message length
912 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
914 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100915
Gilles Peskine449bd832023-01-11 14:50:10 +0100916 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
917 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
918 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100919 }
920
Gilles Peskine449bd832023-01-11 14:50:10 +0100921 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000922 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
925 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100926
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200927 /* For DTLS if this is the initial handshake, remember the client sequence
928 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100930 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931#if defined(MBEDTLS_SSL_RENEGOTIATION)
932 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000933#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200935 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
937 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
938 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200939 }
940
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
942 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200943
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100945 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
946 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200947 ssl->next_record_offset = 0;
948 ssl->in_left = 0;
949 goto read_record_header;
950 }
951
952 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200954#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200955 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200956#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200957
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000958 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000959
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200962 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000963 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100965#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000966 {
Ronald Cron6291b232023-03-08 15:51:25 +0100967 if (ssl->keep_current_message) {
968 ssl->keep_current_message = 0;
969 } else {
970 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
971 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
972 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
973 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000974
Ronald Cron6291b232023-03-08 15:51:25 +0100975 if ((ret = mbedtls_ssl_fetch_input(ssl,
976 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
977 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
978 return ret;
979 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200980
Ronald Cron6291b232023-03-08 15:51:25 +0100981 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200982#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100983 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
984 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
985 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200986#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100987 ssl->in_left = 0;
988 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100989 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000990
991 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000992
Gilles Peskine449bd832023-01-11 14:50:10 +0100993 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +0100994
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +0100995 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
996 if (0 != ret) {
997 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
998 return ret;
999 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001000
1001 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001002 * Handshake layer:
1003 * 0 . 0 handshake type
1004 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001005 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001006 * 6 . 8 DTLS only: fragment offset
1007 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001008 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001009 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1010 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1011 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001012 }
1013
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001015
Gilles Peskine449bd832023-01-11 14:50:10 +01001016 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1017 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1018 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001019 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001022 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001023 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001024 * Copy the client's handshake message_seq on initial handshakes,
1025 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001026 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001029 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001030 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001031 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1032 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1033 "%u (expected %u)", cli_msg_seq,
1034 ssl->handshake->in_msg_seq));
1035 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001036 }
1037
1038 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001040#endif
1041 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001042 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001043 ssl->handshake->out_msg_seq = cli_msg_seq;
1044 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1045 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001046 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001047 /*
1048 * For now we don't support fragmentation, so make sure
1049 * fragment_offset == 0 and fragment_length == length
1050 */
1051 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001052 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1053 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1054 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001055 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 4, ("fragment_offset=%u fragment_length=%u length=%u",
1057 (unsigned) fragment_offset, (unsigned) fragment_length,
1058 (unsigned) length));
1059 if (fragment_offset != 0 || length != fragment_length) {
1060 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1061 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001062 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001063 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001064 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001066
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 buf += mbedtls_ssl_hs_hdr_len(ssl);
1068 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001069
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001070 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001071 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001072 * 0 . 1 protocol version
1073 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001074 * 34 . 34 session id length (1 byte)
1075 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001076 * 35+x . 35+x DTLS only: cookie length (1 byte)
1077 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001078 * .. . .. ciphersuite list length (2 bytes)
1079 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001080 * .. . .. compression alg. list length (1 byte)
1081 * .. . .. compression alg. list
1082 * .. . .. extensions length (2 bytes, optional)
1083 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001084 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001085
1086 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001087 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001088 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1089 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001090 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 if (msg_len < 38) {
1092 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1093 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001094 }
1095
1096 /*
1097 * Check and save the protocol version
1098 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001100
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001101 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1102 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001103 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001104 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001105
Gilles Peskine449bd832023-01-11 14:50:10 +01001106 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1107 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1108 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1109 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1110 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001111 }
1112
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001113 /*
1114 * Save client random (inc. Unix time)
1115 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001117
Gilles Peskine449bd832023-01-11 14:50:10 +01001118 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001119
1120 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001121 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001122 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001123 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001124
Gilles Peskine449bd832023-01-11 14:50:10 +01001125 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1126 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1127 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1128 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1129 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1130 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001131 }
1132
Gilles Peskine449bd832023-01-11 14:50:10 +01001133 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001134
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001135 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001136 memset(ssl->session_negotiate->id, 0,
1137 sizeof(ssl->session_negotiate->id));
1138 memcpy(ssl->session_negotiate->id, buf + 35,
1139 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001140
1141 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001142 * Check the cookie length and content
1143 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001144#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001146 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001147 cookie_len = buf[cookie_offset];
1148
Gilles Peskine449bd832023-01-11 14:50:10 +01001149 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1150 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1151 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1152 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1153 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001154 }
1155
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1157 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001159#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001161#if defined(MBEDTLS_SSL_RENEGOTIATION)
1162 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001163#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001164 ) {
1165 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1166 buf + cookie_offset + 1, cookie_len,
1167 ssl->cli_id, ssl->cli_id_len) != 0) {
1168 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001169 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001170 } else {
1171 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001172 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001173 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001174 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001176 {
1177 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001179 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1181 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001182 }
1183
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001185 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001186
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 /*
1188 * Check the ciphersuitelist length (will be parsed later)
1189 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001190 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001192#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001194
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001195 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001196
Gilles Peskine449bd832023-01-11 14:50:10 +01001197 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001198 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 (ciph_len % 2) != 0) {
1200 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1201 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1202 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1203 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001204 }
1205
Gilles Peskine449bd832023-01-11 14:50:10 +01001206 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1207 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001208
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001209 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001210 * Check the compression algorithm's length.
1211 * The list contents are ignored because implementing
1212 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1213 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001214 */
1215 comp_offset = ciph_offset + 2 + ciph_len;
1216
1217 comp_len = buf[comp_offset];
1218
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001220 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 comp_len + comp_offset + 1 > msg_len) {
1222 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1223 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1224 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1225 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001226 }
1227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1229 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001230
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 /*
1232 * Check the extension length
1233 */
1234 ext_offset = comp_offset + 1 + comp_len;
1235 if (msg_len > ext_offset) {
1236 if (msg_len < ext_offset + 2) {
1237 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1238 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1239 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1240 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001241 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001242
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001243 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001244
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 if (msg_len != ext_offset + 2 + ext_len) {
1246 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1247 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1248 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1249 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1250 }
1251 } else {
1252 ext_len = 0;
1253 }
Paul Bakker48916f92012-09-16 19:57:18 +00001254
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 ext = buf + ext_offset + 2;
1256 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1257
1258 while (ext_len != 0) {
1259 unsigned int ext_id;
1260 unsigned int ext_size;
1261 if (ext_len < 4) {
1262 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1263 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1264 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1265 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1266 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001267 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1268 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001269
1270 if (ext_size + 4 > ext_len) {
1271 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1272 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1273 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1274 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1275 }
1276 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001277#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001278 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1280 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1281 ext + 4 + ext_size);
1282 if (ret != 0) {
1283 return ret;
1284 }
Simon Butcher584a5472016-05-23 16:24:52 +01001285 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001286#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001287
Simon Butcher584a5472016-05-23 16:24:52 +01001288 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001290#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001291 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001292#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1295 if (ret != 0) {
1296 return ret;
1297 }
Simon Butcher584a5472016-05-23 16:24:52 +01001298 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001299
Jerry Yue7541932022-01-28 10:21:24 +08001300#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001301 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001302 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001303
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1305 if (ret != 0) {
1306 return ret;
1307 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001308
1309 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001310 break;
Jerry Yue7541932022-01-28 10:21:24 +08001311#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001312
Valerio Setti60d3b912023-07-25 10:43:53 +02001313#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001314 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001316 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001317 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001318
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1320 if (ret != 0) {
1321 return ret;
1322 }
Simon Butcher584a5472016-05-23 16:24:52 +01001323 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001324
Simon Butcher584a5472016-05-23 16:24:52 +01001325 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001327 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001328
Gilles Peskine449bd832023-01-11 14:50:10 +01001329 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1330 if (ret != 0) {
1331 return ret;
1332 }
Simon Butcher584a5472016-05-23 16:24:52 +01001333 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001334#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001335 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001336 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001337
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001338#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001339 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001340 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001341
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1343 if (ret != 0) {
1344 return ret;
1345 }
Simon Butcher584a5472016-05-23 16:24:52 +01001346 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001347#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001350 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001352
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1354 if (ret != 0) {
1355 return ret;
1356 }
Simon Butcher584a5472016-05-23 16:24:52 +01001357 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001358#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001359
Hanno Beckera0e20d02019-05-15 14:03:01 +01001360#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001361 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001363
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1365 if (ret != 0) {
1366 return ret;
1367 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001368 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001369#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001371#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001372 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001374
Gilles Peskine449bd832023-01-11 14:50:10 +01001375 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1376 if (ret != 0) {
1377 return ret;
1378 }
Simon Butcher584a5472016-05-23 16:24:52 +01001379 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001383 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001385
Gilles Peskine449bd832023-01-11 14:50:10 +01001386 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1387 if (ret != 0) {
1388 return ret;
1389 }
Simon Butcher584a5472016-05-23 16:24:52 +01001390 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001394 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001396
Gilles Peskine449bd832023-01-11 14:50:10 +01001397 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1398 if (ret != 0) {
1399 return ret;
1400 }
Simon Butcher584a5472016-05-23 16:24:52 +01001401 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001403
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001404#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001405 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001407
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1409 ext + 4 + ext_size);
1410 if (ret != 0) {
1411 return ret;
1412 }
Simon Butcher584a5472016-05-23 16:24:52 +01001413 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001414#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001415
Johan Pascalb62bb512015-12-03 21:56:45 +01001416#if defined(MBEDTLS_SSL_DTLS_SRTP)
1417 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001418 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001419
Gilles Peskine449bd832023-01-11 14:50:10 +01001420 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1421 if (ret != 0) {
1422 return ret;
1423 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001424 break;
1425#endif /* MBEDTLS_SSL_DTLS_SRTP */
1426
Simon Butcher584a5472016-05-23 16:24:52 +01001427 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1429 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001430 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001431
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 ext_len -= 4 + ext_size;
1433 ext += 4 + ext_size;
1434 }
1435
Jerry Yue7541932022-01-28 10:21:24 +08001436#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001437
1438 /*
1439 * Try to fall back to default hash SHA1 if the client
1440 * hasn't provided any preferred signature-hash combinations.
1441 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001442 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001443 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1444 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001445#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1447 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001448#endif
1449#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1451 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001452#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001453 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001454 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001455
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001456 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1457 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1458 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001459
Gilles Peskine449bd832023-01-11 14:50:10 +01001460 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001461 }
1462
Jerry Yue7541932022-01-28 10:21:24 +08001463#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001464
Paul Bakker48916f92012-09-16 19:57:18 +00001465 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001466 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1467 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1469 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1470 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001471#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1473 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1474 "during renegotiation"));
1475 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1476 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1477 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001478 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001479#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001481 break;
1482 }
1483 }
1484
1485 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001486 * Renegotiation security checks
1487 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001488 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1489 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1490 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001491 handshake_failure = 1;
1492 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001494 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001495 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001496 renegotiation_info_seen == 0) {
1497 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001498 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1500 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1501 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1502 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001503 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001504 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1505 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1506 renegotiation_info_seen == 1) {
1507 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001508 handshake_failure = 1;
1509 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001510#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001511
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 if (handshake_failure == 1) {
1513 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1514 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1515 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001516 }
Paul Bakker380da532012-04-18 16:10:25 +00001517
Paul Bakker41c83d32013-03-20 14:39:14 +01001518 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001519 * Server certification selection (after processing TLS extensions)
1520 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001521 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1522 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1523 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001524 }
Glenn Strauss69894072022-01-24 12:58:00 -05001525#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1526 ssl->handshake->sni_name = NULL;
1527 ssl->handshake->sni_name_len = 0;
1528#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001529
1530 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001531 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001532 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001533 * and certificate from the SNI callback triggered by the SNI extension
1534 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001535 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001536 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001537 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001538 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001539
Gilles Peskine449bd832023-01-11 14:50:10 +01001540 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1541 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1542 for (i = 0; ciphersuites[i] != 0; i++) {
1543 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001544 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001545 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001546
TRodziewicz8476f2f2021-06-02 14:34:47 +02001547 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001548
Gilles Peskine449bd832023-01-11 14:50:10 +01001549 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1550 &ciphersuite_info)) != 0) {
1551 return ret;
1552 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001553
Gilles Peskine449bd832023-01-11 14:50:10 +01001554 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001555 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001556 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001557 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001558 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001559 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001560 for (i = 0; ciphersuites[i] != 0; i++) {
1561 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1562 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001563 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001564 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001565
1566 got_common_suite = 1;
1567
Gilles Peskine449bd832023-01-11 14:50:10 +01001568 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1569 &ciphersuite_info)) != 0) {
1570 return ret;
1571 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001572
Gilles Peskine449bd832023-01-11 14:50:10 +01001573 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001574 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001575 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001576 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001577 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001578 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001579
Gilles Peskine449bd832023-01-11 14:50:10 +01001580 if (got_common_suite) {
1581 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1582 "but none of them usable"));
1583 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1584 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1585 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1586 } else {
1587 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1588 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1589 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1590 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001591 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001592
1593have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001594 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001595
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001596 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001597 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001598
Gilles Peskinef670ba52025-03-07 15:09:32 +01001599 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00001600
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001601#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1603 mbedtls_ssl_recv_flight_completed(ssl);
1604 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001605#endif
1606
Hanno Becker7e5437a2017-04-28 17:15:26 +01001607 /* Debugging-only output for testsuite */
1608#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001609 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001610 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1611 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001612 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1614 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1615 sig_hash));
1616 } else {
1617 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1618 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001619 }
1620#endif
1621
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001623
Gilles Peskine449bd832023-01-11 14:50:10 +01001624 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001625}
1626
Hanno Beckera0e20d02019-05-15 14:03:01 +01001627#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001628static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1629 unsigned char *buf,
1630 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001631{
1632 unsigned char *p = buf;
1633 size_t ext_len;
1634 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1635
1636 *olen = 0;
1637
1638 /* Skip writing the extension if we don't want to use it or if
1639 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001640 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001641 return;
1642 }
1643
Gilles Peskine449bd832023-01-11 14:50:10 +01001644 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1645 * which is at most 255, so the increment cannot overflow. */
1646 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1647 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1648 return;
1649 }
1650
1651 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001652
1653 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001654 * struct {
1655 * opaque cid<0..2^8-1>;
1656 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001657 */
1658 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001659 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001660 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001662 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001663
1664 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001665 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001666
1667 *olen = ssl->own_cid_len + 5;
1668}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001669#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001670
Neil Armstrong76b74072022-04-06 13:43:54 +02001671#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001672static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1673 unsigned char *buf,
1674 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001675{
1676 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001677 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001678
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001679 /*
1680 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1681 * from a client and then selects a stream or Authenticated Encryption
1682 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1683 * encrypt-then-MAC response extension back to the client."
1684 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001685 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 ssl->session_negotiate->ciphersuite);
1687 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001688 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001689 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001690 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001691 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001692 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001693 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001694
Gilles Peskine449bd832023-01-11 14:50:10 +01001695 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001696 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001697 }
Ronald Cron862902d2022-03-24 14:15:28 +01001698 }
1699
Gilles Peskine449bd832023-01-11 14:50:10 +01001700 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001701 *olen = 0;
1702 return;
1703 }
1704
Gilles Peskine449bd832023-01-11 14:50:10 +01001705 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001706
Gilles Peskine449bd832023-01-11 14:50:10 +01001707 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001708 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001709
1710 *p++ = 0x00;
1711 *p++ = 0x00;
1712
1713 *olen = 4;
1714}
Neil Armstrong76b74072022-04-06 13:43:54 +02001715#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001716
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001718static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1719 unsigned char *buf,
1720 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001721{
1722 unsigned char *p = buf;
1723
Gilles Peskine449bd832023-01-11 14:50:10 +01001724 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001725 *olen = 0;
1726 return;
1727 }
1728
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1730 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001731
Gilles Peskine449bd832023-01-11 14:50:10 +01001732 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001733 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001734
1735 *p++ = 0x00;
1736 *p++ = 0x00;
1737
1738 *olen = 4;
1739}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001740#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001741
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001742#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001743static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1744 unsigned char *buf,
1745 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001746{
1747 unsigned char *p = buf;
1748
Gilles Peskine449bd832023-01-11 14:50:10 +01001749 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001750 *olen = 0;
1751 return;
1752 }
1753
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001755
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001757 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001758
1759 *p++ = 0x00;
1760 *p++ = 0x00;
1761
1762 *olen = 4;
1763}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001764#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001765
Gilles Peskine449bd832023-01-11 14:50:10 +01001766static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1767 unsigned char *buf,
1768 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001769{
1770 unsigned char *p = buf;
1771
Gilles Peskine449bd832023-01-11 14:50:10 +01001772 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001773 *olen = 0;
1774 return;
1775 }
1776
Gilles Peskine449bd832023-01-11 14:50:10 +01001777 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001778
Gilles Peskine449bd832023-01-11 14:50:10 +01001779 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001780 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001781
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001782#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001783 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001784 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001785 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001786 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001787
Gilles Peskine449bd832023-01-11 14:50:10 +01001788 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001789 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001790 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001791 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001792 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001793#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001794 {
1795 *p++ = 0x00;
1796 *p++ = 0x01;
1797 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001798 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001799
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001800 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001801}
1802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001803#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001804static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1805 unsigned char *buf,
1806 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001807{
1808 unsigned char *p = buf;
1809
Gilles Peskine449bd832023-01-11 14:50:10 +01001810 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001811 *olen = 0;
1812 return;
1813 }
1814
Gilles Peskine449bd832023-01-11 14:50:10 +01001815 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001816
Gilles Peskine449bd832023-01-11 14:50:10 +01001817 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001818 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001819
1820 *p++ = 0x00;
1821 *p++ = 1;
1822
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001823 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001824
1825 *olen = 5;
1826}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001827#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001828
Valerio Setti7aeec542023-07-05 18:57:21 +02001829#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001830 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001831 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001832static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1833 unsigned char *buf,
1834 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001835{
1836 unsigned char *p = buf;
1837 ((void) ssl);
1838
Gilles Peskine449bd832023-01-11 14:50:10 +01001839 if ((ssl->handshake->cli_exts &
1840 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001841 *olen = 0;
1842 return;
1843 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001844
Gilles Peskine449bd832023-01-11 14:50:10 +01001845 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001846
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001848 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001849
1850 *p++ = 0x00;
1851 *p++ = 2;
1852
1853 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001854 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001855
1856 *olen = 6;
1857}
Valerio Setti45d56f32023-07-13 17:23:20 +02001858#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001859 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001860 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001861
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001862#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001863static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1864 unsigned char *buf,
1865 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001866{
Janos Follath865b3eb2019-12-16 11:46:15 +00001867 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001868 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001869 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001870 size_t kkpp_len;
1871
1872 *olen = 0;
1873
1874 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001875 if (ssl->handshake->ciphersuite_info->key_exchange !=
1876 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001877 return;
1878 }
1879
Gilles Peskine449bd832023-01-11 14:50:10 +01001880 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1881
1882 if (end - p < 4) {
1883 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1884 return;
1885 }
1886
1887 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001888 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001889
Gilles Peskine449bd832023-01-11 14:50:10 +01001890 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001891 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001892 MBEDTLS_ECJPAKE_ROUND_ONE);
1893 if (ret != 0) {
1894 psa_destroy_key(ssl->handshake->psa_pake_password);
1895 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1896 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001897 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001898 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001899
Gilles Peskine449bd832023-01-11 14:50:10 +01001900 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001901 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001902
1903 *olen = kkpp_len + 4;
1904}
1905#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1906
Gilles Peskine449bd832023-01-11 14:50:10 +01001907#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1908static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1909 unsigned char *buf,
1910 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001911{
Ron Eldor75870ec2018-12-06 17:31:55 +02001912 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001913 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001914 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1915
1916 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001917
Gilles Peskine449bd832023-01-11 14:50:10 +01001918 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1919 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001920 return;
1921 }
1922
Gilles Peskine449bd832023-01-11 14:50:10 +01001923 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001924
Gilles Peskine449bd832023-01-11 14:50:10 +01001925 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001926 mki_len = ssl->dtls_srtp_info.mki_len;
1927 }
1928
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001929 /* The extension total size is 9 bytes :
1930 * - 2 bytes for the extension tag
1931 * - 2 bytes for the total size
1932 * - 2 bytes for the protection profile length
1933 * - 2 bytes for the protection profile
1934 * - 1 byte for the mki length
1935 * + the actual mki length
1936 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001937 if ((size_t) (end - buf) < mki_len + 9) {
1938 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001939 return;
1940 }
1941
Johan Pascalb62bb512015-12-03 21:56:45 +01001942 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001943 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001944 /*
1945 * total length 5 and mki value: only one profile(2 bytes)
1946 * and length(2 bytes) and srtp_mki )
1947 */
Ron Eldor591f1622018-01-22 12:30:04 +02001948 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001949 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001950
1951 /* protection profile length: 2 */
1952 buf[4] = 0x00;
1953 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001954 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001955 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1956 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1957 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1958 } else {
1959 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001960 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001961 }
1962
Ron Eldor591f1622018-01-22 12:30:04 +02001963 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001965
Ron Eldor591f1622018-01-22 12:30:04 +02001966 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001967}
1968#endif /* MBEDTLS_SSL_DTLS_SRTP */
1969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001970#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001971MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001972static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001973{
Janos Follath865b3eb2019-12-16 11:46:15 +00001974 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001975 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001976 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001977
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001979
1980 /*
1981 * struct {
1982 * ProtocolVersion server_version;
1983 * opaque cookie<0..2^8-1>;
1984 * } HelloVerifyRequest;
1985 */
1986
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001987 /* The RFC is not clear on this point, but sending the actual negotiated
1988 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001989 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
1990 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001991 p += 2;
1992
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001993 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01001994 if (ssl->conf->f_cookie_write == NULL) {
1995 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
1996 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001997 }
1998
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001999 /* Skip length byte until we know the length */
2000 cookie_len_byte = p++;
2001
Gilles Peskine449bd832023-01-11 14:50:10 +01002002 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2003 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2004 ssl->cli_id, ssl->cli_id_len)) != 0) {
2005 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2006 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002007 }
2008
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002010
Gilles Peskine449bd832023-01-11 14:50:10 +01002011 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002012
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002013 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002014 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2015 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002016
Gilles Peskinef670ba52025-03-07 15:09:32 +01002017 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002018
Gilles Peskine449bd832023-01-11 14:50:10 +01002019 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2020 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2021 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002022 }
2023
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002024#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002025 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2026 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2027 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2028 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002029 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002030#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002031
Gilles Peskine449bd832023-01-11 14:50:10 +01002032 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002033
Gilles Peskine449bd832023-01-11 14:50:10 +01002034 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002035}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002036#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002037
Gilles Peskine449bd832023-01-11 14:50:10 +01002038static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002039{
2040 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002041 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002042 mbedtls_ssl_session * const session = ssl->session_negotiate;
2043
2044 /* Resume is 0 by default, see ssl_handshake_init().
2045 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002046 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002047 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002048 }
2049 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002050 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 }
2052 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002053 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002055#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002056 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002057 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002059#endif
2060
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002062
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2064 session->id,
2065 session->id_len,
2066 &session_tmp);
2067 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002068 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002069 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002070
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002072 /* Mismatch between cached and negotiated session */
2073 goto exit;
2074 }
2075
2076 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002078 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002079 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002082 ssl->handshake->resume = 1;
2083
2084exit:
2085
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002087}
2088
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002089MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002090static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002091{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002092#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002093 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002094#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002095 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002096 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002097 unsigned char *buf, *p;
2098
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002101#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2103 ssl->handshake->cookie_verify_result != 0) {
2104 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2105 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002108 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002109#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002110
Paul Bakker5121ce52009-01-03 21:22:43 +00002111 /*
2112 * 0 . 0 handshake type
2113 * 1 . 3 handshake length
2114 * 4 . 5 protocol version
2115 * 6 . 9 UNIX time()
2116 * 10 . 37 random bytes
2117 */
2118 buf = ssl->out_msg;
2119 p = buf + 4;
2120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002122 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002123
Gilles Peskine449bd832023-01-11 14:50:10 +01002124 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2125 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002126
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002127#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 t = mbedtls_time(NULL);
2129 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002130 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002131
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2133 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002134#else
Ben Taylorfd529842025-03-10 08:27:42 +00002135 if ((ret = psa_generate_random(p, 4)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 return ret;
2137 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002138
2139 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002140#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002141
Ben Taylor602b2962025-03-07 15:52:50 +00002142 if ((ret = psa_generate_random(p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 return ret;
2144 }
Ronald Cronc5649382023-04-04 15:33:42 +02002145 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002146
Ronald Cronc5649382023-04-04 15:33:42 +02002147#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2148 /*
2149 * RFC 8446
2150 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2151 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2152 * response to a ClientHello MUST set the last 8 bytes of their Random
2153 * value specially in their ServerHello.
2154 */
2155 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2156 static const unsigned char magic_tls12_downgrade_string[] =
2157 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2158
2159 MBEDTLS_STATIC_ASSERT(
2160 sizeof(magic_tls12_downgrade_string) == 8,
2161 "magic_tls12_downgrade_string does not have the expected size");
2162
Ronald Cronfe01ec22023-04-06 09:56:53 +02002163 memcpy(p, magic_tls12_downgrade_string,
2164 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002165 } else
2166#endif
2167 {
Ben Taylor602b2962025-03-07 15:52:50 +00002168 if ((ret = psa_generate_random(p, 8)) != 0) {
Ronald Cronc5649382023-04-04 15:33:42 +02002169 return ret;
2170 }
2171 }
2172 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002173
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002181 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002182 * New session, create a new session id,
2183 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002184 */
Gilles Peskinef670ba52025-03-07 15:09:32 +01002185 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002187#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002189#endif
2190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002191#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002193 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 memset(ssl->session_negotiate->id, 0, 32);
2195 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002196#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002197 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002198 ssl->session_negotiate->id_len = n = 32;
Ben Taylor602b2962025-03-07 15:52:50 +00002199 if ((ret = psa_generate_random(ssl->session_negotiate->id,
Ben Taylor1cd1e012025-03-18 11:50:39 +00002200 n)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002201 return ret;
2202 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002203 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002204 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002205 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002206 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002207 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002208 n = ssl->session_negotiate->id_len;
Gilles Peskinef670ba52025-03-07 15:09:32 +01002209 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC);
Paul Bakkerff60ee62010-03-16 21:09:09 +00002210
Gilles Peskine449bd832023-01-11 14:50:10 +01002211 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2212 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2213 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002214 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002215 }
2216
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002217 /*
2218 * 38 . 38 session id length
2219 * 39 . 38+n session id
2220 * 39+n . 40+n chosen ciphersuite
2221 * 41+n . 41+n chosen compression alg.
2222 * 42+n . 43+n extensions length
2223 * 44+n . 43+n+m extensions
2224 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002225 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002227 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002228
Gilles Peskine449bd832023-01-11 14:50:10 +01002229 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2230 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2231 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2232 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002233
Gilles Peskine449bd832023-01-11 14:50:10 +01002234 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002235 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002236 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002237
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2239 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2240 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2241 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002242
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002243 /*
2244 * First write extensions, then the total length
2245 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002246 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002247 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002249#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002250 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002251 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002252#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002253
Hanno Beckera0e20d02019-05-15 14:03:01 +01002254#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002255 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002256 ext_len += olen;
2257#endif
2258
Neil Armstrong76b74072022-04-06 13:43:54 +02002259#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002260 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002261 ext_len += olen;
2262#endif
2263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002264#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002265 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002266 ext_len += olen;
2267#endif
2268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002269#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002270 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002271 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002272#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002273
Valerio Setti7aeec542023-07-05 18:57:21 +02002274#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002275 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002276 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002277 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002278 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2279 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2280 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002281 ext_len += olen;
2282 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002283#endif
2284
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002285#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002286 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002287 ext_len += olen;
2288#endif
2289
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002290#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002291 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002292 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2293 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002294 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002295 }
Paul Elliottf518f812022-07-11 12:36:20 +01002296
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002297 ext_len += olen;
2298#endif
2299
Johan Pascalb62bb512015-12-03 21:56:45 +01002300#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002301 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002302 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002303#endif
2304
Gilles Peskine449bd832023-01-11 14:50:10 +01002305 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2306 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002307
Gilles Peskine449bd832023-01-11 14:50:10 +01002308 if (ext_len > 0) {
2309 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002310 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002311 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002312
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002313 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002314 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2315 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002316
Gilles Peskine449bd832023-01-11 14:50:10 +01002317 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002318
Gilles Peskine449bd832023-01-11 14:50:10 +01002319 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002320
Gilles Peskine449bd832023-01-11 14:50:10 +01002321 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002322}
2323
Gilles Peskineeccd8882020-03-10 12:19:08 +01002324#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002325MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002326static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002327{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002328 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002329 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002330
Gilles Peskine449bd832023-01-11 14:50:10 +01002331 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002332
Gilles Peskine449bd832023-01-11 14:50:10 +01002333 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2334 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002335 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002336 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002337 }
2338
Gilles Peskine449bd832023-01-11 14:50:10 +01002339 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2340 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002341}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002342#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002343MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002344static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002345{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002346 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002347 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002348 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002349 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002350 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002351 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002352 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002353 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002354 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002355
Gilles Peskine449bd832023-01-11 14:50:10 +01002356 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002357
Gilles Peskinef670ba52025-03-07 15:09:32 +01002358 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002359
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002360#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002361 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002362 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002363 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002364#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002365 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002366
Gilles Peskine449bd832023-01-11 14:50:10 +01002367 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2368 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2369 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2370 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002371 }
2372
2373 /*
2374 * 0 . 0 handshake type
2375 * 1 . 3 handshake length
2376 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002377 * 5 .. m-1 cert types
2378 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002379 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002380 * n .. n+1 length of all DNs
2381 * n+2 .. n+3 length of DN 1
2382 * n+4 .. ... Distinguished Name #1
2383 * ... .. ... length of DN 2, etc.
2384 */
2385 buf = ssl->out_msg;
2386 p = buf + 4;
2387
2388 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002389 * Supported certificate types
2390 *
2391 * ClientCertificateType certificate_types<1..2^8-1>;
2392 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002393 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002394 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002396#if defined(MBEDTLS_RSA_C)
2397 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002398#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002399#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002401#endif
2402
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002403 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002404 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002405
Paul Bakker577e0062013-08-28 11:57:20 +02002406 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002407
Paul Bakker926af752012-11-23 13:38:07 +01002408 /*
2409 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002410 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002411 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2412 *
2413 * struct {
2414 * HashAlgorithm hash;
2415 * SignatureAlgorithm signature;
2416 * } SignatureAndHashAlgorithm;
2417 *
2418 * enum { (255) } HashAlgorithm;
2419 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002420 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002421 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2422 if (sig_alg == NULL) {
2423 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2424 }
Ronald Cron8457c122022-03-07 11:32:54 +01002425
Gilles Peskine449bd832023-01-11 14:50:10 +01002426 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2427 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002428
Gilles Peskine449bd832023-01-11 14:50:10 +01002429 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002430 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002431 }
2432 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002433 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002434 }
Simon Butcher99000142016-10-13 17:21:01 +01002435
Paul Elliott96a0fd92022-11-08 17:09:56 +00002436 /* Write elements at offsets starting from 1 (offset 0 is for the
2437 * length). Thus the offset of each element is the length of the
2438 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002439 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002440 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002441
Paul Bakker926af752012-11-23 13:38:07 +01002442 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002443
Paul Elliott96a0fd92022-11-08 17:09:56 +00002444 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002445 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002446 sa_len += 2;
2447 p += sa_len;
2448
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002449 /*
2450 * DistinguishedName certificate_authorities<0..2^16-1>;
2451 * opaque DistinguishedName<1..2^16-1>;
2452 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002453 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002454
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002455 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002456
Gilles Peskine449bd832023-01-11 14:50:10 +01002457 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002458 /* NOTE: If trusted certificates are provisioned
2459 * via a CA callback (configured through
2460 * `mbedtls_ssl_conf_ca_cb()`, then the
2461 * CertificateRequest is currently left empty. */
2462
Glenn Strauss999ef702022-03-11 01:37:23 -05002463#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2464#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002465 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002466 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002467 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002468#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002469 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002470 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002471 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002472#endif
Janos Follath088ce432017-04-10 12:42:31 +01002473#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002474 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002475 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002476 } else
Janos Follath088ce432017-04-10 12:42:31 +01002477#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002478 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002479
Gilles Peskine449bd832023-01-11 14:50:10 +01002480 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002481 /* It follows from RFC 5280 A.1 that this length
2482 * can be represented in at most 11 bits. */
2483 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002484
Gilles Peskine449bd832023-01-11 14:50:10 +01002485 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2486 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002487 break;
2488 }
2489
Gilles Peskine449bd832023-01-11 14:50:10 +01002490 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002491 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002492 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002493 p += dn_size;
2494
Gilles Peskine449bd832023-01-11 14:50:10 +01002495 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002496
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002497 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002498 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002499 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002500 }
2501
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002502 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002503 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2504 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002506
Gilles Peskine449bd832023-01-11 14:50:10 +01002507 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002508
Gilles Peskine449bd832023-01-11 14:50:10 +01002509 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002510
Gilles Peskine449bd832023-01-11 14:50:10 +01002511 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002512}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002513#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002514
Gilles Peskineeccd8882020-03-10 12:19:08 +01002515#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002516 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002517MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002518static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2519 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002520{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002521 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2522 * signature length which will be added in ssl_write_server_key_exchange
2523 * after the call to ssl_prepare_server_key_exchange.
2524 * ssl_write_server_key_exchange also takes care of incrementing
2525 * ssl->out_msglen. */
2526 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002527 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2528 - sig_start);
2529 int ret = ssl->conf->f_async_resume(ssl,
2530 sig_start, signature_len, sig_max_len);
2531 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002532 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002533 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002534 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002535 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2536 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002537}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002538#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002539 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002540
Gilles Peskined3eb0612018-01-08 17:07:44 +01002541/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002542 * calculating the signature if any, but excluding formatting the
2543 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002544MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002545static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2546 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002547{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002548 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002549 ssl->handshake->ciphersuite_info;
2550
Gilles Peskineeccd8882020-03-10 12:19:08 +01002551#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002552#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002553 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002554#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002555#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002556
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002557 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002558#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002559 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002560#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002561
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002562#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002563#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002564 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002565#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002566 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 +02002567#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002568#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002569
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002570 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002571
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002572 /*
2573 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002574 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002575 *
2576 */
2577
2578 /*
2579 * - ECJPAKE key exchanges
2580 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002581#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002582 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002583 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002584 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2585 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2586 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002587 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002588 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002589
Valerio Setti6f1b5742022-11-16 10:00:32 +01002590 /*
2591 * The first 3 bytes are:
2592 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2593 * [1, 2] elliptic curve's TLS ID
2594 *
2595 * However since we only support secp256r1 for now, we hardcode its
2596 * TLS ID here
2597 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002598 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002599 MBEDTLS_ECP_DP_SECP256R1);
2600 if (tls_id == 0) {
2601 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002602 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002603 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002605 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002606
Gilles Peskine449bd832023-01-11 14:50:10 +01002607 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2608 out_p + output_offset,
2609 end_p - out_p - output_offset, &output_len,
2610 MBEDTLS_ECJPAKE_ROUND_TWO);
2611 if (ret != 0) {
2612 psa_destroy_key(ssl->handshake->psa_pake_password);
2613 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2614 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2615 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002616 }
2617
Valerio Setti02c25b52022-11-15 14:08:42 +01002618 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002619 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002620 }
2621#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2622
Hanno Becker1aa267c2017-04-28 17:08:27 +01002623 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002624 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002625 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2626 * we use empty support identity hints here.
2627 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002628#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2629 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002630 ssl->out_msg[ssl->out_msglen++] = 0x00;
2631 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002632 }
Valerio Setti48659a12025-01-15 14:22:28 +01002633#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002634
Hanno Becker7e5437a2017-04-28 17:15:26 +01002635 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002636 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002637 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002638#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002639 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002640 /*
2641 * Ephemeral ECDH parameters:
2642 *
2643 * struct {
2644 * ECParameters curve_params;
2645 * ECPoint public;
2646 * } ServerECDHParams;
2647 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002648 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002649 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002650 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002651 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002652
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002653 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2655 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2656 }
2657 for (; *group_list != 0; group_list++) {
2658 for (curr_tls_id = ssl->handshake->curves_tls_id;
2659 *curr_tls_id != 0; curr_tls_id++) {
2660 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002661 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002662 }
2663 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002664 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002665
Gilles Peskine449bd832023-01-11 14:50:10 +01002666curve_matching_done:
2667 if (*curr_tls_id == 0) {
2668 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2669 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2670 }
2671
2672 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2673 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002674
Neil Armstrongd91526c2022-04-12 14:38:52 +02002675 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2676 psa_key_attributes_t key_attributes;
2677 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002678 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2679 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2680 // data length(1)
2681 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002682 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002683 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002684
Gilles Peskine449bd832023-01-11 14:50:10 +01002685 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002686
Valerio Setti40d9ca92023-01-04 16:08:04 +01002687 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002689 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2691 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2692 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002693 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002694 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002695 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002696
2697 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2699 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002700 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002701 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002702
2703 /*
2704 * ECParameters curve_params
2705 *
2706 * First byte is curve_type, always named_curve
2707 */
2708 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2709
2710 /*
2711 * Next two bytes are the namedcurve value
2712 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002714 p += 2;
2715
2716 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002717 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002718 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002719 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002720 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002721 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2722 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002723 }
2724
2725 /*
2726 * ECPoint public
2727 *
2728 * First byte is data length.
2729 * It will be filled later. p holds now the data length location.
2730 */
2731
2732 /* Export the public part of the ECDH private key from PSA.
2733 * Make one byte space for the length.
2734 */
2735 unsigned char *own_pubkey = p + data_length_size;
2736
Gilles Peskine449bd832023-01-11 14:50:10 +01002737 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2738 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002739
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002740 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002741 own_pubkey, own_pubkey_max_len,
2742 &len);
2743 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002744 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002745 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002746 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2747 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002748 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002749 }
2750
2751 /* Store the length of the exported public key. */
2752 *p = (uint8_t) len;
2753
2754 /* Determine full message length. */
2755 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002756
Jerry Yuc5aef882021-12-23 20:15:02 +08002757#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002758 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002759#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002760
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002761 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002762 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002763#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002764
Hanno Becker1aa267c2017-04-28 17:08:27 +01002765 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002766 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002767 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002768 * exchange parameters, compute and add the signature here.
2769 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002770 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002771#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002772 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2773 if (dig_signed == NULL) {
2774 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2775 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002776 }
2777
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002778 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02002779 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002780 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02002781
Janos Follath865b3eb2019-12-16 11:46:15 +00002782 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002783
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002784 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002785 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002786 * For TLS 1.2, obey signature-hash-algorithm extension
2787 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002788 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002789
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002790 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01002791 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01002792
Dave Rodgmanc37ad442023-11-03 23:36:06 +00002793 unsigned char sig_hash =
2794 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01002795 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002796
Gilles Peskine449bd832023-01-11 14:50:10 +01002797 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002798
Ronald Cron8457c122022-03-07 11:32:54 +01002799 /* For TLS 1.2, obey signature-hash-algorithm extension
2800 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002801 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
2802 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01002803 /* (... because we choose a cipher suite
2804 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01002805 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002806 }
2807
Gilles Peskine449bd832023-01-11 14:50:10 +01002808 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01002809
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002810 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002811 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002812 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002813 if (md_alg != MBEDTLS_MD_NONE) {
2814 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2815 dig_signed,
2816 dig_signed_len,
2817 md_alg);
2818 if (ret != 0) {
2819 return ret;
2820 }
2821 } else {
2822 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2823 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002824 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02002825
Gilles Peskine449bd832023-01-11 14:50:10 +01002826 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002827
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002828 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002829 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002830 */
Ronald Cron8457c122022-03-07 11:32:54 +01002831 /*
2832 * We need to specify signature and hash algorithm explicitly through
2833 * a prefix to the signature.
2834 *
2835 * struct {
2836 * HashAlgorithm hash;
2837 * SignatureAlgorithm signature;
2838 * } SignatureAndHashAlgorithm;
2839 *
2840 * struct {
2841 * SignatureAndHashAlgorithm algorithm;
2842 * opaque signature<0..2^16-1>;
2843 * } DigitallySigned;
2844 *
2845 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002846
Gilles Peskine449bd832023-01-11 14:50:10 +01002847 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
2848 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002849
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002850#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002851 if (ssl->conf->f_async_sign_start != NULL) {
2852 ret = ssl->conf->f_async_sign_start(ssl,
2853 mbedtls_ssl_own_cert(ssl),
2854 md_alg, hash, hashlen);
2855 switch (ret) {
2856 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
2857 /* act as if f_async_sign was null */
2858 break;
2859 case 0:
2860 ssl->handshake->async_in_progress = 1;
2861 return ssl_resume_server_key_exchange(ssl, signature_len);
2862 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
2863 ssl->handshake->async_in_progress = 1;
2864 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
2865 default:
2866 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
2867 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002868 }
2869 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002870#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002871
Gilles Peskine449bd832023-01-11 14:50:10 +01002872 if (mbedtls_ssl_own_key(ssl) == NULL) {
2873 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
2874 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002875 }
2876
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002877 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2878 * signature length which will be added in ssl_write_server_key_exchange
2879 * after the call to ssl_prepare_server_key_exchange.
2880 * ssl_write_server_key_exchange also takes care of incrementing
2881 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002882 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
2883 md_alg, hash, hashlen,
2884 ssl->out_msg + ssl->out_msglen + 2,
2885 out_buf_len - ssl->out_msglen - 2,
Ben Taylor440cb2a2025-03-05 09:40:08 +00002886 signature_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002887 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
2888 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00002889 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002890 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002891#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002892
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002894}
Paul Bakker1ef83d62012-04-11 12:09:53 +00002895
Gilles Peskined3eb0612018-01-08 17:07:44 +01002896/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02002897 * that do not include a ServerKeyExchange message, do nothing. Either
2898 * way, if successful, move on to the next step in the SSL state
2899 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002900MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002901static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002902{
Janos Follath865b3eb2019-12-16 11:46:15 +00002903 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002904 size_t signature_len = 0;
Ben Taylor5cdbe302025-09-08 13:12:43 +01002905#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002906 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01002907 ssl->handshake->ciphersuite_info;
Ben Taylor5cdbe302025-09-08 13:12:43 +01002908#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002909
Gilles Peskine449bd832023-01-11 14:50:10 +01002910 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01002911
Ben Taylor5cdbe302025-09-08 13:12:43 +01002912#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002913 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002914 /* Key exchanges not involving ephemeral keys don't use
2915 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002916 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002917 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002918 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002919 }
Ben Taylor5cdbe302025-09-08 13:12:43 +01002920#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002921
Gilles Peskineeccd8882020-03-10 12:19:08 +01002922#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002923 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01002924 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02002925 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002926 if (ssl->handshake->async_in_progress != 0) {
2927 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
2928 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
2929 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01002930#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002931 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002932 {
2933 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002934 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01002935 }
2936
Gilles Peskine449bd832023-01-11 14:50:10 +01002937 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02002938 /* If we're starting to write a new message, set ssl->out_msglen
2939 * to 0. But if we're resuming after an asynchronous message,
2940 * out_msglen is the amount of data written so far and mst be
2941 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002942 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
2943 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
2944 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01002945 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002946 }
2947 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002948 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002949
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002950 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02002951 * ssl_prepare_server_key_exchange already wrote the signature
2952 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002953#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002954 if (signature_len != 0) {
2955 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
2956 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002957
Gilles Peskine449bd832023-01-11 14:50:10 +01002958 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
2959 ssl->out_msg + ssl->out_msglen,
2960 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002961
2962 /* Skip over the already-written signature */
2963 ssl->out_msglen += signature_len;
2964 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002965#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002966
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002967 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002968 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2969 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002970
Gilles Peskinef670ba52025-03-07 15:09:32 +01002971 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002972
Gilles Peskine449bd832023-01-11 14:50:10 +01002973 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2974 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2975 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002976 }
2977
Gilles Peskine449bd832023-01-11 14:50:10 +01002978 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
2979 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002980}
2981
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002982MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002983static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002984{
Janos Follath865b3eb2019-12-16 11:46:15 +00002985 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00002986
Gilles Peskine449bd832023-01-11 14:50:10 +01002987 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002988
2989 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002990 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2991 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002992
Gilles Peskinef670ba52025-03-07 15:09:32 +01002993 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002994
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002995#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002996 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2997 mbedtls_ssl_send_flight_completed(ssl);
2998 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02002999#endif
3000
Gilles Peskine449bd832023-01-11 14:50:10 +01003001 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3002 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3003 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003004 }
3005
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003006#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003007 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3008 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3009 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3010 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003011 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003012#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003013
Gilles Peskine449bd832023-01-11 14:50:10 +01003014 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003015
Gilles Peskine449bd832023-01-11 14:50:10 +01003016 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003017}
3018
Gilles Peskineeccd8882020-03-10 12:19:08 +01003019#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003020MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003021static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3022 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003023{
Paul Bakker6db455e2013-09-18 17:29:31 +02003024 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003025 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003026
Gilles Peskine449bd832023-01-11 14:50:10 +01003027 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3028 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3029 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003030 }
3031
3032 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003033 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003034 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003035 if (end - *p < 2) {
3036 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3037 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003038 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003039
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003040 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003041 *p += 2;
3042
Gilles Peskine449bd832023-01-11 14:50:10 +01003043 if (n == 0 || n > end - *p) {
3044 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3045 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003046 }
3047
Gilles Peskine449bd832023-01-11 14:50:10 +01003048 if (ssl->conf->f_psk != NULL) {
3049 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003050 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003051 }
3052 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003053 /* Identity is not a big secret since clients send it in the clear,
3054 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003055 if (n != ssl->conf->psk_identity_len ||
3056 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003057 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003058 }
3059 }
3060
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3062 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3063 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3064 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3065 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003066 }
3067
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003068 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003069
Gilles Peskine449bd832023-01-11 14:50:10 +01003070 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003071}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003072#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003073
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003074MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003075static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003076{
Janos Follath865b3eb2019-12-16 11:46:15 +00003077 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003078 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003079 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003080
Hanno Beckere694c3e2017-12-27 21:34:08 +00003081 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003082
Gilles Peskine449bd832023-01-11 14:50:10 +01003083 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003084
Gilles Peskine449bd832023-01-11 14:50:10 +01003085 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3086 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3087 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003088 }
3089
Gilles Peskine449bd832023-01-11 14:50:10 +01003090 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003091 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003092
Gilles Peskine449bd832023-01-11 14:50:10 +01003093 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3094 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3095 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003096 }
3097
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3099 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3100 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003101 }
3102
Neil Armstrongd91526c2022-04-12 14:38:52 +02003103#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003104 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003105 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003106 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003107 size_t data_len = (size_t) (*p++);
3108 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003109 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3110 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3111
Gilles Peskine530c4232023-10-02 15:37:23 +02003112 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003113
3114 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003115 * We must have at least two bytes (1 for length, at least 1 for data)
3116 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003118 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3119 buf_len));
3120 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003121 }
3122
Gilles Peskine449bd832023-01-11 14:50:10 +01003123 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003124 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3125 " > %" MBEDTLS_PRINTF_SIZET,
3126 data_len, buf_len));
3127 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003128 }
3129
3130 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003131 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003132 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3133 " > %" MBEDTLS_PRINTF_SIZET,
3134 data_len,
3135 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003136 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3137 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003138 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3139 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003140
3141 /* Compute ECDH shared secret. */
3142 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003143 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3144 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003145 handshake->premaster, sizeof(handshake->premaster),
3146 &handshake->pmslen);
3147 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003148 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003149 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003150 if (handshake->xxdh_psa_privkey_is_external == 0) {
3151 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003152 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003153 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003154 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003155 }
3156
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003157 if (handshake->xxdh_psa_privkey_is_external == 0) {
3158 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003159
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003161 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003162 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3163 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003164 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003165 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003166 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003167 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003168#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003169 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003170#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003171 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3172 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3173 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3174 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003175 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003176
Gilles Peskine449bd832023-01-11 14:50:10 +01003177 if (p != end) {
3178 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3179 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003180 }
3181
Gilles Peskine449bd832023-01-11 14:50:10 +01003182 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003183#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003184#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003185 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003186 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3187 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003188 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003189
3190 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3191
Gilles Peskine449bd832023-01-11 14:50:10 +01003192 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3193 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003194 psa_destroy_key(handshake->xxdh_psa_privkey);
3195 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003196 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003197 }
3198
3199 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003200 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003201 psa_destroy_key(handshake->xxdh_psa_privkey);
3202 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003203 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003204 }
3205
Neil Armstrong039db292022-03-09 11:38:34 +01003206 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003207 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003208 psa_destroy_key(handshake->xxdh_psa_privkey);
3209 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003210 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003211 }
3212
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003213 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3214 the sizes of the FFDH keys which are at least 2048 bits.
3215 The size of the array is thus greater than 256 bytes which is greater than any
3216 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003217#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003218 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3219 psa_destroy_key(handshake->xxdh_psa_privkey);
3220 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003221 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003222 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003223#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003224 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3225 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003226#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003227
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003228 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3229 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003230 p += ecpoint_len;
3231
Neil Armstrong3bcef082022-03-23 18:16:54 +01003232 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003233 * - a uint16 containing the length (in octets) of the ECDH computation
3234 * - the octet string produced by the ECDH computation
3235 * - a uint16 containing the length (in octets) of the PSK
3236 * - the PSK itself
3237 */
Neil Armstrong039db292022-03-09 11:38:34 +01003238 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003239 const unsigned char * const psm_end =
3240 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003241 /* uint16 to store length (in octets) of the ECDH computation */
3242 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003243 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003244
3245 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003246 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003247 handshake->xxdh_psa_privkey,
3248 handshake->xxdh_psa_peerkey,
3249 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003250 psm + zlen_size,
3251 psm_end - (psm + zlen_size),
3252 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003253
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003254 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3255 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003256
Gilles Peskine449bd832023-01-11 14:50:10 +01003257 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003258 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003259 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003260 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 }
Neil Armstrong039db292022-03-09 11:38:34 +01003262
Neil Armstrong3bcef082022-03-23 18:16:54 +01003263 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003265 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003266
Gilles Peskine449bd832023-01-11 14:50:10 +01003267 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003268#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003269#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003270 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003272 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003273 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3274 psa_destroy_key(ssl->handshake->psa_pake_password);
3275 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003276
Gilles Peskine449bd832023-01-11 14:50:10 +01003277 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3278 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003279 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003280 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003281#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003282 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003283 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3284 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003285 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003286
Gilles Peskine449bd832023-01-11 14:50:10 +01003287 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3288 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3289 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003290 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003291
Gilles Peskinef670ba52025-03-07 15:09:32 +01003292 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003293
Gilles Peskine449bd832023-01-11 14:50:10 +01003294 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003295
Gilles Peskine449bd832023-01-11 14:50:10 +01003296 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003297}
3298
Gilles Peskineeccd8882020-03-10 12:19:08 +01003299#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003300MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003301static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003302{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003303 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003304 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003305
Gilles Peskine449bd832023-01-11 14:50:10 +01003306 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003307
Gilles Peskine449bd832023-01-11 14:50:10 +01003308 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3309 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003310 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003311 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003312 }
3313
Gilles Peskine449bd832023-01-11 14:50:10 +01003314 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3315 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003316}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003317#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003318MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003319static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003320{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003321 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003322 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003323 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003324 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003325 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003326 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003327 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003328 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003329 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003330 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003331
Gilles Peskine449bd832023-01-11 14:50:10 +01003332 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003333
Gilles Peskine449bd832023-01-11 14:50:10 +01003334 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3335 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003336 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003337 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003338 }
3339
Hanno Becker2a831a42019-02-07 13:17:25 +00003340#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003341 if (ssl->session_negotiate->peer_cert == NULL) {
3342 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003343 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003345 }
3346#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003347 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3348 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003349 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003350 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003351 }
3352#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3353
Simon Butcher99000142016-10-13 17:21:01 +01003354 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3356 if (0 != ret) {
3357 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3358 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003359 }
3360
Gilles Peskinef670ba52025-03-07 15:09:32 +01003361 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003362
Simon Butcher99000142016-10-13 17:21:01 +01003363 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003364 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3365 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3366 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3367 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003368 }
3369
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003371
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003372#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3373 peer_pk = &ssl->handshake->peer_pubkey;
3374#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003375 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003376 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003377 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003378 }
3379 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3380#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3381
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003382 /*
3383 * struct {
3384 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3385 * opaque signature<0..2^16-1>;
3386 * } DigitallySigned;
3387 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003388 if (i + 2 > ssl->in_hslen) {
3389 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3390 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003391 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003392
Ronald Cron8457c122022-03-07 11:32:54 +01003393 /*
3394 * Hash
3395 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003396 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003397
Gilles Peskine449bd832023-01-11 14:50:10 +01003398 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3399 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3400 " for verify message"));
3401 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003402 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003403
Simon Butcher99000142016-10-13 17:21:01 +01003404#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003405 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003406 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003407 }
Simon Butcher99000142016-10-13 17:21:01 +01003408#endif
Paul Bakker926af752012-11-23 13:38:07 +01003409
Ronald Cron8457c122022-03-07 11:32:54 +01003410 /* Info from md_alg will be used instead */
3411 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003412
Ronald Cron8457c122022-03-07 11:32:54 +01003413 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003414
Ronald Cron8457c122022-03-07 11:32:54 +01003415 /*
3416 * Signature
3417 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003418 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3419 == MBEDTLS_PK_NONE) {
3420 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3421 " for verify message"));
3422 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003423 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003424
Ronald Cron8457c122022-03-07 11:32:54 +01003425 /*
3426 * Check the certificate's key type matches the signature alg
3427 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003428 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3429 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3430 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003431 }
3432
3433 i++;
3434
Gilles Peskine449bd832023-01-11 14:50:10 +01003435 if (i + 2 > ssl->in_hslen) {
3436 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3437 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003438 }
3439
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003440 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003441 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003442
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 if (i + sig_len != ssl->in_hslen) {
3444 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3445 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003446 }
3447
Simon Butcher99000142016-10-13 17:21:01 +01003448 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003449 {
3450 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003451 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3452 if (0 != ret) {
3453 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3454 return ret;
3455 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003456 }
Simon Butcher99000142016-10-13 17:21:01 +01003457
Gilles Peskine449bd832023-01-11 14:50:10 +01003458 if ((ret = mbedtls_pk_verify(peer_pk,
3459 md_alg, hash_start, hashlen,
3460 ssl->in_msg + i, sig_len)) != 0) {
3461 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3462 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003463 }
3464
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003465 ret = mbedtls_ssl_update_handshake_status(ssl);
3466 if (0 != ret) {
3467 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3468 return ret;
3469 }
Simon Butcher99000142016-10-13 17:21:01 +01003470
Gilles Peskine449bd832023-01-11 14:50:10 +01003471 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003472
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003474}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003475#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003477#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003478MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003479static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003480{
Janos Follath865b3eb2019-12-16 11:46:15 +00003481 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003482 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003483 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003484
Gilles Peskine449bd832023-01-11 14:50:10 +01003485 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003486
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003487 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3488 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003489
3490 /*
3491 * struct {
3492 * uint32 ticket_lifetime_hint;
3493 * opaque ticket<0..2^16-1>;
3494 * } NewSessionTicket;
3495 *
3496 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3497 * 8 . 9 ticket_len (n)
3498 * 10 . 9+n ticket content
3499 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003500
Ronald Cron3c0072b2023-11-22 10:00:14 +01003501#if defined(MBEDTLS_HAVE_TIME)
3502 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3503#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003504 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3505 ssl->session_negotiate,
3506 ssl->out_msg + 10,
3507 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3508 &tlen, &lifetime)) != 0) {
3509 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003510 tlen = 0;
3511 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003512
Gilles Peskine449bd832023-01-11 14:50:10 +01003513 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3514 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003515 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003516
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003517 /*
3518 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3519 * ChangeCipherSpec share the same state.
3520 */
3521 ssl->handshake->new_session_ticket = 0;
3522
Gilles Peskine449bd832023-01-11 14:50:10 +01003523 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3524 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3525 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003526 }
3527
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003529
Gilles Peskine449bd832023-01-11 14:50:10 +01003530 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003531}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003532#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003533
Paul Bakker5121ce52009-01-03 21:22:43 +00003534/*
Paul Bakker1961b702013-01-25 14:49:24 +01003535 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003536 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003537int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003538{
3539 int ret = 0;
3540
Gilles Peskine449bd832023-01-11 14:50:10 +01003541 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003542
Gilles Peskine449bd832023-01-11 14:50:10 +01003543 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003544 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskinef670ba52025-03-07 15:09:32 +01003545 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Paul Bakker5121ce52009-01-03 21:22:43 +00003546 break;
3547
Paul Bakker1961b702013-01-25 14:49:24 +01003548 /*
3549 * <== ClientHello
3550 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003551 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003552 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003553 break;
Paul Bakker1961b702013-01-25 14:49:24 +01003554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003555#if defined(MBEDTLS_SSL_PROTO_DTLS)
3556 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01003557 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02003558#endif
3559
Paul Bakker1961b702013-01-25 14:49:24 +01003560 /*
3561 * ==> ServerHello
3562 * Certificate
3563 * ( ServerKeyExchange )
3564 * ( CertificateRequest )
3565 * ServerHelloDone
3566 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003567 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003568 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003569 break;
3570
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003571 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003572 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003573 break;
3574
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003575 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003576 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003577 break;
3578
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003579 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01003580 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003581 break;
3582
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003583 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003584 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003585 break;
3586
3587 /*
3588 * <== ( Certificate/Alert )
3589 * ClientKeyExchange
3590 * ( CertificateVerify )
3591 * ChangeCipherSpec
3592 * Finished
3593 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003594 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003595 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003596 break;
3597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003598 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003599 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003600 break;
3601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003602 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003603 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003604 break;
3605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003606 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01003607 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003608 break;
3609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003610 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003611 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003612 break;
3613
3614 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003615 * ==> ( NewSessionTicket )
3616 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003617 * Finished
3618 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003619 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3620#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003621 if (ssl->handshake->new_session_ticket != 0) {
3622 ret = ssl_write_new_session_ticket(ssl);
3623 } else
Paul Bakkera503a632013-08-14 13:48:06 +02003624#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003625 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003626 break;
3627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003628 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003629 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003630 break;
3631
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003632 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003633 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003634 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
Paul Bakker1961b702013-01-25 14:49:24 +01003635 break;
3636
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003637 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003638 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003639 break;
3640
3641 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003642 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3643 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00003644 }
3645
Gilles Peskine449bd832023-01-11 14:50:10 +01003646 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003647}
TRodziewicz8476f2f2021-06-02 14:34:47 +02003648
Gilles Peskine449bd832023-01-11 14:50:10 +01003649void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02003650{
TRodziewicz3946f792021-06-14 12:11:18 +02003651 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02003652}
3653
Jerry Yufb4b6472022-01-27 15:03:26 +08003654#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */