blob: 3d912284fb3375a575b00f207da1ad4cb2535a51 [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) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200260#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
261 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200262 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200263#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200264#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
266 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
267 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200268#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
270 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100271 }
272
273 list_size--;
274 p++;
275 }
276
Gilles Peskine449bd832023-01-11 14:50:10 +0100277 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100278}
Valerio Setti60d3b912023-07-25 10:43:53 +0200279#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200280 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200281 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100282
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200283#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200284MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100285static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
286 const unsigned char *buf,
287 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200288{
Janos Follath865b3eb2019-12-16 11:46:15 +0000289 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200290
Manuel Pégourié-Gonnard58916762025-01-23 10:48:45 +0100291 if (ssl->handshake->psa_pake_ctx_is_ok != 1) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
293 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200294 }
295
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 if ((ret = mbedtls_psa_ecjpake_read_round(
297 &ssl->handshake->psa_pake_ctx, buf, len,
298 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
299 psa_destroy_key(ssl->handshake->psa_pake_password);
300 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200301
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100303 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 ssl,
305 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
306 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200307
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200309 }
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200310
311 /* Only mark the extension as OK when we're sure it is */
312 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
313
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200315}
316#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200319MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100320static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
321 const unsigned char *buf,
322 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200323{
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
325 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
326 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
327 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
328 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200329 }
330
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200331 ssl->session_negotiate->mfl_code = buf[0];
332
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200334}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200336
Hanno Beckera0e20d02019-05-15 14:03:01 +0100337#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200338MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100339static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
340 const unsigned char *buf,
341 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100342{
343 size_t peer_cid_len;
344
345 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
347 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
348 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
349 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
350 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100351 }
352
353 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100354 * struct {
355 * opaque cid<0..2^8-1>;
356 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100357 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100358
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 if (len < 1) {
360 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
361 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
362 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
363 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100364 }
365
366 peer_cid_len = *buf++;
367 len--;
368
Gilles Peskine449bd832023-01-11 14:50:10 +0100369 if (len != peer_cid_len) {
370 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
371 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
372 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
373 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100374 }
375
376 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100378 /* Leave ssl->handshake->cid_in_use in its default
379 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100380 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
381 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100382 }
383
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
385 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
386 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
387 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
388 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100389 }
390
Hanno Becker08556bf2019-05-03 12:43:44 +0100391 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100392 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
396 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100397
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100399}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100400#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200403MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100404static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
405 const unsigned char *buf,
406 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100407{
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 if (len != 0) {
409 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
410 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
411 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
412 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100413 }
414
415 ((void) buf);
416
Gilles Peskine449bd832023-01-11 14:50:10 +0100417 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100419 }
420
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100422}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200426MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100427static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
428 const unsigned char *buf,
429 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200430{
Gilles Peskine449bd832023-01-11 14:50:10 +0100431 if (len != 0) {
432 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
433 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
434 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
435 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200436 }
437
438 ((void) buf);
439
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200442 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200443
Gilles Peskine449bd832023-01-11 14:50:10 +0100444 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200445}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200449MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100450static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
451 unsigned char *buf,
452 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200453{
Janos Follath865b3eb2019-12-16 11:46:15 +0000454 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200455 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200456
Gilles Peskine449bd832023-01-11 14:50:10 +0100457 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200458
Gilles Peskine449bd832023-01-11 14:50:10 +0100459 if (ssl->conf->f_ticket_parse == NULL ||
460 ssl->conf->f_ticket_write == NULL) {
461 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200462 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200463
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200464 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200465 ssl->handshake->new_session_ticket = 1;
466
Gilles Peskine449bd832023-01-11 14:50:10 +0100467 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200468
Gilles Peskine449bd832023-01-11 14:50:10 +0100469 if (len == 0) {
470 return 0;
471 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
475 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
476 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200477 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200479
480 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200481 * Failures are ok: just ignore the ticket and proceed.
482 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100483 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
484 buf, len)) != 0) {
485 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
488 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
489 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
490 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
491 } else {
492 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
493 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200494
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200496 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200497
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200498 /*
499 * Keep the session ID sent by the client, since we MUST send it back to
500 * inform them we're accepting the ticket (RFC 5077 section 3.4)
501 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200502 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200504
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 mbedtls_ssl_session_free(ssl->session_negotiate);
506 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200507
508 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200510
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200512
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200513 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200514
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200515 /* Don't send a new ticket after all, this one is OK */
516 ssl->handshake->new_session_ticket = 0;
517
Gilles Peskine449bd832023-01-11 14:50:10 +0100518 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200519}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200521
Johan Pascalb62bb512015-12-03 21:56:45 +0100522#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200523MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100524static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
525 const unsigned char *buf,
526 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100527{
Johan Pascal43f94902020-09-22 12:25:52 +0200528 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100529 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200530 size_t profile_length;
531 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200532 /*! 2 bytes for profile length and 1 byte for mki len */
533 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100534
535 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100536 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
537 (ssl->conf->dtls_srtp_profile_list == NULL) ||
538 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
539 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200540 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100541
542 /* RFC5764 section 4.1.1
543 * uint8 SRTPProtectionProfile[2];
544 *
545 * struct {
546 * SRTPProtectionProfiles SRTPProtectionProfiles;
547 * opaque srtp_mki<0..255>;
548 * } UseSRTPData;
549
550 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100551 */
552
Ron Eldoref72faf2018-07-12 11:54:20 +0300553 /*
554 * Min length is 5: at least one protection profile(2 bytes)
555 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200556 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200557 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300558 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 if (len < size_of_lengths) {
560 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
561 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
562 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200563 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200566
Ron Eldoref72faf2018-07-12 11:54:20 +0300567 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200569 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200570
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200571 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 if (profile_length > len - size_of_lengths ||
573 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
574 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
575 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
576 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200577 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300578 /*
579 * parse the extension list values are defined in
580 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
581 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200583 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100585
Gilles Peskine449bd832023-01-11 14:50:10 +0100586 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
587 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
588 mbedtls_ssl_get_srtp_profile_as_string(
589 client_protection)));
590 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200591 continue;
592 }
Ron Eldor591f1622018-01-22 12:30:04 +0200593 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
595 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200596 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
598 mbedtls_ssl_get_srtp_profile_as_string(
599 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200600 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100601 }
602 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200604 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 }
Ron Eldor591f1622018-01-22 12:30:04 +0200606 }
Johan Pascal042d4562020-08-25 12:14:02 +0200607 buf += profile_length; /* buf points to the mki length */
608 mki_length = *buf;
609 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200610
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
612 mki_length + profile_length + size_of_lengths != len) {
613 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
614 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
615 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200616 }
617
618 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100619 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
620 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200621 ssl->dtls_srtp_info.mki_len = mki_length;
622
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300624
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
626 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100627 }
628
Gilles Peskine449bd832023-01-11 14:50:10 +0100629 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100630}
631#endif /* MBEDTLS_SSL_DTLS_SRTP */
632
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100633/*
634 * Auxiliary functions for ServerHello parsing and related actions
635 */
636
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100638/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100639 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100640 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200641#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200642MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100643static int ssl_check_key_curve(mbedtls_pk_context *pk,
644 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100645{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100646 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100647 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100648 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100649
Gilles Peskine449bd832023-01-11 14:50:10 +0100650 while (*curr_tls_id != 0) {
651 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
652 if (curr_grp_id == grp_id) {
653 return 0;
654 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100655 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100656 }
657
Gilles Peskine449bd832023-01-11 14:50:10 +0100658 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100659}
Valerio Settie9646ec2023-08-02 20:02:28 +0200660#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100661
662/*
663 * Try picking a certificate for this ciphersuite,
664 * return 0 on success and -1 on failure.
665 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200666MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100667static int ssl_pick_cert(mbedtls_ssl_context *ssl,
668 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100669{
Glenn Strauss041a3762022-03-15 06:08:29 -0400670 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200671 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200673 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100674 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200675 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100679 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100681#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100683
David Horstmann3a334c22022-10-25 10:53:44 +0100684 int pk_alg_is_none = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 if (pk_alg_is_none) {
687 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200688 }
689
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
691
692 if (list == NULL) {
693 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
694 return -1;
695 }
696
697 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400698 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100699 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
700 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000701
David Horstmann3a334c22022-10-25 10:53:44 +0100702 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200703#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100704 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
705 ssl->conf->f_async_decrypt_start != NULL ||
706 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
707 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200708#else
David Horstmann3a334c22022-10-25 10:53:44 +0100709 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100710 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200711#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100712 if (!key_type_matches) {
713 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100714 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000715 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100716
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200717 /*
718 * This avoids sending the client a cert it'll reject based on
719 * keyUsage or other extensions.
720 *
721 * It also allows the user to provision different certificates for
722 * different uses based on keyUsage, eg if they want to avoid signing
723 * and decrypting with the same RSA key.
724 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200726 MBEDTLS_SSL_IS_CLIENT,
727 MBEDTLS_SSL_VERSION_TLS1_2,
728 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
730 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200731 continue;
732 }
733
Valerio Settie9646ec2023-08-02 20:02:28 +0200734#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100735 if (pk_alg == MBEDTLS_PK_ECDSA &&
736 ssl_check_key_curve(&cur->cert->pk,
737 ssl->handshake->curves_tls_id) != 0) {
738 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100739 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000740 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100741#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100742
743 /* If we get there, we got a winner */
744 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100745 }
746
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200747 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100749 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100750 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
751 ssl->handshake->key_cert->cert);
752 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100753 }
754
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100756}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200757#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100758
759/*
760 * Check if a given ciphersuite is suitable for use with our config/keys/etc
761 * Sets ciphersuite_info only if the suite matches.
762 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200763MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100764static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
765 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100766{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200767 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100768
Jerry Yue7541932022-01-28 10:21:24 +0800769#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100770 mbedtls_pk_type_t sig_type;
771#endif
772
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
774 if (suite_info == NULL) {
775 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
776 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100777 }
778
Gilles Peskine449bd832023-01-11 14:50:10 +0100779 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
780 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000781
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 if (suite_info->min_tls_version > ssl->tls_version ||
783 suite_info->max_tls_version < ssl->tls_version) {
784 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
785 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000786 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100787
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200788#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100789 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
790 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
791 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
792 "not configured or ext missing"));
793 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200794 }
795#endif
796
797
Valerio Setti60d3b912023-07-25 10:43:53 +0200798#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200799 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100800 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
801 (ssl->handshake->curves_tls_id == NULL ||
802 ssl->handshake->curves_tls_id[0] == 0)) {
803 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
804 "no common elliptic curve"));
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
Gilles Peskineeccd8882020-03-10 12:19:08 +0100809#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810 /* If the ciphersuite requires a pre-shared key and we don't
811 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
813 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
814 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
815 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000816 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100817#endif
818
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200819#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100820 /*
821 * Final check: if ciphersuite requires us to have a
822 * certificate/key of a particular type:
823 * - select the appropriate certificate if we have one, or
824 * - try the next ciphersuite if we don't
825 * This must be done last since we modify the key_cert list.
826 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 if (ssl_pick_cert(ssl, suite_info) != 0) {
828 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
829 "no suitable certificate"));
830 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000831 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100832#endif
833
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200834#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
835 /* If the ciphersuite requires signing, check whether
836 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
838 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200839 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
841 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
842 "for signature algorithm %u", (unsigned) sig_type));
843 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200844 }
845
846#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
847
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100848 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100849 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850}
851
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200852/* This function doesn't alert on errors that happen early during
853 ClientHello parsing because they might indicate that the client is
854 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200855MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100856static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000857{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100858 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200859 size_t i, j;
860 size_t ciph_offset, comp_offset, ext_offset;
861 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200863 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100864#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000865 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000867 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100868#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000869 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200870 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200871 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000872
Hanno Becker7e5437a2017-04-28 17:15:26 +0100873 /* If there is no signature-algorithm extension present,
874 * we need to fall back to the default values for allowed
875 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800876#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100877 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800878#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100879
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000881
David Horstmanne0af39a2022-10-06 18:19:18 +0100882 int renegotiating;
883
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200884#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200885read_record_header:
886#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100887 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100889 * otherwise read it ourselves manually in order to support SSLv2
890 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100891 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
892 * ClientHello has been already fully fetched by the TLS 1.3 code and the
893 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100894 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100895 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200896#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100898#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100899 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100900 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200901 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
903 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000904 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000905 }
906
907 buf = ssl->in_hdr;
908
Gilles Peskine449bd832023-01-11 14:50:10 +0100909 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000910
Paul Bakkerec636f32012-09-09 19:17:02 +0000911 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100912 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000913 *
914 * Record layer:
915 * 0 . 0 message type
916 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200917 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000918 * 3 . 4 message length
919 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
921 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100922
Gilles Peskine449bd832023-01-11 14:50:10 +0100923 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
924 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
925 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100926 }
927
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000929 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100930
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
932 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100933
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200934 /* For DTLS if this is the initial handshake, remember the client sequence
935 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200938#if defined(MBEDTLS_SSL_RENEGOTIATION)
939 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000940#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200942 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
944 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
945 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200946 }
947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
949 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200950
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200951#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
953 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200954 ssl->next_record_offset = 0;
955 ssl->in_left = 0;
956 goto read_record_header;
957 }
958
959 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200961#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200962 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200963#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200964
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000965 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000970 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100971 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100972#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000973 {
Ronald Cron6291b232023-03-08 15:51:25 +0100974 if (ssl->keep_current_message) {
975 ssl->keep_current_message = 0;
976 } else {
977 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
978 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
979 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
980 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000981
Ronald Cron6291b232023-03-08 15:51:25 +0100982 if ((ret = mbedtls_ssl_fetch_input(ssl,
983 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
984 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
985 return ret;
986 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200987
Ronald Cron6291b232023-03-08 15:51:25 +0100988 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100990 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
991 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
992 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200993#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100994 ssl->in_left = 0;
995 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100996 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000997
998 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000999
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001001
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001002 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1003 if (0 != ret) {
1004 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1005 return ret;
1006 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001007
1008 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001009 * Handshake layer:
1010 * 0 . 0 handshake type
1011 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001012 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001013 * 6 . 8 DTLS only: fragment offset
1014 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001015 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001016 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1017 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1018 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001019 }
1020
Gilles Peskine449bd832023-01-11 14:50:10 +01001021 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001022
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1024 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1025 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001026 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001027 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1029 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1030 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001031
1032 /* The record layer has a record size limit of 2^14 - 1 and
1033 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 if (buf[1] != 0) {
1035 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1036 (unsigned) buf[1]));
1037 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001038 }
1039
1040 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001041 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1042 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1043 (unsigned) msg_len,
1044 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1045 (unsigned) handshake_len));
1046 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001047 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001048 }
1049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001052 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001053 * Copy the client's handshake message_seq on initial handshakes,
1054 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001055 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001058 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001059 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1061 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1062 "%u (expected %u)", cli_msg_seq,
1063 ssl->handshake->in_msg_seq));
1064 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001065 }
1066
1067 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001069#endif
1070 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001071 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001072 ssl->handshake->out_msg_seq = cli_msg_seq;
1073 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1074 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001075 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001076 /*
1077 * For now we don't support fragmentation, so make sure
1078 * fragment_offset == 0 and fragment_length == length
1079 */
1080 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1082 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1083 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001084 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 4, ("fragment_offset=%u fragment_length=%u length=%u",
1086 (unsigned) fragment_offset, (unsigned) fragment_length,
1087 (unsigned) length));
1088 if (fragment_offset != 0 || length != fragment_length) {
1089 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1090 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001091 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001092 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001093 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001095
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 buf += mbedtls_ssl_hs_hdr_len(ssl);
1097 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001098
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001099 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001100 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001101 * 0 . 1 protocol version
1102 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001103 * 34 . 34 session id length (1 byte)
1104 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001105 * 35+x . 35+x DTLS only: cookie length (1 byte)
1106 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001107 * .. . .. ciphersuite list length (2 bytes)
1108 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001109 * .. . .. compression alg. list length (1 byte)
1110 * .. . .. compression alg. list
1111 * .. . .. extensions length (2 bytes, optional)
1112 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001113 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001114
1115 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001116 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001117 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1118 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001119 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 if (msg_len < 38) {
1121 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1122 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001123 }
1124
1125 /*
1126 * Check and save the protocol version
1127 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001129
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001130 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1131 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001132 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001133 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001134
Gilles Peskine449bd832023-01-11 14:50:10 +01001135 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1136 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1137 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1138 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1139 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001140 }
1141
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001142 /*
1143 * Save client random (inc. Unix time)
1144 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001146
Gilles Peskine449bd832023-01-11 14:50:10 +01001147 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001148
1149 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001150 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001151 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001152 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001153
Gilles Peskine449bd832023-01-11 14:50:10 +01001154 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1155 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1156 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1157 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1158 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1159 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001160 }
1161
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001163
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001164 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 memset(ssl->session_negotiate->id, 0,
1166 sizeof(ssl->session_negotiate->id));
1167 memcpy(ssl->session_negotiate->id, buf + 35,
1168 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001169
1170 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001171 * Check the cookie length and content
1172 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001173#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001174 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001175 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001176 cookie_len = buf[cookie_offset];
1177
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1179 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1180 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1181 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1182 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001183 }
1184
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1186 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190#if defined(MBEDTLS_SSL_RENEGOTIATION)
1191 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001192#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 ) {
1194 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1195 buf + cookie_offset + 1, cookie_len,
1196 ssl->cli_id, ssl->cli_id_len) != 0) {
1197 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001198 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 } else {
1200 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001201 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001202 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001205 {
1206 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001208 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001209 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1210 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001211 }
1212
Gilles Peskine449bd832023-01-11 14:50:10 +01001213 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001214 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 /*
1217 * Check the ciphersuitelist length (will be parsed later)
1218 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001219 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001223
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001224 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001227 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 (ciph_len % 2) != 0) {
1229 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1230 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1231 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1232 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001233 }
1234
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1236 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001237
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001238 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001239 * Check the compression algorithm's length.
1240 * The list contents are ignored because implementing
1241 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1242 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001243 */
1244 comp_offset = ciph_offset + 2 + ciph_len;
1245
1246 comp_len = buf[comp_offset];
1247
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001249 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001250 comp_len + comp_offset + 1 > msg_len) {
1251 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1252 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1253 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1254 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001255 }
1256
Gilles Peskine449bd832023-01-11 14:50:10 +01001257 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1258 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001259
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 /*
1261 * Check the extension length
1262 */
1263 ext_offset = comp_offset + 1 + comp_len;
1264 if (msg_len > ext_offset) {
1265 if (msg_len < ext_offset + 2) {
1266 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1267 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1268 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1269 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001270 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001271
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001272 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001273
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 if (msg_len != ext_offset + 2 + ext_len) {
1275 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1276 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1277 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1278 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1279 }
1280 } else {
1281 ext_len = 0;
1282 }
Paul Bakker48916f92012-09-16 19:57:18 +00001283
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 ext = buf + ext_offset + 2;
1285 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1286
1287 while (ext_len != 0) {
1288 unsigned int ext_id;
1289 unsigned int ext_size;
1290 if (ext_len < 4) {
1291 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1292 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1293 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1294 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1295 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001296 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1297 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001298
1299 if (ext_size + 4 > ext_len) {
1300 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1301 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1302 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1303 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1304 }
1305 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001306#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001307 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001308 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1309 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1310 ext + 4 + ext_size);
1311 if (ret != 0) {
1312 return ret;
1313 }
Simon Butcher584a5472016-05-23 16:24:52 +01001314 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001315#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001316
Simon Butcher584a5472016-05-23 16:24:52 +01001317 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001319#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001320 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001321#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001322
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1324 if (ret != 0) {
1325 return ret;
1326 }
Simon Butcher584a5472016-05-23 16:24:52 +01001327 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001328
Jerry Yue7541932022-01-28 10:21:24 +08001329#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001330 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001332
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1334 if (ret != 0) {
1335 return ret;
1336 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001337
1338 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001339 break;
Jerry Yue7541932022-01-28 10:21:24 +08001340#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001341
Valerio Setti60d3b912023-07-25 10:43:53 +02001342#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001343 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001345 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001346 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001347
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1349 if (ret != 0) {
1350 return ret;
1351 }
Simon Butcher584a5472016-05-23 16:24:52 +01001352 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001353
Simon Butcher584a5472016-05-23 16:24:52 +01001354 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001356 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001357
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1359 if (ret != 0) {
1360 return ret;
1361 }
Simon Butcher584a5472016-05-23 16:24:52 +01001362 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001363#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001364 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001365 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001366
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001367#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001368 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001370
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1372 if (ret != 0) {
1373 return ret;
1374 }
Simon Butcher584a5472016-05-23 16:24:52 +01001375 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001376#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001378#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001379 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001381
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1383 if (ret != 0) {
1384 return ret;
1385 }
Simon Butcher584a5472016-05-23 16:24:52 +01001386 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001388
Hanno Beckera0e20d02019-05-15 14:03:01 +01001389#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001390 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1394 if (ret != 0) {
1395 return ret;
1396 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001397 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001398#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001401 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001402 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001403
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1405 if (ret != 0) {
1406 return ret;
1407 }
Simon Butcher584a5472016-05-23 16:24:52 +01001408 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001409#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001412 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001414
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1416 if (ret != 0) {
1417 return ret;
1418 }
Simon Butcher584a5472016-05-23 16:24:52 +01001419 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001420#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001422#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001423 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1427 if (ret != 0) {
1428 return ret;
1429 }
Simon Butcher584a5472016-05-23 16:24:52 +01001430 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001431#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001434 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1438 ext + 4 + ext_size);
1439 if (ret != 0) {
1440 return ret;
1441 }
Simon Butcher584a5472016-05-23 16:24:52 +01001442 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001444
Johan Pascalb62bb512015-12-03 21:56:45 +01001445#if defined(MBEDTLS_SSL_DTLS_SRTP)
1446 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001448
Gilles Peskine449bd832023-01-11 14:50:10 +01001449 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1450 if (ret != 0) {
1451 return ret;
1452 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001453 break;
1454#endif /* MBEDTLS_SSL_DTLS_SRTP */
1455
Simon Butcher584a5472016-05-23 16:24:52 +01001456 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1458 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001459 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001460
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 ext_len -= 4 + ext_size;
1462 ext += 4 + ext_size;
1463 }
1464
Jerry Yue7541932022-01-28 10:21:24 +08001465#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001466
1467 /*
1468 * Try to fall back to default hash SHA1 if the client
1469 * hasn't provided any preferred signature-hash combinations.
1470 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001471 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001472 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1473 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001474#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001475 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1476 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001477#endif
1478#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001479 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1480 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001481#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001482 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001483 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001484
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001485 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1486 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1487 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001488
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001490 }
1491
Jerry Yue7541932022-01-28 10:21:24 +08001492#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001493
Paul Bakker48916f92012-09-16 19:57:18 +00001494 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001495 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1496 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001497 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1498 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1499 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001501 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1502 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1503 "during renegotiation"));
1504 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1505 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1506 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001507 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001508#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001509 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001510 break;
1511 }
1512 }
1513
1514 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001515 * Renegotiation security checks
1516 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1518 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1519 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001520 handshake_failure = 1;
1521 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001523 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001525 renegotiation_info_seen == 0) {
1526 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001527 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001528 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1529 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1530 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1531 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001532 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1534 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1535 renegotiation_info_seen == 1) {
1536 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001537 handshake_failure = 1;
1538 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001539#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001540
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 if (handshake_failure == 1) {
1542 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1543 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1544 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001545 }
Paul Bakker380da532012-04-18 16:10:25 +00001546
Paul Bakker41c83d32013-03-20 14:39:14 +01001547 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001548 * Server certification selection (after processing TLS extensions)
1549 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001550 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1551 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1552 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001553 }
Glenn Strauss69894072022-01-24 12:58:00 -05001554#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1555 ssl->handshake->sni_name = NULL;
1556 ssl->handshake->sni_name_len = 0;
1557#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001558
1559 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001560 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001561 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001562 * and certificate from the SNI callback triggered by the SNI extension
1563 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001564 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001565 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001566 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001567 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001568
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1570 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1571 for (i = 0; ciphersuites[i] != 0; i++) {
1572 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001573 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001575
TRodziewicz8476f2f2021-06-02 14:34:47 +02001576 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001577
Gilles Peskine449bd832023-01-11 14:50:10 +01001578 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1579 &ciphersuite_info)) != 0) {
1580 return ret;
1581 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001582
Gilles Peskine449bd832023-01-11 14:50:10 +01001583 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001584 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001585 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001586 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001587 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001588 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001589 for (i = 0; ciphersuites[i] != 0; i++) {
1590 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1591 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001592 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001593 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001594
1595 got_common_suite = 1;
1596
Gilles Peskine449bd832023-01-11 14:50:10 +01001597 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1598 &ciphersuite_info)) != 0) {
1599 return ret;
1600 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001601
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001603 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001604 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001605 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001607 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001608
Gilles Peskine449bd832023-01-11 14:50:10 +01001609 if (got_common_suite) {
1610 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1611 "but none of them usable"));
1612 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1613 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1614 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1615 } else {
1616 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1617 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1618 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1619 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001620 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001621
1622have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001623 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001624
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001625 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001626 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001627
Paul Bakker5121ce52009-01-03 21:22:43 +00001628 ssl->state++;
1629
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001630#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1632 mbedtls_ssl_recv_flight_completed(ssl);
1633 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001634#endif
1635
Hanno Becker7e5437a2017-04-28 17:15:26 +01001636 /* Debugging-only output for testsuite */
1637#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001638 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001639 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1640 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001641 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1643 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1644 sig_hash));
1645 } else {
1646 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1647 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001648 }
1649#endif
1650
Gilles Peskine449bd832023-01-11 14:50:10 +01001651 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001652
Gilles Peskine449bd832023-01-11 14:50:10 +01001653 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001654}
1655
Hanno Beckera0e20d02019-05-15 14:03:01 +01001656#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001657static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1658 unsigned char *buf,
1659 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001660{
1661 unsigned char *p = buf;
1662 size_t ext_len;
1663 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1664
1665 *olen = 0;
1666
1667 /* Skip writing the extension if we don't want to use it or if
1668 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001669 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001670 return;
1671 }
1672
Gilles Peskine449bd832023-01-11 14:50:10 +01001673 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1674 * which is at most 255, so the increment cannot overflow. */
1675 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1676 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1677 return;
1678 }
1679
1680 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001681
1682 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001683 * struct {
1684 * opaque cid<0..2^8-1>;
1685 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 */
1687 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001688 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001689 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001691 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001692
1693 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001694 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001695
1696 *olen = ssl->own_cid_len + 5;
1697}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001698#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001699
Neil Armstrong76b74072022-04-06 13:43:54 +02001700#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001701static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1702 unsigned char *buf,
1703 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001704{
1705 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001706 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001707
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001708 /*
1709 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1710 * from a client and then selects a stream or Authenticated Encryption
1711 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1712 * encrypt-then-MAC response extension back to the client."
1713 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001714 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001715 ssl->session_negotiate->ciphersuite);
1716 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001717 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001718 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001719 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001720 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001721 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001722 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001723
Gilles Peskine449bd832023-01-11 14:50:10 +01001724 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001725 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 }
Ronald Cron862902d2022-03-24 14:15:28 +01001727 }
1728
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001730 *olen = 0;
1731 return;
1732 }
1733
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001735
Gilles Peskine449bd832023-01-11 14:50:10 +01001736 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001737 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001738
1739 *p++ = 0x00;
1740 *p++ = 0x00;
1741
1742 *olen = 4;
1743}
Neil Armstrong76b74072022-04-06 13:43:54 +02001744#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001745
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001746#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001747static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1748 unsigned char *buf,
1749 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001750{
1751 unsigned char *p = buf;
1752
Gilles Peskine449bd832023-01-11 14:50:10 +01001753 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001754 *olen = 0;
1755 return;
1756 }
1757
Gilles Peskine449bd832023-01-11 14:50:10 +01001758 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1759 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001760
Gilles Peskine449bd832023-01-11 14:50:10 +01001761 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001762 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001763
1764 *p++ = 0x00;
1765 *p++ = 0x00;
1766
1767 *olen = 4;
1768}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001769#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001770
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001771#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001772static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1773 unsigned char *buf,
1774 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001775{
1776 unsigned char *p = buf;
1777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001779 *olen = 0;
1780 return;
1781 }
1782
Gilles Peskine449bd832023-01-11 14:50:10 +01001783 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001784
Gilles Peskine449bd832023-01-11 14:50:10 +01001785 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001786 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001787
1788 *p++ = 0x00;
1789 *p++ = 0x00;
1790
1791 *olen = 4;
1792}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001793#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001794
Gilles Peskine449bd832023-01-11 14:50:10 +01001795static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1796 unsigned char *buf,
1797 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001798{
1799 unsigned char *p = buf;
1800
Gilles Peskine449bd832023-01-11 14:50:10 +01001801 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001802 *olen = 0;
1803 return;
1804 }
1805
Gilles Peskine449bd832023-01-11 14:50:10 +01001806 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001807
Gilles Peskine449bd832023-01-11 14:50:10 +01001808 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001809 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001811#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001813 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001815 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001816
Gilles Peskine449bd832023-01-11 14:50:10 +01001817 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001818 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001819 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001820 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001821 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001822#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001823 {
1824 *p++ = 0x00;
1825 *p++ = 0x01;
1826 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001827 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001828
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001829 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001830}
1831
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001832#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001833static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1834 unsigned char *buf,
1835 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001836{
1837 unsigned char *p = buf;
1838
Gilles Peskine449bd832023-01-11 14:50:10 +01001839 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001840 *olen = 0;
1841 return;
1842 }
1843
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001845
Gilles Peskine449bd832023-01-11 14:50:10 +01001846 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001847 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001848
1849 *p++ = 0x00;
1850 *p++ = 1;
1851
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001852 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001853
1854 *olen = 5;
1855}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001856#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001857
Valerio Setti7aeec542023-07-05 18:57:21 +02001858#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001859 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001860 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001861static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1862 unsigned char *buf,
1863 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001864{
1865 unsigned char *p = buf;
1866 ((void) ssl);
1867
Gilles Peskine449bd832023-01-11 14:50:10 +01001868 if ((ssl->handshake->cli_exts &
1869 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001870 *olen = 0;
1871 return;
1872 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001873
Gilles Peskine449bd832023-01-11 14:50:10 +01001874 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001875
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001877 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001878
1879 *p++ = 0x00;
1880 *p++ = 2;
1881
1882 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001883 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001884
1885 *olen = 6;
1886}
Valerio Setti45d56f32023-07-13 17:23:20 +02001887#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001888 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001889 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001890
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001891#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001892static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1893 unsigned char *buf,
1894 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001895{
Janos Follath865b3eb2019-12-16 11:46:15 +00001896 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001897 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001898 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001899 size_t kkpp_len;
1900
1901 *olen = 0;
1902
1903 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001904 if (ssl->handshake->ciphersuite_info->key_exchange !=
1905 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001906 return;
1907 }
1908
Gilles Peskine449bd832023-01-11 14:50:10 +01001909 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1910
1911 if (end - p < 4) {
1912 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1913 return;
1914 }
1915
1916 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001917 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001918
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001920 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001921 MBEDTLS_ECJPAKE_ROUND_ONE);
1922 if (ret != 0) {
1923 psa_destroy_key(ssl->handshake->psa_pake_password);
1924 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1925 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001926 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001927 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001928
Gilles Peskine449bd832023-01-11 14:50:10 +01001929 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001930 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001931
1932 *olen = kkpp_len + 4;
1933}
1934#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1935
Gilles Peskine449bd832023-01-11 14:50:10 +01001936#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1937static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1938 unsigned char *buf,
1939 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001940{
Ron Eldor75870ec2018-12-06 17:31:55 +02001941 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001942 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001943 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1944
1945 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001946
Gilles Peskine449bd832023-01-11 14:50:10 +01001947 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1948 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001949 return;
1950 }
1951
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001953
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001955 mki_len = ssl->dtls_srtp_info.mki_len;
1956 }
1957
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001958 /* The extension total size is 9 bytes :
1959 * - 2 bytes for the extension tag
1960 * - 2 bytes for the total size
1961 * - 2 bytes for the protection profile length
1962 * - 2 bytes for the protection profile
1963 * - 1 byte for the mki length
1964 * + the actual mki length
1965 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001966 if ((size_t) (end - buf) < mki_len + 9) {
1967 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001968 return;
1969 }
1970
Johan Pascalb62bb512015-12-03 21:56:45 +01001971 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001973 /*
1974 * total length 5 and mki value: only one profile(2 bytes)
1975 * and length(2 bytes) and srtp_mki )
1976 */
Ron Eldor591f1622018-01-22 12:30:04 +02001977 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001979
1980 /* protection profile length: 2 */
1981 buf[4] = 0x00;
1982 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001983 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001984 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1985 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1986 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1987 } else {
1988 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001989 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001990 }
1991
Ron Eldor591f1622018-01-22 12:30:04 +02001992 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001994
Ron Eldor591f1622018-01-22 12:30:04 +02001995 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001996}
1997#endif /* MBEDTLS_SSL_DTLS_SRTP */
1998
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001999#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002000MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002001static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002002{
Janos Follath865b3eb2019-12-16 11:46:15 +00002003 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002004 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002005 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002006
Gilles Peskine449bd832023-01-11 14:50:10 +01002007 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002008
2009 /*
2010 * struct {
2011 * ProtocolVersion server_version;
2012 * opaque cookie<0..2^8-1>;
2013 * } HelloVerifyRequest;
2014 */
2015
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002016 /* The RFC is not clear on this point, but sending the actual negotiated
2017 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002018 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2019 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002020 p += 2;
2021
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002022 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002023 if (ssl->conf->f_cookie_write == NULL) {
2024 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2025 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002026 }
2027
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002028 /* Skip length byte until we know the length */
2029 cookie_len_byte = p++;
2030
Gilles Peskine449bd832023-01-11 14:50:10 +01002031 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2032 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2033 ssl->cli_id, ssl->cli_id_len)) != 0) {
2034 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2035 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002036 }
2037
Gilles Peskine449bd832023-01-11 14:50:10 +01002038 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002039
Gilles Peskine449bd832023-01-11 14:50:10 +01002040 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002041
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002042 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2044 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002046 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002047
Gilles Peskine449bd832023-01-11 14:50:10 +01002048 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2049 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2050 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002051 }
2052
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002053#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2055 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2056 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2057 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002058 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002059#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002060
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002062
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002064}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002065#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002066
Gilles Peskine449bd832023-01-11 14:50:10 +01002067static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002068{
2069 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002070 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002071 mbedtls_ssl_session * const session = ssl->session_negotiate;
2072
2073 /* Resume is 0 by default, see ssl_handshake_init().
2074 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002075 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002076 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 }
2078 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002079 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 }
2081 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002082 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002084#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002085 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002086 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002087 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002088#endif
2089
Gilles Peskine449bd832023-01-11 14:50:10 +01002090 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002091
Gilles Peskine449bd832023-01-11 14:50:10 +01002092 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2093 session->id,
2094 session->id_len,
2095 &session_tmp);
2096 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002097 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002099
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002101 /* Mismatch between cached and negotiated session */
2102 goto exit;
2103 }
2104
2105 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002107 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002109
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002111 ssl->handshake->resume = 1;
2112
2113exit:
2114
Gilles Peskine449bd832023-01-11 14:50:10 +01002115 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002116}
2117
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002118MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002119static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002120{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002121#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002122 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002123#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002124 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002125 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002126 unsigned char *buf, *p;
2127
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002129
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002130#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2132 ssl->handshake->cookie_verify_result != 0) {
2133 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2134 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002135
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002137 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002138#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002139
Paul Bakker5121ce52009-01-03 21:22:43 +00002140 /*
2141 * 0 . 0 handshake type
2142 * 1 . 3 handshake length
2143 * 4 . 5 protocol version
2144 * 6 . 9 UNIX time()
2145 * 10 . 37 random bytes
2146 */
2147 buf = ssl->out_msg;
2148 p = buf + 4;
2149
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002151 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002152
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2154 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002156#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002157 t = mbedtls_time(NULL);
2158 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002159 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002160
Gilles Peskine449bd832023-01-11 14:50:10 +01002161 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2162 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002163#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2165 return ret;
2166 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002167
2168 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002169#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002170
Ronald Cronc5649382023-04-04 15:33:42 +02002171 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 return ret;
2173 }
Ronald Cronc5649382023-04-04 15:33:42 +02002174 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002175
Ronald Cronc5649382023-04-04 15:33:42 +02002176#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2177 /*
2178 * RFC 8446
2179 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2180 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2181 * response to a ClientHello MUST set the last 8 bytes of their Random
2182 * value specially in their ServerHello.
2183 */
2184 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2185 static const unsigned char magic_tls12_downgrade_string[] =
2186 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2187
2188 MBEDTLS_STATIC_ASSERT(
2189 sizeof(magic_tls12_downgrade_string) == 8,
2190 "magic_tls12_downgrade_string does not have the expected size");
2191
Ronald Cronfe01ec22023-04-06 09:56:53 +02002192 memcpy(p, magic_tls12_downgrade_string,
2193 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002194 } else
2195#endif
2196 {
2197 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2198 return ret;
2199 }
2200 }
2201 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002202
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002204
Gilles Peskine449bd832023-01-11 14:50:10 +01002205 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002206
Gilles Peskine449bd832023-01-11 14:50:10 +01002207 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002208
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002210 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002211 * New session, create a new session id,
2212 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002213 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002214 ssl->state++;
2215
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002216#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002217 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002218#endif
2219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002220#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002221 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002222 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 memset(ssl->session_negotiate->id, 0, 32);
2224 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002225#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002226 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002227 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002228 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2229 n)) != 0) {
2230 return ret;
2231 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002232 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002233 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002234 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002235 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002236 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002237 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002238 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002239
Gilles Peskine449bd832023-01-11 14:50:10 +01002240 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2241 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2242 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002243 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002244 }
2245
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002246 /*
2247 * 38 . 38 session id length
2248 * 39 . 38+n session id
2249 * 39+n . 40+n chosen ciphersuite
2250 * 41+n . 41+n chosen compression alg.
2251 * 42+n . 43+n extensions length
2252 * 44+n . 43+n+m extensions
2253 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002254 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002255 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002256 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002257
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2259 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2260 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2261 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002262
Gilles Peskine449bd832023-01-11 14:50:10 +01002263 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002264 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002265 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002266
Gilles Peskine449bd832023-01-11 14:50:10 +01002267 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2268 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2269 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2270 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002271
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002272 /*
2273 * First write extensions, then the total length
2274 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002276 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002278#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002280 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002281#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002282
Hanno Beckera0e20d02019-05-15 14:03:01 +01002283#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002284 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002285 ext_len += olen;
2286#endif
2287
Neil Armstrong76b74072022-04-06 13:43:54 +02002288#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002289 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002290 ext_len += olen;
2291#endif
2292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002293#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002294 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002295 ext_len += olen;
2296#endif
2297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002298#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002299 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002300 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002301#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002302
Valerio Setti7aeec542023-07-05 18:57:21 +02002303#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002304 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002305 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002306 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2308 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2309 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002310 ext_len += olen;
2311 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002312#endif
2313
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002314#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002315 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002316 ext_len += olen;
2317#endif
2318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002319#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002320 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002321 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2322 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002323 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 }
Paul Elliottf518f812022-07-11 12:36:20 +01002325
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002326 ext_len += olen;
2327#endif
2328
Johan Pascalb62bb512015-12-03 21:56:45 +01002329#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002330 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002331 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002332#endif
2333
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2335 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002336
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 if (ext_len > 0) {
2338 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002339 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002340 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002341
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002342 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002343 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2344 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002345
Gilles Peskine449bd832023-01-11 14:50:10 +01002346 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002347
Gilles Peskine449bd832023-01-11 14:50:10 +01002348 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002349
Gilles Peskine449bd832023-01-11 14:50:10 +01002350 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002351}
2352
Gilles Peskineeccd8882020-03-10 12:19:08 +01002353#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002354MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002355static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002356{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002357 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002358 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002359
Gilles Peskine449bd832023-01-11 14:50:10 +01002360 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002361
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2363 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002364 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002365 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002366 }
2367
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2369 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002370}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002371#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002372MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002373static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002374{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002375 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002376 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002377 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002378 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002379 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002380 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002381 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002382 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002383 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002384
Gilles Peskine449bd832023-01-11 14:50:10 +01002385 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002386
2387 ssl->state++;
2388
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002389#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002390 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002391 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002392 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002393#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002394 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002395
Gilles Peskine449bd832023-01-11 14:50:10 +01002396 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2397 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2398 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2399 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002400 }
2401
2402 /*
2403 * 0 . 0 handshake type
2404 * 1 . 3 handshake length
2405 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002406 * 5 .. m-1 cert types
2407 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002408 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002409 * n .. n+1 length of all DNs
2410 * n+2 .. n+3 length of DN 1
2411 * n+4 .. ... Distinguished Name #1
2412 * ... .. ... length of DN 2, etc.
2413 */
2414 buf = ssl->out_msg;
2415 p = buf + 4;
2416
2417 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002418 * Supported certificate types
2419 *
2420 * ClientCertificateType certificate_types<1..2^8-1>;
2421 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002422 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002423 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425#if defined(MBEDTLS_RSA_C)
2426 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002427#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002428#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002429 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002430#endif
2431
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002432 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002433 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002434
Paul Bakker577e0062013-08-28 11:57:20 +02002435 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002436
Paul Bakker926af752012-11-23 13:38:07 +01002437 /*
2438 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002439 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002440 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2441 *
2442 * struct {
2443 * HashAlgorithm hash;
2444 * SignatureAlgorithm signature;
2445 * } SignatureAndHashAlgorithm;
2446 *
2447 * enum { (255) } HashAlgorithm;
2448 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002449 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002450 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2451 if (sig_alg == NULL) {
2452 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2453 }
Ronald Cron8457c122022-03-07 11:32:54 +01002454
Gilles Peskine449bd832023-01-11 14:50:10 +01002455 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2456 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002457
Gilles Peskine449bd832023-01-11 14:50:10 +01002458 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002459 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002460 }
2461 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002462 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002463 }
Simon Butcher99000142016-10-13 17:21:01 +01002464
Paul Elliott96a0fd92022-11-08 17:09:56 +00002465 /* Write elements at offsets starting from 1 (offset 0 is for the
2466 * length). Thus the offset of each element is the length of the
2467 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002468 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002469 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002470
Paul Bakker926af752012-11-23 13:38:07 +01002471 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002472
Paul Elliott96a0fd92022-11-08 17:09:56 +00002473 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002474 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002475 sa_len += 2;
2476 p += sa_len;
2477
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002478 /*
2479 * DistinguishedName certificate_authorities<0..2^16-1>;
2480 * opaque DistinguishedName<1..2^16-1>;
2481 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002482 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002483
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002484 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002485
Gilles Peskine449bd832023-01-11 14:50:10 +01002486 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002487 /* NOTE: If trusted certificates are provisioned
2488 * via a CA callback (configured through
2489 * `mbedtls_ssl_conf_ca_cb()`, then the
2490 * CertificateRequest is currently left empty. */
2491
Glenn Strauss999ef702022-03-11 01:37:23 -05002492#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2493#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002495 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002497#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002499 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002501#endif
Janos Follath088ce432017-04-10 12:42:31 +01002502#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002504 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 } else
Janos Follath088ce432017-04-10 12:42:31 +01002506#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002507 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002508
Gilles Peskine449bd832023-01-11 14:50:10 +01002509 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002510 /* It follows from RFC 5280 A.1 that this length
2511 * can be represented in at most 11 bits. */
2512 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002513
Gilles Peskine449bd832023-01-11 14:50:10 +01002514 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2515 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002516 break;
2517 }
2518
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002520 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002521 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002522 p += dn_size;
2523
Gilles Peskine449bd832023-01-11 14:50:10 +01002524 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002525
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002526 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002527 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002528 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002529 }
2530
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002531 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002532 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2533 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002535
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002537
Gilles Peskine449bd832023-01-11 14:50:10 +01002538 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Gilles Peskine449bd832023-01-11 14:50:10 +01002540 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002541}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002542#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002543
Valerio Setti4d0e8462023-10-06 13:20:21 +02002544#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002545 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002546MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002547static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002548{
2549 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2550 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002551 mbedtls_pk_context *pk;
2552 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002553 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002554 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2555 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002556#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002557 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002558 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002559 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002560 mbedtls_ecp_keypair *key;
2561#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002562
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002564
Gilles Peskine449bd832023-01-11 14:50:10 +01002565 if (pk == NULL) {
2566 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2567 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002568
Valerio Setti0813b6f2023-06-16 12:18:53 +02002569 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002570
Valerio Setti0813b6f2023-06-16 12:18:53 +02002571 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002572 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002573#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2574 case MBEDTLS_PK_ECKEY:
2575 case MBEDTLS_PK_ECKEY_DH:
2576 case MBEDTLS_PK_ECDSA:
2577#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002578 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2579 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2580 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002581
Valerio Settibced8bc2023-12-06 10:40:47 +01002582 /* Get the attributes of the key previously parsed by PK module in
2583 * order to extract its type and length (in bits). */
2584 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002585 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002586 ret = PSA_TO_MBEDTLS_ERR(status);
2587 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002588 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002589 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002590 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002591
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002592#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2593 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002594 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2595 * module and only have ECDSA capabilities. Since we need
2596 * them for ECDH later, we export and then re-import them with
2597 * proper flags and algorithm. Of course We also set key's type
2598 * and bits that we just got above. */
2599 key_attributes = psa_key_attributes_init();
2600 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2601 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2602 psa_set_key_type(&key_attributes,
2603 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2604 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002605
Valerio Setti202bb712023-12-06 17:05:24 +01002606 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2607 if (status != PSA_SUCCESS) {
2608 ret = PSA_TO_MBEDTLS_ERR(status);
2609 goto exit;
2610 }
2611 status = psa_import_key(&key_attributes, buf, key_len,
2612 &ssl->handshake->xxdh_psa_privkey);
2613 if (status != PSA_SUCCESS) {
2614 ret = PSA_TO_MBEDTLS_ERR(status);
2615 goto exit;
2616 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002617
Valerio Setti202bb712023-12-06 17:05:24 +01002618 /* Set this key as owned by the TLS library: it will be its duty
2619 * to clear it exit. */
2620 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002621
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002622 ret = 0;
2623 break;
2624 }
2625#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2626
2627 /* Opaque key is created by the user (externally from Mbed TLS)
2628 * so we assume it already has the right algorithm and flags
2629 * set. Just copy its ID as reference. */
2630 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2631 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002632 ret = 0;
2633 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002634
Valerio Setti0813b6f2023-06-16 12:18:53 +02002635#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002636 case MBEDTLS_PK_ECKEY:
2637 case MBEDTLS_PK_ECKEY_DH:
2638 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002639 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002640 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002641 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002642 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2643 }
Valerio Setti97207782023-05-18 18:59:06 +02002644 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002645 if (tls_id == 0) {
2646 /* This elliptic curve is not supported */
2647 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2648 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002649
Gilles Peskine449bd832023-01-11 14:50:10 +01002650 /* If the above conversion to TLS ID was fine, then also this one will
2651 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002652 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002653 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002654
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002655 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002656
Gilles Peskine449bd832023-01-11 14:50:10 +01002657 key_attributes = psa_key_attributes_init();
2658 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2659 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2660 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002661 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002662 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002663
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002664 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002665 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002666 mbedtls_platform_zeroize(buf, sizeof(buf));
2667 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002668 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002669
Gilles Peskine449bd832023-01-11 14:50:10 +01002670 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002671 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002672 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002673 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002674 mbedtls_platform_zeroize(buf, sizeof(buf));
2675 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002677
Valerio Setti6835b4a2023-06-22 09:06:31 +02002678 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 ret = 0;
2680 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002681#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002682 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002683 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002684 }
2685
Valerio Settibced8bc2023-12-06 10:40:47 +01002686exit:
2687 psa_reset_key_attributes(&key_attributes);
2688 mbedtls_platform_zeroize(buf, sizeof(buf));
2689
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002691}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002692#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2693 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002694
Gilles Peskineeccd8882020-03-10 12:19:08 +01002695#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002696 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002697MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002698static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2699 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002700{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002701 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2702 * signature length which will be added in ssl_write_server_key_exchange
2703 * after the call to ssl_prepare_server_key_exchange.
2704 * ssl_write_server_key_exchange also takes care of incrementing
2705 * ssl->out_msglen. */
2706 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002707 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2708 - sig_start);
2709 int ret = ssl->conf->f_async_resume(ssl,
2710 sig_start, signature_len, sig_max_len);
2711 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002712 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002714 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002715 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2716 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002717}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002718#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002719 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002720
Gilles Peskined3eb0612018-01-08 17:07:44 +01002721/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002722 * calculating the signature if any, but excluding formatting the
2723 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002724MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002725static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2726 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002727{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002728 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002729 ssl->handshake->ciphersuite_info;
2730
Gilles Peskineeccd8882020-03-10 12:19:08 +01002731#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002732#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002733 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002734#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002735#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002736
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002737 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002738#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002739 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002740#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002741
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002742#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002743#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002744 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002745#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002746 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 +02002747#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002748#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002749
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002750 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002751
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002752 /*
2753 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002754 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002755 *
2756 */
2757
2758 /*
2759 * - ECJPAKE key exchanges
2760 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002761#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002762 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002763 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002764 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2765 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2766 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002767 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002768 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002769
Valerio Setti6f1b5742022-11-16 10:00:32 +01002770 /*
2771 * The first 3 bytes are:
2772 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2773 * [1, 2] elliptic curve's TLS ID
2774 *
2775 * However since we only support secp256r1 for now, we hardcode its
2776 * TLS ID here
2777 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002778 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002779 MBEDTLS_ECP_DP_SECP256R1);
2780 if (tls_id == 0) {
2781 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002782 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002783 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002784 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002785 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002786
Gilles Peskine449bd832023-01-11 14:50:10 +01002787 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2788 out_p + output_offset,
2789 end_p - out_p - output_offset, &output_len,
2790 MBEDTLS_ECJPAKE_ROUND_TWO);
2791 if (ret != 0) {
2792 psa_destroy_key(ssl->handshake->psa_pake_password);
2793 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2794 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2795 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002796 }
2797
Valerio Setti02c25b52022-11-15 14:08:42 +01002798 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002799 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002800 }
2801#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2802
Hanno Becker1aa267c2017-04-28 17:08:27 +01002803 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002804 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002805 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2806 * we use empty support identity hints here.
2807 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002808#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2809 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002810 ssl->out_msg[ssl->out_msglen++] = 0x00;
2811 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002812 }
Valerio Setti48659a12025-01-15 14:22:28 +01002813#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002814
Hanno Becker7e5437a2017-04-28 17:15:26 +01002815 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002816 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002817 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002818#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002819 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002820 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002821 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002822
Gilles Peskine449bd832023-01-11 14:50:10 +01002823 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2824 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2825 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002826 }
2827
Paul Bakker41c83d32013-03-20 14:39:14 +01002828 /*
2829 * Ephemeral DH parameters:
2830 *
2831 * struct {
2832 * opaque dh_p<1..2^16-1>;
2833 * opaque dh_g<1..2^16-1>;
2834 * opaque dh_Ys<1..2^16-1>;
2835 * } ServerDHParams;
2836 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002837 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2838 &ssl->conf->dhm_P,
2839 &ssl->conf->dhm_G)) != 0) {
2840 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2841 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002842 }
Paul Bakker48916f92012-09-16 19:57:18 +00002843
Gilles Peskine449bd832023-01-11 14:50:10 +01002844 if ((ret = mbedtls_dhm_make_params(
2845 &ssl->handshake->dhm_ctx,
2846 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2847 ssl->out_msg + ssl->out_msglen, &len,
2848 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2849 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2850 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002851 }
2852
Jerry Yuc5aef882021-12-23 20:15:02 +08002853#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002854 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002855#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002856
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002857 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002858
Gilles Peskine449bd832023-01-11 14:50:10 +01002859 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2860 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2861 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2862 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002863 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002864#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002865
Hanno Becker1aa267c2017-04-28 17:08:27 +01002866 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002867 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002868 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002869#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002870 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002871 /*
2872 * Ephemeral ECDH parameters:
2873 *
2874 * struct {
2875 * ECParameters curve_params;
2876 * ECPoint public;
2877 * } ServerECDHParams;
2878 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002879 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002880 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002881 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002882 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002883
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002884 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002885 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2886 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2887 }
2888 for (; *group_list != 0; group_list++) {
2889 for (curr_tls_id = ssl->handshake->curves_tls_id;
2890 *curr_tls_id != 0; curr_tls_id++) {
2891 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002892 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002893 }
2894 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002895 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002896
Gilles Peskine449bd832023-01-11 14:50:10 +01002897curve_matching_done:
2898 if (*curr_tls_id == 0) {
2899 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2900 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2901 }
2902
2903 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2904 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002905
Neil Armstrongd91526c2022-04-12 14:38:52 +02002906 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2907 psa_key_attributes_t key_attributes;
2908 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002909 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2910 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2911 // data length(1)
2912 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002913 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002914 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002915
Gilles Peskine449bd832023-01-11 14:50:10 +01002916 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002917
Valerio Setti40d9ca92023-01-04 16:08:04 +01002918 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002919 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002920 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002921 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2922 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2923 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002924 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002925 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002926 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002927
2928 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002929 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2930 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002931 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002932 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002933
2934 /*
2935 * ECParameters curve_params
2936 *
2937 * First byte is curve_type, always named_curve
2938 */
2939 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2940
2941 /*
2942 * Next two bytes are the namedcurve value
2943 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002944 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002945 p += 2;
2946
2947 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002949 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002950 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002951 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002952 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2953 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002954 }
2955
2956 /*
2957 * ECPoint public
2958 *
2959 * First byte is data length.
2960 * It will be filled later. p holds now the data length location.
2961 */
2962
2963 /* Export the public part of the ECDH private key from PSA.
2964 * Make one byte space for the length.
2965 */
2966 unsigned char *own_pubkey = p + data_length_size;
2967
Gilles Peskine449bd832023-01-11 14:50:10 +01002968 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2969 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002970
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002971 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002972 own_pubkey, own_pubkey_max_len,
2973 &len);
2974 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002975 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002976 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002977 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2978 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002979 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002980 }
2981
2982 /* Store the length of the exported public key. */
2983 *p = (uint8_t) len;
2984
2985 /* Determine full message length. */
2986 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002987
Jerry Yuc5aef882021-12-23 20:15:02 +08002988#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002989 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002990#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002991
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002992 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002993 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002994#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002995
Hanno Becker1aa267c2017-04-28 17:08:27 +01002996 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002997 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002998 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002999 * exchange parameters, compute and add the signature here.
3000 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003001 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003002#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003003 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3004 if (dig_signed == NULL) {
3005 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3006 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003007 }
3008
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003009 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003010 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003011 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003012
Janos Follath865b3eb2019-12-16 11:46:15 +00003013 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003014
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003015 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003016 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003017 * For TLS 1.2, obey signature-hash-algorithm extension
3018 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003019 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003020
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003021 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003022 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003023
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003024 unsigned char sig_hash =
3025 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003026 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003027
Gilles Peskine449bd832023-01-11 14:50:10 +01003028 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003029
Ronald Cron8457c122022-03-07 11:32:54 +01003030 /* For TLS 1.2, obey signature-hash-algorithm extension
3031 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003032 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3033 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003034 /* (... because we choose a cipher suite
3035 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003036 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003037 }
3038
Gilles Peskine449bd832023-01-11 14:50:10 +01003039 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003040
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003041 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003042 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003043 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003044 if (md_alg != MBEDTLS_MD_NONE) {
3045 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3046 dig_signed,
3047 dig_signed_len,
3048 md_alg);
3049 if (ret != 0) {
3050 return ret;
3051 }
3052 } else {
3053 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3054 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003055 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003056
Gilles Peskine449bd832023-01-11 14:50:10 +01003057 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003058
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003059 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003060 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003061 */
Ronald Cron8457c122022-03-07 11:32:54 +01003062 /*
3063 * We need to specify signature and hash algorithm explicitly through
3064 * a prefix to the signature.
3065 *
3066 * struct {
3067 * HashAlgorithm hash;
3068 * SignatureAlgorithm signature;
3069 * } SignatureAndHashAlgorithm;
3070 *
3071 * struct {
3072 * SignatureAndHashAlgorithm algorithm;
3073 * opaque signature<0..2^16-1>;
3074 * } DigitallySigned;
3075 *
3076 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003077
Gilles Peskine449bd832023-01-11 14:50:10 +01003078 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3079 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003080
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003081#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003082 if (ssl->conf->f_async_sign_start != NULL) {
3083 ret = ssl->conf->f_async_sign_start(ssl,
3084 mbedtls_ssl_own_cert(ssl),
3085 md_alg, hash, hashlen);
3086 switch (ret) {
3087 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3088 /* act as if f_async_sign was null */
3089 break;
3090 case 0:
3091 ssl->handshake->async_in_progress = 1;
3092 return ssl_resume_server_key_exchange(ssl, signature_len);
3093 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3094 ssl->handshake->async_in_progress = 1;
3095 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3096 default:
3097 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3098 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003099 }
3100 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003101#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003102
Gilles Peskine449bd832023-01-11 14:50:10 +01003103 if (mbedtls_ssl_own_key(ssl) == NULL) {
3104 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3105 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003106 }
3107
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003108 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3109 * signature length which will be added in ssl_write_server_key_exchange
3110 * after the call to ssl_prepare_server_key_exchange.
3111 * ssl_write_server_key_exchange also takes care of incrementing
3112 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003113 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3114 md_alg, hash, hashlen,
3115 ssl->out_msg + ssl->out_msglen + 2,
3116 out_buf_len - ssl->out_msglen - 2,
3117 signature_len,
3118 ssl->conf->f_rng,
3119 ssl->conf->p_rng)) != 0) {
3120 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3121 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003122 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003123 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003124#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003125
Gilles Peskine449bd832023-01-11 14:50:10 +01003126 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003127}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003128
Gilles Peskined3eb0612018-01-08 17:07:44 +01003129/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003130 * that do not include a ServerKeyExchange message, do nothing. Either
3131 * way, if successful, move on to the next step in the SSL state
3132 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003133MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003134static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003135{
Janos Follath865b3eb2019-12-16 11:46:15 +00003136 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003137 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003138#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003139 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003141#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003142
Gilles Peskine449bd832023-01-11 14:50:10 +01003143 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003144
Gilles Peskineeccd8882020-03-10 12:19:08 +01003145#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003146 /* Extract static ECDH parameters and abort if ServerKeyExchange
3147 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003148 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003149 /* For suites involving ECDH, extract DH parameters
3150 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003151#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003152 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3153 ret = ssl_get_ecdh_params_from_cert(ssl);
3154 if (ret != 0) {
3155 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3156 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003157 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003158 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003159#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003160
3161 /* Key exchanges not involving ephemeral keys don't use
3162 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003163 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003164 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003165 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003166 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003167#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003168
Gilles Peskineeccd8882020-03-10 12:19:08 +01003169#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003170 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003171 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003172 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003173 if (ssl->handshake->async_in_progress != 0) {
3174 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3175 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3176 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003177#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003178 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003179 {
3180 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003181 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003182 }
3183
Gilles Peskine449bd832023-01-11 14:50:10 +01003184 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003185 /* If we're starting to write a new message, set ssl->out_msglen
3186 * to 0. But if we're resuming after an asynchronous message,
3187 * out_msglen is the amount of data written so far and mst be
3188 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003189 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3190 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3191 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003192 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003193 }
3194 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003195 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003196
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003197 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003198 * ssl_prepare_server_key_exchange already wrote the signature
3199 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003200#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003201 if (signature_len != 0) {
3202 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3203 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003204
Gilles Peskine449bd832023-01-11 14:50:10 +01003205 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3206 ssl->out_msg + ssl->out_msglen,
3207 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003208
3209 /* Skip over the already-written signature */
3210 ssl->out_msglen += signature_len;
3211 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003212#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003213
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003214 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003215 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3216 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003217
3218 ssl->state++;
3219
Gilles Peskine449bd832023-01-11 14:50:10 +01003220 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3221 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3222 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003223 }
3224
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3226 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003227}
3228
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003229MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003230static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003231{
Janos Follath865b3eb2019-12-16 11:46:15 +00003232 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003233
Gilles Peskine449bd832023-01-11 14:50:10 +01003234 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003235
3236 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003237 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3238 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003239
3240 ssl->state++;
3241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003242#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003243 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3244 mbedtls_ssl_send_flight_completed(ssl);
3245 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003246#endif
3247
Gilles Peskine449bd832023-01-11 14:50:10 +01003248 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3249 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3250 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003251 }
3252
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003253#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3255 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3256 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3257 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003258 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003259#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003260
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003262
Gilles Peskine449bd832023-01-11 14:50:10 +01003263 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003264}
3265
Valerio Setti48659a12025-01-15 14:22:28 +01003266#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003267MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003268static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3269 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003270{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003271 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003272 size_t n;
3273
3274 /*
3275 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3276 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003277 if (*p + 2 > end) {
3278 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3279 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003280 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003281
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003282 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003283 *p += 2;
3284
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (*p + n > end) {
3286 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3287 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003288 }
3289
Gilles Peskine449bd832023-01-11 14:50:10 +01003290 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3291 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3292 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003293 }
3294
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003295 *p += n;
3296
Gilles Peskine449bd832023-01-11 14:50:10 +01003297 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003298
Gilles Peskine449bd832023-01-11 14:50:10 +01003299 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003300}
Valerio Setti48659a12025-01-15 14:22:28 +01003301#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003302
Gilles Peskineac767e52024-09-20 18:08:44 +02003303#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003304
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003305#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003306MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003307static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3308 unsigned char *peer_pms,
3309 size_t *peer_pmslen,
3310 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003311{
Gilles Peskine449bd832023-01-11 14:50:10 +01003312 int ret = ssl->conf->f_async_resume(ssl,
3313 peer_pms, peer_pmslen, peer_pmssize);
3314 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003315 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003316 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003317 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003318 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3319 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003320}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003321#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003322
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003323MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003324static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3325 const unsigned char *p,
3326 const unsigned char *end,
3327 unsigned char *peer_pms,
3328 size_t *peer_pmslen,
3329 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003330{
Janos Follath865b3eb2019-12-16 11:46:15 +00003331 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003332
Gilles Peskine449bd832023-01-11 14:50:10 +01003333 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3334 if (own_cert == NULL) {
3335 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3336 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003337 }
3338 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3340 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003341
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003342#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003343 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003344 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003345 if (ssl->handshake->async_in_progress != 0) {
3346 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3347 return ssl_resume_decrypt_pms(ssl,
3348 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003349 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003350#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003351
3352 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003353 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003354 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 if (p + 2 > end) {
3356 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3357 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003358 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003359 if (*p++ != MBEDTLS_BYTE_1(len) ||
3360 *p++ != MBEDTLS_BYTE_0(len)) {
3361 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3362 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003363 }
3364
Gilles Peskine449bd832023-01-11 14:50:10 +01003365 if (p + len != end) {
3366 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3367 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003368 }
3369
Gilles Peskine422ccab2018-01-11 18:29:01 +01003370 /*
3371 * Decrypt the premaster secret
3372 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003373#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 if (ssl->conf->f_async_decrypt_start != NULL) {
3375 ret = ssl->conf->f_async_decrypt_start(ssl,
3376 mbedtls_ssl_own_cert(ssl),
3377 p, len);
3378 switch (ret) {
3379 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3380 /* act as if f_async_decrypt_start was null */
3381 break;
3382 case 0:
3383 ssl->handshake->async_in_progress = 1;
3384 return ssl_resume_decrypt_pms(ssl,
3385 peer_pms,
3386 peer_pmslen,
3387 peer_pmssize);
3388 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3389 ssl->handshake->async_in_progress = 1;
3390 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3391 default:
3392 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3393 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003394 }
3395 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003396#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003397
Gilles Peskine449bd832023-01-11 14:50:10 +01003398 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3399 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3400 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003401 }
3402
Gilles Peskine449bd832023-01-11 14:50:10 +01003403 ret = mbedtls_pk_decrypt(private_key, p, len,
3404 peer_pms, peer_pmslen, peer_pmssize,
3405 ssl->conf->f_rng, ssl->conf->p_rng);
3406 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003407}
3408
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003409MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003410static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3411 const unsigned char *p,
3412 const unsigned char *end,
3413 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003414{
Janos Follath865b3eb2019-12-16 11:46:15 +00003415 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003416 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3417 unsigned char ver[2];
3418 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003419 size_t peer_pmslen;
3420 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003421
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003422 /* In case of a failure in decryption, the decryption may write less than
3423 * 2 bytes of output, but we always read the first two bytes. It doesn't
3424 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003425 * ret being nonzero, and we only care whether diff is 0.
3426 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3427 * also makes memory analyzers happy (don't access uninitialized memory,
3428 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003429 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003430 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003431
Gilles Peskine449bd832023-01-11 14:50:10 +01003432 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3433 peer_pms,
3434 &peer_pmslen,
3435 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003436
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003437#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003438 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3439 return ret;
3440 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003441#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003442
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3444 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003445
3446 /* Avoid data-dependent branches while checking for invalid
3447 * padding, to protect against timing-based Bleichenbacher-type
3448 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003449 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003450 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3451 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3452 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003453
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003454 /*
3455 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3456 * must not cause the connection to end immediately; instead, send a
3457 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003458 * To protect against timing-based variants of the attack, we must
3459 * not have any branch that depends on whether the decryption was
3460 * successful. In particular, always generate the fake premaster secret,
3461 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003462 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003463 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3464 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003465 /* It's ok to abort on an RNG failure, since this does not reveal
3466 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003467 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003468 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003469
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003470#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003471 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003472 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3473 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003474#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003475
Gilles Peskine449bd832023-01-11 14:50:10 +01003476 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3477 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3478 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3479 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003480 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003481 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003482
Gilles Peskine422ccab2018-01-11 18:29:01 +01003483 /* Set pms to either the true or the fake PMS, without
3484 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003485 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003486
Gilles Peskine449bd832023-01-11 14:50:10 +01003487 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003488}
Gilles Peskineac767e52024-09-20 18:08:44 +02003489#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003490
Gilles Peskineeccd8882020-03-10 12:19:08 +01003491#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003492MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003493static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3494 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003495{
Paul Bakker6db455e2013-09-18 17:29:31 +02003496 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003497 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003498
Gilles Peskine449bd832023-01-11 14:50:10 +01003499 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3500 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3501 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003502 }
3503
3504 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003505 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003506 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003507 if (end - *p < 2) {
3508 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3509 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003510 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003511
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003512 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003513 *p += 2;
3514
Gilles Peskine449bd832023-01-11 14:50:10 +01003515 if (n == 0 || n > end - *p) {
3516 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3517 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003518 }
3519
Gilles Peskine449bd832023-01-11 14:50:10 +01003520 if (ssl->conf->f_psk != NULL) {
3521 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003522 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003523 }
3524 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003525 /* Identity is not a big secret since clients send it in the clear,
3526 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003527 if (n != ssl->conf->psk_identity_len ||
3528 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003529 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003530 }
3531 }
3532
Gilles Peskine449bd832023-01-11 14:50:10 +01003533 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3534 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3535 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3536 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3537 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003538 }
3539
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003540 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003541
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003543}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003544#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003545
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003546MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003547static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003548{
Janos Follath865b3eb2019-12-16 11:46:15 +00003549 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003550 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003551 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003552
Hanno Beckere694c3e2017-12-27 21:34:08 +00003553 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003554
Gilles Peskine449bd832023-01-11 14:50:10 +01003555 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003556
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003557#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskineac767e52024-09-20 18:08:44 +02003558 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine712e9a12024-09-20 18:11:31 +02003559 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA &&
Gilles Peskine449bd832023-01-11 14:50:10 +01003560 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003561 /* We've already read a record and there is an asynchronous
3562 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003563 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003564 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3565 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003566#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003567 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3568 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3569 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003570 }
3571
Gilles Peskine449bd832023-01-11 14:50:10 +01003572 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003573 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003574
Gilles Peskine449bd832023-01-11 14:50:10 +01003575 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3576 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3577 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003578 }
3579
Gilles Peskine449bd832023-01-11 14:50:10 +01003580 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3581 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3582 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003583 }
3584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003585#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003586 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3587 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3588 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3589 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003590 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003591
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 if (p != end) {
3593 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3594 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003595 }
3596
Gilles Peskine449bd832023-01-11 14:50:10 +01003597 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3598 ssl->handshake->premaster,
3599 MBEDTLS_PREMASTER_SIZE,
3600 &ssl->handshake->pmslen,
3601 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3602 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3603 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003604 }
3605
Gilles Peskine449bd832023-01-11 14:50:10 +01003606 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3607 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003608#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003609#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3610 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3611 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3612 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003613 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003614 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3615 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003616 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003617 size_t data_len = (size_t) (*p++);
3618 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003619 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3620 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3621
Gilles Peskine530c4232023-10-02 15:37:23 +02003622 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003623
3624 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003625 * We must have at least two bytes (1 for length, at least 1 for data)
3626 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003627 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003628 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3629 buf_len));
3630 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003631 }
3632
Gilles Peskine449bd832023-01-11 14:50:10 +01003633 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003634 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3635 " > %" MBEDTLS_PRINTF_SIZET,
3636 data_len, buf_len));
3637 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003638 }
3639
3640 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003641 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003642 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3643 " > %" MBEDTLS_PRINTF_SIZET,
3644 data_len,
3645 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003646 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3647 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003648 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3649 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003650
3651 /* Compute ECDH shared secret. */
3652 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003653 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3654 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003655 handshake->premaster, sizeof(handshake->premaster),
3656 &handshake->pmslen);
3657 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003658 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003660 if (handshake->xxdh_psa_privkey_is_external == 0) {
3661 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003662 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003663 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003664 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003665 }
3666
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003667 if (handshake->xxdh_psa_privkey_is_external == 0) {
3668 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003669
Gilles Peskine449bd832023-01-11 14:50:10 +01003670 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003671 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003672 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3673 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003674 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003675 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003676 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003677 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003678#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3679 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3680 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3681 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3682#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003683 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3684 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3685 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3686 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003687 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003688
Gilles Peskine449bd832023-01-11 14:50:10 +01003689 if (p != end) {
3690 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3691 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003692 }
3693
Gilles Peskine449bd832023-01-11 14:50:10 +01003694 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003695#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003696#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003697 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003698 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3699 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003700 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003701
3702 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3703
Gilles Peskine449bd832023-01-11 14:50:10 +01003704 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3705 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003706 psa_destroy_key(handshake->xxdh_psa_privkey);
3707 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003708 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003709 }
3710
3711 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003712 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003713 psa_destroy_key(handshake->xxdh_psa_privkey);
3714 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003715 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003716 }
3717
Neil Armstrong039db292022-03-09 11:38:34 +01003718 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003719 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003720 psa_destroy_key(handshake->xxdh_psa_privkey);
3721 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003722 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003723 }
3724
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003725 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3726 the sizes of the FFDH keys which are at least 2048 bits.
3727 The size of the array is thus greater than 256 bytes which is greater than any
3728 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003729#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003730 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3731 psa_destroy_key(handshake->xxdh_psa_privkey);
3732 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003733 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003734 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003735#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003736 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3737 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003738#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003739
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003740 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3741 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003742 p += ecpoint_len;
3743
Neil Armstrong3bcef082022-03-23 18:16:54 +01003744 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003745 * - a uint16 containing the length (in octets) of the ECDH computation
3746 * - the octet string produced by the ECDH computation
3747 * - a uint16 containing the length (in octets) of the PSK
3748 * - the PSK itself
3749 */
Neil Armstrong039db292022-03-09 11:38:34 +01003750 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003751 const unsigned char * const psm_end =
3752 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003753 /* uint16 to store length (in octets) of the ECDH computation */
3754 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003755 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003756
3757 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003758 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003759 handshake->xxdh_psa_privkey,
3760 handshake->xxdh_psa_peerkey,
3761 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003762 psm + zlen_size,
3763 psm_end - (psm + zlen_size),
3764 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003765
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003766 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3767 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003768
Gilles Peskine449bd832023-01-11 14:50:10 +01003769 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003770 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003771 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003772 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 }
Neil Armstrong039db292022-03-09 11:38:34 +01003774
Neil Armstrong3bcef082022-03-23 18:16:54 +01003775 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003776 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003777 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003778
Gilles Peskine449bd832023-01-11 14:50:10 +01003779 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003780#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3781#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3783 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3784 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3785 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003786 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003787 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003788#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003789#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003790 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003791 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003792 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003793 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3794 psa_destroy_key(ssl->handshake->psa_pake_password);
3795 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003796
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3798 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003799 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003800 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003801#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003802 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3804 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003805 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003806
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3808 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3809 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003810 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003811
Paul Bakker5121ce52009-01-03 21:22:43 +00003812 ssl->state++;
3813
Gilles Peskine449bd832023-01-11 14:50:10 +01003814 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003815
Gilles Peskine449bd832023-01-11 14:50:10 +01003816 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003817}
3818
Gilles Peskineeccd8882020-03-10 12:19:08 +01003819#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003820MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003821static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003822{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003823 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003824 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003825
Gilles Peskine449bd832023-01-11 14:50:10 +01003826 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003827
Gilles Peskine449bd832023-01-11 14:50:10 +01003828 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3829 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003830 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003831 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003832 }
3833
Gilles Peskine449bd832023-01-11 14:50:10 +01003834 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3835 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003836}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003837#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003838MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003839static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003840{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003841 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003842 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003843 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003844 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003845 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003846 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003847 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003848 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003849 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003850 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003851
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003853
Gilles Peskine449bd832023-01-11 14:50:10 +01003854 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3855 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003856 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003857 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003858 }
3859
Hanno Becker2a831a42019-02-07 13:17:25 +00003860#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003861 if (ssl->session_negotiate->peer_cert == NULL) {
3862 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003863 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003865 }
3866#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003867 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3868 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003869 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003870 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003871 }
3872#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3873
Simon Butcher99000142016-10-13 17:21:01 +01003874 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003875 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3876 if (0 != ret) {
3877 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3878 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003879 }
3880
3881 ssl->state++;
3882
Simon Butcher99000142016-10-13 17:21:01 +01003883 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003884 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3885 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3886 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3887 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003888 }
3889
Gilles Peskine449bd832023-01-11 14:50:10 +01003890 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003891
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003892#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3893 peer_pk = &ssl->handshake->peer_pubkey;
3894#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003895 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003896 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003897 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003898 }
3899 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3900#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3901
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003902 /*
3903 * struct {
3904 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3905 * opaque signature<0..2^16-1>;
3906 * } DigitallySigned;
3907 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 if (i + 2 > ssl->in_hslen) {
3909 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3910 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003911 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003912
Ronald Cron8457c122022-03-07 11:32:54 +01003913 /*
3914 * Hash
3915 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003916 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003917
Gilles Peskine449bd832023-01-11 14:50:10 +01003918 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3919 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3920 " for verify message"));
3921 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003922 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003923
Simon Butcher99000142016-10-13 17:21:01 +01003924#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003925 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003926 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003927 }
Simon Butcher99000142016-10-13 17:21:01 +01003928#endif
Paul Bakker926af752012-11-23 13:38:07 +01003929
Ronald Cron8457c122022-03-07 11:32:54 +01003930 /* Info from md_alg will be used instead */
3931 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003932
Ronald Cron8457c122022-03-07 11:32:54 +01003933 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003934
Ronald Cron8457c122022-03-07 11:32:54 +01003935 /*
3936 * Signature
3937 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003938 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3939 == MBEDTLS_PK_NONE) {
3940 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3941 " for verify message"));
3942 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003943 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003944
Ronald Cron8457c122022-03-07 11:32:54 +01003945 /*
3946 * Check the certificate's key type matches the signature alg
3947 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003948 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3949 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3950 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003951 }
3952
3953 i++;
3954
Gilles Peskine449bd832023-01-11 14:50:10 +01003955 if (i + 2 > ssl->in_hslen) {
3956 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3957 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003958 }
3959
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003960 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003961 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003962
Gilles Peskine449bd832023-01-11 14:50:10 +01003963 if (i + sig_len != ssl->in_hslen) {
3964 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3965 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003966 }
3967
Simon Butcher99000142016-10-13 17:21:01 +01003968 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003969 {
3970 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003971 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3972 if (0 != ret) {
3973 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3974 return ret;
3975 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003976 }
Simon Butcher99000142016-10-13 17:21:01 +01003977
Gilles Peskine449bd832023-01-11 14:50:10 +01003978 if ((ret = mbedtls_pk_verify(peer_pk,
3979 md_alg, hash_start, hashlen,
3980 ssl->in_msg + i, sig_len)) != 0) {
3981 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3982 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003983 }
3984
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003985 ret = mbedtls_ssl_update_handshake_status(ssl);
3986 if (0 != ret) {
3987 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3988 return ret;
3989 }
Simon Butcher99000142016-10-13 17:21:01 +01003990
Gilles Peskine449bd832023-01-11 14:50:10 +01003991 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003992
Gilles Peskine449bd832023-01-11 14:50:10 +01003993 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003994}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003995#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003996
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003997#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003998MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003999static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004000{
Janos Follath865b3eb2019-12-16 11:46:15 +00004001 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004002 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004003 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004004
Gilles Peskine449bd832023-01-11 14:50:10 +01004005 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004007 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4008 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004009
4010 /*
4011 * struct {
4012 * uint32 ticket_lifetime_hint;
4013 * opaque ticket<0..2^16-1>;
4014 * } NewSessionTicket;
4015 *
4016 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4017 * 8 . 9 ticket_len (n)
4018 * 10 . 9+n ticket content
4019 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004020
Ronald Cron3c0072b2023-11-22 10:00:14 +01004021#if defined(MBEDTLS_HAVE_TIME)
4022 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4023#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004024 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4025 ssl->session_negotiate,
4026 ssl->out_msg + 10,
4027 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4028 &tlen, &lifetime)) != 0) {
4029 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004030 tlen = 0;
4031 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004032
Gilles Peskine449bd832023-01-11 14:50:10 +01004033 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4034 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004035 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004036
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004037 /*
4038 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4039 * ChangeCipherSpec share the same state.
4040 */
4041 ssl->handshake->new_session_ticket = 0;
4042
Gilles Peskine449bd832023-01-11 14:50:10 +01004043 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4044 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4045 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004046 }
4047
Gilles Peskine449bd832023-01-11 14:50:10 +01004048 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004049
Gilles Peskine449bd832023-01-11 14:50:10 +01004050 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004051}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004052#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004053
Paul Bakker5121ce52009-01-03 21:22:43 +00004054/*
Paul Bakker1961b702013-01-25 14:49:24 +01004055 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004056 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004057int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004058{
4059 int ret = 0;
4060
Gilles Peskine449bd832023-01-11 14:50:10 +01004061 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004062
Gilles Peskine449bd832023-01-11 14:50:10 +01004063 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004064 case MBEDTLS_SSL_HELLO_REQUEST:
4065 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004066 break;
4067
Paul Bakker1961b702013-01-25 14:49:24 +01004068 /*
4069 * <== ClientHello
4070 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004071 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004072 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004073 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004075#if defined(MBEDTLS_SSL_PROTO_DTLS)
4076 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004077 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004078#endif
4079
Paul Bakker1961b702013-01-25 14:49:24 +01004080 /*
4081 * ==> ServerHello
4082 * Certificate
4083 * ( ServerKeyExchange )
4084 * ( CertificateRequest )
4085 * ServerHelloDone
4086 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004087 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004088 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004089 break;
4090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004091 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004092 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004093 break;
4094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004095 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004096 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004097 break;
4098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004099 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004101 break;
4102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004103 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004104 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004105 break;
4106
4107 /*
4108 * <== ( Certificate/Alert )
4109 * ClientKeyExchange
4110 * ( CertificateVerify )
4111 * ChangeCipherSpec
4112 * Finished
4113 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004114 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004115 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004116 break;
4117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004118 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004119 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004120 break;
4121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004122 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004123 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004124 break;
4125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004126 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004127 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004128 break;
4129
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004130 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004131 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004132 break;
4133
4134 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004135 * ==> ( NewSessionTicket )
4136 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004137 * Finished
4138 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004139 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4140#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004141 if (ssl->handshake->new_session_ticket != 0) {
4142 ret = ssl_write_new_session_ticket(ssl);
4143 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004144#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004145 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004146 break;
4147
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004148 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004149 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004150 break;
4151
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004152 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004153 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004154 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004155 break;
4156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004157 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004158 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004159 break;
4160
4161 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004162 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4163 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004164 }
4165
Gilles Peskine449bd832023-01-11 14:50:10 +01004166 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004167}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004168
Gilles Peskine449bd832023-01-11 14:50:10 +01004169void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004170{
TRodziewicz3946f792021-06-14 12:11:18 +02004171 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004172}
4173
Jerry Yufb4b6472022-01-27 15:03:26 +08004174#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */