blob: fb88cf295612b90224705553ec435d8a14e056e7 [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)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/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
Paul Bakker5121ce52009-01-03 21:22:43 +00001600 ssl->state++;
1601
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002018 ssl->state = 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
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2137 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
Ronald Cronc5649382023-04-04 15:33:42 +02002143 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, 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 {
2169 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2170 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 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002186 ssl->state++;
2187
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;
Gilles Peskine449bd832023-01-11 14:50:10 +01002200 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2201 n)) != 0) {
2202 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;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002210 ssl->state = 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"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002336 ssl->state++;
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
2359 ssl->state++;
2360
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
Valerio Setti4d0e8462023-10-06 13:20:21 +02002516#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002518MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002519static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002520{
2521 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2522 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002523 mbedtls_pk_context *pk;
2524 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002525 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002526 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2527 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002528#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002529 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002530 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002531 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002532 mbedtls_ecp_keypair *key;
2533#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002534
Gilles Peskine449bd832023-01-11 14:50:10 +01002535 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002536
Gilles Peskine449bd832023-01-11 14:50:10 +01002537 if (pk == NULL) {
2538 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2539 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002540
Valerio Setti0813b6f2023-06-16 12:18:53 +02002541 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002542
Valerio Setti0813b6f2023-06-16 12:18:53 +02002543 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002544 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002545#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2546 case MBEDTLS_PK_ECKEY:
2547 case MBEDTLS_PK_ECKEY_DH:
2548 case MBEDTLS_PK_ECDSA:
2549#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002550 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2551 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2552 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002553
Valerio Settibced8bc2023-12-06 10:40:47 +01002554 /* Get the attributes of the key previously parsed by PK module in
2555 * order to extract its type and length (in bits). */
2556 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002558 ret = PSA_TO_MBEDTLS_ERR(status);
2559 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002560 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002561 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002562 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002563
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002564#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2565 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002566 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2567 * module and only have ECDSA capabilities. Since we need
2568 * them for ECDH later, we export and then re-import them with
2569 * proper flags and algorithm. Of course We also set key's type
2570 * and bits that we just got above. */
2571 key_attributes = psa_key_attributes_init();
2572 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2573 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2574 psa_set_key_type(&key_attributes,
2575 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2576 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002577
Valerio Setti202bb712023-12-06 17:05:24 +01002578 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2579 if (status != PSA_SUCCESS) {
2580 ret = PSA_TO_MBEDTLS_ERR(status);
2581 goto exit;
2582 }
2583 status = psa_import_key(&key_attributes, buf, key_len,
2584 &ssl->handshake->xxdh_psa_privkey);
2585 if (status != PSA_SUCCESS) {
2586 ret = PSA_TO_MBEDTLS_ERR(status);
2587 goto exit;
2588 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002589
Valerio Setti202bb712023-12-06 17:05:24 +01002590 /* Set this key as owned by the TLS library: it will be its duty
2591 * to clear it exit. */
2592 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002593
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002594 ret = 0;
2595 break;
2596 }
2597#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2598
2599 /* Opaque key is created by the user (externally from Mbed TLS)
2600 * so we assume it already has the right algorithm and flags
2601 * set. Just copy its ID as reference. */
2602 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2603 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 ret = 0;
2605 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002606
Valerio Setti0813b6f2023-06-16 12:18:53 +02002607#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 case MBEDTLS_PK_ECKEY:
2609 case MBEDTLS_PK_ECKEY_DH:
2610 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002611 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002612 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002613 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2615 }
Valerio Setti97207782023-05-18 18:59:06 +02002616 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002617 if (tls_id == 0) {
2618 /* This elliptic curve is not supported */
2619 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2620 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002621
Gilles Peskine449bd832023-01-11 14:50:10 +01002622 /* If the above conversion to TLS ID was fine, then also this one will
2623 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002624 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002625 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002626
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002627 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002628
Gilles Peskine449bd832023-01-11 14:50:10 +01002629 key_attributes = psa_key_attributes_init();
2630 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2631 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2632 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002633 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002634 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002635
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002636 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002637 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002638 mbedtls_platform_zeroize(buf, sizeof(buf));
2639 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002641
Gilles Peskine449bd832023-01-11 14:50:10 +01002642 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002643 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002644 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002645 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002646 mbedtls_platform_zeroize(buf, sizeof(buf));
2647 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002649
Valerio Setti6835b4a2023-06-22 09:06:31 +02002650 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002651 ret = 0;
2652 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002653#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002655 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002656 }
2657
Valerio Settibced8bc2023-12-06 10:40:47 +01002658exit:
2659 psa_reset_key_attributes(&key_attributes);
2660 mbedtls_platform_zeroize(buf, sizeof(buf));
2661
Gilles Peskine449bd832023-01-11 14:50:10 +01002662 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002663}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002664#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2665 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002666
Gilles Peskineeccd8882020-03-10 12:19:08 +01002667#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002668 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002669MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002670static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2671 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002672{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002673 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2674 * signature length which will be added in ssl_write_server_key_exchange
2675 * after the call to ssl_prepare_server_key_exchange.
2676 * ssl_write_server_key_exchange also takes care of incrementing
2677 * ssl->out_msglen. */
2678 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2680 - sig_start);
2681 int ret = ssl->conf->f_async_resume(ssl,
2682 sig_start, signature_len, sig_max_len);
2683 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002684 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002685 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002686 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002687 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2688 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002689}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002690#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002691 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002692
Gilles Peskined3eb0612018-01-08 17:07:44 +01002693/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002694 * calculating the signature if any, but excluding formatting the
2695 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002696MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002697static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2698 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002699{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002700 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002701 ssl->handshake->ciphersuite_info;
2702
Gilles Peskineeccd8882020-03-10 12:19:08 +01002703#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002704#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002705 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002706#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002707#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002708
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002709 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002710#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002711 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002712#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002713
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002714#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002715#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002716 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002717#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002718 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 +02002719#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002720#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002721
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002722 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002723
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002724 /*
2725 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002726 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002727 *
2728 */
2729
2730 /*
2731 * - ECJPAKE key exchanges
2732 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002733#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002734 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002735 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002736 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2737 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2738 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002739 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002740 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002741
Valerio Setti6f1b5742022-11-16 10:00:32 +01002742 /*
2743 * The first 3 bytes are:
2744 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2745 * [1, 2] elliptic curve's TLS ID
2746 *
2747 * However since we only support secp256r1 for now, we hardcode its
2748 * TLS ID here
2749 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002750 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002751 MBEDTLS_ECP_DP_SECP256R1);
2752 if (tls_id == 0) {
2753 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002754 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002755 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002756 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002757 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002758
Gilles Peskine449bd832023-01-11 14:50:10 +01002759 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2760 out_p + output_offset,
2761 end_p - out_p - output_offset, &output_len,
2762 MBEDTLS_ECJPAKE_ROUND_TWO);
2763 if (ret != 0) {
2764 psa_destroy_key(ssl->handshake->psa_pake_password);
2765 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2766 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2767 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002768 }
2769
Valerio Setti02c25b52022-11-15 14:08:42 +01002770 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002771 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002772 }
2773#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2774
Hanno Becker1aa267c2017-04-28 17:08:27 +01002775 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002776 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002777 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2778 * we use empty support identity hints here.
2779 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002780#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2781 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002782 ssl->out_msg[ssl->out_msglen++] = 0x00;
2783 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002784 }
Valerio Setti48659a12025-01-15 14:22:28 +01002785#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002786
Hanno Becker7e5437a2017-04-28 17:15:26 +01002787 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002788 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002789 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002790#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002791 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002792 /*
2793 * Ephemeral ECDH parameters:
2794 *
2795 * struct {
2796 * ECParameters curve_params;
2797 * ECPoint public;
2798 * } ServerECDHParams;
2799 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002800 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002801 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002802 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002803 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002804
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002805 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002806 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2807 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2808 }
2809 for (; *group_list != 0; group_list++) {
2810 for (curr_tls_id = ssl->handshake->curves_tls_id;
2811 *curr_tls_id != 0; curr_tls_id++) {
2812 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002813 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002814 }
2815 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002816 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002817
Gilles Peskine449bd832023-01-11 14:50:10 +01002818curve_matching_done:
2819 if (*curr_tls_id == 0) {
2820 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2821 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2822 }
2823
2824 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2825 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002826
Neil Armstrongd91526c2022-04-12 14:38:52 +02002827 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2828 psa_key_attributes_t key_attributes;
2829 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002830 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2831 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2832 // data length(1)
2833 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002834 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002835 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002836
Gilles Peskine449bd832023-01-11 14:50:10 +01002837 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002838
Valerio Setti40d9ca92023-01-04 16:08:04 +01002839 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002840 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002841 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002842 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2843 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2844 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002845 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002846 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002847 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002848
2849 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002850 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2851 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002852 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002853 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002854
2855 /*
2856 * ECParameters curve_params
2857 *
2858 * First byte is curve_type, always named_curve
2859 */
2860 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2861
2862 /*
2863 * Next two bytes are the namedcurve value
2864 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002865 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002866 p += 2;
2867
2868 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002869 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002870 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002871 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002872 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002873 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2874 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002875 }
2876
2877 /*
2878 * ECPoint public
2879 *
2880 * First byte is data length.
2881 * It will be filled later. p holds now the data length location.
2882 */
2883
2884 /* Export the public part of the ECDH private key from PSA.
2885 * Make one byte space for the length.
2886 */
2887 unsigned char *own_pubkey = p + data_length_size;
2888
Gilles Peskine449bd832023-01-11 14:50:10 +01002889 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2890 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002891
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002892 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 own_pubkey, own_pubkey_max_len,
2894 &len);
2895 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002896 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002898 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2899 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002900 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002901 }
2902
2903 /* Store the length of the exported public key. */
2904 *p = (uint8_t) len;
2905
2906 /* Determine full message length. */
2907 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002908
Jerry Yuc5aef882021-12-23 20:15:02 +08002909#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002910 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002911#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002912
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002913 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002914 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002915#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002916
Hanno Becker1aa267c2017-04-28 17:08:27 +01002917 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002918 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002919 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002920 * exchange parameters, compute and add the signature here.
2921 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002922 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002923#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002924 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2925 if (dig_signed == NULL) {
2926 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2927 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002928 }
2929
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002930 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02002931 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002932 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02002933
Janos Follath865b3eb2019-12-16 11:46:15 +00002934 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002935
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002936 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002937 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002938 * For TLS 1.2, obey signature-hash-algorithm extension
2939 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002940 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002941
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002942 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01002944
Dave Rodgmanc37ad442023-11-03 23:36:06 +00002945 unsigned char sig_hash =
2946 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01002947 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002948
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002950
Ronald Cron8457c122022-03-07 11:32:54 +01002951 /* For TLS 1.2, obey signature-hash-algorithm extension
2952 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
2954 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01002955 /* (... because we choose a cipher suite
2956 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01002957 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002958 }
2959
Gilles Peskine449bd832023-01-11 14:50:10 +01002960 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01002961
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002962 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002963 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002964 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002965 if (md_alg != MBEDTLS_MD_NONE) {
2966 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2967 dig_signed,
2968 dig_signed_len,
2969 md_alg);
2970 if (ret != 0) {
2971 return ret;
2972 }
2973 } else {
2974 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2975 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002976 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02002977
Gilles Peskine449bd832023-01-11 14:50:10 +01002978 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002979
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002980 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002981 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002982 */
Ronald Cron8457c122022-03-07 11:32:54 +01002983 /*
2984 * We need to specify signature and hash algorithm explicitly through
2985 * a prefix to the signature.
2986 *
2987 * struct {
2988 * HashAlgorithm hash;
2989 * SignatureAlgorithm signature;
2990 * } SignatureAndHashAlgorithm;
2991 *
2992 * struct {
2993 * SignatureAndHashAlgorithm algorithm;
2994 * opaque signature<0..2^16-1>;
2995 * } DigitallySigned;
2996 *
2997 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002998
Gilles Peskine449bd832023-01-11 14:50:10 +01002999 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3000 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003001
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003002#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003003 if (ssl->conf->f_async_sign_start != NULL) {
3004 ret = ssl->conf->f_async_sign_start(ssl,
3005 mbedtls_ssl_own_cert(ssl),
3006 md_alg, hash, hashlen);
3007 switch (ret) {
3008 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3009 /* act as if f_async_sign was null */
3010 break;
3011 case 0:
3012 ssl->handshake->async_in_progress = 1;
3013 return ssl_resume_server_key_exchange(ssl, signature_len);
3014 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3015 ssl->handshake->async_in_progress = 1;
3016 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3017 default:
3018 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3019 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003020 }
3021 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003022#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003023
Gilles Peskine449bd832023-01-11 14:50:10 +01003024 if (mbedtls_ssl_own_key(ssl) == NULL) {
3025 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3026 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003027 }
3028
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003029 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3030 * signature length which will be added in ssl_write_server_key_exchange
3031 * after the call to ssl_prepare_server_key_exchange.
3032 * ssl_write_server_key_exchange also takes care of incrementing
3033 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003034 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3035 md_alg, hash, hashlen,
3036 ssl->out_msg + ssl->out_msglen + 2,
3037 out_buf_len - ssl->out_msglen - 2,
3038 signature_len,
3039 ssl->conf->f_rng,
3040 ssl->conf->p_rng)) != 0) {
3041 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3042 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003043 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003044 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003045#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003046
Gilles Peskine449bd832023-01-11 14:50:10 +01003047 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003048}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003049
Gilles Peskined3eb0612018-01-08 17:07:44 +01003050/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003051 * that do not include a ServerKeyExchange message, do nothing. Either
3052 * way, if successful, move on to the next step in the SSL state
3053 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003054MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003055static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003056{
Janos Follath865b3eb2019-12-16 11:46:15 +00003057 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003058 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003059#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003060 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003062#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003063
Gilles Peskine449bd832023-01-11 14:50:10 +01003064 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003065
Gilles Peskineeccd8882020-03-10 12:19:08 +01003066#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003067 /* Extract static ECDH parameters and abort if ServerKeyExchange
3068 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003070 /* For suites involving ECDH, extract DH parameters
3071 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003072#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003073 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3074 ret = ssl_get_ecdh_params_from_cert(ssl);
3075 if (ret != 0) {
3076 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3077 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003078 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003079 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003080#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003081
3082 /* Key exchanges not involving ephemeral keys don't use
3083 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003084 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003085 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003086 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003087 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003088#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003089
Gilles Peskineeccd8882020-03-10 12:19:08 +01003090#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003091 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003092 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003093 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003094 if (ssl->handshake->async_in_progress != 0) {
3095 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3096 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3097 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003098#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003099 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003100 {
3101 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003102 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003103 }
3104
Gilles Peskine449bd832023-01-11 14:50:10 +01003105 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003106 /* If we're starting to write a new message, set ssl->out_msglen
3107 * to 0. But if we're resuming after an asynchronous message,
3108 * out_msglen is the amount of data written so far and mst be
3109 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003110 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3111 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3112 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003113 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003114 }
3115 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003116 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003117
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003118 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003119 * ssl_prepare_server_key_exchange already wrote the signature
3120 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003121#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 if (signature_len != 0) {
3123 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3124 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003125
Gilles Peskine449bd832023-01-11 14:50:10 +01003126 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3127 ssl->out_msg + ssl->out_msglen,
3128 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003129
3130 /* Skip over the already-written signature */
3131 ssl->out_msglen += signature_len;
3132 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003133#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003134
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003135 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003136 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3137 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003138
3139 ssl->state++;
3140
Gilles Peskine449bd832023-01-11 14:50:10 +01003141 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3142 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3143 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003144 }
3145
Gilles Peskine449bd832023-01-11 14:50:10 +01003146 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3147 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003148}
3149
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003150MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003151static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003152{
Janos Follath865b3eb2019-12-16 11:46:15 +00003153 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003154
Gilles Peskine449bd832023-01-11 14:50:10 +01003155 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003156
3157 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003158 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3159 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003160
3161 ssl->state++;
3162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003163#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003164 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3165 mbedtls_ssl_send_flight_completed(ssl);
3166 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003167#endif
3168
Gilles Peskine449bd832023-01-11 14:50:10 +01003169 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3170 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3171 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003172 }
3173
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003174#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003175 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3176 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3177 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3178 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003179 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003180#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003181
Gilles Peskine449bd832023-01-11 14:50:10 +01003182 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003183
Gilles Peskine449bd832023-01-11 14:50:10 +01003184 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003185}
3186
Gilles Peskineeccd8882020-03-10 12:19:08 +01003187#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003188MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003189static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3190 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003191{
Paul Bakker6db455e2013-09-18 17:29:31 +02003192 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003193 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003194
Gilles Peskine449bd832023-01-11 14:50:10 +01003195 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3196 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3197 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003198 }
3199
3200 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003201 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003202 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003203 if (end - *p < 2) {
3204 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3205 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003206 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003207
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003208 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003209 *p += 2;
3210
Gilles Peskine449bd832023-01-11 14:50:10 +01003211 if (n == 0 || n > end - *p) {
3212 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3213 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003214 }
3215
Gilles Peskine449bd832023-01-11 14:50:10 +01003216 if (ssl->conf->f_psk != NULL) {
3217 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003218 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003219 }
3220 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003221 /* Identity is not a big secret since clients send it in the clear,
3222 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003223 if (n != ssl->conf->psk_identity_len ||
3224 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003225 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003226 }
3227 }
3228
Gilles Peskine449bd832023-01-11 14:50:10 +01003229 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3230 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3231 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3232 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3233 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003234 }
3235
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003236 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003237
Gilles Peskine449bd832023-01-11 14:50:10 +01003238 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003239}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003240#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003241
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003242MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003243static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003244{
Janos Follath865b3eb2019-12-16 11:46:15 +00003245 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003246 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003247 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003248
Hanno Beckere694c3e2017-12-27 21:34:08 +00003249 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003250
Gilles Peskine449bd832023-01-11 14:50:10 +01003251 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003252
Gilles Peskine449bd832023-01-11 14:50:10 +01003253 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3254 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3255 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003256 }
3257
Gilles Peskine449bd832023-01-11 14:50:10 +01003258 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003259 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003260
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3262 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3263 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003264 }
3265
Gilles Peskine449bd832023-01-11 14:50:10 +01003266 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3267 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3268 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003269 }
3270
Neil Armstrongd91526c2022-04-12 14:38:52 +02003271#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3272 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3273 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3274 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003276 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3277 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003278 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003279 size_t data_len = (size_t) (*p++);
3280 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003281 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3282 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3283
Gilles Peskine530c4232023-10-02 15:37:23 +02003284 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003285
3286 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003287 * We must have at least two bytes (1 for length, at least 1 for data)
3288 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003289 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003290 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3291 buf_len));
3292 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003293 }
3294
Gilles Peskine449bd832023-01-11 14:50:10 +01003295 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003296 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3297 " > %" MBEDTLS_PRINTF_SIZET,
3298 data_len, buf_len));
3299 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003300 }
3301
3302 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003303 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003304 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3305 " > %" MBEDTLS_PRINTF_SIZET,
3306 data_len,
3307 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003308 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3309 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003310 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3311 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003312
3313 /* Compute ECDH shared secret. */
3314 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003315 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3316 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 handshake->premaster, sizeof(handshake->premaster),
3318 &handshake->pmslen);
3319 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003320 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003321 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003322 if (handshake->xxdh_psa_privkey_is_external == 0) {
3323 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003324 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003325 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003326 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003327 }
3328
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003329 if (handshake->xxdh_psa_privkey_is_external == 0) {
3330 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003331
Gilles Peskine449bd832023-01-11 14:50:10 +01003332 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003333 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003334 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3335 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003336 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003337 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003338 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003340#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3341 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3342 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3343 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3344#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003345 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3346 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3347 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3348 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003349 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003350
Gilles Peskine449bd832023-01-11 14:50:10 +01003351 if (p != end) {
3352 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3353 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003354 }
3355
Gilles Peskine449bd832023-01-11 14:50:10 +01003356 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003357#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003358#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003359 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003360 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3361 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003362 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003363
3364 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3365
Gilles Peskine449bd832023-01-11 14:50:10 +01003366 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3367 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003368 psa_destroy_key(handshake->xxdh_psa_privkey);
3369 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003371 }
3372
3373 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003375 psa_destroy_key(handshake->xxdh_psa_privkey);
3376 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003377 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003378 }
3379
Neil Armstrong039db292022-03-09 11:38:34 +01003380 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003382 psa_destroy_key(handshake->xxdh_psa_privkey);
3383 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003384 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003385 }
3386
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003387 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3388 the sizes of the FFDH keys which are at least 2048 bits.
3389 The size of the array is thus greater than 256 bytes which is greater than any
3390 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003391#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003392 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3393 psa_destroy_key(handshake->xxdh_psa_privkey);
3394 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003395 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003396 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003397#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003398 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3399 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003400#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003401
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003402 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3403 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003404 p += ecpoint_len;
3405
Neil Armstrong3bcef082022-03-23 18:16:54 +01003406 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003407 * - a uint16 containing the length (in octets) of the ECDH computation
3408 * - the octet string produced by the ECDH computation
3409 * - a uint16 containing the length (in octets) of the PSK
3410 * - the PSK itself
3411 */
Neil Armstrong039db292022-03-09 11:38:34 +01003412 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003413 const unsigned char * const psm_end =
3414 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003415 /* uint16 to store length (in octets) of the ECDH computation */
3416 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003417 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003418
3419 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003420 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003421 handshake->xxdh_psa_privkey,
3422 handshake->xxdh_psa_peerkey,
3423 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003424 psm + zlen_size,
3425 psm_end - (psm + zlen_size),
3426 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003427
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003428 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3429 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003430
Gilles Peskine449bd832023-01-11 14:50:10 +01003431 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003432 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003433 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003434 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003435 }
Neil Armstrong039db292022-03-09 11:38:34 +01003436
Neil Armstrong3bcef082022-03-23 18:16:54 +01003437 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003438 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003439 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003440
Gilles Peskine449bd832023-01-11 14:50:10 +01003441 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003442#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003443#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003444 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003445 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003446 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3448 psa_destroy_key(ssl->handshake->psa_pake_password);
3449 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003450
Gilles Peskine449bd832023-01-11 14:50:10 +01003451 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3452 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003453 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003454 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003455#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003456 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003457 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3458 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003459 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003460
Gilles Peskine449bd832023-01-11 14:50:10 +01003461 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3462 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3463 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003464 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003465
Paul Bakker5121ce52009-01-03 21:22:43 +00003466 ssl->state++;
3467
Gilles Peskine449bd832023-01-11 14:50:10 +01003468 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003469
Gilles Peskine449bd832023-01-11 14:50:10 +01003470 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003471}
3472
Gilles Peskineeccd8882020-03-10 12:19:08 +01003473#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003474MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003475static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003476{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003477 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003478 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003479
Gilles Peskine449bd832023-01-11 14:50:10 +01003480 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003481
Gilles Peskine449bd832023-01-11 14:50:10 +01003482 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3483 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003484 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003485 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003486 }
3487
Gilles Peskine449bd832023-01-11 14:50:10 +01003488 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3489 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003490}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003491#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003492MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003493static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003494{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003495 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003496 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003497 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003498 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003499 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003500 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003501 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003502 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003503 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003504 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003505
Gilles Peskine449bd832023-01-11 14:50:10 +01003506 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003507
Gilles Peskine449bd832023-01-11 14:50:10 +01003508 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3509 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003510 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003511 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003512 }
3513
Hanno Becker2a831a42019-02-07 13:17:25 +00003514#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003515 if (ssl->session_negotiate->peer_cert == NULL) {
3516 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003517 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003518 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003519 }
3520#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3522 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003523 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003524 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003525 }
3526#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3527
Simon Butcher99000142016-10-13 17:21:01 +01003528 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003529 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3530 if (0 != ret) {
3531 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3532 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003533 }
3534
3535 ssl->state++;
3536
Simon Butcher99000142016-10-13 17:21:01 +01003537 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003538 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3539 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3540 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3541 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003542 }
3543
Gilles Peskine449bd832023-01-11 14:50:10 +01003544 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003545
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003546#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3547 peer_pk = &ssl->handshake->peer_pubkey;
3548#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003549 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003550 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003551 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003552 }
3553 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3554#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3555
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003556 /*
3557 * struct {
3558 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3559 * opaque signature<0..2^16-1>;
3560 * } DigitallySigned;
3561 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003562 if (i + 2 > ssl->in_hslen) {
3563 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3564 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003565 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003566
Ronald Cron8457c122022-03-07 11:32:54 +01003567 /*
3568 * Hash
3569 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003570 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003571
Gilles Peskine449bd832023-01-11 14:50:10 +01003572 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3573 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3574 " for verify message"));
3575 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003576 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003577
Simon Butcher99000142016-10-13 17:21:01 +01003578#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003579 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003580 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 }
Simon Butcher99000142016-10-13 17:21:01 +01003582#endif
Paul Bakker926af752012-11-23 13:38:07 +01003583
Ronald Cron8457c122022-03-07 11:32:54 +01003584 /* Info from md_alg will be used instead */
3585 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003586
Ronald Cron8457c122022-03-07 11:32:54 +01003587 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003588
Ronald Cron8457c122022-03-07 11:32:54 +01003589 /*
3590 * Signature
3591 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3593 == MBEDTLS_PK_NONE) {
3594 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3595 " for verify message"));
3596 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003597 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003598
Ronald Cron8457c122022-03-07 11:32:54 +01003599 /*
3600 * Check the certificate's key type matches the signature alg
3601 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003602 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3603 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3604 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003605 }
3606
3607 i++;
3608
Gilles Peskine449bd832023-01-11 14:50:10 +01003609 if (i + 2 > ssl->in_hslen) {
3610 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3611 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003612 }
3613
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003614 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003615 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003616
Gilles Peskine449bd832023-01-11 14:50:10 +01003617 if (i + sig_len != ssl->in_hslen) {
3618 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3619 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003620 }
3621
Simon Butcher99000142016-10-13 17:21:01 +01003622 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003623 {
3624 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003625 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3626 if (0 != ret) {
3627 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3628 return ret;
3629 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003630 }
Simon Butcher99000142016-10-13 17:21:01 +01003631
Gilles Peskine449bd832023-01-11 14:50:10 +01003632 if ((ret = mbedtls_pk_verify(peer_pk,
3633 md_alg, hash_start, hashlen,
3634 ssl->in_msg + i, sig_len)) != 0) {
3635 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3636 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003637 }
3638
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003639 ret = mbedtls_ssl_update_handshake_status(ssl);
3640 if (0 != ret) {
3641 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3642 return ret;
3643 }
Simon Butcher99000142016-10-13 17:21:01 +01003644
Gilles Peskine449bd832023-01-11 14:50:10 +01003645 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003646
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003648}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003649#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003651#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003652MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003653static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003654{
Janos Follath865b3eb2019-12-16 11:46:15 +00003655 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003656 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003657 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003658
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003661 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3662 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003663
3664 /*
3665 * struct {
3666 * uint32 ticket_lifetime_hint;
3667 * opaque ticket<0..2^16-1>;
3668 * } NewSessionTicket;
3669 *
3670 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3671 * 8 . 9 ticket_len (n)
3672 * 10 . 9+n ticket content
3673 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003674
Ronald Cron3c0072b2023-11-22 10:00:14 +01003675#if defined(MBEDTLS_HAVE_TIME)
3676 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3677#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003678 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3679 ssl->session_negotiate,
3680 ssl->out_msg + 10,
3681 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3682 &tlen, &lifetime)) != 0) {
3683 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003684 tlen = 0;
3685 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003686
Gilles Peskine449bd832023-01-11 14:50:10 +01003687 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3688 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003689 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003690
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003691 /*
3692 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3693 * ChangeCipherSpec share the same state.
3694 */
3695 ssl->handshake->new_session_ticket = 0;
3696
Gilles Peskine449bd832023-01-11 14:50:10 +01003697 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3698 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3699 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003700 }
3701
Gilles Peskine449bd832023-01-11 14:50:10 +01003702 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003703
Gilles Peskine449bd832023-01-11 14:50:10 +01003704 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003705}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003706#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003707
Paul Bakker5121ce52009-01-03 21:22:43 +00003708/*
Paul Bakker1961b702013-01-25 14:49:24 +01003709 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003710 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003711int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003712{
3713 int ret = 0;
3714
Gilles Peskine449bd832023-01-11 14:50:10 +01003715 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003716
Gilles Peskine449bd832023-01-11 14:50:10 +01003717 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003718 case MBEDTLS_SSL_HELLO_REQUEST:
3719 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003720 break;
3721
Paul Bakker1961b702013-01-25 14:49:24 +01003722 /*
3723 * <== ClientHello
3724 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003725 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003726 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003727 break;
Paul Bakker1961b702013-01-25 14:49:24 +01003728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003729#if defined(MBEDTLS_SSL_PROTO_DTLS)
3730 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01003731 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02003732#endif
3733
Paul Bakker1961b702013-01-25 14:49:24 +01003734 /*
3735 * ==> ServerHello
3736 * Certificate
3737 * ( ServerKeyExchange )
3738 * ( CertificateRequest )
3739 * ServerHelloDone
3740 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003741 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003742 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003743 break;
3744
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003745 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003746 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003747 break;
3748
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003749 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003750 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003751 break;
3752
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003753 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01003754 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003755 break;
3756
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003757 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003758 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003759 break;
3760
3761 /*
3762 * <== ( Certificate/Alert )
3763 * ClientKeyExchange
3764 * ( CertificateVerify )
3765 * ChangeCipherSpec
3766 * Finished
3767 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003768 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003769 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003770 break;
3771
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003772 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003774 break;
3775
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003776 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003777 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003778 break;
3779
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003780 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01003781 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003782 break;
3783
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003784 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003785 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003786 break;
3787
3788 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003789 * ==> ( NewSessionTicket )
3790 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003791 * Finished
3792 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003793 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3794#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003795 if (ssl->handshake->new_session_ticket != 0) {
3796 ret = ssl_write_new_session_ticket(ssl);
3797 } else
Paul Bakkera503a632013-08-14 13:48:06 +02003798#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003799 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003800 break;
3801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003802 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003804 break;
3805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003806 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003808 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01003809 break;
3810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003811 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003813 break;
3814
3815 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003816 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3817 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00003818 }
3819
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003821}
TRodziewicz8476f2f2021-06-02 14:34:47 +02003822
Gilles Peskine449bd832023-01-11 14:50:10 +01003823void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02003824{
TRodziewicz3946f792021-06-14 12:11:18 +02003825 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02003826}
3827
Jerry Yufb4b6472022-01-27 15:03:26 +08003828#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */