blob: 96598cc427ad97560a20fe433c3f8cee85f4bed3 [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. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040025#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
26 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040027static int local_err_translation(psa_status_t status)
28{
29 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040030 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040031 psa_generic_status_to_mbedtls);
32}
33#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050034#endif
35
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_ECP_C)
Anton Matkinbc487252025-06-16 13:37:03 +020037#include "mbedtls/private/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010038#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010041#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010045int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
46 const unsigned char *info,
47 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020048{
Gilles Peskine449bd832023-01-11 14:50:10 +010049 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
50 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
51 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020052
Gilles Peskine449bd832023-01-11 14:50:10 +010053 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020054
Gilles Peskine449bd832023-01-11 14:50:10 +010055 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
56 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
57 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020058
Gilles Peskine449bd832023-01-11 14:50:10 +010059 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020060 ssl->cli_id_len = ilen;
61
Gilles Peskine449bd832023-01-11 14:50:10 +010062 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020064
Gilles Peskine449bd832023-01-11 14:50:10 +010065void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
66 mbedtls_ssl_cookie_write_t *f_cookie_write,
67 mbedtls_ssl_cookie_check_t *f_cookie_check,
68 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020069{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020070 conf->f_cookie_write = f_cookie_write;
71 conf->f_cookie_check = f_cookie_check;
72 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020073}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020075
Gilles Peskineeccd8882020-03-10 12:19:08 +010076#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020077MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010078static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010079{
Gilles Peskine449bd832023-01-11 14:50:10 +010080 if (conf->f_psk != NULL) {
81 return 1;
82 }
Hanno Becker845b9462018-10-26 12:07:29 +010083
Gilles Peskine449bd832023-01-11 14:50:10 +010084 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
85 return 0;
86 }
Hanno Becker845b9462018-10-26 12:07:29 +010087
Hanno Becker845b9462018-10-26 12:07:29 +010088
Gilles Peskine449bd832023-01-11 14:50:10 +010089 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
90 return 1;
91 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020092
Gilles Peskine449bd832023-01-11 14:50:10 +010093 if (conf->psk != NULL && conf->psk_len != 0) {
94 return 1;
95 }
Hanno Becker845b9462018-10-26 12:07:29 +010096
Gilles Peskine449bd832023-01-11 14:50:10 +010097 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +010098}
Gilles Peskineeccd8882020-03-10 12:19:08 +010099#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100100
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200101MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100102static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
103 const unsigned char *buf,
104 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000105{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100107 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100108 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100110 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
112 ssl->verify_data_len) != 0) {
113 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
114 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
115 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
116 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100117 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000120 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 if (len != 1 || buf[0] != 0x0) {
122 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
123 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
124 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
125 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000126 }
127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200128 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000129 }
Paul Bakker48916f92012-09-16 19:57:18 +0000130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000132}
133
Valerio Setti60d3b912023-07-25 10:43:53 +0200134#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200135 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100136 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800137/*
Jerry Yud491ea42022-01-13 16:15:25 +0800138 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
139 * curves (TLS 1.2) extension.
140 *
141 * The "extension_data" field of a supported groups extension contains a
142 * "NamedGroupList" value (TLS 1.3 RFC8446):
143 * enum {
144 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
145 * x25519(0x001D), x448(0x001E),
146 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
147 * ffdhe6144(0x0103), ffdhe8192(0x0104),
148 * ffdhe_private_use(0x01FC..0x01FF),
149 * ecdhe_private_use(0xFE00..0xFEFF),
150 * (0xFFFF)
151 * } NamedGroup;
152 * struct {
153 * NamedGroup named_group_list<2..2^16-1>;
154 * } NamedGroupList;
155 *
156 * The "extension_data" field of a supported elliptic curves extension contains
157 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
158 * enum {
159 * deprecated(1..22),
160 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
161 * x25519(29), x448(30),
162 * reserved (0xFE00..0xFEFF),
163 * deprecated(0xFF01..0xFF02),
164 * (0xFFFF)
165 * } NamedCurve;
166 * struct {
167 * NamedCurve named_curve_list<2..2^16-1>
168 * } NamedCurveList;
169 *
Jerry Yub925f212022-01-12 11:17:02 +0800170 * The TLS 1.3 supported groups extension was defined to be a compatible
171 * generalization of the TLS 1.2 supported elliptic curves extension. They both
172 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800173 *
Jerry Yub925f212022-01-12 11:17:02 +0800174 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200175MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100176static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
177 const unsigned char *buf,
178 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100179{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200180 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100181 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100182 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 if (len < 2) {
185 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
186 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
187 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
188 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200189 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000190 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 if (list_size + 2 != len ||
192 list_size % 2 != 0) {
193 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
194 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
195 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
196 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100197 }
198
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200199 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 if (ssl->handshake->curves_tls_id != NULL) {
201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
203 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
204 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200205 }
206
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100207 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200208 * and leave room for a final 0 */
209 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200213
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 if ((curves_tls_id = mbedtls_calloc(our_size,
215 sizeof(*curves_tls_id))) == NULL) {
216 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
217 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
218 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200219 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200220
Valerio Setti18c9fed2022-12-30 17:44:24 +0100221 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200222
Paul Bakker41c83d32013-03-20 14:39:14 +0100223 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 while (list_size > 0 && our_size > 1) {
225 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200226
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
228 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100229 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200230 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100231 }
232
233 list_size -= 2;
234 p += 2;
235 }
236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100238}
239
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200240MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100241static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
242 const unsigned char *buf,
243 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100244{
245 size_t list_size;
246 const unsigned char *p;
247
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 if (len == 0 || (size_t) (buf[0] + 1) != len) {
249 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
250 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
251 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
252 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100253 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200254 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100255
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200256 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 while (list_size > 0) {
258 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
259 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
261 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100262 }
263
264 list_size--;
265 p++;
266 }
267
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100269}
Valerio Setti60d3b912023-07-25 10:43:53 +0200270#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200271 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200272 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100273
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200274#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200275MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100276static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
277 const unsigned char *buf,
278 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200279{
Janos Follath865b3eb2019-12-16 11:46:15 +0000280 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200281
Manuel Pégourié-Gonnard58916762025-01-23 10:48:45 +0100282 if (ssl->handshake->psa_pake_ctx_is_ok != 1) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100283 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
284 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200285 }
286
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 if ((ret = mbedtls_psa_ecjpake_read_round(
288 &ssl->handshake->psa_pake_ctx, buf, len,
289 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
290 psa_destroy_key(ssl->handshake->psa_pake_password);
291 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200292
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100294 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 ssl,
296 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
297 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200298
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200300 }
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200301
302 /* Only mark the extension as OK when we're sure it is */
303 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200306}
307#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200310MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100311static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
312 const unsigned char *buf,
313 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200314{
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
316 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
317 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
318 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
319 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200320 }
321
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200322 ssl->session_negotiate->mfl_code = buf[0];
323
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200325}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200327
Hanno Beckera0e20d02019-05-15 14:03:01 +0100328#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200329MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100330static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
331 const unsigned char *buf,
332 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100333{
334 size_t peer_cid_len;
335
336 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
338 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
339 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
340 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
341 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100342 }
343
344 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100345 * struct {
346 * opaque cid<0..2^8-1>;
347 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100349
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 if (len < 1) {
351 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
352 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
353 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
354 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100355 }
356
357 peer_cid_len = *buf++;
358 len--;
359
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 if (len != peer_cid_len) {
361 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
362 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
363 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
364 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100365 }
366
367 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100369 /* Leave ssl->handshake->cid_in_use in its default
370 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
372 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100373 }
374
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
376 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
377 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
378 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
379 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100380 }
381
Hanno Becker08556bf2019-05-03 12:43:44 +0100382 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100383 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100385
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
387 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100388
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100390}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100391#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200394MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100395static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
396 const unsigned char *buf,
397 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100398{
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 if (len != 0) {
400 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
401 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
402 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
403 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100404 }
405
406 ((void) buf);
407
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100410 }
411
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100413}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100418static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
419 const unsigned char *buf,
420 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200421{
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 if (len != 0) {
423 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
424 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
425 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
426 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200427 }
428
429 ((void) buf);
430
Gilles Peskine449bd832023-01-11 14:50:10 +0100431 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200433 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200434
Gilles Peskine449bd832023-01-11 14:50:10 +0100435 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200436}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200440MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100441static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
442 unsigned char *buf,
443 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200444{
Janos Follath865b3eb2019-12-16 11:46:15 +0000445 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200446 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 if (ssl->conf->f_ticket_parse == NULL ||
451 ssl->conf->f_ticket_write == NULL) {
452 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200453 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200454
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200455 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200456 ssl->handshake->new_session_ticket = 1;
457
Gilles Peskine449bd832023-01-11 14:50:10 +0100458 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (len == 0) {
461 return 0;
462 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100465 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
466 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
467 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200468 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200470
471 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200472 * Failures are ok: just ignore the ticket and proceed.
473 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
475 buf, len)) != 0) {
476 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
479 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
480 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
481 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
482 } else {
483 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
484 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200487 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200488
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200489 /*
490 * Keep the session ID sent by the client, since we MUST send it back to
491 * inform them we're accepting the ticket (RFC 5077 section 3.4)
492 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200493 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 mbedtls_ssl_session_free(ssl->session_negotiate);
497 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200498
499 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200501
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200503
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200504 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200505
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200506 /* Don't send a new ticket after all, this one is OK */
507 ssl->handshake->new_session_ticket = 0;
508
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200510}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200512
Johan Pascalb62bb512015-12-03 21:56:45 +0100513#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200514MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100515static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
516 const unsigned char *buf,
517 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100518{
Johan Pascal43f94902020-09-22 12:25:52 +0200519 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100520 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200521 size_t profile_length;
522 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200523 /*! 2 bytes for profile length and 1 byte for mki len */
524 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100525
526 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
528 (ssl->conf->dtls_srtp_profile_list == NULL) ||
529 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
530 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200531 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100532
533 /* RFC5764 section 4.1.1
534 * uint8 SRTPProtectionProfile[2];
535 *
536 * struct {
537 * SRTPProtectionProfiles SRTPProtectionProfiles;
538 * opaque srtp_mki<0..255>;
539 * } UseSRTPData;
540
541 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100542 */
543
Ron Eldoref72faf2018-07-12 11:54:20 +0300544 /*
545 * Min length is 5: at least one protection profile(2 bytes)
546 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200547 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200548 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300549 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 if (len < size_of_lengths) {
551 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
552 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
553 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200554 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100555
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200557
Ron Eldoref72faf2018-07-12 11:54:20 +0300558 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200560 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200561
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200562 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100563 if (profile_length > len - size_of_lengths ||
564 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
565 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
566 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
567 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200568 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300569 /*
570 * parse the extension list values are defined in
571 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
572 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100573 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200574 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100575 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100576
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
578 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
579 mbedtls_ssl_get_srtp_profile_as_string(
580 client_protection)));
581 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200582 continue;
583 }
Ron Eldor591f1622018-01-22 12:30:04 +0200584 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
586 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200587 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
589 mbedtls_ssl_get_srtp_profile_as_string(
590 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200591 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100592 }
593 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200595 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 }
Ron Eldor591f1622018-01-22 12:30:04 +0200597 }
Johan Pascal042d4562020-08-25 12:14:02 +0200598 buf += profile_length; /* buf points to the mki length */
599 mki_length = *buf;
600 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
603 mki_length + profile_length + size_of_lengths != len) {
604 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
605 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
606 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200607 }
608
609 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100610 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
611 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200612 ssl->dtls_srtp_info.mki_len = mki_length;
613
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
617 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100618 }
619
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100621}
622#endif /* MBEDTLS_SSL_DTLS_SRTP */
623
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100624/*
625 * Auxiliary functions for ServerHello parsing and related actions
626 */
627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100629/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100630 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100631 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200632#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200633MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100634static int ssl_check_key_curve(mbedtls_pk_context *pk,
635 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100636{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100637 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100638 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100639 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100640
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 while (*curr_tls_id != 0) {
642 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
643 if (curr_grp_id == grp_id) {
644 return 0;
645 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100646 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100647 }
648
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100650}
Valerio Settie9646ec2023-08-02 20:02:28 +0200651#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100652
653/*
654 * Try picking a certificate for this ciphersuite,
655 * return 0 on success and -1 on failure.
656 */
Gabor Mezei58535da2025-03-03 15:43:50 +0100657#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200658MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100659static int ssl_pick_cert(mbedtls_ssl_context *ssl,
660 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100661{
Glenn Strauss041a3762022-03-15 06:08:29 -0400662 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200663 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100664 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200665 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100666 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200667 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100670 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100671 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100673#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100674 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100675
David Horstmann3a334c22022-10-25 10:53:44 +0100676 int pk_alg_is_none = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 if (pk_alg_is_none) {
679 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200680 }
681
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
683
684 if (list == NULL) {
685 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
686 return -1;
687 }
688
689 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400690 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
692 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000693
David Horstmann3a334c22022-10-25 10:53:44 +0100694 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200695#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100697 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
698 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200699#else
David Horstmann3a334c22022-10-25 10:53:44 +0100700 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100701 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200702#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (!key_type_matches) {
704 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100705 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000706 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100707
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200708 /*
709 * This avoids sending the client a cert it'll reject based on
710 * keyUsage or other extensions.
711 *
712 * It also allows the user to provision different certificates for
713 * different uses based on keyUsage, eg if they want to avoid signing
714 * and decrypting with the same RSA key.
715 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200717 MBEDTLS_SSL_IS_CLIENT,
718 MBEDTLS_SSL_VERSION_TLS1_2,
719 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
721 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200722 continue;
723 }
724
Valerio Settie9646ec2023-08-02 20:02:28 +0200725#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100726 if (pk_alg == MBEDTLS_PK_ECDSA &&
727 ssl_check_key_curve(&cur->cert->pk,
728 ssl->handshake->curves_tls_id) != 0) {
729 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100730 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000731 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100732#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100733
734 /* If we get there, we got a winner */
735 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100736 }
737
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200738 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100740 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
742 ssl->handshake->key_cert->cert);
743 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100744 }
745
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747}
Gabor Mezei58535da2025-03-03 15:43:50 +0100748#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200750#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100751
752/*
753 * Check if a given ciphersuite is suitable for use with our config/keys/etc
754 * Sets ciphersuite_info only if the suite matches.
755 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200756MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100757static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
758 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100759{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100761
Jerry Yue7541932022-01-28 10:21:24 +0800762#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100763 mbedtls_pk_type_t sig_type;
764#endif
765
Gilles Peskine449bd832023-01-11 14:50:10 +0100766 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
767 if (suite_info == NULL) {
768 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
769 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100770 }
771
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
773 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000774
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 if (suite_info->min_tls_version > ssl->tls_version ||
776 suite_info->max_tls_version < ssl->tls_version) {
777 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
778 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000779 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100780
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200781#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
783 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
784 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
785 "not configured or ext missing"));
786 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200787 }
788#endif
789
790
Valerio Setti60d3b912023-07-25 10:43:53 +0200791#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200792 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
794 (ssl->handshake->curves_tls_id == NULL ||
795 ssl->handshake->curves_tls_id[0] == 0)) {
796 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
797 "no common elliptic curve"));
798 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000799 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100800#endif
801
Gilles Peskineeccd8882020-03-10 12:19:08 +0100802#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100803 /* If the ciphersuite requires a pre-shared key and we don't
804 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100805 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
806 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
807 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
808 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000809 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810#endif
811
Gabor Mezei58535da2025-03-03 15:43:50 +0100812#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
813
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100815 /*
816 * Final check: if ciphersuite requires us to have a
817 * certificate/key of a particular type:
818 * - select the appropriate certificate if we have one, or
819 * - try the next ciphersuite if we don't
820 * This must be done last since we modify the key_cert list.
821 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 if (ssl_pick_cert(ssl, suite_info) != 0) {
823 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
824 "no suitable certificate"));
825 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000826 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100827#endif
828
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200829 /* If the ciphersuite requires signing, check whether
830 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
832 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200833 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100834 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
835 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
836 "for signature algorithm %u", (unsigned) sig_type));
837 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200838 }
839
840#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
841
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100842 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100844}
845
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200846/* This function doesn't alert on errors that happen early during
847 ClientHello parsing because they might indicate that the client is
848 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200849MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100850static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000851{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100852 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200853 size_t i, j;
854 size_t ciph_offset, comp_offset, ext_offset;
855 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200857 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100858#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000859 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000861 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100862#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000863 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200864 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000866
Hanno Becker7e5437a2017-04-28 17:15:26 +0100867 /* If there is no signature-algorithm extension present,
868 * we need to fall back to the default values for allowed
869 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800870#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100871 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800872#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100873
Gilles Peskine449bd832023-01-11 14:50:10 +0100874 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000875
David Horstmanne0af39a2022-10-06 18:19:18 +0100876 int renegotiating;
877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200879read_record_header:
880#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100881 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200882 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100883 * otherwise read it ourselves manually in order to support SSLv2
884 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100885 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
886 * ClientHello has been already fully fetched by the TLS 1.3 code and the
887 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100888 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100889 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100892#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100893 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200895 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
897 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000898 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000899 }
900
901 buf = ssl->in_hdr;
902
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000904
Paul Bakkerec636f32012-09-09 19:17:02 +0000905 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100906 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000907 *
908 * Record layer:
909 * 0 . 0 message type
910 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200911 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000912 * 3 . 4 message length
913 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
915 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100916
Gilles Peskine449bd832023-01-11 14:50:10 +0100917 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
918 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
919 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100920 }
921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000923 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100924
Gilles Peskine449bd832023-01-11 14:50:10 +0100925 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
926 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100927
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200928 /* For DTLS if this is the initial handshake, remember the client sequence
929 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932#if defined(MBEDTLS_SSL_RENEGOTIATION)
933 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000934#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200936 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
938 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
939 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200940 }
941
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
943 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
947 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200948 ssl->next_record_offset = 0;
949 ssl->in_left = 0;
950 goto read_record_header;
951 }
952
953 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200955#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200956 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200958
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000959 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000960
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200963 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000964 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100966#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000967 {
Ronald Cron6291b232023-03-08 15:51:25 +0100968 if (ssl->keep_current_message) {
969 ssl->keep_current_message = 0;
970 } else {
971 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
972 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
973 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
974 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000975
Ronald Cron6291b232023-03-08 15:51:25 +0100976 if ((ret = mbedtls_ssl_fetch_input(ssl,
977 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
978 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
979 return ret;
980 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200981
Ronald Cron6291b232023-03-08 15:51:25 +0100982 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100984 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
985 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
986 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200987#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100988 ssl->in_left = 0;
989 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100990 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000991
992 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000993
Gilles Peskine449bd832023-01-11 14:50:10 +0100994 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +0100995
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +0100996 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
997 if (0 != ret) {
998 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
999 return ret;
1000 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001001
1002 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001003 * Handshake layer:
1004 * 0 . 0 handshake type
1005 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001006 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001007 * 6 . 8 DTLS only: fragment offset
1008 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001009 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1011 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1012 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001013 }
1014
Gilles Peskine449bd832023-01-11 14:50:10 +01001015 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001016
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1018 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1019 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001020 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001024 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001025 * Copy the client's handshake message_seq on initial handshakes,
1026 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001027 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001030 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001031 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1033 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1034 "%u (expected %u)", cli_msg_seq,
1035 ssl->handshake->in_msg_seq));
1036 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001037 }
1038
1039 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001040 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001041#endif
1042 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001043 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001044 ssl->handshake->out_msg_seq = cli_msg_seq;
1045 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1046 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001047 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001048 /*
1049 * For now we don't support fragmentation, so make sure
1050 * fragment_offset == 0 and fragment_length == length
1051 */
1052 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1054 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1055 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001056 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 4, ("fragment_offset=%u fragment_length=%u length=%u",
1058 (unsigned) fragment_offset, (unsigned) fragment_length,
1059 (unsigned) length));
1060 if (fragment_offset != 0 || length != fragment_length) {
1061 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1062 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001063 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001064 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001065 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001067
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 buf += mbedtls_ssl_hs_hdr_len(ssl);
1069 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001070
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001071 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001072 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001073 * 0 . 1 protocol version
1074 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001075 * 34 . 34 session id length (1 byte)
1076 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001077 * 35+x . 35+x DTLS only: cookie length (1 byte)
1078 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001079 * .. . .. ciphersuite list length (2 bytes)
1080 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001081 * .. . .. compression alg. list length (1 byte)
1082 * .. . .. compression alg. list
1083 * .. . .. extensions length (2 bytes, optional)
1084 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001085 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001086
1087 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001088 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001089 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1090 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001091 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 if (msg_len < 38) {
1093 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1094 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001095 }
1096
1097 /*
1098 * Check and save the protocol version
1099 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001101
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001102 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1103 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001104 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001105 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1108 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1109 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1110 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1111 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001112 }
1113
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001114 /*
1115 * Save client random (inc. Unix time)
1116 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001117 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001118
Gilles Peskine449bd832023-01-11 14:50:10 +01001119 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001120
1121 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001122 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001123 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001124 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1127 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1128 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1129 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1130 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1131 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001132 }
1133
Gilles Peskine449bd832023-01-11 14:50:10 +01001134 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001135
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001136 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 memset(ssl->session_negotiate->id, 0,
1138 sizeof(ssl->session_negotiate->id));
1139 memcpy(ssl->session_negotiate->id, buf + 35,
1140 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001141
1142 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001143 * Check the cookie length and content
1144 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001145#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001147 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001148 cookie_len = buf[cookie_offset];
1149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1151 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1152 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1153 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1154 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001155 }
1156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1158 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001159
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001160#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001162#if defined(MBEDTLS_SSL_RENEGOTIATION)
1163 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001164#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 ) {
1166 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1167 buf + cookie_offset + 1, cookie_len,
1168 ssl->cli_id, ssl->cli_id_len) != 0) {
1169 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001170 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001171 } else {
1172 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001173 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001174 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001176#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001177 {
1178 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001179 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001180 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1182 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001183 }
1184
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001186 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 /*
1189 * Check the ciphersuitelist length (will be parsed later)
1190 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001191 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001195
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001196 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001197
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001199 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 (ciph_len % 2) != 0) {
1201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1203 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001205 }
1206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1208 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001209
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001210 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001211 * Check the compression algorithm's length.
1212 * The list contents are ignored because implementing
1213 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1214 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001215 */
1216 comp_offset = ciph_offset + 2 + ciph_len;
1217
1218 comp_len = buf[comp_offset];
1219
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001221 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 comp_len + comp_offset + 1 > msg_len) {
1223 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1224 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1225 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1226 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001227 }
1228
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1230 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001231
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 /*
1233 * Check the extension length
1234 */
1235 ext_offset = comp_offset + 1 + comp_len;
1236 if (msg_len > ext_offset) {
1237 if (msg_len < ext_offset + 2) {
1238 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1239 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1240 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1241 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001242 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001243
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001244 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001245
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 if (msg_len != ext_offset + 2 + ext_len) {
1247 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1248 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1249 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1250 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1251 }
1252 } else {
1253 ext_len = 0;
1254 }
Paul Bakker48916f92012-09-16 19:57:18 +00001255
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 ext = buf + ext_offset + 2;
1257 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1258
1259 while (ext_len != 0) {
1260 unsigned int ext_id;
1261 unsigned int ext_size;
1262 if (ext_len < 4) {
1263 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1264 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1265 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1266 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1267 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001268 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1269 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001270
1271 if (ext_size + 4 > ext_len) {
1272 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1273 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1274 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1275 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1276 }
1277 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001279 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1281 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1282 ext + 4 + ext_size);
1283 if (ret != 0) {
1284 return ret;
1285 }
Simon Butcher584a5472016-05-23 16:24:52 +01001286 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001287#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001288
Simon Butcher584a5472016-05-23 16:24:52 +01001289 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001291#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001292 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001293#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1296 if (ret != 0) {
1297 return ret;
1298 }
Simon Butcher584a5472016-05-23 16:24:52 +01001299 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001300
Jerry Yue7541932022-01-28 10:21:24 +08001301#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001302 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001304
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1306 if (ret != 0) {
1307 return ret;
1308 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001309
1310 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001311 break;
Jerry Yue7541932022-01-28 10:21:24 +08001312#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001313
Valerio Setti60d3b912023-07-25 10:43:53 +02001314#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001315 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001316 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001317 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001319
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1321 if (ret != 0) {
1322 return ret;
1323 }
Simon Butcher584a5472016-05-23 16:24:52 +01001324 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001325
Simon Butcher584a5472016-05-23 16:24:52 +01001326 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001328 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001329
Gilles Peskine449bd832023-01-11 14:50:10 +01001330 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1331 if (ret != 0) {
1332 return ret;
1333 }
Simon Butcher584a5472016-05-23 16:24:52 +01001334 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001335#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001336 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001337 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001338
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001339#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001340 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001342
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1344 if (ret != 0) {
1345 return ret;
1346 }
Simon Butcher584a5472016-05-23 16:24:52 +01001347 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001348#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001351 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001353
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1355 if (ret != 0) {
1356 return ret;
1357 }
Simon Butcher584a5472016-05-23 16:24:52 +01001358 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001360
Hanno Beckera0e20d02019-05-15 14:03:01 +01001361#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001362 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1366 if (ret != 0) {
1367 return ret;
1368 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001369 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001370#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001373 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001374 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001375
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1377 if (ret != 0) {
1378 return ret;
1379 }
Simon Butcher584a5472016-05-23 16:24:52 +01001380 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001381#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001383#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001384 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1388 if (ret != 0) {
1389 return ret;
1390 }
Simon Butcher584a5472016-05-23 16:24:52 +01001391 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001392#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001394#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001395 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001397
Gilles Peskine449bd832023-01-11 14:50:10 +01001398 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1399 if (ret != 0) {
1400 return ret;
1401 }
Simon Butcher584a5472016-05-23 16:24:52 +01001402 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001403#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001405#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001406 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1410 ext + 4 + ext_size);
1411 if (ret != 0) {
1412 return ret;
1413 }
Simon Butcher584a5472016-05-23 16:24:52 +01001414 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001416
Johan Pascalb62bb512015-12-03 21:56:45 +01001417#if defined(MBEDTLS_SSL_DTLS_SRTP)
1418 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001420
Gilles Peskine449bd832023-01-11 14:50:10 +01001421 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1422 if (ret != 0) {
1423 return ret;
1424 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001425 break;
1426#endif /* MBEDTLS_SSL_DTLS_SRTP */
1427
Simon Butcher584a5472016-05-23 16:24:52 +01001428 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1430 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001431 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001432
Gilles Peskine449bd832023-01-11 14:50:10 +01001433 ext_len -= 4 + ext_size;
1434 ext += 4 + ext_size;
1435 }
1436
Jerry Yue7541932022-01-28 10:21:24 +08001437#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001438
1439 /*
1440 * Try to fall back to default hash SHA1 if the client
1441 * hasn't provided any preferred signature-hash combinations.
1442 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001444 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1445 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001446#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1448 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001449#endif
1450#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1452 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001453#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001454 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001455 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001456
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001457 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1458 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1459 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001460
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001462 }
1463
Jerry Yue7541932022-01-28 10:21:24 +08001464#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001465
Paul Bakker48916f92012-09-16 19:57:18 +00001466 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001467 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1468 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1470 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1471 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001472#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001473 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1474 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1475 "during renegotiation"));
1476 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1477 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1478 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001479 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001480#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001482 break;
1483 }
1484 }
1485
1486 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001487 * Renegotiation security checks
1488 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1490 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1491 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001492 handshake_failure = 1;
1493 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001497 renegotiation_info_seen == 0) {
1498 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001499 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001500 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1501 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1502 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1503 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001504 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1506 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1507 renegotiation_info_seen == 1) {
1508 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001509 handshake_failure = 1;
1510 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001511#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001512
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 if (handshake_failure == 1) {
1514 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1515 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1516 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001517 }
Paul Bakker380da532012-04-18 16:10:25 +00001518
Paul Bakker41c83d32013-03-20 14:39:14 +01001519 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001520 * Server certification selection (after processing TLS extensions)
1521 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001522 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1523 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1524 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001525 }
Glenn Strauss69894072022-01-24 12:58:00 -05001526#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1527 ssl->handshake->sni_name = NULL;
1528 ssl->handshake->sni_name_len = 0;
1529#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001530
1531 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001532 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001533 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001534 * and certificate from the SNI callback triggered by the SNI extension
1535 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001536 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001537 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001538 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001539 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001540
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1542 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1543 for (i = 0; ciphersuites[i] != 0; i++) {
1544 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001545 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001547
TRodziewicz8476f2f2021-06-02 14:34:47 +02001548 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001549
Gilles Peskine449bd832023-01-11 14:50:10 +01001550 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1551 &ciphersuite_info)) != 0) {
1552 return ret;
1553 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001554
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001556 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001557 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001558 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001559 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001560 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 for (i = 0; ciphersuites[i] != 0; i++) {
1562 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1563 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001564 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001566
1567 got_common_suite = 1;
1568
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1570 &ciphersuite_info)) != 0) {
1571 return ret;
1572 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001573
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001575 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001576 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001577 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001578 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001579 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001580
Gilles Peskine449bd832023-01-11 14:50:10 +01001581 if (got_common_suite) {
1582 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1583 "but none of them usable"));
1584 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1585 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1586 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1587 } else {
1588 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1589 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1590 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1591 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001592 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001593
1594have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001595 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001596
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001597 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001598 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001599
Gilles Peskinef670ba52025-03-07 15:09:32 +01001600 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00001601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1604 mbedtls_ssl_recv_flight_completed(ssl);
1605 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001606#endif
1607
Hanno Becker7e5437a2017-04-28 17:15:26 +01001608 /* Debugging-only output for testsuite */
1609#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001610 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1612 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001613 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001614 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1615 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1616 sig_hash));
1617 } else {
1618 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1619 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001620 }
1621#endif
1622
Gilles Peskine449bd832023-01-11 14:50:10 +01001623 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001624
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001626}
1627
Hanno Beckera0e20d02019-05-15 14:03:01 +01001628#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001629static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1630 unsigned char *buf,
1631 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001632{
1633 unsigned char *p = buf;
1634 size_t ext_len;
1635 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1636
1637 *olen = 0;
1638
1639 /* Skip writing the extension if we don't want to use it or if
1640 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001642 return;
1643 }
1644
Gilles Peskine449bd832023-01-11 14:50:10 +01001645 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1646 * which is at most 255, so the increment cannot overflow. */
1647 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1648 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1649 return;
1650 }
1651
1652 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001653
1654 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001655 * struct {
1656 * opaque cid<0..2^8-1>;
1657 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001658 */
1659 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001660 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001661 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001662 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001663 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001664
1665 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001666 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001667
1668 *olen = ssl->own_cid_len + 5;
1669}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001670#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001671
Neil Armstrong76b74072022-04-06 13:43:54 +02001672#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001673static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1674 unsigned char *buf,
1675 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001676{
1677 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001679
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001680 /*
1681 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1682 * from a client and then selects a stream or Authenticated Encryption
1683 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1684 * encrypt-then-MAC response extension back to the client."
1685 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001686 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001687 ssl->session_negotiate->ciphersuite);
1688 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001689 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001691 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001692 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001693 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001694 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001695
Gilles Peskine449bd832023-01-11 14:50:10 +01001696 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001697 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001698 }
Ronald Cron862902d2022-03-24 14:15:28 +01001699 }
1700
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001702 *olen = 0;
1703 return;
1704 }
1705
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001707
Gilles Peskine449bd832023-01-11 14:50:10 +01001708 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001709 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001710
1711 *p++ = 0x00;
1712 *p++ = 0x00;
1713
1714 *olen = 4;
1715}
Neil Armstrong76b74072022-04-06 13:43:54 +02001716#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001717
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001718#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001719static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1720 unsigned char *buf,
1721 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001722{
1723 unsigned char *p = buf;
1724
Gilles Peskine449bd832023-01-11 14:50:10 +01001725 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001726 *olen = 0;
1727 return;
1728 }
1729
Gilles Peskine449bd832023-01-11 14:50:10 +01001730 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1731 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001732
Gilles Peskine449bd832023-01-11 14:50:10 +01001733 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001734 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001735
1736 *p++ = 0x00;
1737 *p++ = 0x00;
1738
1739 *olen = 4;
1740}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001741#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001742
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001743#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001744static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1745 unsigned char *buf,
1746 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001747{
1748 unsigned char *p = buf;
1749
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001751 *olen = 0;
1752 return;
1753 }
1754
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001756
Gilles Peskine449bd832023-01-11 14:50:10 +01001757 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001758 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001759
1760 *p++ = 0x00;
1761 *p++ = 0x00;
1762
1763 *olen = 4;
1764}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001765#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001766
Gilles Peskine449bd832023-01-11 14:50:10 +01001767static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1768 unsigned char *buf,
1769 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001770{
1771 unsigned char *p = buf;
1772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001774 *olen = 0;
1775 return;
1776 }
1777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001779
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001781 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001782
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001783#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001784 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001785 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001787 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001788
Gilles Peskine449bd832023-01-11 14:50:10 +01001789 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001790 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001792 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001794#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001795 {
1796 *p++ = 0x00;
1797 *p++ = 0x01;
1798 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001799 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001800
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001801 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001802}
1803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001805static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1806 unsigned char *buf,
1807 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001808{
1809 unsigned char *p = buf;
1810
Gilles Peskine449bd832023-01-11 14:50:10 +01001811 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001812 *olen = 0;
1813 return;
1814 }
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001817
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001819 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001820
1821 *p++ = 0x00;
1822 *p++ = 1;
1823
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001824 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001825
1826 *olen = 5;
1827}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001828#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001829
Valerio Setti7aeec542023-07-05 18:57:21 +02001830#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001831 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001832 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001833static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1834 unsigned char *buf,
1835 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001836{
1837 unsigned char *p = buf;
1838 ((void) ssl);
1839
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 if ((ssl->handshake->cli_exts &
1841 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001842 *olen = 0;
1843 return;
1844 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001845
Gilles Peskine449bd832023-01-11 14:50:10 +01001846 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001847
Gilles Peskine449bd832023-01-11 14:50:10 +01001848 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001849 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001850
1851 *p++ = 0x00;
1852 *p++ = 2;
1853
1854 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001855 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001856
1857 *olen = 6;
1858}
Valerio Setti45d56f32023-07-13 17:23:20 +02001859#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001860 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001861 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001862
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001863#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001864static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1865 unsigned char *buf,
1866 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001867{
Janos Follath865b3eb2019-12-16 11:46:15 +00001868 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001869 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001870 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001871 size_t kkpp_len;
1872
1873 *olen = 0;
1874
1875 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 if (ssl->handshake->ciphersuite_info->key_exchange !=
1877 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001878 return;
1879 }
1880
Gilles Peskine449bd832023-01-11 14:50:10 +01001881 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1882
1883 if (end - p < 4) {
1884 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1885 return;
1886 }
1887
1888 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001889 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001890
Gilles Peskine449bd832023-01-11 14:50:10 +01001891 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001892 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001893 MBEDTLS_ECJPAKE_ROUND_ONE);
1894 if (ret != 0) {
1895 psa_destroy_key(ssl->handshake->psa_pake_password);
1896 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1897 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001898 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001899 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001900
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001902 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001903
1904 *olen = kkpp_len + 4;
1905}
1906#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1907
Gilles Peskine449bd832023-01-11 14:50:10 +01001908#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1909static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1910 unsigned char *buf,
1911 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001912{
Ron Eldor75870ec2018-12-06 17:31:55 +02001913 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001914 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001915 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1916
1917 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001918
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1920 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001921 return;
1922 }
1923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001925
Gilles Peskine449bd832023-01-11 14:50:10 +01001926 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001927 mki_len = ssl->dtls_srtp_info.mki_len;
1928 }
1929
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001930 /* The extension total size is 9 bytes :
1931 * - 2 bytes for the extension tag
1932 * - 2 bytes for the total size
1933 * - 2 bytes for the protection profile length
1934 * - 2 bytes for the protection profile
1935 * - 1 byte for the mki length
1936 * + the actual mki length
1937 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001938 if ((size_t) (end - buf) < mki_len + 9) {
1939 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001940 return;
1941 }
1942
Johan Pascalb62bb512015-12-03 21:56:45 +01001943 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001944 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001945 /*
1946 * total length 5 and mki value: only one profile(2 bytes)
1947 * and length(2 bytes) and srtp_mki )
1948 */
Ron Eldor591f1622018-01-22 12:30:04 +02001949 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001951
1952 /* protection profile length: 2 */
1953 buf[4] = 0x00;
1954 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001955 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001956 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1957 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1958 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1959 } else {
1960 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001961 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001962 }
1963
Ron Eldor591f1622018-01-22 12:30:04 +02001964 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001965 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001966
Ron Eldor591f1622018-01-22 12:30:04 +02001967 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001968}
1969#endif /* MBEDTLS_SSL_DTLS_SRTP */
1970
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001971#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001972MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001973static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001974{
Janos Follath865b3eb2019-12-16 11:46:15 +00001975 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001976 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001977 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001978
Gilles Peskine449bd832023-01-11 14:50:10 +01001979 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001980
1981 /*
1982 * struct {
1983 * ProtocolVersion server_version;
1984 * opaque cookie<0..2^8-1>;
1985 * } HelloVerifyRequest;
1986 */
1987
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001988 /* The RFC is not clear on this point, but sending the actual negotiated
1989 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
1991 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001992 p += 2;
1993
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001994 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 if (ssl->conf->f_cookie_write == NULL) {
1996 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
1997 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001998 }
1999
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002000 /* Skip length byte until we know the length */
2001 cookie_len_byte = p++;
2002
Gilles Peskine449bd832023-01-11 14:50:10 +01002003 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2004 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2005 ssl->cli_id, ssl->cli_id_len)) != 0) {
2006 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2007 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002008 }
2009
Gilles Peskine449bd832023-01-11 14:50:10 +01002010 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002011
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002013
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002014 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002015 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2016 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002017
Gilles Peskinef670ba52025-03-07 15:09:32 +01002018 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002019
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2021 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2022 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002023 }
2024
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002025#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2027 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2028 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2029 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002030 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002031#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002032
Gilles Peskine449bd832023-01-11 14:50:10 +01002033 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002034
Gilles Peskine449bd832023-01-11 14:50:10 +01002035 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002036}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002037#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002038
Gilles Peskine449bd832023-01-11 14:50:10 +01002039static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002040{
2041 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002042 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002043 mbedtls_ssl_session * const session = ssl->session_negotiate;
2044
2045 /* Resume is 0 by default, see ssl_handshake_init().
2046 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002048 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 }
2050 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002051 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002052 }
2053 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002054 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002055 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002056#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002057 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002058 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002060#endif
2061
Gilles Peskine449bd832023-01-11 14:50:10 +01002062 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002063
Gilles Peskine449bd832023-01-11 14:50:10 +01002064 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2065 session->id,
2066 session->id_len,
2067 &session_tmp);
2068 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002069 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002070 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002071
Gilles Peskine449bd832023-01-11 14:50:10 +01002072 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002073 /* Mismatch between cached and negotiated session */
2074 goto exit;
2075 }
2076
2077 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002079 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002081
Gilles Peskine449bd832023-01-11 14:50:10 +01002082 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002083 ssl->handshake->resume = 1;
2084
2085exit:
2086
Gilles Peskine449bd832023-01-11 14:50:10 +01002087 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002088}
2089
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002090MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002091static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002092{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002093#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002094 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002095#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002096 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002097 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002098 unsigned char *buf, *p;
2099
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002102#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2104 ssl->handshake->cookie_verify_result != 0) {
2105 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2106 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002107
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002109 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002110#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002111
Paul Bakker5121ce52009-01-03 21:22:43 +00002112 /*
2113 * 0 . 0 handshake type
2114 * 1 . 3 handshake length
2115 * 4 . 5 protocol version
2116 * 6 . 9 UNIX time()
2117 * 10 . 37 random bytes
2118 */
2119 buf = ssl->out_msg;
2120 p = buf + 4;
2121
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002123 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002124
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2126 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002128#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 t = mbedtls_time(NULL);
2130 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002131 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002132
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2134 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002135#else
Ben Taylorfd529842025-03-10 08:27:42 +00002136 if ((ret = psa_generate_random(p, 4)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 return ret;
2138 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002139
2140 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002141#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002142
Ben Taylor602b2962025-03-07 15:52:50 +00002143 if ((ret = psa_generate_random(p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 return ret;
2145 }
Ronald Cronc5649382023-04-04 15:33:42 +02002146 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002147
Ronald Cronc5649382023-04-04 15:33:42 +02002148#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2149 /*
2150 * RFC 8446
2151 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2152 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2153 * response to a ClientHello MUST set the last 8 bytes of their Random
2154 * value specially in their ServerHello.
2155 */
2156 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2157 static const unsigned char magic_tls12_downgrade_string[] =
2158 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2159
2160 MBEDTLS_STATIC_ASSERT(
2161 sizeof(magic_tls12_downgrade_string) == 8,
2162 "magic_tls12_downgrade_string does not have the expected size");
2163
Ronald Cronfe01ec22023-04-06 09:56:53 +02002164 memcpy(p, magic_tls12_downgrade_string,
2165 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002166 } else
2167#endif
2168 {
Ben Taylor602b2962025-03-07 15:52:50 +00002169 if ((ret = psa_generate_random(p, 8)) != 0) {
Ronald Cronc5649382023-04-04 15:33:42 +02002170 return ret;
2171 }
2172 }
2173 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002174
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002178
Gilles Peskine449bd832023-01-11 14:50:10 +01002179 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002183 * New session, create a new session id,
2184 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002185 */
Gilles Peskinef670ba52025-03-07 15:09:32 +01002186 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002188#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002190#endif
2191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002192#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002194 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 memset(ssl->session_negotiate->id, 0, 32);
2196 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002197#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002198 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002199 ssl->session_negotiate->id_len = n = 32;
Ben Taylor602b2962025-03-07 15:52:50 +00002200 if ((ret = psa_generate_random(ssl->session_negotiate->id,
Ben Taylor1cd1e012025-03-18 11:50:39 +00002201 n)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 return ret;
2203 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002204 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002205 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002206 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002207 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002208 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002209 n = ssl->session_negotiate->id_len;
Gilles Peskinef670ba52025-03-07 15:09:32 +01002210 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC);
Paul Bakkerff60ee62010-03-16 21:09:09 +00002211
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2213 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2214 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002215 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002216 }
2217
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002218 /*
2219 * 38 . 38 session id length
2220 * 39 . 38+n session id
2221 * 39+n . 40+n chosen ciphersuite
2222 * 41+n . 41+n chosen compression alg.
2223 * 42+n . 43+n extensions length
2224 * 44+n . 43+n+m extensions
2225 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002226 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002228 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2231 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2232 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2233 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002236 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002237 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002238
Gilles Peskine449bd832023-01-11 14:50:10 +01002239 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2240 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2241 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2242 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002243
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002244 /*
2245 * First write extensions, then the total length
2246 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002248 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002250#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002251 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002252 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002253#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002254
Hanno Beckera0e20d02019-05-15 14:03:01 +01002255#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002257 ext_len += olen;
2258#endif
2259
Neil Armstrong76b74072022-04-06 13:43:54 +02002260#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002261 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002262 ext_len += olen;
2263#endif
2264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002265#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002267 ext_len += olen;
2268#endif
2269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002270#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002271 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002272 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002273#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002274
Valerio Setti7aeec542023-07-05 18:57:21 +02002275#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002276 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002277 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002278 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2280 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2281 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002282 ext_len += olen;
2283 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002284#endif
2285
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002286#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002287 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002288 ext_len += olen;
2289#endif
2290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002291#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002292 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002293 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2294 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002295 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002296 }
Paul Elliottf518f812022-07-11 12:36:20 +01002297
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002298 ext_len += olen;
2299#endif
2300
Johan Pascalb62bb512015-12-03 21:56:45 +01002301#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002302 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002303 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002304#endif
2305
Gilles Peskine449bd832023-01-11 14:50:10 +01002306 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2307 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002308
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 if (ext_len > 0) {
2310 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002311 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002312 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002313
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002314 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002315 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2316 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002317
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002319
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002321
Gilles Peskine449bd832023-01-11 14:50:10 +01002322 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002323}
2324
Gilles Peskineeccd8882020-03-10 12:19:08 +01002325#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002326MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002327static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002328{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002329 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002330 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002331
Gilles Peskine449bd832023-01-11 14:50:10 +01002332 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002333
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2335 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002336 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002338 }
2339
Gilles Peskine449bd832023-01-11 14:50:10 +01002340 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2341 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002342}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002343#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002344MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002345static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002346{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002348 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002349 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002350 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002351 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002352 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002353 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002354 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002355 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002356
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002358
Gilles Peskinef670ba52025-03-07 15:09:32 +01002359 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002360
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002361#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002363 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002365#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002367
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2369 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2370 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2371 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002372 }
2373
2374 /*
2375 * 0 . 0 handshake type
2376 * 1 . 3 handshake length
2377 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002378 * 5 .. m-1 cert types
2379 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002380 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002381 * n .. n+1 length of all DNs
2382 * n+2 .. n+3 length of DN 1
2383 * n+4 .. ... Distinguished Name #1
2384 * ... .. ... length of DN 2, etc.
2385 */
2386 buf = ssl->out_msg;
2387 p = buf + 4;
2388
2389 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002390 * Supported certificate types
2391 *
2392 * ClientCertificateType certificate_types<1..2^8-1>;
2393 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002395 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002397#if defined(MBEDTLS_RSA_C)
2398 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002399#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002400#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002401 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002402#endif
2403
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002404 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002405 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002406
Paul Bakker577e0062013-08-28 11:57:20 +02002407 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002408
Paul Bakker926af752012-11-23 13:38:07 +01002409 /*
2410 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002411 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002412 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2413 *
2414 * struct {
2415 * HashAlgorithm hash;
2416 * SignatureAlgorithm signature;
2417 * } SignatureAndHashAlgorithm;
2418 *
2419 * enum { (255) } HashAlgorithm;
2420 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002421 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002422 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2423 if (sig_alg == NULL) {
2424 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2425 }
Ronald Cron8457c122022-03-07 11:32:54 +01002426
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2428 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002429
Gilles Peskine449bd832023-01-11 14:50:10 +01002430 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002431 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002432 }
2433 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002434 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002435 }
Simon Butcher99000142016-10-13 17:21:01 +01002436
Paul Elliott96a0fd92022-11-08 17:09:56 +00002437 /* Write elements at offsets starting from 1 (offset 0 is for the
2438 * length). Thus the offset of each element is the length of the
2439 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002440 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002441 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002442
Paul Bakker926af752012-11-23 13:38:07 +01002443 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002444
Paul Elliott96a0fd92022-11-08 17:09:56 +00002445 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002446 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002447 sa_len += 2;
2448 p += sa_len;
2449
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002450 /*
2451 * DistinguishedName certificate_authorities<0..2^16-1>;
2452 * opaque DistinguishedName<1..2^16-1>;
2453 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002455
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002456 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002457
Gilles Peskine449bd832023-01-11 14:50:10 +01002458 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002459 /* NOTE: If trusted certificates are provisioned
2460 * via a CA callback (configured through
2461 * `mbedtls_ssl_conf_ca_cb()`, then the
2462 * CertificateRequest is currently left empty. */
2463
Glenn Strauss999ef702022-03-11 01:37:23 -05002464#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2465#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002466 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002467 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002468 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002469#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002470 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002471 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002472 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002473#endif
Janos Follath088ce432017-04-10 12:42:31 +01002474#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002476 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002477 } else
Janos Follath088ce432017-04-10 12:42:31 +01002478#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002479 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002480
Gilles Peskine449bd832023-01-11 14:50:10 +01002481 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002482 /* It follows from RFC 5280 A.1 that this length
2483 * can be represented in at most 11 bits. */
2484 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002485
Gilles Peskine449bd832023-01-11 14:50:10 +01002486 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2487 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002488 break;
2489 }
2490
Gilles Peskine449bd832023-01-11 14:50:10 +01002491 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002492 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002493 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002494 p += dn_size;
2495
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002497
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002498 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002499 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002500 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002501 }
2502
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002503 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002504 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2505 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002509
Gilles Peskine449bd832023-01-11 14:50:10 +01002510 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002511
Gilles Peskine449bd832023-01-11 14:50:10 +01002512 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002513}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002514#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002515
Gilles Peskineeccd8882020-03-10 12:19:08 +01002516#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002517 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002518MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002519static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2520 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002521{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002522 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2523 * signature length which will be added in ssl_write_server_key_exchange
2524 * after the call to ssl_prepare_server_key_exchange.
2525 * ssl_write_server_key_exchange also takes care of incrementing
2526 * ssl->out_msglen. */
2527 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2529 - sig_start);
2530 int ret = ssl->conf->f_async_resume(ssl,
2531 sig_start, signature_len, sig_max_len);
2532 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002533 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002535 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2537 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002538}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002539#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002540 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002541
Gilles Peskined3eb0612018-01-08 17:07:44 +01002542/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002543 * calculating the signature if any, but excluding formatting the
2544 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002545MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002546static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2547 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002548{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002549 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002550 ssl->handshake->ciphersuite_info;
2551
Gilles Peskineeccd8882020-03-10 12:19:08 +01002552#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002553#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002554 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002555#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002556#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002557
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002558 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002559#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002560 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002561#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002562
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002563#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002564#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002565 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002566#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002567 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002568#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002569#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002570
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002571 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002572
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002573 /*
2574 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002575 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002576 *
2577 */
2578
2579 /*
2580 * - ECJPAKE key exchanges
2581 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002582#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002583 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002584 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002585 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2586 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2587 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002588 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002589 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002590
Valerio Setti6f1b5742022-11-16 10:00:32 +01002591 /*
2592 * The first 3 bytes are:
2593 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2594 * [1, 2] elliptic curve's TLS ID
2595 *
2596 * However since we only support secp256r1 for now, we hardcode its
2597 * TLS ID here
2598 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002599 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 MBEDTLS_ECP_DP_SECP256R1);
2601 if (tls_id == 0) {
2602 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002603 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002604 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002605 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002606 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002607
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2609 out_p + output_offset,
2610 end_p - out_p - output_offset, &output_len,
2611 MBEDTLS_ECJPAKE_ROUND_TWO);
2612 if (ret != 0) {
2613 psa_destroy_key(ssl->handshake->psa_pake_password);
2614 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2615 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2616 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002617 }
2618
Valerio Setti02c25b52022-11-15 14:08:42 +01002619 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002620 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002621 }
2622#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2623
Hanno Becker1aa267c2017-04-28 17:08:27 +01002624 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002625 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002626 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2627 * we use empty support identity hints here.
2628 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002629#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2630 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002631 ssl->out_msg[ssl->out_msglen++] = 0x00;
2632 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002633 }
Valerio Setti48659a12025-01-15 14:22:28 +01002634#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002635
Hanno Becker7e5437a2017-04-28 17:15:26 +01002636 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002637 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002638 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002639#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002641 /*
2642 * Ephemeral ECDH parameters:
2643 *
2644 * struct {
2645 * ECParameters curve_params;
2646 * ECPoint public;
2647 * } ServerECDHParams;
2648 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002649 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002650 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002651 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002652 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002653
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002654 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002655 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2656 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2657 }
2658 for (; *group_list != 0; group_list++) {
2659 for (curr_tls_id = ssl->handshake->curves_tls_id;
2660 *curr_tls_id != 0; curr_tls_id++) {
2661 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002662 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 }
2664 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002665 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002666
Gilles Peskine449bd832023-01-11 14:50:10 +01002667curve_matching_done:
2668 if (*curr_tls_id == 0) {
2669 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2670 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2671 }
2672
2673 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2674 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002675
Neil Armstrongd91526c2022-04-12 14:38:52 +02002676 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2677 psa_key_attributes_t key_attributes;
2678 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002679 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2680 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2681 // data length(1)
2682 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002683 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002684 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002685
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002687
Valerio Setti40d9ca92023-01-04 16:08:04 +01002688 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002689 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002690 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002691 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2692 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2693 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002694 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002695 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002696 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002697
2698 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002699 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2700 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002701 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002702 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002703
2704 /*
2705 * ECParameters curve_params
2706 *
2707 * First byte is curve_type, always named_curve
2708 */
2709 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2710
2711 /*
2712 * Next two bytes are the namedcurve value
2713 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002715 p += 2;
2716
2717 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002718 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002719 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002720 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002721 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2723 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002724 }
2725
2726 /*
2727 * ECPoint public
2728 *
2729 * First byte is data length.
2730 * It will be filled later. p holds now the data length location.
2731 */
2732
2733 /* Export the public part of the ECDH private key from PSA.
2734 * Make one byte space for the length.
2735 */
2736 unsigned char *own_pubkey = p + data_length_size;
2737
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2739 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002740
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002741 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002742 own_pubkey, own_pubkey_max_len,
2743 &len);
2744 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002745 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002746 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002747 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2748 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002749 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002750 }
2751
2752 /* Store the length of the exported public key. */
2753 *p = (uint8_t) len;
2754
2755 /* Determine full message length. */
2756 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002757
Jerry Yuc5aef882021-12-23 20:15:02 +08002758#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002759 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002760#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002761
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002762 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002763 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002764#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002765
Hanno Becker1aa267c2017-04-28 17:08:27 +01002766 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002767 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002768 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002769 * exchange parameters, compute and add the signature here.
2770 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002771 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002772#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002773 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2774 if (dig_signed == NULL) {
2775 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2776 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002777 }
2778
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002779 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02002780 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002781 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02002782
Janos Follath865b3eb2019-12-16 11:46:15 +00002783 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002784
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002785 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002786 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002787 * For TLS 1.2, obey signature-hash-algorithm extension
2788 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002789 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002790
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002791 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01002792 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01002793
Dave Rodgmanc37ad442023-11-03 23:36:06 +00002794 unsigned char sig_hash =
2795 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002797
Gilles Peskine449bd832023-01-11 14:50:10 +01002798 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002799
Ronald Cron8457c122022-03-07 11:32:54 +01002800 /* For TLS 1.2, obey signature-hash-algorithm extension
2801 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
2803 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01002804 /* (... because we choose a cipher suite
2805 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01002806 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002807 }
2808
Gilles Peskine449bd832023-01-11 14:50:10 +01002809 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01002810
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002811 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002812 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002813 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002814 if (md_alg != MBEDTLS_MD_NONE) {
2815 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2816 dig_signed,
2817 dig_signed_len,
2818 md_alg);
2819 if (ret != 0) {
2820 return ret;
2821 }
2822 } else {
2823 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2824 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002825 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02002826
Gilles Peskine449bd832023-01-11 14:50:10 +01002827 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002828
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002829 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002830 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002831 */
Ronald Cron8457c122022-03-07 11:32:54 +01002832 /*
2833 * We need to specify signature and hash algorithm explicitly through
2834 * a prefix to the signature.
2835 *
2836 * struct {
2837 * HashAlgorithm hash;
2838 * SignatureAlgorithm signature;
2839 * } SignatureAndHashAlgorithm;
2840 *
2841 * struct {
2842 * SignatureAndHashAlgorithm algorithm;
2843 * opaque signature<0..2^16-1>;
2844 * } DigitallySigned;
2845 *
2846 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002847
Gilles Peskine449bd832023-01-11 14:50:10 +01002848 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
2849 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002850
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002851#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002852 if (ssl->conf->f_async_sign_start != NULL) {
2853 ret = ssl->conf->f_async_sign_start(ssl,
2854 mbedtls_ssl_own_cert(ssl),
2855 md_alg, hash, hashlen);
2856 switch (ret) {
2857 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
2858 /* act as if f_async_sign was null */
2859 break;
2860 case 0:
2861 ssl->handshake->async_in_progress = 1;
2862 return ssl_resume_server_key_exchange(ssl, signature_len);
2863 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
2864 ssl->handshake->async_in_progress = 1;
2865 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
2866 default:
2867 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
2868 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002869 }
2870 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002871#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002872
Gilles Peskine449bd832023-01-11 14:50:10 +01002873 if (mbedtls_ssl_own_key(ssl) == NULL) {
2874 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
2875 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01002876 }
2877
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002878 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2879 * signature length which will be added in ssl_write_server_key_exchange
2880 * after the call to ssl_prepare_server_key_exchange.
2881 * ssl_write_server_key_exchange also takes care of incrementing
2882 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002883 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
2884 md_alg, hash, hashlen,
2885 ssl->out_msg + ssl->out_msglen + 2,
2886 out_buf_len - ssl->out_msglen - 2,
Ben Taylor440cb2a2025-03-05 09:40:08 +00002887 signature_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002888 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
2889 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00002890 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002891 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002892#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002893
Gilles Peskine449bd832023-01-11 14:50:10 +01002894 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002895}
Paul Bakker1ef83d62012-04-11 12:09:53 +00002896
Gilles Peskined3eb0612018-01-08 17:07:44 +01002897/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02002898 * that do not include a ServerKeyExchange message, do nothing. Either
2899 * way, if successful, move on to the next step in the SSL state
2900 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002901MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002902static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002903{
Janos Follath865b3eb2019-12-16 11:46:15 +00002904 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002905 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002906#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002907 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01002908 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002909#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002910
Gilles Peskine449bd832023-01-11 14:50:10 +01002911 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01002912
Gilles Peskineeccd8882020-03-10 12:19:08 +01002913#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01002914 /* Extract static ECDH parameters and abort if ServerKeyExchange
2915 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002916 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002917 /* For suites involving ECDH, extract DH parameters
2918 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002919#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002920 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
2921 ret = ssl_get_ecdh_params_from_cert(ssl);
2922 if (ret != 0) {
2923 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
2924 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02002925 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002926 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002927#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002928
2929 /* Key exchanges not involving ephemeral keys don't use
2930 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002931 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01002932 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01002933 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002934 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002935#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002936
Gilles Peskineeccd8882020-03-10 12:19:08 +01002937#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002938 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01002939 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02002940 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002941 if (ssl->handshake->async_in_progress != 0) {
2942 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
2943 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
2944 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01002945#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002946 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002947 {
2948 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01002950 }
2951
Gilles Peskine449bd832023-01-11 14:50:10 +01002952 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02002953 /* If we're starting to write a new message, set ssl->out_msglen
2954 * to 0. But if we're resuming after an asynchronous message,
2955 * out_msglen is the amount of data written so far and mst be
2956 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002957 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
2958 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
2959 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01002960 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002961 }
2962 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002963 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002964
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002965 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02002966 * ssl_prepare_server_key_exchange already wrote the signature
2967 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002968#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002969 if (signature_len != 0) {
2970 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
2971 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002972
Gilles Peskine449bd832023-01-11 14:50:10 +01002973 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
2974 ssl->out_msg + ssl->out_msglen,
2975 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002976
2977 /* Skip over the already-written signature */
2978 ssl->out_msglen += signature_len;
2979 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002980#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002981
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002982 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002983 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2984 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002985
Gilles Peskinef670ba52025-03-07 15:09:32 +01002986 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002987
Gilles Peskine449bd832023-01-11 14:50:10 +01002988 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2989 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2990 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002991 }
2992
Gilles Peskine449bd832023-01-11 14:50:10 +01002993 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
2994 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002995}
2996
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002997MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002998static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002999{
Janos Follath865b3eb2019-12-16 11:46:15 +00003000 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003001
Gilles Peskine449bd832023-01-11 14:50:10 +01003002 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003003
3004 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003005 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3006 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003007
Gilles Peskinef670ba52025-03-07 15:09:32 +01003008 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003009
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003010#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003011 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3012 mbedtls_ssl_send_flight_completed(ssl);
3013 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003014#endif
3015
Gilles Peskine449bd832023-01-11 14:50:10 +01003016 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3017 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3018 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003019 }
3020
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003021#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003022 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3023 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3024 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3025 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003026 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003027#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003028
Gilles Peskine449bd832023-01-11 14:50:10 +01003029 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003030
Gilles Peskine449bd832023-01-11 14:50:10 +01003031 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003032}
3033
Gilles Peskineeccd8882020-03-10 12:19:08 +01003034#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003035MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003036static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3037 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003038{
Paul Bakker6db455e2013-09-18 17:29:31 +02003039 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003040 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003041
Gilles Peskine449bd832023-01-11 14:50:10 +01003042 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3043 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3044 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003045 }
3046
3047 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003048 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003049 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003050 if (end - *p < 2) {
3051 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3052 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003053 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003054
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003055 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003056 *p += 2;
3057
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 if (n == 0 || n > end - *p) {
3059 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3060 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003061 }
3062
Gilles Peskine449bd832023-01-11 14:50:10 +01003063 if (ssl->conf->f_psk != NULL) {
3064 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003065 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003066 }
3067 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003068 /* Identity is not a big secret since clients send it in the clear,
3069 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003070 if (n != ssl->conf->psk_identity_len ||
3071 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003072 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003073 }
3074 }
3075
Gilles Peskine449bd832023-01-11 14:50:10 +01003076 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3077 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3078 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3079 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3080 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003081 }
3082
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003083 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003084
Gilles Peskine449bd832023-01-11 14:50:10 +01003085 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003086}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003087#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003088
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003089MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003090static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003091{
Janos Follath865b3eb2019-12-16 11:46:15 +00003092 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003093 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003094 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003095
Hanno Beckere694c3e2017-12-27 21:34:08 +00003096 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003097
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003099
Gilles Peskine449bd832023-01-11 14:50:10 +01003100 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3101 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3102 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003103 }
3104
Gilles Peskine449bd832023-01-11 14:50:10 +01003105 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003106 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003107
Gilles Peskine449bd832023-01-11 14:50:10 +01003108 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3109 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3110 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003111 }
3112
Gilles Peskine449bd832023-01-11 14:50:10 +01003113 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3114 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3115 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003116 }
3117
Neil Armstrongd91526c2022-04-12 14:38:52 +02003118#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003119 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003120 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003121 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 size_t data_len = (size_t) (*p++);
3123 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003124 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3125 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3126
Gilles Peskine530c4232023-10-02 15:37:23 +02003127 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003128
3129 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003130 * We must have at least two bytes (1 for length, at least 1 for data)
3131 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003132 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003133 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3134 buf_len));
3135 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003136 }
3137
Gilles Peskine449bd832023-01-11 14:50:10 +01003138 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003139 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3140 " > %" MBEDTLS_PRINTF_SIZET,
3141 data_len, buf_len));
3142 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003143 }
3144
3145 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003146 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003147 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3148 " > %" MBEDTLS_PRINTF_SIZET,
3149 data_len,
3150 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003151 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3152 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003153 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3154 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003155
3156 /* Compute ECDH shared secret. */
3157 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003158 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3159 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 handshake->premaster, sizeof(handshake->premaster),
3161 &handshake->pmslen);
3162 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003163 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003164 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003165 if (handshake->xxdh_psa_privkey_is_external == 0) {
3166 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003167 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003168 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003169 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003170 }
3171
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003172 if (handshake->xxdh_psa_privkey_is_external == 0) {
3173 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003174
Gilles Peskine449bd832023-01-11 14:50:10 +01003175 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003176 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003177 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3178 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003179 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003180 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003181 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003182 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003183#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Ben Taylor15f1d7f2025-07-10 09:41:09 +01003184 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003185#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003186 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3187 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3188 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3189 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003190 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003191
Gilles Peskine449bd832023-01-11 14:50:10 +01003192 if (p != end) {
3193 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3194 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003195 }
3196
Gilles Peskine449bd832023-01-11 14:50:10 +01003197 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003198#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003199#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003200 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003201 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3202 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003203 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003204
3205 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3206
Gilles Peskine449bd832023-01-11 14:50:10 +01003207 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3208 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003209 psa_destroy_key(handshake->xxdh_psa_privkey);
3210 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003211 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003212 }
3213
3214 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003215 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003216 psa_destroy_key(handshake->xxdh_psa_privkey);
3217 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003218 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003219 }
3220
Neil Armstrong039db292022-03-09 11:38:34 +01003221 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003222 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003223 psa_destroy_key(handshake->xxdh_psa_privkey);
3224 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003226 }
3227
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003228 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3229 the sizes of the FFDH keys which are at least 2048 bits.
3230 The size of the array is thus greater than 256 bytes which is greater than any
3231 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003232#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003233 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3234 psa_destroy_key(handshake->xxdh_psa_privkey);
3235 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003236 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003237 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003238#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003239 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3240 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003241#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003242
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003243 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3244 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003245 p += ecpoint_len;
3246
Neil Armstrong3bcef082022-03-23 18:16:54 +01003247 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003248 * - a uint16 containing the length (in octets) of the ECDH computation
3249 * - the octet string produced by the ECDH computation
3250 * - a uint16 containing the length (in octets) of the PSK
3251 * - the PSK itself
3252 */
Neil Armstrong039db292022-03-09 11:38:34 +01003253 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 const unsigned char * const psm_end =
3255 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003256 /* uint16 to store length (in octets) of the ECDH computation */
3257 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003258 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003259
3260 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003262 handshake->xxdh_psa_privkey,
3263 handshake->xxdh_psa_peerkey,
3264 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003265 psm + zlen_size,
3266 psm_end - (psm + zlen_size),
3267 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003268
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003269 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3270 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003271
Gilles Peskine449bd832023-01-11 14:50:10 +01003272 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003273 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003275 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003276 }
Neil Armstrong039db292022-03-09 11:38:34 +01003277
Neil Armstrong3bcef082022-03-23 18:16:54 +01003278 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003279 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003280 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003281
Gilles Peskine449bd832023-01-11 14:50:10 +01003282 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003283#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003284#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003286 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003287 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3289 psa_destroy_key(ssl->handshake->psa_pake_password);
3290 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003291
Gilles Peskine449bd832023-01-11 14:50:10 +01003292 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3293 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003294 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003295 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003296#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003297 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003298 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3299 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003300 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003301
Gilles Peskine449bd832023-01-11 14:50:10 +01003302 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3303 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3304 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003305 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003306
Gilles Peskinef670ba52025-03-07 15:09:32 +01003307 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003308
Gilles Peskine449bd832023-01-11 14:50:10 +01003309 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003310
Gilles Peskine449bd832023-01-11 14:50:10 +01003311 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003312}
3313
Gilles Peskineeccd8882020-03-10 12:19:08 +01003314#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003315MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003316static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003317{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003318 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003319 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003320
Gilles Peskine449bd832023-01-11 14:50:10 +01003321 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003322
Gilles Peskine449bd832023-01-11 14:50:10 +01003323 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3324 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003325 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003326 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003327 }
3328
Gilles Peskine449bd832023-01-11 14:50:10 +01003329 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3330 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003331}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003332#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003333MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003334static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003335{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003336 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003337 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003338 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003339 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003340 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003341 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003342 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003343 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003344 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003345 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003346
Gilles Peskine449bd832023-01-11 14:50:10 +01003347 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003348
Gilles Peskine449bd832023-01-11 14:50:10 +01003349 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3350 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003351 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003353 }
3354
Hanno Becker2a831a42019-02-07 13:17:25 +00003355#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003356 if (ssl->session_negotiate->peer_cert == NULL) {
3357 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003358 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003359 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003360 }
3361#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003362 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3363 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003364 mbedtls_ssl_handshake_increment_state(ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +01003365 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003366 }
3367#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3368
Simon Butcher99000142016-10-13 17:21:01 +01003369 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3371 if (0 != ret) {
3372 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3373 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003374 }
3375
Gilles Peskinef670ba52025-03-07 15:09:32 +01003376 mbedtls_ssl_handshake_increment_state(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003377
Simon Butcher99000142016-10-13 17:21:01 +01003378 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003379 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3380 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3381 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3382 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003383 }
3384
Gilles Peskine449bd832023-01-11 14:50:10 +01003385 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003386
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003387#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3388 peer_pk = &ssl->handshake->peer_pubkey;
3389#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003390 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003391 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003392 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003393 }
3394 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3395#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3396
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003397 /*
3398 * struct {
3399 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3400 * opaque signature<0..2^16-1>;
3401 * } DigitallySigned;
3402 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003403 if (i + 2 > ssl->in_hslen) {
3404 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3405 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003406 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003407
Ronald Cron8457c122022-03-07 11:32:54 +01003408 /*
3409 * Hash
3410 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003411 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003412
Gilles Peskine449bd832023-01-11 14:50:10 +01003413 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3414 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3415 " for verify message"));
3416 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003417 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003418
Simon Butcher99000142016-10-13 17:21:01 +01003419#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003420 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003421 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003422 }
Simon Butcher99000142016-10-13 17:21:01 +01003423#endif
Paul Bakker926af752012-11-23 13:38:07 +01003424
Ronald Cron8457c122022-03-07 11:32:54 +01003425 /* Info from md_alg will be used instead */
3426 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003427
Ronald Cron8457c122022-03-07 11:32:54 +01003428 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003429
Ronald Cron8457c122022-03-07 11:32:54 +01003430 /*
3431 * Signature
3432 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003433 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3434 == MBEDTLS_PK_NONE) {
3435 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3436 " for verify message"));
3437 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003438 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003439
Ronald Cron8457c122022-03-07 11:32:54 +01003440 /*
3441 * Check the certificate's key type matches the signature alg
3442 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3444 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3445 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003446 }
3447
3448 i++;
3449
Gilles Peskine449bd832023-01-11 14:50:10 +01003450 if (i + 2 > ssl->in_hslen) {
3451 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3452 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003453 }
3454
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003455 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003456 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003457
Gilles Peskine449bd832023-01-11 14:50:10 +01003458 if (i + sig_len != ssl->in_hslen) {
3459 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3460 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003461 }
3462
Simon Butcher99000142016-10-13 17:21:01 +01003463 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003464 {
3465 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003466 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3467 if (0 != ret) {
3468 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3469 return ret;
3470 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003471 }
Simon Butcher99000142016-10-13 17:21:01 +01003472
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 if ((ret = mbedtls_pk_verify(peer_pk,
3474 md_alg, hash_start, hashlen,
3475 ssl->in_msg + i, sig_len)) != 0) {
3476 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3477 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003478 }
3479
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003480 ret = mbedtls_ssl_update_handshake_status(ssl);
3481 if (0 != ret) {
3482 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3483 return ret;
3484 }
Simon Butcher99000142016-10-13 17:21:01 +01003485
Gilles Peskine449bd832023-01-11 14:50:10 +01003486 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003487
Gilles Peskine449bd832023-01-11 14:50:10 +01003488 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003489}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003490#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003492#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003493MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003494static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003495{
Janos Follath865b3eb2019-12-16 11:46:15 +00003496 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003497 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003498 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003499
Gilles Peskine449bd832023-01-11 14:50:10 +01003500 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3503 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003504
3505 /*
3506 * struct {
3507 * uint32 ticket_lifetime_hint;
3508 * opaque ticket<0..2^16-1>;
3509 * } NewSessionTicket;
3510 *
3511 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3512 * 8 . 9 ticket_len (n)
3513 * 10 . 9+n ticket content
3514 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003515
Ronald Cron3c0072b2023-11-22 10:00:14 +01003516#if defined(MBEDTLS_HAVE_TIME)
3517 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3518#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003519 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3520 ssl->session_negotiate,
3521 ssl->out_msg + 10,
3522 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3523 &tlen, &lifetime)) != 0) {
3524 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003525 tlen = 0;
3526 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003527
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3529 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003530 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003531
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003532 /*
3533 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3534 * ChangeCipherSpec share the same state.
3535 */
3536 ssl->handshake->new_session_ticket = 0;
3537
Gilles Peskine449bd832023-01-11 14:50:10 +01003538 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3539 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3540 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003541 }
3542
Gilles Peskine449bd832023-01-11 14:50:10 +01003543 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003544
Gilles Peskine449bd832023-01-11 14:50:10 +01003545 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003546}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003547#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003548
Paul Bakker5121ce52009-01-03 21:22:43 +00003549/*
Paul Bakker1961b702013-01-25 14:49:24 +01003550 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003551 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003552int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003553{
3554 int ret = 0;
3555
Gilles Peskine449bd832023-01-11 14:50:10 +01003556 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003557
Gilles Peskine449bd832023-01-11 14:50:10 +01003558 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003559 case MBEDTLS_SSL_HELLO_REQUEST:
Gilles Peskinef670ba52025-03-07 15:09:32 +01003560 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
Paul Bakker5121ce52009-01-03 21:22:43 +00003561 break;
3562
Paul Bakker1961b702013-01-25 14:49:24 +01003563 /*
3564 * <== ClientHello
3565 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003566 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003567 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003568 break;
Paul Bakker1961b702013-01-25 14:49:24 +01003569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003570#if defined(MBEDTLS_SSL_PROTO_DTLS)
3571 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01003572 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02003573#endif
3574
Paul Bakker1961b702013-01-25 14:49:24 +01003575 /*
3576 * ==> ServerHello
3577 * Certificate
3578 * ( ServerKeyExchange )
3579 * ( CertificateRequest )
3580 * ServerHelloDone
3581 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003582 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003583 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003584 break;
3585
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003586 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003587 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003588 break;
3589
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003590 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003591 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003592 break;
3593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003594 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01003595 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003596 break;
3597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003598 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003599 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003600 break;
3601
3602 /*
3603 * <== ( Certificate/Alert )
3604 * ClientKeyExchange
3605 * ( CertificateVerify )
3606 * ChangeCipherSpec
3607 * Finished
3608 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003609 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003610 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003611 break;
3612
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003613 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003614 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003615 break;
3616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003617 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003618 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003619 break;
3620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003621 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01003622 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003623 break;
3624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003625 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003626 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003627 break;
3628
3629 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003630 * ==> ( NewSessionTicket )
3631 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003632 * Finished
3633 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003634 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3635#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003636 if (ssl->handshake->new_session_ticket != 0) {
3637 ret = ssl_write_new_session_ticket(ssl);
3638 } else
Paul Bakkera503a632013-08-14 13:48:06 +02003639#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003640 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003641 break;
3642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003643 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003644 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003645 break;
3646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003647 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003648 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Gilles Peskinef670ba52025-03-07 15:09:32 +01003649 mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
Paul Bakker1961b702013-01-25 14:49:24 +01003650 break;
3651
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003652 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003653 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003654 break;
3655
3656 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003657 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3658 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00003659 }
3660
Gilles Peskine449bd832023-01-11 14:50:10 +01003661 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003662}
TRodziewicz8476f2f2021-06-02 14:34:47 +02003663
Gilles Peskine449bd832023-01-11 14:50:10 +01003664void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02003665{
TRodziewicz3946f792021-06-14 12:11:18 +02003666 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02003667}
3668
Jerry Yufb4b6472022-01-27 15:03:26 +08003669#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */