blob: 542d1f09577eddc850073bed929b890ae37df486 [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 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200657MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100658static int ssl_pick_cert(mbedtls_ssl_context *ssl,
659 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100660{
Glenn Strauss041a3762022-03-15 06:08:29 -0400661 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200662 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200664 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200666 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100670 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100671 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100672#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100674
David Horstmann3a334c22022-10-25 10:53:44 +0100675 int pk_alg_is_none = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 if (pk_alg_is_none) {
678 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200679 }
680
Gilles Peskine449bd832023-01-11 14:50:10 +0100681 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
682
683 if (list == NULL) {
684 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
685 return -1;
686 }
687
688 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400689 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
691 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000692
David Horstmann3a334c22022-10-25 10:53:44 +0100693 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200694#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
697 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200698#else
David Horstmann3a334c22022-10-25 10:53:44 +0100699 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200701#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 if (!key_type_matches) {
703 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100704 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000705 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100706
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200707 /*
708 * This avoids sending the client a cert it'll reject based on
709 * keyUsage or other extensions.
710 *
711 * It also allows the user to provision different certificates for
712 * different uses based on keyUsage, eg if they want to avoid signing
713 * and decrypting with the same RSA key.
714 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200716 MBEDTLS_SSL_IS_CLIENT,
717 MBEDTLS_SSL_VERSION_TLS1_2,
718 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
720 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200721 continue;
722 }
723
Valerio Settie9646ec2023-08-02 20:02:28 +0200724#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (pk_alg == MBEDTLS_PK_ECDSA &&
726 ssl_check_key_curve(&cur->cert->pk,
727 ssl->handshake->curves_tls_id) != 0) {
728 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100729 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000730 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100731#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100732
733 /* If we get there, we got a winner */
734 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100735 }
736
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200737 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100739 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
741 ssl->handshake->key_cert->cert);
742 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100743 }
744
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100746}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100748
749/*
750 * Check if a given ciphersuite is suitable for use with our config/keys/etc
751 * Sets ciphersuite_info only if the suite matches.
752 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200753MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100754static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
755 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100756{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200757 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100758
Jerry Yue7541932022-01-28 10:21:24 +0800759#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100760 mbedtls_pk_type_t sig_type;
761#endif
762
Gilles Peskine449bd832023-01-11 14:50:10 +0100763 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
764 if (suite_info == NULL) {
765 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
766 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100767 }
768
Gilles Peskine449bd832023-01-11 14:50:10 +0100769 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
770 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000771
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 if (suite_info->min_tls_version > ssl->tls_version ||
773 suite_info->max_tls_version < ssl->tls_version) {
774 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
775 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000776 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100777
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200778#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100779 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
780 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
781 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
782 "not configured or ext missing"));
783 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200784 }
785#endif
786
787
Valerio Setti60d3b912023-07-25 10:43:53 +0200788#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200789 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
791 (ssl->handshake->curves_tls_id == NULL ||
792 ssl->handshake->curves_tls_id[0] == 0)) {
793 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
794 "no common elliptic curve"));
795 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000796 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100797#endif
798
Gilles Peskineeccd8882020-03-10 12:19:08 +0100799#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100800 /* If the ciphersuite requires a pre-shared key and we don't
801 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100802 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
803 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
804 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
805 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000806 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100807#endif
808
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810 /*
811 * Final check: if ciphersuite requires us to have a
812 * certificate/key of a particular type:
813 * - select the appropriate certificate if we have one, or
814 * - try the next ciphersuite if we don't
815 * This must be done last since we modify the key_cert list.
816 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100817 if (ssl_pick_cert(ssl, suite_info) != 0) {
818 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
819 "no suitable certificate"));
820 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000821 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100822#endif
823
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200824#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
825 /* If the ciphersuite requires signing, check whether
826 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
828 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200829 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
831 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
832 "for signature algorithm %u", (unsigned) sig_type));
833 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200834 }
835
836#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
837
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100838 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100839 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100840}
841
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200842/* This function doesn't alert on errors that happen early during
843 ClientHello parsing because they might indicate that the client is
844 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200845MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100846static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000847{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100848 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200849 size_t i, j;
850 size_t ciph_offset, comp_offset, ext_offset;
851 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200853 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100854#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000855 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000857 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100858#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000859 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200860 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000862
Hanno Becker7e5437a2017-04-28 17:15:26 +0100863 /* If there is no signature-algorithm extension present,
864 * we need to fall back to the default values for allowed
865 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800866#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100867 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800868#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100869
Gilles Peskine449bd832023-01-11 14:50:10 +0100870 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000871
David Horstmanne0af39a2022-10-06 18:19:18 +0100872 int renegotiating;
873
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200875read_record_header:
876#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100877 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100879 * otherwise read it ourselves manually in order to support SSLv2
880 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100881 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
882 * ClientHello has been already fully fetched by the TLS 1.3 code and the
883 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100884 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100885 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100888#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100889 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200891 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
893 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000894 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000895 }
896
897 buf = ssl->in_hdr;
898
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000900
Paul Bakkerec636f32012-09-09 19:17:02 +0000901 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100902 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000903 *
904 * Record layer:
905 * 0 . 0 message type
906 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200907 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000908 * 3 . 4 message length
909 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100910 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
911 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
914 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
915 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100916 }
917
Gilles Peskine449bd832023-01-11 14:50:10 +0100918 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000919 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100920
Gilles Peskine449bd832023-01-11 14:50:10 +0100921 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
922 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100923
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200924 /* For DTLS if this is the initial handshake, remember the client sequence
925 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100927 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928#if defined(MBEDTLS_SSL_RENEGOTIATION)
929 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000930#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200932 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
934 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
935 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200936 }
937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
939 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
943 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200944 ssl->next_record_offset = 0;
945 ssl->in_left = 0;
946 goto read_record_header;
947 }
948
949 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200951#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200952 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200954
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000955 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200959 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000960 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100962#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000963 {
Ronald Cron6291b232023-03-08 15:51:25 +0100964 if (ssl->keep_current_message) {
965 ssl->keep_current_message = 0;
966 } else {
967 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
968 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
969 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
970 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000971
Ronald Cron6291b232023-03-08 15:51:25 +0100972 if ((ret = mbedtls_ssl_fetch_input(ssl,
973 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
974 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
975 return ret;
976 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200977
Ronald Cron6291b232023-03-08 15:51:25 +0100978 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100980 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
981 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
982 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200983#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100984 ssl->in_left = 0;
985 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100986 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000987
988 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000989
Gilles Peskine449bd832023-01-11 14:50:10 +0100990 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +0100991
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +0100992 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
993 if (0 != ret) {
994 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
995 return ret;
996 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000997
998 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +0200999 * Handshake layer:
1000 * 0 . 0 handshake type
1001 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001002 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001003 * 6 . 8 DTLS only: fragment offset
1004 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001005 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001006 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1007 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1008 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001009 }
1010
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001012
Gilles Peskine449bd832023-01-11 14:50:10 +01001013 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1014 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1015 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001016 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001017
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001018#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001020 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001021 * Copy the client's handshake message_seq on initial handshakes,
1022 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001023 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001024#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001026 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001027 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1029 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1030 "%u (expected %u)", cli_msg_seq,
1031 ssl->handshake->in_msg_seq));
1032 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001033 }
1034
1035 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001036 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001037#endif
1038 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001039 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001040 ssl->handshake->out_msg_seq = cli_msg_seq;
1041 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1042 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001043 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001044 /*
1045 * For now we don't support fragmentation, so make sure
1046 * fragment_offset == 0 and fragment_length == length
1047 */
1048 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1050 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1051 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001052 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 4, ("fragment_offset=%u fragment_length=%u length=%u",
1054 (unsigned) fragment_offset, (unsigned) fragment_length,
1055 (unsigned) length));
1056 if (fragment_offset != 0 || length != fragment_length) {
1057 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1058 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001059 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001060 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001061 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001062#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001063
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 buf += mbedtls_ssl_hs_hdr_len(ssl);
1065 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001066
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001067 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001068 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001069 * 0 . 1 protocol version
1070 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001071 * 34 . 34 session id length (1 byte)
1072 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001073 * 35+x . 35+x DTLS only: cookie length (1 byte)
1074 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001075 * .. . .. ciphersuite list length (2 bytes)
1076 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001077 * .. . .. compression alg. list length (1 byte)
1078 * .. . .. compression alg. list
1079 * .. . .. extensions length (2 bytes, optional)
1080 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001081 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001082
1083 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001084 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001085 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1086 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001087 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 if (msg_len < 38) {
1089 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1090 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001091 }
1092
1093 /*
1094 * Check and save the protocol version
1095 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001097
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001098 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1099 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001100 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001101 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001102
Gilles Peskine449bd832023-01-11 14:50:10 +01001103 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1104 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1105 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1106 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1107 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001108 }
1109
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001110 /*
1111 * Save client random (inc. Unix time)
1112 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001113 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001114
Gilles Peskine449bd832023-01-11 14:50:10 +01001115 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001116
1117 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001118 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001119 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001120 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001121
Gilles Peskine449bd832023-01-11 14:50:10 +01001122 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1123 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1124 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1125 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1126 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1127 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001128 }
1129
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001131
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001132 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001133 memset(ssl->session_negotiate->id, 0,
1134 sizeof(ssl->session_negotiate->id));
1135 memcpy(ssl->session_negotiate->id, buf + 35,
1136 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001137
1138 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001139 * Check the cookie length and content
1140 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001142 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001143 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001144 cookie_len = buf[cookie_offset];
1145
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1147 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1148 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1149 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1150 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001151 }
1152
Gilles Peskine449bd832023-01-11 14:50:10 +01001153 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1154 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001156#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001158#if defined(MBEDTLS_SSL_RENEGOTIATION)
1159 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001160#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 ) {
1162 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1163 buf + cookie_offset + 1, cookie_len,
1164 ssl->cli_id, ssl->cli_id_len) != 0) {
1165 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001166 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 } else {
1168 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001169 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001170 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001171 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001172#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001173 {
1174 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001176 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1178 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001179 }
1180
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001182 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001183
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 /*
1185 * Check the ciphersuitelist length (will be parsed later)
1186 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001187 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001191
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001192 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001193
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001195 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 (ciph_len % 2) != 0) {
1197 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1198 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1199 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1200 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001201 }
1202
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1204 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001205
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001206 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001207 * Check the compression algorithm's length.
1208 * The list contents are ignored because implementing
1209 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1210 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001211 */
1212 comp_offset = ciph_offset + 2 + ciph_len;
1213
1214 comp_len = buf[comp_offset];
1215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001217 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 comp_len + comp_offset + 1 > msg_len) {
1219 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1220 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1221 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1222 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001223 }
1224
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1226 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 /*
1229 * Check the extension length
1230 */
1231 ext_offset = comp_offset + 1 + comp_len;
1232 if (msg_len > ext_offset) {
1233 if (msg_len < ext_offset + 2) {
1234 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1235 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1236 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1237 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001238 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001239
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001240 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001241
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 if (msg_len != ext_offset + 2 + ext_len) {
1243 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1244 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1245 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1246 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1247 }
1248 } else {
1249 ext_len = 0;
1250 }
Paul Bakker48916f92012-09-16 19:57:18 +00001251
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 ext = buf + ext_offset + 2;
1253 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1254
1255 while (ext_len != 0) {
1256 unsigned int ext_id;
1257 unsigned int ext_size;
1258 if (ext_len < 4) {
1259 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1260 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1261 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1262 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1263 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001264 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1265 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001266
1267 if (ext_size + 4 > ext_len) {
1268 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1269 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1270 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1271 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1272 }
1273 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001275 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1277 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1278 ext + 4 + ext_size);
1279 if (ret != 0) {
1280 return ret;
1281 }
Simon Butcher584a5472016-05-23 16:24:52 +01001282 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001283#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001284
Simon Butcher584a5472016-05-23 16:24:52 +01001285 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001287#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001288 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001289#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001290
Gilles Peskine449bd832023-01-11 14:50:10 +01001291 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1292 if (ret != 0) {
1293 return ret;
1294 }
Simon Butcher584a5472016-05-23 16:24:52 +01001295 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001296
Jerry Yue7541932022-01-28 10:21:24 +08001297#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001298 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001300
Gilles Peskine449bd832023-01-11 14:50:10 +01001301 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1302 if (ret != 0) {
1303 return ret;
1304 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001305
1306 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001307 break;
Jerry Yue7541932022-01-28 10:21:24 +08001308#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001309
Valerio Setti60d3b912023-07-25 10:43:53 +02001310#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001311 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001312 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001313 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001315
Gilles Peskine449bd832023-01-11 14:50:10 +01001316 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1317 if (ret != 0) {
1318 return ret;
1319 }
Simon Butcher584a5472016-05-23 16:24:52 +01001320 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001321
Simon Butcher584a5472016-05-23 16:24:52 +01001322 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001324 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001325
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1327 if (ret != 0) {
1328 return ret;
1329 }
Simon Butcher584a5472016-05-23 16:24:52 +01001330 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001331#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001332 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001333 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001334
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001335#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001336 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1340 if (ret != 0) {
1341 return ret;
1342 }
Simon Butcher584a5472016-05-23 16:24:52 +01001343 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001344#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001346#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001347 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001349
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1351 if (ret != 0) {
1352 return ret;
1353 }
Simon Butcher584a5472016-05-23 16:24:52 +01001354 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001355#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001356
Hanno Beckera0e20d02019-05-15 14:03:01 +01001357#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001358 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001360
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1362 if (ret != 0) {
1363 return ret;
1364 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001365 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001366#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001368#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001369 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001371
Gilles Peskine449bd832023-01-11 14:50:10 +01001372 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1373 if (ret != 0) {
1374 return ret;
1375 }
Simon Butcher584a5472016-05-23 16:24:52 +01001376 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001377#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001379#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001380 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001382
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1384 if (ret != 0) {
1385 return ret;
1386 }
Simon Butcher584a5472016-05-23 16:24:52 +01001387 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001390#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001391 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001393
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1395 if (ret != 0) {
1396 return ret;
1397 }
Simon Butcher584a5472016-05-23 16:24:52 +01001398 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001399#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001401#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001402 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001404
Gilles Peskine449bd832023-01-11 14:50:10 +01001405 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1406 ext + 4 + ext_size);
1407 if (ret != 0) {
1408 return ret;
1409 }
Simon Butcher584a5472016-05-23 16:24:52 +01001410 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001412
Johan Pascalb62bb512015-12-03 21:56:45 +01001413#if defined(MBEDTLS_SSL_DTLS_SRTP)
1414 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001416
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1418 if (ret != 0) {
1419 return ret;
1420 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001421 break;
1422#endif /* MBEDTLS_SSL_DTLS_SRTP */
1423
Simon Butcher584a5472016-05-23 16:24:52 +01001424 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1426 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001427 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001428
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 ext_len -= 4 + ext_size;
1430 ext += 4 + ext_size;
1431 }
1432
Jerry Yue7541932022-01-28 10:21:24 +08001433#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001434
1435 /*
1436 * Try to fall back to default hash SHA1 if the client
1437 * hasn't provided any preferred signature-hash combinations.
1438 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001440 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1441 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001442#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1444 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001445#endif
1446#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1448 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001449#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001450 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001451 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001452
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001453 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1454 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1455 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001456
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001458 }
1459
Jerry Yue7541932022-01-28 10:21:24 +08001460#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001461
Paul Bakker48916f92012-09-16 19:57:18 +00001462 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001463 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1464 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001465 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1466 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1467 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1470 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1471 "during renegotiation"));
1472 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1473 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1474 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001475 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001476#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001477 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001478 break;
1479 }
1480 }
1481
1482 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001483 * Renegotiation security checks
1484 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001485 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1486 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1487 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001488 handshake_failure = 1;
1489 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001490#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001491 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001493 renegotiation_info_seen == 0) {
1494 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001495 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001496 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1497 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1498 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1499 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001500 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001501 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1502 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1503 renegotiation_info_seen == 1) {
1504 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001505 handshake_failure = 1;
1506 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001507#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001508
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 if (handshake_failure == 1) {
1510 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1511 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1512 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001513 }
Paul Bakker380da532012-04-18 16:10:25 +00001514
Paul Bakker41c83d32013-03-20 14:39:14 +01001515 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001516 * Server certification selection (after processing TLS extensions)
1517 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001518 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1519 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1520 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001521 }
Glenn Strauss69894072022-01-24 12:58:00 -05001522#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1523 ssl->handshake->sni_name = NULL;
1524 ssl->handshake->sni_name_len = 0;
1525#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001526
1527 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001528 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001529 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001530 * and certificate from the SNI callback triggered by the SNI extension
1531 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001532 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001533 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001534 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001535 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001536
Gilles Peskine449bd832023-01-11 14:50:10 +01001537 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1538 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1539 for (i = 0; ciphersuites[i] != 0; i++) {
1540 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001541 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001542 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001543
TRodziewicz8476f2f2021-06-02 14:34:47 +02001544 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001545
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1547 &ciphersuite_info)) != 0) {
1548 return ret;
1549 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001550
Gilles Peskine449bd832023-01-11 14:50:10 +01001551 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001552 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001553 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001554 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001556 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001557 for (i = 0; ciphersuites[i] != 0; i++) {
1558 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1559 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001560 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001562
1563 got_common_suite = 1;
1564
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1566 &ciphersuite_info)) != 0) {
1567 return ret;
1568 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001569
Gilles Peskine449bd832023-01-11 14:50:10 +01001570 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001571 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001572 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001573 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001575 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001576
Gilles Peskine449bd832023-01-11 14:50:10 +01001577 if (got_common_suite) {
1578 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1579 "but none of them usable"));
1580 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1581 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1582 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1583 } else {
1584 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1585 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1586 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1587 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001588 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001589
1590have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001591 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001592
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001593 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001594 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001595
Paul Bakker5121ce52009-01-03 21:22:43 +00001596 ssl->state++;
1597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001598#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001599 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1600 mbedtls_ssl_recv_flight_completed(ssl);
1601 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001602#endif
1603
Hanno Becker7e5437a2017-04-28 17:15:26 +01001604 /* Debugging-only output for testsuite */
1605#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001606 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001607 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1608 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001609 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001610 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1611 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1612 sig_hash));
1613 } else {
1614 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1615 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001616 }
1617#endif
1618
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001620
Gilles Peskine449bd832023-01-11 14:50:10 +01001621 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001622}
1623
Hanno Beckera0e20d02019-05-15 14:03:01 +01001624#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001625static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1626 unsigned char *buf,
1627 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001628{
1629 unsigned char *p = buf;
1630 size_t ext_len;
1631 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1632
1633 *olen = 0;
1634
1635 /* Skip writing the extension if we don't want to use it or if
1636 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001638 return;
1639 }
1640
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1642 * which is at most 255, so the increment cannot overflow. */
1643 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1644 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1645 return;
1646 }
1647
1648 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001649
1650 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001651 * struct {
1652 * opaque cid<0..2^8-1>;
1653 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001654 */
1655 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001656 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001657 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001658 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001659 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001660
1661 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001662 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001663
1664 *olen = ssl->own_cid_len + 5;
1665}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001666#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001667
Neil Armstrong76b74072022-04-06 13:43:54 +02001668#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001669static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1670 unsigned char *buf,
1671 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001672{
1673 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001675
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001676 /*
1677 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1678 * from a client and then selects a stream or Authenticated Encryption
1679 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1680 * encrypt-then-MAC response extension back to the client."
1681 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001682 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 ssl->session_negotiate->ciphersuite);
1684 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001685 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001687 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001688 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001689 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001691
Gilles Peskine449bd832023-01-11 14:50:10 +01001692 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001693 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001694 }
Ronald Cron862902d2022-03-24 14:15:28 +01001695 }
1696
Gilles Peskine449bd832023-01-11 14:50:10 +01001697 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001698 *olen = 0;
1699 return;
1700 }
1701
Gilles Peskine449bd832023-01-11 14:50:10 +01001702 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001703
Gilles Peskine449bd832023-01-11 14:50:10 +01001704 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001705 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001706
1707 *p++ = 0x00;
1708 *p++ = 0x00;
1709
1710 *olen = 4;
1711}
Neil Armstrong76b74072022-04-06 13:43:54 +02001712#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001715static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1716 unsigned char *buf,
1717 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001718{
1719 unsigned char *p = buf;
1720
Gilles Peskine449bd832023-01-11 14:50:10 +01001721 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001722 *olen = 0;
1723 return;
1724 }
1725
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1727 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001728
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001730 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001731
1732 *p++ = 0x00;
1733 *p++ = 0x00;
1734
1735 *olen = 4;
1736}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001737#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001738
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001739#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001740static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1741 unsigned char *buf,
1742 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001743{
1744 unsigned char *p = buf;
1745
Gilles Peskine449bd832023-01-11 14:50:10 +01001746 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001747 *olen = 0;
1748 return;
1749 }
1750
Gilles Peskine449bd832023-01-11 14:50:10 +01001751 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001752
Gilles Peskine449bd832023-01-11 14:50:10 +01001753 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001754 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001755
1756 *p++ = 0x00;
1757 *p++ = 0x00;
1758
1759 *olen = 4;
1760}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001761#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001762
Gilles Peskine449bd832023-01-11 14:50:10 +01001763static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1764 unsigned char *buf,
1765 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001766{
1767 unsigned char *p = buf;
1768
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001770 *olen = 0;
1771 return;
1772 }
1773
Gilles Peskine449bd832023-01-11 14:50:10 +01001774 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001775
Gilles Peskine449bd832023-01-11 14:50:10 +01001776 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001777 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001778
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001779#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001781 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001782 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001783 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001784
Gilles Peskine449bd832023-01-11 14:50:10 +01001785 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001786 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001787 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001788 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001789 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001790#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001791 {
1792 *p++ = 0x00;
1793 *p++ = 0x01;
1794 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001795 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001796
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001797 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001798}
1799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001800#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001801static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1802 unsigned char *buf,
1803 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001804{
1805 unsigned char *p = buf;
1806
Gilles Peskine449bd832023-01-11 14:50:10 +01001807 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001808 *olen = 0;
1809 return;
1810 }
1811
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001813
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001815 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001816
1817 *p++ = 0x00;
1818 *p++ = 1;
1819
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001820 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001821
1822 *olen = 5;
1823}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001824#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001825
Valerio Setti7aeec542023-07-05 18:57:21 +02001826#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001827 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001828 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001829static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1830 unsigned char *buf,
1831 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001832{
1833 unsigned char *p = buf;
1834 ((void) ssl);
1835
Gilles Peskine449bd832023-01-11 14:50:10 +01001836 if ((ssl->handshake->cli_exts &
1837 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001838 *olen = 0;
1839 return;
1840 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001841
Gilles Peskine449bd832023-01-11 14:50:10 +01001842 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001843
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001845 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001846
1847 *p++ = 0x00;
1848 *p++ = 2;
1849
1850 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001851 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001852
1853 *olen = 6;
1854}
Valerio Setti45d56f32023-07-13 17:23:20 +02001855#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001856 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001857 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001858
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001859#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001860static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1861 unsigned char *buf,
1862 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001863{
Janos Follath865b3eb2019-12-16 11:46:15 +00001864 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001865 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001866 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001867 size_t kkpp_len;
1868
1869 *olen = 0;
1870
1871 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 if (ssl->handshake->ciphersuite_info->key_exchange !=
1873 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001874 return;
1875 }
1876
Gilles Peskine449bd832023-01-11 14:50:10 +01001877 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1878
1879 if (end - p < 4) {
1880 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1881 return;
1882 }
1883
1884 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001885 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001886
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001888 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 MBEDTLS_ECJPAKE_ROUND_ONE);
1890 if (ret != 0) {
1891 psa_destroy_key(ssl->handshake->psa_pake_password);
1892 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1893 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001894 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001895 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001896
Gilles Peskine449bd832023-01-11 14:50:10 +01001897 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001898 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001899
1900 *olen = kkpp_len + 4;
1901}
1902#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1903
Gilles Peskine449bd832023-01-11 14:50:10 +01001904#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1905static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1906 unsigned char *buf,
1907 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001908{
Ron Eldor75870ec2018-12-06 17:31:55 +02001909 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001910 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001911 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1912
1913 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001914
Gilles Peskine449bd832023-01-11 14:50:10 +01001915 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1916 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001917 return;
1918 }
1919
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001921
Gilles Peskine449bd832023-01-11 14:50:10 +01001922 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001923 mki_len = ssl->dtls_srtp_info.mki_len;
1924 }
1925
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001926 /* The extension total size is 9 bytes :
1927 * - 2 bytes for the extension tag
1928 * - 2 bytes for the total size
1929 * - 2 bytes for the protection profile length
1930 * - 2 bytes for the protection profile
1931 * - 1 byte for the mki length
1932 * + the actual mki length
1933 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001934 if ((size_t) (end - buf) < mki_len + 9) {
1935 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001936 return;
1937 }
1938
Johan Pascalb62bb512015-12-03 21:56:45 +01001939 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001940 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001941 /*
1942 * total length 5 and mki value: only one profile(2 bytes)
1943 * and length(2 bytes) and srtp_mki )
1944 */
Ron Eldor591f1622018-01-22 12:30:04 +02001945 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001946 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001947
1948 /* protection profile length: 2 */
1949 buf[4] = 0x00;
1950 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001951 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1953 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1954 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1955 } else {
1956 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001957 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001958 }
1959
Ron Eldor591f1622018-01-22 12:30:04 +02001960 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001961 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001962
Ron Eldor591f1622018-01-22 12:30:04 +02001963 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001964}
1965#endif /* MBEDTLS_SSL_DTLS_SRTP */
1966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001967#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001968MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001969static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001970{
Janos Follath865b3eb2019-12-16 11:46:15 +00001971 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001972 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001973 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001974
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001976
1977 /*
1978 * struct {
1979 * ProtocolVersion server_version;
1980 * opaque cookie<0..2^8-1>;
1981 * } HelloVerifyRequest;
1982 */
1983
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001984 /* The RFC is not clear on this point, but sending the actual negotiated
1985 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001986 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
1987 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001988 p += 2;
1989
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001990 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 if (ssl->conf->f_cookie_write == NULL) {
1992 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
1993 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001994 }
1995
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001996 /* Skip length byte until we know the length */
1997 cookie_len_byte = p++;
1998
Gilles Peskine449bd832023-01-11 14:50:10 +01001999 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2000 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2001 ssl->cli_id, ssl->cli_id_len)) != 0) {
2002 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2003 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002004 }
2005
Gilles Peskine449bd832023-01-11 14:50:10 +01002006 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002007
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002009
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002010 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002011 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2012 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002014 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002015
Gilles Peskine449bd832023-01-11 14:50:10 +01002016 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2017 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2018 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002019 }
2020
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002021#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002022 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2023 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2024 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2025 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002026 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002027#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002028
Gilles Peskine449bd832023-01-11 14:50:10 +01002029 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002030
Gilles Peskine449bd832023-01-11 14:50:10 +01002031 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002032}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002033#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002034
Gilles Peskine449bd832023-01-11 14:50:10 +01002035static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002036{
2037 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002038 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002039 mbedtls_ssl_session * const session = ssl->session_negotiate;
2040
2041 /* Resume is 0 by default, see ssl_handshake_init().
2042 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002043 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002044 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002045 }
2046 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002047 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002048 }
2049 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002050 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002052#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002053 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
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#endif
2057
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002059
Gilles Peskine449bd832023-01-11 14:50:10 +01002060 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2061 session->id,
2062 session->id_len,
2063 &session_tmp);
2064 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002065 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002066 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002067
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002069 /* Mismatch between cached and negotiated session */
2070 goto exit;
2071 }
2072
2073 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002075 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002077
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002079 ssl->handshake->resume = 1;
2080
2081exit:
2082
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002084}
2085
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002086MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002087static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002088{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002090 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002091#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002092 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002093 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002094 unsigned char *buf, *p;
2095
Gilles Peskine449bd832023-01-11 14:50:10 +01002096 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002098#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2100 ssl->handshake->cookie_verify_result != 0) {
2101 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2102 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002103
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002105 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002106#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002107
Paul Bakker5121ce52009-01-03 21:22:43 +00002108 /*
2109 * 0 . 0 handshake type
2110 * 1 . 3 handshake length
2111 * 4 . 5 protocol version
2112 * 6 . 9 UNIX time()
2113 * 10 . 37 random bytes
2114 */
2115 buf = ssl->out_msg;
2116 p = buf + 4;
2117
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002119 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2122 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 t = mbedtls_time(NULL);
2126 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002127 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002128
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2130 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002131#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2133 return ret;
2134 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002135
2136 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002137#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002138
Ronald Cronc5649382023-04-04 15:33:42 +02002139 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002140 return ret;
2141 }
Ronald Cronc5649382023-04-04 15:33:42 +02002142 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002143
Ronald Cronc5649382023-04-04 15:33:42 +02002144#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2145 /*
2146 * RFC 8446
2147 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2148 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2149 * response to a ClientHello MUST set the last 8 bytes of their Random
2150 * value specially in their ServerHello.
2151 */
2152 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2153 static const unsigned char magic_tls12_downgrade_string[] =
2154 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2155
2156 MBEDTLS_STATIC_ASSERT(
2157 sizeof(magic_tls12_downgrade_string) == 8,
2158 "magic_tls12_downgrade_string does not have the expected size");
2159
Ronald Cronfe01ec22023-04-06 09:56:53 +02002160 memcpy(p, magic_tls12_downgrade_string,
2161 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002162 } else
2163#endif
2164 {
2165 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2166 return ret;
2167 }
2168 }
2169 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002170
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002172
Gilles Peskine449bd832023-01-11 14:50:10 +01002173 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002174
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002178 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002179 * New session, create a new session id,
2180 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002181 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 ssl->state++;
2183
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002184#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002185 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002186#endif
2187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002188#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002190 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 memset(ssl->session_negotiate->id, 0, 32);
2192 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002193#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002194 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002195 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002196 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2197 n)) != 0) {
2198 return ret;
2199 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002200 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002201 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002202 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002203 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002204 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002205 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002206 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002207
Gilles Peskine449bd832023-01-11 14:50:10 +01002208 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2209 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2210 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002211 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002212 }
2213
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002214 /*
2215 * 38 . 38 session id length
2216 * 39 . 38+n session id
2217 * 39+n . 40+n chosen ciphersuite
2218 * 41+n . 41+n chosen compression alg.
2219 * 42+n . 43+n extensions length
2220 * 44+n . 43+n+m extensions
2221 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002222 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002224 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002225
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2227 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2228 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2229 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002230
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002232 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002233 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2236 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2237 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2238 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002239
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002240 /*
2241 * First write extensions, then the total length
2242 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002243 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002244 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002246#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002248 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002249#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002250
Hanno Beckera0e20d02019-05-15 14:03:01 +01002251#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002252 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002253 ext_len += olen;
2254#endif
2255
Neil Armstrong76b74072022-04-06 13:43:54 +02002256#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002257 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002258 ext_len += olen;
2259#endif
2260
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002261#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002262 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002263 ext_len += olen;
2264#endif
2265
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002266#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002267 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002268 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002269#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002270
Valerio Setti7aeec542023-07-05 18:57:21 +02002271#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002272 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002273 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002274 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2276 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2277 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002278 ext_len += olen;
2279 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002280#endif
2281
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002282#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002283 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002284 ext_len += olen;
2285#endif
2286
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002287#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002288 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002289 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2290 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002291 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002292 }
Paul Elliottf518f812022-07-11 12:36:20 +01002293
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002294 ext_len += olen;
2295#endif
2296
Johan Pascalb62bb512015-12-03 21:56:45 +01002297#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002298 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002299 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002300#endif
2301
Gilles Peskine449bd832023-01-11 14:50:10 +01002302 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2303 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002304
Gilles Peskine449bd832023-01-11 14:50:10 +01002305 if (ext_len > 0) {
2306 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002307 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002308 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002309
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002310 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002311 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2312 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002313
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002315
Gilles Peskine449bd832023-01-11 14:50:10 +01002316 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002317
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002319}
2320
Gilles Peskineeccd8882020-03-10 12:19:08 +01002321#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002322MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002323static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002324{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002325 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002326 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002327
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002329
Gilles Peskine449bd832023-01-11 14:50:10 +01002330 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2331 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002332 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002333 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002334 }
2335
Gilles Peskine449bd832023-01-11 14:50:10 +01002336 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2337 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002338}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002339#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002340MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002341static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002342{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002343 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002344 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002345 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002346 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002347 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002348 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002349 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002350 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002351 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002352
Gilles Peskine449bd832023-01-11 14:50:10 +01002353 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002354
2355 ssl->state++;
2356
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002357#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002358 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002359 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002360 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002361#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002363
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2365 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2366 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2367 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002368 }
2369
2370 /*
2371 * 0 . 0 handshake type
2372 * 1 . 3 handshake length
2373 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002374 * 5 .. m-1 cert types
2375 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002376 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002377 * n .. n+1 length of all DNs
2378 * n+2 .. n+3 length of DN 1
2379 * n+4 .. ... Distinguished Name #1
2380 * ... .. ... length of DN 2, etc.
2381 */
2382 buf = ssl->out_msg;
2383 p = buf + 4;
2384
2385 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002386 * Supported certificate types
2387 *
2388 * ClientCertificateType certificate_types<1..2^8-1>;
2389 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002390 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002391 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002393#if defined(MBEDTLS_RSA_C)
2394 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002395#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002396#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002397 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002398#endif
2399
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002400 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002401 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002402
Paul Bakker577e0062013-08-28 11:57:20 +02002403 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002404
Paul Bakker926af752012-11-23 13:38:07 +01002405 /*
2406 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002407 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002408 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2409 *
2410 * struct {
2411 * HashAlgorithm hash;
2412 * SignatureAlgorithm signature;
2413 * } SignatureAndHashAlgorithm;
2414 *
2415 * enum { (255) } HashAlgorithm;
2416 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002417 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002418 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2419 if (sig_alg == NULL) {
2420 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2421 }
Ronald Cron8457c122022-03-07 11:32:54 +01002422
Gilles Peskine449bd832023-01-11 14:50:10 +01002423 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2424 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002425
Gilles Peskine449bd832023-01-11 14:50:10 +01002426 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002427 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002428 }
2429 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002430 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002431 }
Simon Butcher99000142016-10-13 17:21:01 +01002432
Paul Elliott96a0fd92022-11-08 17:09:56 +00002433 /* Write elements at offsets starting from 1 (offset 0 is for the
2434 * length). Thus the offset of each element is the length of the
2435 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002436 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002438
Paul Bakker926af752012-11-23 13:38:07 +01002439 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002440
Paul Elliott96a0fd92022-11-08 17:09:56 +00002441 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002442 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002443 sa_len += 2;
2444 p += sa_len;
2445
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002446 /*
2447 * DistinguishedName certificate_authorities<0..2^16-1>;
2448 * opaque DistinguishedName<1..2^16-1>;
2449 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002450 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002451
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002452 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002453
Gilles Peskine449bd832023-01-11 14:50:10 +01002454 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002455 /* NOTE: If trusted certificates are provisioned
2456 * via a CA callback (configured through
2457 * `mbedtls_ssl_conf_ca_cb()`, then the
2458 * CertificateRequest is currently left empty. */
2459
Glenn Strauss999ef702022-03-11 01:37:23 -05002460#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2461#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002462 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002463 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002464 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002465#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002466 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002467 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002468 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002469#endif
Janos Follath088ce432017-04-10 12:42:31 +01002470#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002471 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002472 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002473 } else
Janos Follath088ce432017-04-10 12:42:31 +01002474#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002476
Gilles Peskine449bd832023-01-11 14:50:10 +01002477 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002478 /* It follows from RFC 5280 A.1 that this length
2479 * can be represented in at most 11 bits. */
2480 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002481
Gilles Peskine449bd832023-01-11 14:50:10 +01002482 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2483 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002484 break;
2485 }
2486
Gilles Peskine449bd832023-01-11 14:50:10 +01002487 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002488 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002489 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002490 p += dn_size;
2491
Gilles Peskine449bd832023-01-11 14:50:10 +01002492 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002493
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002494 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002495 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002496 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002497 }
2498
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002499 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002500 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2501 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002502 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002503
Gilles Peskine449bd832023-01-11 14:50:10 +01002504 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002505
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002509}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002510#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002511
Valerio Setti4d0e8462023-10-06 13:20:21 +02002512#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002513 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002514MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002515static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002516{
2517 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2518 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002519 mbedtls_pk_context *pk;
2520 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002521 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002522 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2523 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002524#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002525 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002526 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002527 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002528 mbedtls_ecp_keypair *key;
2529#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002530
Gilles Peskine449bd832023-01-11 14:50:10 +01002531 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002532
Gilles Peskine449bd832023-01-11 14:50:10 +01002533 if (pk == NULL) {
2534 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2535 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002536
Valerio Setti0813b6f2023-06-16 12:18:53 +02002537 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002538
Valerio Setti0813b6f2023-06-16 12:18:53 +02002539 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002540 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002541#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2542 case MBEDTLS_PK_ECKEY:
2543 case MBEDTLS_PK_ECKEY_DH:
2544 case MBEDTLS_PK_ECDSA:
2545#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002546 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2547 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2548 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002549
Valerio Settibced8bc2023-12-06 10:40:47 +01002550 /* Get the attributes of the key previously parsed by PK module in
2551 * order to extract its type and length (in bits). */
2552 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002553 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002554 ret = PSA_TO_MBEDTLS_ERR(status);
2555 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002556 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002557 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002558 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002559
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002560#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2561 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002562 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2563 * module and only have ECDSA capabilities. Since we need
2564 * them for ECDH later, we export and then re-import them with
2565 * proper flags and algorithm. Of course We also set key's type
2566 * and bits that we just got above. */
2567 key_attributes = psa_key_attributes_init();
2568 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2569 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2570 psa_set_key_type(&key_attributes,
2571 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2572 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002573
Valerio Setti202bb712023-12-06 17:05:24 +01002574 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2575 if (status != PSA_SUCCESS) {
2576 ret = PSA_TO_MBEDTLS_ERR(status);
2577 goto exit;
2578 }
2579 status = psa_import_key(&key_attributes, buf, key_len,
2580 &ssl->handshake->xxdh_psa_privkey);
2581 if (status != PSA_SUCCESS) {
2582 ret = PSA_TO_MBEDTLS_ERR(status);
2583 goto exit;
2584 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002585
Valerio Setti202bb712023-12-06 17:05:24 +01002586 /* Set this key as owned by the TLS library: it will be its duty
2587 * to clear it exit. */
2588 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002589
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002590 ret = 0;
2591 break;
2592 }
2593#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2594
2595 /* Opaque key is created by the user (externally from Mbed TLS)
2596 * so we assume it already has the right algorithm and flags
2597 * set. Just copy its ID as reference. */
2598 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2599 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 ret = 0;
2601 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002602
Valerio Setti0813b6f2023-06-16 12:18:53 +02002603#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 case MBEDTLS_PK_ECKEY:
2605 case MBEDTLS_PK_ECKEY_DH:
2606 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002607 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002608 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002609 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002610 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2611 }
Valerio Setti97207782023-05-18 18:59:06 +02002612 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002613 if (tls_id == 0) {
2614 /* This elliptic curve is not supported */
2615 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2616 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002617
Gilles Peskine449bd832023-01-11 14:50:10 +01002618 /* If the above conversion to TLS ID was fine, then also this one will
2619 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002620 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002621 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002622
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002623 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002624
Gilles Peskine449bd832023-01-11 14:50:10 +01002625 key_attributes = psa_key_attributes_init();
2626 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2627 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2628 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002629 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002630 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002631
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002632 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002633 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002634 mbedtls_platform_zeroize(buf, sizeof(buf));
2635 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002636 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002637
Gilles Peskine449bd832023-01-11 14:50:10 +01002638 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002639 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002641 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002642 mbedtls_platform_zeroize(buf, sizeof(buf));
2643 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002644 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002645
Valerio Setti6835b4a2023-06-22 09:06:31 +02002646 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002647 ret = 0;
2648 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002649#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002650 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002651 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002652 }
2653
Valerio Settibced8bc2023-12-06 10:40:47 +01002654exit:
2655 psa_reset_key_attributes(&key_attributes);
2656 mbedtls_platform_zeroize(buf, sizeof(buf));
2657
Gilles Peskine449bd832023-01-11 14:50:10 +01002658 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002659}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002660#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2661 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002662
Gilles Peskineeccd8882020-03-10 12:19:08 +01002663#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002664 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002665MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002666static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2667 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002668{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002669 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2670 * signature length which will be added in ssl_write_server_key_exchange
2671 * after the call to ssl_prepare_server_key_exchange.
2672 * ssl_write_server_key_exchange also takes care of incrementing
2673 * ssl->out_msglen. */
2674 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002675 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2676 - sig_start);
2677 int ret = ssl->conf->f_async_resume(ssl,
2678 sig_start, signature_len, sig_max_len);
2679 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002680 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002681 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002682 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002683 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2684 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002685}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002686#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002687 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002688
Gilles Peskined3eb0612018-01-08 17:07:44 +01002689/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002690 * calculating the signature if any, but excluding formatting the
2691 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002692MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002693static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2694 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002695{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002696 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002697 ssl->handshake->ciphersuite_info;
2698
Gilles Peskineeccd8882020-03-10 12:19:08 +01002699#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002700#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002701 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002702#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002703#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002704
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002705 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002706#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002707 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002708#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002709
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002710#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002711#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002712 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002713#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002714 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 +02002715#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002716#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002717
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002718 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002719
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002720 /*
2721 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002722 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002723 *
2724 */
2725
2726 /*
2727 * - ECJPAKE key exchanges
2728 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002729#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002730 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002731 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002732 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2733 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2734 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002735 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002736 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002737
Valerio Setti6f1b5742022-11-16 10:00:32 +01002738 /*
2739 * The first 3 bytes are:
2740 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2741 * [1, 2] elliptic curve's TLS ID
2742 *
2743 * However since we only support secp256r1 for now, we hardcode its
2744 * TLS ID here
2745 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002746 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002747 MBEDTLS_ECP_DP_SECP256R1);
2748 if (tls_id == 0) {
2749 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002750 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002751 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002752 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002753 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002754
Gilles Peskine449bd832023-01-11 14:50:10 +01002755 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2756 out_p + output_offset,
2757 end_p - out_p - output_offset, &output_len,
2758 MBEDTLS_ECJPAKE_ROUND_TWO);
2759 if (ret != 0) {
2760 psa_destroy_key(ssl->handshake->psa_pake_password);
2761 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2762 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2763 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002764 }
2765
Valerio Setti02c25b52022-11-15 14:08:42 +01002766 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002767 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002768 }
2769#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2770
Hanno Becker1aa267c2017-04-28 17:08:27 +01002771 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002772 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002773 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2774 * we use empty support identity hints here.
2775 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002776#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2777 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002778 ssl->out_msg[ssl->out_msglen++] = 0x00;
2779 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002780 }
Valerio Setti48659a12025-01-15 14:22:28 +01002781#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002782
Hanno Becker7e5437a2017-04-28 17:15:26 +01002783 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002784 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002785 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002786#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002787 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002788 /*
2789 * Ephemeral ECDH parameters:
2790 *
2791 * struct {
2792 * ECParameters curve_params;
2793 * ECPoint public;
2794 * } ServerECDHParams;
2795 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002796 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002797 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002798 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002799 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002800
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002801 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2803 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2804 }
2805 for (; *group_list != 0; group_list++) {
2806 for (curr_tls_id = ssl->handshake->curves_tls_id;
2807 *curr_tls_id != 0; curr_tls_id++) {
2808 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002809 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002810 }
2811 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002812 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002813
Gilles Peskine449bd832023-01-11 14:50:10 +01002814curve_matching_done:
2815 if (*curr_tls_id == 0) {
2816 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2817 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2818 }
2819
2820 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2821 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002822
Neil Armstrongd91526c2022-04-12 14:38:52 +02002823 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2824 psa_key_attributes_t key_attributes;
2825 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002826 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2827 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2828 // data length(1)
2829 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002830 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002831 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002832
Gilles Peskine449bd832023-01-11 14:50:10 +01002833 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002834
Valerio Setti40d9ca92023-01-04 16:08:04 +01002835 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002836 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002837 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002838 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2839 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2840 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002841 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002842 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002843 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002844
2845 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002846 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2847 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002848 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002849 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002850
2851 /*
2852 * ECParameters curve_params
2853 *
2854 * First byte is curve_type, always named_curve
2855 */
2856 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2857
2858 /*
2859 * Next two bytes are the namedcurve value
2860 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002861 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002862 p += 2;
2863
2864 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002865 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002866 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002867 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002868 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002869 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2870 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002871 }
2872
2873 /*
2874 * ECPoint public
2875 *
2876 * First byte is data length.
2877 * It will be filled later. p holds now the data length location.
2878 */
2879
2880 /* Export the public part of the ECDH private key from PSA.
2881 * Make one byte space for the length.
2882 */
2883 unsigned char *own_pubkey = p + data_length_size;
2884
Gilles Peskine449bd832023-01-11 14:50:10 +01002885 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2886 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002887
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002888 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002889 own_pubkey, own_pubkey_max_len,
2890 &len);
2891 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002892 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002894 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2895 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002896 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002897 }
2898
2899 /* Store the length of the exported public key. */
2900 *p = (uint8_t) len;
2901
2902 /* Determine full message length. */
2903 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002904
Jerry Yuc5aef882021-12-23 20:15:02 +08002905#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002906 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002907#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002908
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002909 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002910 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002911#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002912
Hanno Becker1aa267c2017-04-28 17:08:27 +01002913 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002914 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002915 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002916 * exchange parameters, compute and add the signature here.
2917 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002918 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002919#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002920 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2921 if (dig_signed == NULL) {
2922 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2923 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002924 }
2925
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002926 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02002927 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002928 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02002929
Janos Follath865b3eb2019-12-16 11:46:15 +00002930 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002931
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002932 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002933 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002934 * For TLS 1.2, obey signature-hash-algorithm extension
2935 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002936 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002937
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002938 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01002939 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01002940
Dave Rodgmanc37ad442023-11-03 23:36:06 +00002941 unsigned char sig_hash =
2942 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002944
Gilles Peskine449bd832023-01-11 14:50:10 +01002945 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02002946
Ronald Cron8457c122022-03-07 11:32:54 +01002947 /* For TLS 1.2, obey signature-hash-algorithm extension
2948 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
2950 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01002951 /* (... because we choose a cipher suite
2952 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002954 }
2955
Gilles Peskine449bd832023-01-11 14:50:10 +01002956 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01002957
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002958 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002959 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002960 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002961 if (md_alg != MBEDTLS_MD_NONE) {
2962 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2963 dig_signed,
2964 dig_signed_len,
2965 md_alg);
2966 if (ret != 0) {
2967 return ret;
2968 }
2969 } else {
2970 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2971 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002972 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02002973
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002975
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002976 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002977 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002978 */
Ronald Cron8457c122022-03-07 11:32:54 +01002979 /*
2980 * We need to specify signature and hash algorithm explicitly through
2981 * a prefix to the signature.
2982 *
2983 * struct {
2984 * HashAlgorithm hash;
2985 * SignatureAlgorithm signature;
2986 * } SignatureAndHashAlgorithm;
2987 *
2988 * struct {
2989 * SignatureAndHashAlgorithm algorithm;
2990 * opaque signature<0..2^16-1>;
2991 * } DigitallySigned;
2992 *
2993 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002994
Gilles Peskine449bd832023-01-11 14:50:10 +01002995 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
2996 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002997
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002998#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01002999 if (ssl->conf->f_async_sign_start != NULL) {
3000 ret = ssl->conf->f_async_sign_start(ssl,
3001 mbedtls_ssl_own_cert(ssl),
3002 md_alg, hash, hashlen);
3003 switch (ret) {
3004 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3005 /* act as if f_async_sign was null */
3006 break;
3007 case 0:
3008 ssl->handshake->async_in_progress = 1;
3009 return ssl_resume_server_key_exchange(ssl, signature_len);
3010 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3011 ssl->handshake->async_in_progress = 1;
3012 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3013 default:
3014 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3015 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003016 }
3017 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003018#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003019
Gilles Peskine449bd832023-01-11 14:50:10 +01003020 if (mbedtls_ssl_own_key(ssl) == NULL) {
3021 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3022 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003023 }
3024
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003025 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3026 * signature length which will be added in ssl_write_server_key_exchange
3027 * after the call to ssl_prepare_server_key_exchange.
3028 * ssl_write_server_key_exchange also takes care of incrementing
3029 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003030 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3031 md_alg, hash, hashlen,
3032 ssl->out_msg + ssl->out_msglen + 2,
3033 out_buf_len - ssl->out_msglen - 2,
3034 signature_len,
3035 ssl->conf->f_rng,
3036 ssl->conf->p_rng)) != 0) {
3037 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3038 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003039 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003040 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003041#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003042
Gilles Peskine449bd832023-01-11 14:50:10 +01003043 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003044}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003045
Gilles Peskined3eb0612018-01-08 17:07:44 +01003046/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003047 * that do not include a ServerKeyExchange message, do nothing. Either
3048 * way, if successful, move on to the next step in the SSL state
3049 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003050MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003051static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003052{
Janos Follath865b3eb2019-12-16 11:46:15 +00003053 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003054 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003055#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003056 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003057 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003058#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003059
Gilles Peskine449bd832023-01-11 14:50:10 +01003060 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003061
Gilles Peskineeccd8882020-03-10 12:19:08 +01003062#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003063 /* Extract static ECDH parameters and abort if ServerKeyExchange
3064 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003065 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003066 /* For suites involving ECDH, extract DH parameters
3067 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003068#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3070 ret = ssl_get_ecdh_params_from_cert(ssl);
3071 if (ret != 0) {
3072 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3073 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003074 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003075 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003076#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003077
3078 /* Key exchanges not involving ephemeral keys don't use
3079 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003080 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003081 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003082 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003083 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003084#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003085
Gilles Peskineeccd8882020-03-10 12:19:08 +01003086#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003087 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003088 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003089 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003090 if (ssl->handshake->async_in_progress != 0) {
3091 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3092 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3093 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003094#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003095 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003096 {
3097 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003099 }
3100
Gilles Peskine449bd832023-01-11 14:50:10 +01003101 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003102 /* If we're starting to write a new message, set ssl->out_msglen
3103 * to 0. But if we're resuming after an asynchronous message,
3104 * out_msglen is the amount of data written so far and mst be
3105 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003106 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3107 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3108 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003109 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003110 }
3111 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003112 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003113
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003114 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003115 * ssl_prepare_server_key_exchange already wrote the signature
3116 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003117#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 if (signature_len != 0) {
3119 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3120 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003121
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3123 ssl->out_msg + ssl->out_msglen,
3124 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003125
3126 /* Skip over the already-written signature */
3127 ssl->out_msglen += signature_len;
3128 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003129#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003130
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003131 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003132 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3133 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003134
3135 ssl->state++;
3136
Gilles Peskine449bd832023-01-11 14:50:10 +01003137 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3138 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3139 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003140 }
3141
Gilles Peskine449bd832023-01-11 14:50:10 +01003142 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3143 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003144}
3145
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003146MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003147static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003148{
Janos Follath865b3eb2019-12-16 11:46:15 +00003149 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003150
Gilles Peskine449bd832023-01-11 14:50:10 +01003151 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003152
3153 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003154 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3155 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003156
3157 ssl->state++;
3158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003159#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3161 mbedtls_ssl_send_flight_completed(ssl);
3162 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003163#endif
3164
Gilles Peskine449bd832023-01-11 14:50:10 +01003165 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3166 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3167 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003168 }
3169
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003170#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003171 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3172 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3173 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3174 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003175 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003176#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003177
Gilles Peskine449bd832023-01-11 14:50:10 +01003178 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003179
Gilles Peskine449bd832023-01-11 14:50:10 +01003180 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003181}
3182
Gilles Peskineeccd8882020-03-10 12:19:08 +01003183#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003184MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003185static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3186 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003187{
Paul Bakker6db455e2013-09-18 17:29:31 +02003188 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003189 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003190
Gilles Peskine449bd832023-01-11 14:50:10 +01003191 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3192 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3193 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003194 }
3195
3196 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003197 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003198 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003199 if (end - *p < 2) {
3200 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3201 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003202 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003203
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003204 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003205 *p += 2;
3206
Gilles Peskine449bd832023-01-11 14:50:10 +01003207 if (n == 0 || n > end - *p) {
3208 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3209 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003210 }
3211
Gilles Peskine449bd832023-01-11 14:50:10 +01003212 if (ssl->conf->f_psk != NULL) {
3213 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003214 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003215 }
3216 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003217 /* Identity is not a big secret since clients send it in the clear,
3218 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003219 if (n != ssl->conf->psk_identity_len ||
3220 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003221 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003222 }
3223 }
3224
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3226 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3227 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3228 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3229 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003230 }
3231
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003232 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003233
Gilles Peskine449bd832023-01-11 14:50:10 +01003234 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003235}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003236#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003237
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003238MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003239static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003240{
Janos Follath865b3eb2019-12-16 11:46:15 +00003241 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003242 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003243 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003244
Hanno Beckere694c3e2017-12-27 21:34:08 +00003245 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003246
Gilles Peskine449bd832023-01-11 14:50:10 +01003247 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003248
Gilles Peskine449bd832023-01-11 14:50:10 +01003249 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3250 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3251 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003252 }
3253
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003255 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003256
Gilles Peskine449bd832023-01-11 14:50:10 +01003257 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3258 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3259 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003260 }
3261
Gilles Peskine449bd832023-01-11 14:50:10 +01003262 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3263 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3264 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003265 }
3266
Neil Armstrongd91526c2022-04-12 14:38:52 +02003267#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3268 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3269 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3270 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003272 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3273 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 size_t data_len = (size_t) (*p++);
3276 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003277 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3278 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3279
Gilles Peskine530c4232023-10-02 15:37:23 +02003280 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003281
3282 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003283 * We must have at least two bytes (1 for length, at least 1 for data)
3284 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003286 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3287 buf_len));
3288 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003289 }
3290
Gilles Peskine449bd832023-01-11 14:50:10 +01003291 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003292 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3293 " > %" MBEDTLS_PRINTF_SIZET,
3294 data_len, buf_len));
3295 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003296 }
3297
3298 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003299 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003300 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3301 " > %" MBEDTLS_PRINTF_SIZET,
3302 data_len,
3303 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003304 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3305 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003306 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3307 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003308
3309 /* Compute ECDH shared secret. */
3310 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003311 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3312 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003313 handshake->premaster, sizeof(handshake->premaster),
3314 &handshake->pmslen);
3315 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003316 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003318 if (handshake->xxdh_psa_privkey_is_external == 0) {
3319 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003320 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003321 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003322 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003323 }
3324
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003325 if (handshake->xxdh_psa_privkey_is_external == 0) {
3326 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003327
Gilles Peskine449bd832023-01-11 14:50:10 +01003328 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003329 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003330 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3331 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003332 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003333 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003334 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003335 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003336#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3337 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3338 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3339 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3340#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003341 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3342 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3343 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3344 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003345 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003346
Gilles Peskine449bd832023-01-11 14:50:10 +01003347 if (p != end) {
3348 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3349 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003350 }
3351
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003353#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003354#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003356 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3357 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003358 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003359
3360 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3361
Gilles Peskine449bd832023-01-11 14:50:10 +01003362 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3363 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003364 psa_destroy_key(handshake->xxdh_psa_privkey);
3365 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003366 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003367 }
3368
3369 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003371 psa_destroy_key(handshake->xxdh_psa_privkey);
3372 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003373 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003374 }
3375
Neil Armstrong039db292022-03-09 11:38:34 +01003376 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003377 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003378 psa_destroy_key(handshake->xxdh_psa_privkey);
3379 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003380 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003381 }
3382
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003383 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3384 the sizes of the FFDH keys which are at least 2048 bits.
3385 The size of the array is thus greater than 256 bytes which is greater than any
3386 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003387#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003388 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3389 psa_destroy_key(handshake->xxdh_psa_privkey);
3390 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003391 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003392 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003393#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003394 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3395 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003396#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003397
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003398 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3399 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003400 p += ecpoint_len;
3401
Neil Armstrong3bcef082022-03-23 18:16:54 +01003402 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003403 * - a uint16 containing the length (in octets) of the ECDH computation
3404 * - the octet string produced by the ECDH computation
3405 * - a uint16 containing the length (in octets) of the PSK
3406 * - the PSK itself
3407 */
Neil Armstrong039db292022-03-09 11:38:34 +01003408 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003409 const unsigned char * const psm_end =
3410 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003411 /* uint16 to store length (in octets) of the ECDH computation */
3412 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003413 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003414
3415 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003416 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003417 handshake->xxdh_psa_privkey,
3418 handshake->xxdh_psa_peerkey,
3419 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003420 psm + zlen_size,
3421 psm_end - (psm + zlen_size),
3422 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003423
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003424 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3425 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003426
Gilles Peskine449bd832023-01-11 14:50:10 +01003427 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003428 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003429 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003430 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003431 }
Neil Armstrong039db292022-03-09 11:38:34 +01003432
Neil Armstrong3bcef082022-03-23 18:16:54 +01003433 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003434 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003435 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003436
Gilles Peskine449bd832023-01-11 14:50:10 +01003437 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003438#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003439#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003440 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003441 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003442 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3444 psa_destroy_key(ssl->handshake->psa_pake_password);
3445 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003446
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3448 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003449 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003450 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003451#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003452 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003453 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3454 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003455 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003456
Gilles Peskine449bd832023-01-11 14:50:10 +01003457 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3458 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3459 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003460 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003461
Paul Bakker5121ce52009-01-03 21:22:43 +00003462 ssl->state++;
3463
Gilles Peskine449bd832023-01-11 14:50:10 +01003464 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003465
Gilles Peskine449bd832023-01-11 14:50:10 +01003466 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003467}
3468
Gilles Peskineeccd8882020-03-10 12:19:08 +01003469#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003470MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003471static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003472{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003473 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003474 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003475
Gilles Peskine449bd832023-01-11 14:50:10 +01003476 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003477
Gilles Peskine449bd832023-01-11 14:50:10 +01003478 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3479 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003480 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003481 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003482 }
3483
Gilles Peskine449bd832023-01-11 14:50:10 +01003484 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3485 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003486}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003487#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003488MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003489static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003490{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003491 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003492 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003493 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003494 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003495 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003496 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003497 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003498 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003499 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003500 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003501
Gilles Peskine449bd832023-01-11 14:50:10 +01003502 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003503
Gilles Peskine449bd832023-01-11 14:50:10 +01003504 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3505 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003506 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003507 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003508 }
3509
Hanno Becker2a831a42019-02-07 13:17:25 +00003510#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003511 if (ssl->session_negotiate->peer_cert == NULL) {
3512 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003513 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003514 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003515 }
3516#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003517 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3518 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003519 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003520 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003521 }
3522#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3523
Simon Butcher99000142016-10-13 17:21:01 +01003524 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003525 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3526 if (0 != ret) {
3527 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3528 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003529 }
3530
3531 ssl->state++;
3532
Simon Butcher99000142016-10-13 17:21:01 +01003533 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003534 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3535 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3536 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3537 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003538 }
3539
Gilles Peskine449bd832023-01-11 14:50:10 +01003540 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003541
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003542#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3543 peer_pk = &ssl->handshake->peer_pubkey;
3544#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003545 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003546 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003547 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003548 }
3549 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3550#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3551
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003552 /*
3553 * struct {
3554 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3555 * opaque signature<0..2^16-1>;
3556 * } DigitallySigned;
3557 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003558 if (i + 2 > ssl->in_hslen) {
3559 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3560 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003561 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003562
Ronald Cron8457c122022-03-07 11:32:54 +01003563 /*
3564 * Hash
3565 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003566 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003567
Gilles Peskine449bd832023-01-11 14:50:10 +01003568 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3569 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3570 " for verify message"));
3571 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003572 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003573
Simon Butcher99000142016-10-13 17:21:01 +01003574#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003575 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003576 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003577 }
Simon Butcher99000142016-10-13 17:21:01 +01003578#endif
Paul Bakker926af752012-11-23 13:38:07 +01003579
Ronald Cron8457c122022-03-07 11:32:54 +01003580 /* Info from md_alg will be used instead */
3581 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003582
Ronald Cron8457c122022-03-07 11:32:54 +01003583 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003584
Ronald Cron8457c122022-03-07 11:32:54 +01003585 /*
3586 * Signature
3587 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003588 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3589 == MBEDTLS_PK_NONE) {
3590 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3591 " for verify message"));
3592 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003593 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003594
Ronald Cron8457c122022-03-07 11:32:54 +01003595 /*
3596 * Check the certificate's key type matches the signature alg
3597 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003598 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3599 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3600 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003601 }
3602
3603 i++;
3604
Gilles Peskine449bd832023-01-11 14:50:10 +01003605 if (i + 2 > ssl->in_hslen) {
3606 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3607 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003608 }
3609
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003610 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003611 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003612
Gilles Peskine449bd832023-01-11 14:50:10 +01003613 if (i + sig_len != ssl->in_hslen) {
3614 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3615 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003616 }
3617
Simon Butcher99000142016-10-13 17:21:01 +01003618 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003619 {
3620 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003621 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3622 if (0 != ret) {
3623 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3624 return ret;
3625 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003626 }
Simon Butcher99000142016-10-13 17:21:01 +01003627
Gilles Peskine449bd832023-01-11 14:50:10 +01003628 if ((ret = mbedtls_pk_verify(peer_pk,
3629 md_alg, hash_start, hashlen,
3630 ssl->in_msg + i, sig_len)) != 0) {
3631 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3632 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003633 }
3634
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003635 ret = mbedtls_ssl_update_handshake_status(ssl);
3636 if (0 != ret) {
3637 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3638 return ret;
3639 }
Simon Butcher99000142016-10-13 17:21:01 +01003640
Gilles Peskine449bd832023-01-11 14:50:10 +01003641 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003642
Gilles Peskine449bd832023-01-11 14:50:10 +01003643 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003644}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003645#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003647#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003648MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003649static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003650{
Janos Follath865b3eb2019-12-16 11:46:15 +00003651 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003652 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003653 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003654
Gilles Peskine449bd832023-01-11 14:50:10 +01003655 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003657 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3658 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003659
3660 /*
3661 * struct {
3662 * uint32 ticket_lifetime_hint;
3663 * opaque ticket<0..2^16-1>;
3664 * } NewSessionTicket;
3665 *
3666 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3667 * 8 . 9 ticket_len (n)
3668 * 10 . 9+n ticket content
3669 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003670
Ronald Cron3c0072b2023-11-22 10:00:14 +01003671#if defined(MBEDTLS_HAVE_TIME)
3672 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3673#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003674 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3675 ssl->session_negotiate,
3676 ssl->out_msg + 10,
3677 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3678 &tlen, &lifetime)) != 0) {
3679 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003680 tlen = 0;
3681 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003682
Gilles Peskine449bd832023-01-11 14:50:10 +01003683 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3684 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003685 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003686
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003687 /*
3688 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3689 * ChangeCipherSpec share the same state.
3690 */
3691 ssl->handshake->new_session_ticket = 0;
3692
Gilles Peskine449bd832023-01-11 14:50:10 +01003693 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3694 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3695 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003696 }
3697
Gilles Peskine449bd832023-01-11 14:50:10 +01003698 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003699
Gilles Peskine449bd832023-01-11 14:50:10 +01003700 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003701}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003702#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003703
Paul Bakker5121ce52009-01-03 21:22:43 +00003704/*
Paul Bakker1961b702013-01-25 14:49:24 +01003705 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003706 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003707int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003708{
3709 int ret = 0;
3710
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003712
Gilles Peskine449bd832023-01-11 14:50:10 +01003713 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003714 case MBEDTLS_SSL_HELLO_REQUEST:
3715 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003716 break;
3717
Paul Bakker1961b702013-01-25 14:49:24 +01003718 /*
3719 * <== ClientHello
3720 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003721 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003722 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003723 break;
Paul Bakker1961b702013-01-25 14:49:24 +01003724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003725#if defined(MBEDTLS_SSL_PROTO_DTLS)
3726 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01003727 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02003728#endif
3729
Paul Bakker1961b702013-01-25 14:49:24 +01003730 /*
3731 * ==> ServerHello
3732 * Certificate
3733 * ( ServerKeyExchange )
3734 * ( CertificateRequest )
3735 * ServerHelloDone
3736 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003737 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01003738 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003739 break;
3740
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003741 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003742 ret = mbedtls_ssl_write_certificate(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_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003746 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003747 break;
3748
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003749 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01003750 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003751 break;
3752
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003753 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003754 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003755 break;
3756
3757 /*
3758 * <== ( Certificate/Alert )
3759 * ClientKeyExchange
3760 * ( CertificateVerify )
3761 * ChangeCipherSpec
3762 * Finished
3763 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003764 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003765 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003766 break;
3767
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003768 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01003769 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003770 break;
3771
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003772 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003774 break;
3775
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003776 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01003777 ret = mbedtls_ssl_parse_change_cipher_spec(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_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003781 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003782 break;
3783
3784 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003785 * ==> ( NewSessionTicket )
3786 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003787 * Finished
3788 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003789 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3790#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003791 if (ssl->handshake->new_session_ticket != 0) {
3792 ret = ssl_write_new_session_ticket(ssl);
3793 } else
Paul Bakkera503a632013-08-14 13:48:06 +02003794#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003795 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003796 break;
3797
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003798 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01003799 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003800 break;
3801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003802 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003804 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01003805 break;
3806
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003807 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01003808 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01003809 break;
3810
3811 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3813 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00003814 }
3815
Gilles Peskine449bd832023-01-11 14:50:10 +01003816 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003817}
TRodziewicz8476f2f2021-06-02 14:34:47 +02003818
Gilles Peskine449bd832023-01-11 14:50:10 +01003819void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02003820{
TRodziewicz3946f792021-06-14 12:11:18 +02003821 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02003822}
3823
Jerry Yufb4b6472022-01-27 15:03:26 +08003824#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */