blob: 67df4284a401ae2f0cc3322adec877cecc9f6dea [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
Gilles Peskinedb09ef62020-06-03 01:43:33 +02008#include "common.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"
Chris Jones84a773f2021-03-05 18:38:47 +000015#include "ssl_misc.h"
Valerio Settib4f50762024-01-17 10:24:52 +010016#include "debug_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000017#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050018#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020019#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020020#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000021
22#include <string.h>
23
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050024#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek00644842023-05-30 05:45:00 -040025/* Define a local translating function to save code size by not using too many
26 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040027#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
28 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040029static int local_err_translation(psa_status_t status)
30{
31 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040032 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040033 psa_generic_status_to_mbedtls);
34}
35#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050036#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050037#endif
38
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010041#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010044#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010048int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
49 const unsigned char *info,
50 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020051{
Gilles Peskine449bd832023-01-11 14:50:10 +010052 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
53 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
54 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020055
Gilles Peskine449bd832023-01-11 14:50:10 +010056 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020057
Gilles Peskine449bd832023-01-11 14:50:10 +010058 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
59 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
60 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020061
Gilles Peskine449bd832023-01-11 14:50:10 +010062 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063 ssl->cli_id_len = ilen;
64
Gilles Peskine449bd832023-01-11 14:50:10 +010065 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020066}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020067
Gilles Peskine449bd832023-01-11 14:50:10 +010068void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
69 mbedtls_ssl_cookie_write_t *f_cookie_write,
70 mbedtls_ssl_cookie_check_t *f_cookie_check,
71 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020072{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020073 conf->f_cookie_write = f_cookie_write;
74 conf->f_cookie_check = f_cookie_check;
75 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020076}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020078
Gilles Peskineeccd8882020-03-10 12:19:08 +010079#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020080MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010081static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010082{
Gilles Peskine449bd832023-01-11 14:50:10 +010083 if (conf->f_psk != NULL) {
84 return 1;
85 }
Hanno Becker845b9462018-10-26 12:07:29 +010086
Gilles Peskine449bd832023-01-11 14:50:10 +010087 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
88 return 0;
89 }
Hanno Becker845b9462018-10-26 12:07:29 +010090
Hanno Becker845b9462018-10-26 12:07:29 +010091
92#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +010093 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
94 return 1;
95 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020096#endif /* MBEDTLS_USE_PSA_CRYPTO */
97
Gilles Peskine449bd832023-01-11 14:50:10 +010098 if (conf->psk != NULL && conf->psk_len != 0) {
99 return 1;
100 }
Hanno Becker845b9462018-10-26 12:07:29 +0100101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100103}
Gilles Peskineeccd8882020-03-10 12:19:08 +0100104#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100105
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200106MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100107static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
108 const unsigned char *buf,
109 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000110{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100113 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100115 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
117 ssl->verify_data_len) != 0) {
118 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
119 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
120 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
121 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100122 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200124#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000125 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 if (len != 1 || buf[0] != 0x0) {
127 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
128 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
129 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
130 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000131 }
132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000134 }
Paul Bakker48916f92012-09-16 19:57:18 +0000135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000137}
138
Valerio Setti60d3b912023-07-25 10:43:53 +0200139#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200140 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100141 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800142/*
Jerry Yud491ea42022-01-13 16:15:25 +0800143 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
144 * curves (TLS 1.2) extension.
145 *
146 * The "extension_data" field of a supported groups extension contains a
147 * "NamedGroupList" value (TLS 1.3 RFC8446):
148 * enum {
149 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
150 * x25519(0x001D), x448(0x001E),
151 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
152 * ffdhe6144(0x0103), ffdhe8192(0x0104),
153 * ffdhe_private_use(0x01FC..0x01FF),
154 * ecdhe_private_use(0xFE00..0xFEFF),
155 * (0xFFFF)
156 * } NamedGroup;
157 * struct {
158 * NamedGroup named_group_list<2..2^16-1>;
159 * } NamedGroupList;
160 *
161 * The "extension_data" field of a supported elliptic curves extension contains
162 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
163 * enum {
164 * deprecated(1..22),
165 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
166 * x25519(29), x448(30),
167 * reserved (0xFE00..0xFEFF),
168 * deprecated(0xFF01..0xFF02),
169 * (0xFFFF)
170 * } NamedCurve;
171 * struct {
172 * NamedCurve named_curve_list<2..2^16-1>
173 * } NamedCurveList;
174 *
Jerry Yub925f212022-01-12 11:17:02 +0800175 * The TLS 1.3 supported groups extension was defined to be a compatible
176 * generalization of the TLS 1.2 supported elliptic curves extension. They both
177 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800178 *
Jerry Yub925f212022-01-12 11:17:02 +0800179 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200180MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100181static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
182 const unsigned char *buf,
183 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100184{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200185 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100186 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100187 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 if (len < 2) {
190 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
191 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
192 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
193 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200194 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000195 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100196 if (list_size + 2 != len ||
197 list_size % 2 != 0) {
198 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
199 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
200 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
201 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100202 }
203
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200204 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 if (ssl->handshake->curves_tls_id != NULL) {
206 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
207 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
208 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
209 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200210 }
211
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100212 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200213 * and leave room for a final 0 */
214 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200216 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100217 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200218
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 if ((curves_tls_id = mbedtls_calloc(our_size,
220 sizeof(*curves_tls_id))) == NULL) {
221 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
222 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
223 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200224 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200225
Valerio Setti18c9fed2022-12-30 17:44:24 +0100226 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200227
Paul Bakker41c83d32013-03-20 14:39:14 +0100228 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 while (list_size > 0 && our_size > 1) {
230 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200231
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
233 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100234 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200235 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100236 }
237
238 list_size -= 2;
239 p += 2;
240 }
241
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100243}
244
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200245MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100246static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
247 const unsigned char *buf,
248 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100249{
250 size_t list_size;
251 const unsigned char *p;
252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 if (len == 0 || (size_t) (buf[0] + 1) != len) {
254 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
255 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
256 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
257 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100258 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200259 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100260
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200261 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 while (list_size > 0) {
263 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
264 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200265#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
266 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200267 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200268#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200269#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
271 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
272 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200273#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
275 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100276 }
277
278 list_size--;
279 p++;
280 }
281
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100283}
Valerio Setti60d3b912023-07-25 10:43:53 +0200284#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200285 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200286 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100287
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200288#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200289MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100290static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
291 const unsigned char *buf,
292 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200293{
Janos Follath865b3eb2019-12-16 11:46:15 +0000294 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200295
Neil Armstrongca7d5062022-05-31 14:43:23 +0200296#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200298#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200300#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200301 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
303 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200304 }
305
Neil Armstrongca7d5062022-05-31 14:43:23 +0200306#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 if ((ret = mbedtls_psa_ecjpake_read_round(
308 &ssl->handshake->psa_pake_ctx, buf, len,
309 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
310 psa_destroy_key(ssl->handshake->psa_pake_password);
311 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200312
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100314 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 ssl,
316 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
317 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200318
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200320 }
321#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
323 buf, len)) != 0) {
324 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
325 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
326 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
327 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200328 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200329#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200330
331 /* Only mark the extension as OK when we're sure it is */
332 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
333
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200335}
336#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200339MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100340static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
341 const unsigned char *buf,
342 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200343{
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
345 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
346 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
347 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
348 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200349 }
350
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200351 ssl->session_negotiate->mfl_code = buf[0];
352
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200354}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200356
Hanno Beckera0e20d02019-05-15 14:03:01 +0100357#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200358MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100359static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
360 const unsigned char *buf,
361 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100362{
363 size_t peer_cid_len;
364
365 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
367 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
368 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
369 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
370 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100371 }
372
373 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100374 * struct {
375 * opaque cid<0..2^8-1>;
376 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100378
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 if (len < 1) {
380 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
381 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
382 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
383 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100384 }
385
386 peer_cid_len = *buf++;
387 len--;
388
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 if (len != peer_cid_len) {
390 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
391 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
392 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
393 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100394 }
395
396 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100398 /* Leave ssl->handshake->cid_in_use in its default
399 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
401 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100402 }
403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
405 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
406 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
407 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
408 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100409 }
410
Hanno Becker08556bf2019-05-03 12:43:44 +0100411 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100412 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100413 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
416 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100417
Gilles Peskine449bd832023-01-11 14:50:10 +0100418 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100419}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100420#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200422#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200423MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100424static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
425 const unsigned char *buf,
426 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100427{
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 if (len != 0) {
429 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
430 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
431 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
432 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100433 }
434
435 ((void) buf);
436
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100439 }
440
Gilles Peskine449bd832023-01-11 14:50:10 +0100441 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100442}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200446MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100447static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
448 const unsigned char *buf,
449 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200450{
Gilles Peskine449bd832023-01-11 14:50:10 +0100451 if (len != 0) {
452 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
453 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
454 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
455 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200456 }
457
458 ((void) buf);
459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200462 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200463
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200465}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200469MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100470static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
471 unsigned char *buf,
472 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200473{
Janos Follath865b3eb2019-12-16 11:46:15 +0000474 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200475 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200476
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200478
Gilles Peskine449bd832023-01-11 14:50:10 +0100479 if (ssl->conf->f_ticket_parse == NULL ||
480 ssl->conf->f_ticket_write == NULL) {
481 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200482 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200483
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200484 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200485 ssl->handshake->new_session_ticket = 1;
486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 if (len == 0) {
490 return 0;
491 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
495 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
496 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200497 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200499
500 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200501 * Failures are ok: just ignore the ticket and proceed.
502 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
504 buf, len)) != 0) {
505 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200506
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
508 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
509 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
510 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
511 } else {
512 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
513 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200514
Gilles Peskine449bd832023-01-11 14:50:10 +0100515 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200516 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200517
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200518 /*
519 * Keep the session ID sent by the client, since we MUST send it back to
520 * inform them we're accepting the ticket (RFC 5077 section 3.4)
521 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200522 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200524
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 mbedtls_ssl_session_free(ssl->session_negotiate);
526 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200527
528 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100529 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200530
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200532
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200533 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200534
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200535 /* Don't send a new ticket after all, this one is OK */
536 ssl->handshake->new_session_ticket = 0;
537
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200539}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200541
Johan Pascalb62bb512015-12-03 21:56:45 +0100542#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200543MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100544static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
545 const unsigned char *buf,
546 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100547{
Johan Pascal43f94902020-09-22 12:25:52 +0200548 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200550 size_t profile_length;
551 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200552 /*! 2 bytes for profile length and 1 byte for mki len */
553 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100554
555 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
557 (ssl->conf->dtls_srtp_profile_list == NULL) ||
558 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
559 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200560 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100561
562 /* RFC5764 section 4.1.1
563 * uint8 SRTPProtectionProfile[2];
564 *
565 * struct {
566 * SRTPProtectionProfiles SRTPProtectionProfiles;
567 * opaque srtp_mki<0..255>;
568 * } UseSRTPData;
569
570 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100571 */
572
Ron Eldoref72faf2018-07-12 11:54:20 +0300573 /*
574 * Min length is 5: at least one protection profile(2 bytes)
575 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200576 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200577 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300578 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100579 if (len < size_of_lengths) {
580 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
581 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
582 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200583 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100584
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200586
Ron Eldoref72faf2018-07-12 11:54:20 +0300587 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200589 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200590
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200591 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100592 if (profile_length > len - size_of_lengths ||
593 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
594 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
595 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
596 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200597 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300598 /*
599 * parse the extension list values are defined in
600 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
601 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200603 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100605
Gilles Peskine449bd832023-01-11 14:50:10 +0100606 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
607 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
608 mbedtls_ssl_get_srtp_profile_as_string(
609 client_protection)));
610 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200611 continue;
612 }
Ron Eldor591f1622018-01-22 12:30:04 +0200613 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
615 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200616 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
618 mbedtls_ssl_get_srtp_profile_as_string(
619 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200620 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100621 }
622 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200624 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 }
Ron Eldor591f1622018-01-22 12:30:04 +0200626 }
Johan Pascal042d4562020-08-25 12:14:02 +0200627 buf += profile_length; /* buf points to the mki length */
628 mki_length = *buf;
629 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200630
Gilles Peskine449bd832023-01-11 14:50:10 +0100631 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
632 mki_length + profile_length + size_of_lengths != len) {
633 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
634 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
635 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200636 }
637
638 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100639 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
640 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200641 ssl->dtls_srtp_info.mki_len = mki_length;
642
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300644
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
646 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100647 }
648
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100650}
651#endif /* MBEDTLS_SSL_DTLS_SRTP */
652
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100653/*
654 * Auxiliary functions for ServerHello parsing and related actions
655 */
656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100658/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100659 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100660 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200661#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200662MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100663static int ssl_check_key_curve(mbedtls_pk_context *pk,
664 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100665{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100666 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100667 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100668 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100669
Gilles Peskine449bd832023-01-11 14:50:10 +0100670 while (*curr_tls_id != 0) {
671 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
672 if (curr_grp_id == grp_id) {
673 return 0;
674 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100675 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100676 }
677
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100679}
Valerio Settie9646ec2023-08-02 20:02:28 +0200680#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100681
682/*
683 * Try picking a certificate for this ciphersuite,
684 * return 0 on success and -1 on failure.
685 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200686MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100687static int ssl_pick_cert(mbedtls_ssl_context *ssl,
688 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100689{
Glenn Strauss041a3762022-03-15 06:08:29 -0400690 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200691#if defined(MBEDTLS_USE_PSA_CRYPTO)
692 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100693 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200694 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200696#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100697 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200699#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200700 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100701
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100704 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100706#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100708
David Horstmann3a334c22022-10-25 10:53:44 +0100709 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200710#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200712#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200714#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (pk_alg_is_none) {
716 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200717 }
718
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
720
721 if (list == NULL) {
722 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
723 return -1;
724 }
725
726 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400727 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
729 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000730
David Horstmann3a334c22022-10-25 10:53:44 +0100731 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200732#if defined(MBEDTLS_USE_PSA_CRYPTO)
733#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
735 ssl->conf->f_async_decrypt_start != NULL ||
736 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
737 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200738#else
David Horstmann3a334c22022-10-25 10:53:44 +0100739 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200741#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
742#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100743 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200744#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 if (!key_type_matches) {
746 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000748 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100749
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200750 /*
751 * This avoids sending the client a cert it'll reject based on
752 * keyUsage or other extensions.
753 *
754 * It also allows the user to provision different certificates for
755 * different uses based on keyUsage, eg if they want to avoid signing
756 * and decrypting with the same RSA key.
757 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard4938b692024-08-09 11:49:12 +0200759 MBEDTLS_SSL_IS_CLIENT,
760 MBEDTLS_SSL_VERSION_TLS1_2,
761 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100762 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
763 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200764 continue;
765 }
766
Valerio Settie9646ec2023-08-02 20:02:28 +0200767#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100768 if (pk_alg == MBEDTLS_PK_ECDSA &&
769 ssl_check_key_curve(&cur->cert->pk,
770 ssl->handshake->curves_tls_id) != 0) {
771 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100772 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000773 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100774#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100775
776 /* If we get there, we got a winner */
777 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100778 }
779
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200780 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100782 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
784 ssl->handshake->key_cert->cert);
785 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100786 }
787
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100789}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200790#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100791
792/*
793 * Check if a given ciphersuite is suitable for use with our config/keys/etc
794 * Sets ciphersuite_info only if the suite matches.
795 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200796MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100797static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
798 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100801
Jerry Yue7541932022-01-28 10:21:24 +0800802#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100803 mbedtls_pk_type_t sig_type;
804#endif
805
Gilles Peskine449bd832023-01-11 14:50:10 +0100806 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
807 if (suite_info == NULL) {
808 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
809 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810 }
811
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
813 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000814
Gilles Peskine449bd832023-01-11 14:50:10 +0100815 if (suite_info->min_tls_version > ssl->tls_version ||
816 suite_info->max_tls_version < ssl->tls_version) {
817 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
818 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000819 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100820
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200821#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
823 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
824 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
825 "not configured or ext missing"));
826 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200827 }
828#endif
829
830
Valerio Setti60d3b912023-07-25 10:43:53 +0200831#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200832 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100833 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
834 (ssl->handshake->curves_tls_id == NULL ||
835 ssl->handshake->curves_tls_id[0] == 0)) {
836 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
837 "no common elliptic curve"));
838 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000839 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100840#endif
841
Gilles Peskineeccd8882020-03-10 12:19:08 +0100842#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100843 /* If the ciphersuite requires a pre-shared key and we don't
844 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
846 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
847 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
848 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000849 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850#endif
851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100853 /*
854 * Final check: if ciphersuite requires us to have a
855 * certificate/key of a particular type:
856 * - select the appropriate certificate if we have one, or
857 * - try the next ciphersuite if we don't
858 * This must be done last since we modify the key_cert list.
859 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 if (ssl_pick_cert(ssl, suite_info) != 0) {
861 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
862 "no suitable certificate"));
863 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000864 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100865#endif
866
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200867#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
868 /* If the ciphersuite requires signing, check whether
869 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100870 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
871 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200872 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
874 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
875 "for signature algorithm %u", (unsigned) sig_type));
876 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200877 }
878
879#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
880
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100881 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100883}
884
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200885/* This function doesn't alert on errors that happen early during
886 ClientHello parsing because they might indicate that the client is
887 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200888MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100889static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000890{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100891 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200892 size_t i, j;
893 size_t ciph_offset, comp_offset, ext_offset;
894 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200896 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100897#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000898 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200899#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000900 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100901#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000902 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200903 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000905
Hanno Becker7e5437a2017-04-28 17:15:26 +0100906 /* If there is no signature-algorithm extension present,
907 * we need to fall back to the default values for allowed
908 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800909#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100910 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800911#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000914
David Horstmanne0af39a2022-10-06 18:19:18 +0100915 int renegotiating;
916
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200917#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200918read_record_header:
919#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100920 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100922 * otherwise read it ourselves manually in order to support SSLv2
923 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100924 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
925 * ClientHello has been already fully fetched by the TLS 1.3 code and the
926 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100927 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100928 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100930 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100931#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100932 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200934 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
936 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000937 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000938 }
939
940 buf = ssl->in_hdr;
941
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000943
Paul Bakkerec636f32012-09-09 19:17:02 +0000944 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100945 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000946 *
947 * Record layer:
948 * 0 . 0 message type
949 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200950 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000951 * 3 . 4 message length
952 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
954 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100955
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
957 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
958 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100959 }
960
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000962 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100963
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
965 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100966
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200967 /* For DTLS if this is the initial handshake, remember the client sequence
968 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971#if defined(MBEDTLS_SSL_RENEGOTIATION)
972 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000973#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200975 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
977 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
978 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200979 }
980
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
982 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200983
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200984#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100985 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
986 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200987 ssl->next_record_offset = 0;
988 ssl->in_left = 0;
989 goto read_record_header;
990 }
991
992 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100993 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200994#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200995 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200997
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000998 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000999
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001001 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001003 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001004 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001005#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001006 {
Ronald Cron6291b232023-03-08 15:51:25 +01001007 if (ssl->keep_current_message) {
1008 ssl->keep_current_message = 0;
1009 } else {
1010 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1011 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1012 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1013 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001014
Ronald Cron6291b232023-03-08 15:51:25 +01001015 if ((ret = mbedtls_ssl_fetch_input(ssl,
1016 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1017 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1018 return ret;
1019 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001020
Ronald Cron6291b232023-03-08 15:51:25 +01001021 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001023 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1024 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1025 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001026#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001027 ssl->in_left = 0;
1028 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001029 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001030
1031 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001032
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001034
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001035 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1036 if (0 != ret) {
1037 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1038 return ret;
1039 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001040
1041 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001042 * Handshake layer:
1043 * 0 . 0 handshake type
1044 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001045 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001046 * 6 . 8 DTLS only: fragment offset
1047 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001048 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1050 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1051 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001052 }
1053
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001055
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1057 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1058 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001059 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001062 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001063 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001064 * Copy the client's handshake message_seq on initial handshakes,
1065 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001066 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001069 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001070 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001071 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1072 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1073 "%u (expected %u)", cli_msg_seq,
1074 ssl->handshake->in_msg_seq));
1075 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001076 }
1077
1078 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001079 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001080#endif
1081 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001082 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001083 ssl->handshake->out_msg_seq = cli_msg_seq;
1084 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1085 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001086 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001087 /*
1088 * For now we don't support fragmentation, so make sure
1089 * fragment_offset == 0 and fragment_length == length
1090 */
1091 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1093 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1094 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001095 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 4, ("fragment_offset=%u fragment_length=%u length=%u",
1097 (unsigned) fragment_offset, (unsigned) fragment_length,
1098 (unsigned) length));
1099 if (fragment_offset != 0 || length != fragment_length) {
1100 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1101 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001102 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001103 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001104 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001105#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 buf += mbedtls_ssl_hs_hdr_len(ssl);
1108 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001109
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001110 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001111 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001112 * 0 . 1 protocol version
1113 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001114 * 34 . 34 session id length (1 byte)
1115 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001116 * 35+x . 35+x DTLS only: cookie length (1 byte)
1117 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001118 * .. . .. ciphersuite list length (2 bytes)
1119 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001120 * .. . .. compression alg. list length (1 byte)
1121 * .. . .. compression alg. list
1122 * .. . .. extensions length (2 bytes, optional)
1123 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001124 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001125
1126 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001127 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001128 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1129 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001130 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001131 if (msg_len < 38) {
1132 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1133 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001134 }
1135
1136 /*
1137 * Check and save the protocol version
1138 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001139 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001140
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001141 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1142 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001143 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001144 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001145
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1147 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1148 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1149 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1150 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001151 }
1152
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001153 /*
1154 * Save client random (inc. Unix time)
1155 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001157
Gilles Peskine449bd832023-01-11 14:50:10 +01001158 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001159
1160 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001161 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001162 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001163 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001164
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1166 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1167 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1168 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1169 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1170 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001171 }
1172
Gilles Peskine449bd832023-01-11 14:50:10 +01001173 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001174
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001175 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 memset(ssl->session_negotiate->id, 0,
1177 sizeof(ssl->session_negotiate->id));
1178 memcpy(ssl->session_negotiate->id, buf + 35,
1179 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001180
1181 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001182 * Check the cookie length and content
1183 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001184#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001186 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001187 cookie_len = buf[cookie_offset];
1188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1190 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1191 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1192 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1193 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001194 }
1195
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1197 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001201#if defined(MBEDTLS_SSL_RENEGOTIATION)
1202 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001203#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 ) {
1205 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1206 buf + cookie_offset + 1, cookie_len,
1207 ssl->cli_id, ssl->cli_id_len) != 0) {
1208 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001209 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 } else {
1211 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001212 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001213 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001214 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001216 {
1217 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001219 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1221 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001222 }
1223
Gilles Peskine449bd832023-01-11 14:50:10 +01001224 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001225 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001226
Gilles Peskine449bd832023-01-11 14:50:10 +01001227 /*
1228 * Check the ciphersuitelist length (will be parsed later)
1229 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001230 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001234
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001235 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001236
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001238 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 (ciph_len % 2) != 0) {
1240 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1241 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1242 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1243 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001244 }
1245
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1247 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001248
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001249 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001250 * Check the compression algorithm's length.
1251 * The list contents are ignored because implementing
1252 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1253 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001254 */
1255 comp_offset = ciph_offset + 2 + ciph_len;
1256
1257 comp_len = buf[comp_offset];
1258
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001260 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 comp_len + comp_offset + 1 > msg_len) {
1262 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1263 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1264 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1265 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001266 }
1267
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1269 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001270
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 /*
1272 * Check the extension length
1273 */
1274 ext_offset = comp_offset + 1 + comp_len;
1275 if (msg_len > ext_offset) {
1276 if (msg_len < ext_offset + 2) {
1277 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1278 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1279 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1280 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001281 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001282
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001283 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001284
Gilles Peskine449bd832023-01-11 14:50:10 +01001285 if (msg_len != ext_offset + 2 + ext_len) {
1286 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1287 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1288 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1289 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1290 }
1291 } else {
1292 ext_len = 0;
1293 }
Paul Bakker48916f92012-09-16 19:57:18 +00001294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 ext = buf + ext_offset + 2;
1296 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1297
1298 while (ext_len != 0) {
1299 unsigned int ext_id;
1300 unsigned int ext_size;
1301 if (ext_len < 4) {
1302 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1303 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1304 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1305 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1306 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001307 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1308 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001309
1310 if (ext_size + 4 > ext_len) {
1311 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1312 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1313 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1314 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1315 }
1316 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001317#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001318 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1320 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1321 ext + 4 + ext_size);
1322 if (ret != 0) {
1323 return ret;
1324 }
Simon Butcher584a5472016-05-23 16:24:52 +01001325 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001326#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001327
Simon Butcher584a5472016-05-23 16:24:52 +01001328 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001329 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001330#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001331 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001332#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001333
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1335 if (ret != 0) {
1336 return ret;
1337 }
Simon Butcher584a5472016-05-23 16:24:52 +01001338 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001339
Jerry Yue7541932022-01-28 10:21:24 +08001340#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001341 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001343
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1345 if (ret != 0) {
1346 return ret;
1347 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001348
1349 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001350 break;
Jerry Yue7541932022-01-28 10:21:24 +08001351#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001352
Valerio Setti60d3b912023-07-25 10:43:53 +02001353#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001354 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001356 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001357 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001358
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1360 if (ret != 0) {
1361 return ret;
1362 }
Simon Butcher584a5472016-05-23 16:24:52 +01001363 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001364
Simon Butcher584a5472016-05-23 16:24:52 +01001365 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001366 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001367 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001368
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1370 if (ret != 0) {
1371 return ret;
1372 }
Simon Butcher584a5472016-05-23 16:24:52 +01001373 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001374#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001375 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001376 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001377
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001378#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001379 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001381
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 ret = ssl_parse_ecjpake_kkpp(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é-Gonnardbf57be62015-09-16 15:04:01 +02001387#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001389#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001390 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1394 if (ret != 0) {
1395 return ret;
1396 }
Simon Butcher584a5472016-05-23 16:24:52 +01001397 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001399
Hanno Beckera0e20d02019-05-15 14:03:01 +01001400#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001401 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001402 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001403
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1405 if (ret != 0) {
1406 return ret;
1407 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001408 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001409#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001412 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001414
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 ret = ssl_parse_encrypt_then_mac_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_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001422#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001423 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 ret = ssl_parse_extended_ms_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_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001434 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1438 if (ret != 0) {
1439 return ret;
1440 }
Simon Butcher584a5472016-05-23 16:24:52 +01001441 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001442#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001444#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001445 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001447
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1449 ext + 4 + ext_size);
1450 if (ret != 0) {
1451 return ret;
1452 }
Simon Butcher584a5472016-05-23 16:24:52 +01001453 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001455
Johan Pascalb62bb512015-12-03 21:56:45 +01001456#if defined(MBEDTLS_SSL_DTLS_SRTP)
1457 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001458 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001459
Gilles Peskine449bd832023-01-11 14:50:10 +01001460 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1461 if (ret != 0) {
1462 return ret;
1463 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001464 break;
1465#endif /* MBEDTLS_SSL_DTLS_SRTP */
1466
Simon Butcher584a5472016-05-23 16:24:52 +01001467 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1469 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001470 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001471
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 ext_len -= 4 + ext_size;
1473 ext += 4 + ext_size;
1474 }
1475
Jerry Yue7541932022-01-28 10:21:24 +08001476#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001477
1478 /*
1479 * Try to fall back to default hash SHA1 if the client
1480 * hasn't provided any preferred signature-hash combinations.
1481 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001482 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001483 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1484 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001485#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1487 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001488#endif
1489#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001490 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1491 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001492#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001493 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001494 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001495
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001496 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1497 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1498 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001499
Gilles Peskine449bd832023-01-11 14:50:10 +01001500 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001501 }
1502
Jerry Yue7541932022-01-28 10:21:24 +08001503#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001504
Paul Bakker48916f92012-09-16 19:57:18 +00001505 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001506 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1507 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001508 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1509 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1510 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001511#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1513 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1514 "during renegotiation"));
1515 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1516 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1517 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001518 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001519#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001521 break;
1522 }
1523 }
1524
1525 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001526 * Renegotiation security checks
1527 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001528 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1529 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1530 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001531 handshake_failure = 1;
1532 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001533#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001534 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001535 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001536 renegotiation_info_seen == 0) {
1537 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001538 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001539 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1540 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1541 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1542 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001543 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001544 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1545 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1546 renegotiation_info_seen == 1) {
1547 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001548 handshake_failure = 1;
1549 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001551
Gilles Peskine449bd832023-01-11 14:50:10 +01001552 if (handshake_failure == 1) {
1553 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1554 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1555 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001556 }
Paul Bakker380da532012-04-18 16:10:25 +00001557
Paul Bakker41c83d32013-03-20 14:39:14 +01001558 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001559 * Server certification selection (after processing TLS extensions)
1560 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1562 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1563 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001564 }
Glenn Strauss69894072022-01-24 12:58:00 -05001565#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1566 ssl->handshake->sni_name = NULL;
1567 ssl->handshake->sni_name_len = 0;
1568#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001569
1570 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001571 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001572 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001573 * and certificate from the SNI callback triggered by the SNI extension
1574 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001575 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001576 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001577 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001578 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001579
Gilles Peskine449bd832023-01-11 14:50:10 +01001580 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1581 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1582 for (i = 0; ciphersuites[i] != 0; i++) {
1583 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001584 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001585 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001586
TRodziewicz8476f2f2021-06-02 14:34:47 +02001587 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001588
Gilles Peskine449bd832023-01-11 14:50:10 +01001589 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1590 &ciphersuite_info)) != 0) {
1591 return ret;
1592 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001593
Gilles Peskine449bd832023-01-11 14:50:10 +01001594 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001595 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001596 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001597 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001598 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001599 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001600 for (i = 0; ciphersuites[i] != 0; i++) {
1601 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1602 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001603 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001604 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001605
1606 got_common_suite = 1;
1607
Gilles Peskine449bd832023-01-11 14:50:10 +01001608 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1609 &ciphersuite_info)) != 0) {
1610 return ret;
1611 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001612
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001614 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001615 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001616 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001617 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001618 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001619
Gilles Peskine449bd832023-01-11 14:50:10 +01001620 if (got_common_suite) {
1621 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1622 "but none of them usable"));
1623 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1624 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1625 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1626 } else {
1627 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1628 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1629 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1630 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001631 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001632
1633have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001634 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001635
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001636 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001637 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001638
Paul Bakker5121ce52009-01-03 21:22:43 +00001639 ssl->state++;
1640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001641#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1643 mbedtls_ssl_recv_flight_completed(ssl);
1644 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001645#endif
1646
Hanno Becker7e5437a2017-04-28 17:15:26 +01001647 /* Debugging-only output for testsuite */
1648#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001649 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001650 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1651 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001652 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001653 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1654 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1655 sig_hash));
1656 } else {
1657 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1658 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001659 }
1660#endif
1661
Gilles Peskine449bd832023-01-11 14:50:10 +01001662 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001663
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001665}
1666
Hanno Beckera0e20d02019-05-15 14:03:01 +01001667#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001668static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1669 unsigned char *buf,
1670 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001671{
1672 unsigned char *p = buf;
1673 size_t ext_len;
1674 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1675
1676 *olen = 0;
1677
1678 /* Skip writing the extension if we don't want to use it or if
1679 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001680 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001681 return;
1682 }
1683
Gilles Peskine449bd832023-01-11 14:50:10 +01001684 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1685 * which is at most 255, so the increment cannot overflow. */
1686 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1687 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1688 return;
1689 }
1690
1691 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001692
1693 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001694 * struct {
1695 * opaque cid<0..2^8-1>;
1696 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001697 */
1698 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001699 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001700 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001702 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001703
1704 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001705 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001706
1707 *olen = ssl->own_cid_len + 5;
1708}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001709#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001710
Neil Armstrong76b74072022-04-06 13:43:54 +02001711#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001712static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1713 unsigned char *buf,
1714 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001715{
1716 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001718
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001719 /*
1720 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1721 * from a client and then selects a stream or Authenticated Encryption
1722 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1723 * encrypt-then-MAC response extension back to the client."
1724 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001725 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 ssl->session_negotiate->ciphersuite);
1727 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001728 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001729 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001730 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001731 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001732 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001733 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001734
Gilles Peskine449bd832023-01-11 14:50:10 +01001735 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001736 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001737 }
Ronald Cron862902d2022-03-24 14:15:28 +01001738 }
1739
Gilles Peskine449bd832023-01-11 14:50:10 +01001740 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001741 *olen = 0;
1742 return;
1743 }
1744
Gilles Peskine449bd832023-01-11 14:50:10 +01001745 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001746
Gilles Peskine449bd832023-01-11 14:50:10 +01001747 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001748 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001749
1750 *p++ = 0x00;
1751 *p++ = 0x00;
1752
1753 *olen = 4;
1754}
Neil Armstrong76b74072022-04-06 13:43:54 +02001755#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001756
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001757#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001758static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1759 unsigned char *buf,
1760 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001761{
1762 unsigned char *p = buf;
1763
Gilles Peskine449bd832023-01-11 14:50:10 +01001764 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001765 *olen = 0;
1766 return;
1767 }
1768
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1770 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001771
Gilles Peskine449bd832023-01-11 14:50:10 +01001772 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001773 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001774
1775 *p++ = 0x00;
1776 *p++ = 0x00;
1777
1778 *olen = 4;
1779}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001780#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001781
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001782#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001783static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1784 unsigned char *buf,
1785 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001786{
1787 unsigned char *p = buf;
1788
Gilles Peskine449bd832023-01-11 14:50:10 +01001789 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001790 *olen = 0;
1791 return;
1792 }
1793
Gilles Peskine449bd832023-01-11 14:50:10 +01001794 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001795
Gilles Peskine449bd832023-01-11 14:50:10 +01001796 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001797 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001798
1799 *p++ = 0x00;
1800 *p++ = 0x00;
1801
1802 *olen = 4;
1803}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001805
Gilles Peskine449bd832023-01-11 14:50:10 +01001806static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1807 unsigned char *buf,
1808 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001809{
1810 unsigned char *p = buf;
1811
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001813 *olen = 0;
1814 return;
1815 }
1816
Gilles Peskine449bd832023-01-11 14:50:10 +01001817 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001818
Gilles Peskine449bd832023-01-11 14:50:10 +01001819 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001820 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001821
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001822#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001823 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001824 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001825 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001826 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001827
Gilles Peskine449bd832023-01-11 14:50:10 +01001828 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001829 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001830 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001831 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001832 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001833#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001834 {
1835 *p++ = 0x00;
1836 *p++ = 0x01;
1837 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001838 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001839
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001840 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001841}
1842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001843#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001844static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1845 unsigned char *buf,
1846 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001847{
1848 unsigned char *p = buf;
1849
Gilles Peskine449bd832023-01-11 14:50:10 +01001850 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001851 *olen = 0;
1852 return;
1853 }
1854
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001856
Gilles Peskine449bd832023-01-11 14:50:10 +01001857 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001858 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001859
1860 *p++ = 0x00;
1861 *p++ = 1;
1862
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001863 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001864
1865 *olen = 5;
1866}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001867#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001868
Valerio Setti7aeec542023-07-05 18:57:21 +02001869#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001870 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001871 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001872static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1873 unsigned char *buf,
1874 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001875{
1876 unsigned char *p = buf;
1877 ((void) ssl);
1878
Gilles Peskine449bd832023-01-11 14:50:10 +01001879 if ((ssl->handshake->cli_exts &
1880 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001881 *olen = 0;
1882 return;
1883 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001884
Gilles Peskine449bd832023-01-11 14:50:10 +01001885 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001886
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001888 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001889
1890 *p++ = 0x00;
1891 *p++ = 2;
1892
1893 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001895
1896 *olen = 6;
1897}
Valerio Setti45d56f32023-07-13 17:23:20 +02001898#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001899 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001900 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001901
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001902#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001903static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1904 unsigned char *buf,
1905 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001906{
Janos Follath865b3eb2019-12-16 11:46:15 +00001907 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001908 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001909 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001910 size_t kkpp_len;
1911
1912 *olen = 0;
1913
1914 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001915 if (ssl->handshake->ciphersuite_info->key_exchange !=
1916 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001917 return;
1918 }
1919
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1921
1922 if (end - p < 4) {
1923 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1924 return;
1925 }
1926
1927 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001928 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001929
Neil Armstrongca7d5062022-05-31 14:43:23 +02001930#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001931 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001932 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001933 MBEDTLS_ECJPAKE_ROUND_ONE);
1934 if (ret != 0) {
1935 psa_destroy_key(ssl->handshake->psa_pake_password);
1936 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1937 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001938 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001939 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001940#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001941 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001942 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001943 ssl->conf->f_rng, ssl->conf->p_rng);
1944 if (ret != 0) {
1945 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001946 return;
1947 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001948#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001949
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001951 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001952
1953 *olen = kkpp_len + 4;
1954}
1955#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1956
Gilles Peskine449bd832023-01-11 14:50:10 +01001957#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1958static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1959 unsigned char *buf,
1960 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001961{
Ron Eldor75870ec2018-12-06 17:31:55 +02001962 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001963 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001964 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1965
1966 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001967
Gilles Peskine449bd832023-01-11 14:50:10 +01001968 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1969 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001970 return;
1971 }
1972
Gilles Peskine449bd832023-01-11 14:50:10 +01001973 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001974
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001976 mki_len = ssl->dtls_srtp_info.mki_len;
1977 }
1978
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001979 /* The extension total size is 9 bytes :
1980 * - 2 bytes for the extension tag
1981 * - 2 bytes for the total size
1982 * - 2 bytes for the protection profile length
1983 * - 2 bytes for the protection profile
1984 * - 1 byte for the mki length
1985 * + the actual mki length
1986 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001987 if ((size_t) (end - buf) < mki_len + 9) {
1988 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001989 return;
1990 }
1991
Johan Pascalb62bb512015-12-03 21:56:45 +01001992 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001994 /*
1995 * total length 5 and mki value: only one profile(2 bytes)
1996 * and length(2 bytes) and srtp_mki )
1997 */
Ron Eldor591f1622018-01-22 12:30:04 +02001998 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001999 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002000
2001 /* protection profile length: 2 */
2002 buf[4] = 0x00;
2003 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002004 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2006 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2007 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2008 } else {
2009 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002010 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002011 }
2012
Ron Eldor591f1622018-01-22 12:30:04 +02002013 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002015
Ron Eldor591f1622018-01-22 12:30:04 +02002016 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002017}
2018#endif /* MBEDTLS_SSL_DTLS_SRTP */
2019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002020#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002021MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002022static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002023{
Janos Follath865b3eb2019-12-16 11:46:15 +00002024 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002025 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002026 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002027
Gilles Peskine449bd832023-01-11 14:50:10 +01002028 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002029
2030 /*
2031 * struct {
2032 * ProtocolVersion server_version;
2033 * opaque cookie<0..2^8-1>;
2034 * } HelloVerifyRequest;
2035 */
2036
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002037 /* The RFC is not clear on this point, but sending the actual negotiated
2038 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2040 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002041 p += 2;
2042
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002043 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002044 if (ssl->conf->f_cookie_write == NULL) {
2045 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2046 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002047 }
2048
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002049 /* Skip length byte until we know the length */
2050 cookie_len_byte = p++;
2051
Gilles Peskine449bd832023-01-11 14:50:10 +01002052 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2053 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2054 ssl->cli_id, ssl->cli_id_len)) != 0) {
2055 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2056 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002057 }
2058
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002060
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002062
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002063 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002064 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2065 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002066
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002067 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002068
Gilles Peskine449bd832023-01-11 14:50:10 +01002069 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2070 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2071 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002072 }
2073
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002074#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002075 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2076 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2077 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2078 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002079 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002080#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002081
Gilles Peskine449bd832023-01-11 14:50:10 +01002082 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002083
Gilles Peskine449bd832023-01-11 14:50:10 +01002084 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002085}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002086#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002087
Gilles Peskine449bd832023-01-11 14:50:10 +01002088static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002089{
2090 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002091 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002092 mbedtls_ssl_session * const session = ssl->session_negotiate;
2093
2094 /* Resume is 0 by default, see ssl_handshake_init().
2095 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002096 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002097 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 }
2099 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002100 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002101 }
2102 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002103 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002105#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002107 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002109#endif
2110
Gilles Peskine449bd832023-01-11 14:50:10 +01002111 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002112
Gilles Peskine449bd832023-01-11 14:50:10 +01002113 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2114 session->id,
2115 session->id_len,
2116 &session_tmp);
2117 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002118 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002122 /* Mismatch between cached and negotiated session */
2123 goto exit;
2124 }
2125
2126 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002128 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002130
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002132 ssl->handshake->resume = 1;
2133
2134exit:
2135
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002137}
2138
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002139MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002140static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002141{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002142#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002143 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002144#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002145 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002146 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002147 unsigned char *buf, *p;
2148
Gilles Peskine449bd832023-01-11 14:50:10 +01002149 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002151#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2153 ssl->handshake->cookie_verify_result != 0) {
2154 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2155 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002156
Gilles Peskine449bd832023-01-11 14:50:10 +01002157 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002158 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002159#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002160
Paul Bakker5121ce52009-01-03 21:22:43 +00002161 /*
2162 * 0 . 0 handshake type
2163 * 1 . 3 handshake length
2164 * 4 . 5 protocol version
2165 * 6 . 9 UNIX time()
2166 * 10 . 37 random bytes
2167 */
2168 buf = ssl->out_msg;
2169 p = buf + 4;
2170
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002172 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002173
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2175 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002177#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 t = mbedtls_time(NULL);
2179 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002180 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2183 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002184#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002185 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2186 return ret;
2187 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002188
2189 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002190#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002191
Ronald Cronc5649382023-04-04 15:33:42 +02002192 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 return ret;
2194 }
Ronald Cronc5649382023-04-04 15:33:42 +02002195 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002196
Ronald Cronc5649382023-04-04 15:33:42 +02002197#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2198 /*
2199 * RFC 8446
2200 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2201 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2202 * response to a ClientHello MUST set the last 8 bytes of their Random
2203 * value specially in their ServerHello.
2204 */
2205 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2206 static const unsigned char magic_tls12_downgrade_string[] =
2207 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2208
2209 MBEDTLS_STATIC_ASSERT(
2210 sizeof(magic_tls12_downgrade_string) == 8,
2211 "magic_tls12_downgrade_string does not have the expected size");
2212
Ronald Cronfe01ec22023-04-06 09:56:53 +02002213 memcpy(p, magic_tls12_downgrade_string,
2214 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002215 } else
2216#endif
2217 {
2218 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2219 return ret;
2220 }
2221 }
2222 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002223
Gilles Peskine449bd832023-01-11 14:50:10 +01002224 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002225
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002227
Gilles Peskine449bd832023-01-11 14:50:10 +01002228 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002231 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002232 * New session, create a new session id,
2233 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002234 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002235 ssl->state++;
2236
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002237#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002239#endif
2240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002242 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002243 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002244 memset(ssl->session_negotiate->id, 0, 32);
2245 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002246#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002247 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002248 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002249 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2250 n)) != 0) {
2251 return ret;
2252 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002253 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002256 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002257 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002258 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002259 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002260
Gilles Peskine449bd832023-01-11 14:50:10 +01002261 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2262 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2263 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002264 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002265 }
2266
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002267 /*
2268 * 38 . 38 session id length
2269 * 39 . 38+n session id
2270 * 39+n . 40+n chosen ciphersuite
2271 * 41+n . 41+n chosen compression alg.
2272 * 42+n . 43+n extensions length
2273 * 44+n . 43+n+m extensions
2274 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002275 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002276 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002277 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002278
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2280 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2281 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2282 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002283
Gilles Peskine449bd832023-01-11 14:50:10 +01002284 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002285 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002286 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002287
Gilles Peskine449bd832023-01-11 14:50:10 +01002288 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2289 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2290 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2291 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002292
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002293 /*
2294 * First write extensions, then the total length
2295 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002296 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002297 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002299#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002300 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002301 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002302#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002303
Hanno Beckera0e20d02019-05-15 14:03:01 +01002304#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002305 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002306 ext_len += olen;
2307#endif
2308
Neil Armstrong76b74072022-04-06 13:43:54 +02002309#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002310 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002311 ext_len += olen;
2312#endif
2313
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002314#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002315 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002316 ext_len += olen;
2317#endif
2318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002319#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002321 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002322#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002323
Valerio Setti7aeec542023-07-05 18:57:21 +02002324#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002325 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002326 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002327 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2329 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2330 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002331 ext_len += olen;
2332 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002333#endif
2334
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002335#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002336 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002337 ext_len += olen;
2338#endif
2339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002340#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002341 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002342 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2343 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002344 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002345 }
Paul Elliottf518f812022-07-11 12:36:20 +01002346
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002347 ext_len += olen;
2348#endif
2349
Johan Pascalb62bb512015-12-03 21:56:45 +01002350#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002351 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002352 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002353#endif
2354
Gilles Peskine449bd832023-01-11 14:50:10 +01002355 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2356 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002357
Gilles Peskine449bd832023-01-11 14:50:10 +01002358 if (ext_len > 0) {
2359 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002360 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002361 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002362
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002363 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002364 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2365 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002366
Gilles Peskine449bd832023-01-11 14:50:10 +01002367 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002368
Gilles Peskine449bd832023-01-11 14:50:10 +01002369 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002370
Gilles Peskine449bd832023-01-11 14:50:10 +01002371 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002372}
2373
Gilles Peskineeccd8882020-03-10 12:19:08 +01002374#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002375MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002376static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002377{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002378 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002379 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002380
Gilles Peskine449bd832023-01-11 14:50:10 +01002381 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002382
Gilles Peskine449bd832023-01-11 14:50:10 +01002383 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2384 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002385 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002386 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002387 }
2388
Gilles Peskine449bd832023-01-11 14:50:10 +01002389 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2390 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002391}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002392#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002393MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002394static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002395{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002396 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002397 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002398 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002399 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002400 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002401 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002402 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002403 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002404 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002405
Gilles Peskine449bd832023-01-11 14:50:10 +01002406 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002407
2408 ssl->state++;
2409
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002410#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002412 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002413 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002414#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002415 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002416
Gilles Peskine449bd832023-01-11 14:50:10 +01002417 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2418 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2419 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2420 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002421 }
2422
2423 /*
2424 * 0 . 0 handshake type
2425 * 1 . 3 handshake length
2426 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002427 * 5 .. m-1 cert types
2428 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002429 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002430 * n .. n+1 length of all DNs
2431 * n+2 .. n+3 length of DN 1
2432 * n+4 .. ... Distinguished Name #1
2433 * ... .. ... length of DN 2, etc.
2434 */
2435 buf = ssl->out_msg;
2436 p = buf + 4;
2437
2438 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002439 * Supported certificate types
2440 *
2441 * ClientCertificateType certificate_types<1..2^8-1>;
2442 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002443 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002444 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002446#if defined(MBEDTLS_RSA_C)
2447 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002448#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002449#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002450 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002451#endif
2452
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002453 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002454 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002455
Paul Bakker577e0062013-08-28 11:57:20 +02002456 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002457
Paul Bakker926af752012-11-23 13:38:07 +01002458 /*
2459 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002460 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002461 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2462 *
2463 * struct {
2464 * HashAlgorithm hash;
2465 * SignatureAlgorithm signature;
2466 * } SignatureAndHashAlgorithm;
2467 *
2468 * enum { (255) } HashAlgorithm;
2469 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002470 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002471 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2472 if (sig_alg == NULL) {
2473 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2474 }
Ronald Cron8457c122022-03-07 11:32:54 +01002475
Gilles Peskine449bd832023-01-11 14:50:10 +01002476 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2477 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002478
Gilles Peskine449bd832023-01-11 14:50:10 +01002479 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002480 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002481 }
2482 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002483 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002484 }
Simon Butcher99000142016-10-13 17:21:01 +01002485
Paul Elliott96a0fd92022-11-08 17:09:56 +00002486 /* Write elements at offsets starting from 1 (offset 0 is for the
2487 * length). Thus the offset of each element is the length of the
2488 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002489 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002490 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002491
Paul Bakker926af752012-11-23 13:38:07 +01002492 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002493
Paul Elliott96a0fd92022-11-08 17:09:56 +00002494 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002495 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002496 sa_len += 2;
2497 p += sa_len;
2498
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002499 /*
2500 * DistinguishedName certificate_authorities<0..2^16-1>;
2501 * opaque DistinguishedName<1..2^16-1>;
2502 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002503 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002504
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002505 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002506
Gilles Peskine449bd832023-01-11 14:50:10 +01002507 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002508 /* NOTE: If trusted certificates are provisioned
2509 * via a CA callback (configured through
2510 * `mbedtls_ssl_conf_ca_cb()`, then the
2511 * CertificateRequest is currently left empty. */
2512
Glenn Strauss999ef702022-03-11 01:37:23 -05002513#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2514#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002515 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002516 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002518#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002520 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002521 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002522#endif
Janos Follath088ce432017-04-10 12:42:31 +01002523#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002524 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002525 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002526 } else
Janos Follath088ce432017-04-10 12:42:31 +01002527#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002529
Gilles Peskine449bd832023-01-11 14:50:10 +01002530 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002531 /* It follows from RFC 5280 A.1 that this length
2532 * can be represented in at most 11 bits. */
2533 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002534
Gilles Peskine449bd832023-01-11 14:50:10 +01002535 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2536 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002537 break;
2538 }
2539
Gilles Peskine449bd832023-01-11 14:50:10 +01002540 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002541 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002542 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002543 p += dn_size;
2544
Gilles Peskine449bd832023-01-11 14:50:10 +01002545 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002546
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002547 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002548 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002549 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002550 }
2551
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002552 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002553 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2554 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002556
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002558
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002560
Gilles Peskine449bd832023-01-11 14:50:10 +01002561 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002562}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002563#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002564
Valerio Setti4d0e8462023-10-06 13:20:21 +02002565#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002567#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002568MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002569static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002570{
2571 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2572 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002573 mbedtls_pk_context *pk;
2574 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002575 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002576 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2577 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002578#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002579 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002580 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002581 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002582 mbedtls_ecp_keypair *key;
2583#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002584
Gilles Peskine449bd832023-01-11 14:50:10 +01002585 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002586
Gilles Peskine449bd832023-01-11 14:50:10 +01002587 if (pk == NULL) {
2588 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2589 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002590
Valerio Setti0813b6f2023-06-16 12:18:53 +02002591 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002592
Valerio Setti0813b6f2023-06-16 12:18:53 +02002593 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002594 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002595#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2596 case MBEDTLS_PK_ECKEY:
2597 case MBEDTLS_PK_ECKEY_DH:
2598 case MBEDTLS_PK_ECDSA:
2599#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2601 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2602 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002603
Valerio Settibced8bc2023-12-06 10:40:47 +01002604 /* Get the attributes of the key previously parsed by PK module in
2605 * order to extract its type and length (in bits). */
2606 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002607 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002608 ret = PSA_TO_MBEDTLS_ERR(status);
2609 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002610 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002611 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002612 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002613
Gilles Peskinedc492582023-12-18 20:38:38 +01002614#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2615 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002616 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2617 * module and only have ECDSA capabilities. Since we need
2618 * them for ECDH later, we export and then re-import them with
2619 * proper flags and algorithm. Of course We also set key's type
2620 * and bits that we just got above. */
2621 key_attributes = psa_key_attributes_init();
2622 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2623 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2624 psa_set_key_type(&key_attributes,
2625 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2626 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002627
Valerio Setti202bb712023-12-06 17:05:24 +01002628 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2629 if (status != PSA_SUCCESS) {
2630 ret = PSA_TO_MBEDTLS_ERR(status);
2631 goto exit;
2632 }
2633 status = psa_import_key(&key_attributes, buf, key_len,
2634 &ssl->handshake->xxdh_psa_privkey);
2635 if (status != PSA_SUCCESS) {
2636 ret = PSA_TO_MBEDTLS_ERR(status);
2637 goto exit;
2638 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002639
Valerio Setti202bb712023-12-06 17:05:24 +01002640 /* Set this key as owned by the TLS library: it will be its duty
2641 * to clear it exit. */
2642 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002643
Gilles Peskinedc492582023-12-18 20:38:38 +01002644 ret = 0;
2645 break;
2646 }
2647#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2648
2649 /* Opaque key is created by the user (externally from Mbed TLS)
2650 * so we assume it already has the right algorithm and flags
2651 * set. Just copy its ID as reference. */
2652 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2653 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 ret = 0;
2655 break;
Gilles Peskinedc492582023-12-18 20:38:38 +01002656
Valerio Setti0813b6f2023-06-16 12:18:53 +02002657#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002658 case MBEDTLS_PK_ECKEY:
2659 case MBEDTLS_PK_ECKEY_DH:
2660 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002661 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002662 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002663 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2665 }
Valerio Setti97207782023-05-18 18:59:06 +02002666 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 if (tls_id == 0) {
2668 /* This elliptic curve is not supported */
2669 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2670 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002671
Gilles Peskine449bd832023-01-11 14:50:10 +01002672 /* If the above conversion to TLS ID was fine, then also this one will
2673 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002674 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002675 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002676
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002677 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002678
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 key_attributes = psa_key_attributes_init();
2680 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2681 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2682 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002683 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002684 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002685
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002686 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002687 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002688 mbedtls_platform_zeroize(buf, sizeof(buf));
2689 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002691
Gilles Peskine449bd832023-01-11 14:50:10 +01002692 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002693 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002694 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002695 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002696 mbedtls_platform_zeroize(buf, sizeof(buf));
2697 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002699
Valerio Setti6835b4a2023-06-22 09:06:31 +02002700 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002701 ret = 0;
2702 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002703#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002705 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002706 }
2707
Valerio Settibced8bc2023-12-06 10:40:47 +01002708exit:
2709 psa_reset_key_attributes(&key_attributes);
2710 mbedtls_platform_zeroize(buf, sizeof(buf));
2711
Gilles Peskine449bd832023-01-11 14:50:10 +01002712 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002713}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002714#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002715MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002716static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002717{
Janos Follath865b3eb2019-12-16 11:46:15 +00002718 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002719
Gilles Peskine449bd832023-01-11 14:50:10 +01002720 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2721 if (private_key == NULL) {
2722 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2723 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002724 }
2725
Gilles Peskine449bd832023-01-11 14:50:10 +01002726 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2727 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2728 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002729 }
2730
Gilles Peskine449bd832023-01-11 14:50:10 +01002731 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002732 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002733 MBEDTLS_ECDH_OURS)) != 0) {
2734 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2735 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002736 }
2737
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002739}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002740#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002741#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2742 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002743
Gilles Peskineeccd8882020-03-10 12:19:08 +01002744#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002745 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002746MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002747static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2748 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002749{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002750 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2751 * signature length which will be added in ssl_write_server_key_exchange
2752 * after the call to ssl_prepare_server_key_exchange.
2753 * ssl_write_server_key_exchange also takes care of incrementing
2754 * ssl->out_msglen. */
2755 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002756 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2757 - sig_start);
2758 int ret = ssl->conf->f_async_resume(ssl,
2759 sig_start, signature_len, sig_max_len);
2760 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002761 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002762 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002763 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002764 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2765 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002766}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002767#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002768 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002769
Gilles Peskined3eb0612018-01-08 17:07:44 +01002770/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002771 * calculating the signature if any, but excluding formatting the
2772 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002773MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002774static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2775 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002776{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002777 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002778 ssl->handshake->ciphersuite_info;
2779
Gilles Peskineeccd8882020-03-10 12:19:08 +01002780#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002781#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002782 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002783#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002784#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002785
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002786 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002787#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002788 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002789#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002790
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002791#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002792#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002793 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002794#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002795 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 +02002796#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002797#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002798
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002799 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002800
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002801 /*
2802 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002803 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002804 *
2805 */
2806
2807 /*
2808 * - ECJPAKE key exchanges
2809 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002810#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002811 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002812 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002813#if defined(MBEDTLS_USE_PSA_CRYPTO)
2814 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2815 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2816 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002817 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002818 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002819
Valerio Setti6f1b5742022-11-16 10:00:32 +01002820 /*
2821 * The first 3 bytes are:
2822 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2823 * [1, 2] elliptic curve's TLS ID
2824 *
2825 * However since we only support secp256r1 for now, we hardcode its
2826 * TLS ID here
2827 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002828 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002829 MBEDTLS_ECP_DP_SECP256R1);
2830 if (tls_id == 0) {
2831 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002832 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002833 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002834 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002835 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002836
Gilles Peskine449bd832023-01-11 14:50:10 +01002837 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2838 out_p + output_offset,
2839 end_p - out_p - output_offset, &output_len,
2840 MBEDTLS_ECJPAKE_ROUND_TWO);
2841 if (ret != 0) {
2842 psa_destroy_key(ssl->handshake->psa_pake_password);
2843 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2844 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2845 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002846 }
2847
Valerio Setti02c25b52022-11-15 14:08:42 +01002848 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002849 ssl->out_msglen += output_offset;
2850#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002851 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002852
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002853 ret = mbedtls_ecjpake_write_round_two(
2854 &ssl->handshake->ecjpake_ctx,
2855 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002856 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002857 ssl->conf->f_rng, ssl->conf->p_rng);
2858 if (ret != 0) {
2859 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2860 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002861 }
2862
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002863 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002864#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002865 }
2866#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2867
Hanno Becker1aa267c2017-04-28 17:08:27 +01002868 /*
2869 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2870 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2871 * we use empty support identity hints here.
2872 **/
2873#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002874 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002875 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2876 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002877 ssl->out_msg[ssl->out_msglen++] = 0x00;
2878 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002879 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2881 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002882
Hanno Becker7e5437a2017-04-28 17:15:26 +01002883 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002884 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002885 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002886#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002887 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002888 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002889 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002890
Gilles Peskine449bd832023-01-11 14:50:10 +01002891 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2892 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2893 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002894 }
2895
Paul Bakker41c83d32013-03-20 14:39:14 +01002896 /*
2897 * Ephemeral DH parameters:
2898 *
2899 * struct {
2900 * opaque dh_p<1..2^16-1>;
2901 * opaque dh_g<1..2^16-1>;
2902 * opaque dh_Ys<1..2^16-1>;
2903 * } ServerDHParams;
2904 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002905 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2906 &ssl->conf->dhm_P,
2907 &ssl->conf->dhm_G)) != 0) {
2908 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2909 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002910 }
Paul Bakker48916f92012-09-16 19:57:18 +00002911
Gilles Peskine449bd832023-01-11 14:50:10 +01002912 if ((ret = mbedtls_dhm_make_params(
2913 &ssl->handshake->dhm_ctx,
2914 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2915 ssl->out_msg + ssl->out_msglen, &len,
2916 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2917 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2918 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002919 }
2920
Jerry Yuc5aef882021-12-23 20:15:02 +08002921#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002922 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002923#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002924
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002925 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002926
Gilles Peskine449bd832023-01-11 14:50:10 +01002927 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2928 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2929 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2930 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002931 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002932#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002933
Hanno Becker1aa267c2017-04-28 17:08:27 +01002934 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002935 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002936 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002937#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002938 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002939 /*
2940 * Ephemeral ECDH parameters:
2941 *
2942 * struct {
2943 * ECParameters curve_params;
2944 * ECPoint public;
2945 * } ServerECDHParams;
2946 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002947 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002949 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002950 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002951
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002952 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2954 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2955 }
2956 for (; *group_list != 0; group_list++) {
2957 for (curr_tls_id = ssl->handshake->curves_tls_id;
2958 *curr_tls_id != 0; curr_tls_id++) {
2959 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002960 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002961 }
2962 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002963 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002964
Gilles Peskine449bd832023-01-11 14:50:10 +01002965curve_matching_done:
2966 if (*curr_tls_id == 0) {
2967 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2968 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2969 }
2970
2971 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2972 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002973
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002974#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002975 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2976 psa_key_attributes_t key_attributes;
2977 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002978 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2979 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2980 // data length(1)
2981 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002982 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002983 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002984
Gilles Peskine449bd832023-01-11 14:50:10 +01002985 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002986
Valerio Setti40d9ca92023-01-04 16:08:04 +01002987 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002988 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002989 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002990 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2991 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2992 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002993 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002994 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002995 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002996
2997 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002998 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2999 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003000 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003001 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003002
3003 /*
3004 * ECParameters curve_params
3005 *
3006 * First byte is curve_type, always named_curve
3007 */
3008 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3009
3010 /*
3011 * Next two bytes are the namedcurve value
3012 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003013 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003014 p += 2;
3015
3016 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003017 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003018 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003019 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003020 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003021 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3022 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003023 }
3024
3025 /*
3026 * ECPoint public
3027 *
3028 * First byte is data length.
3029 * It will be filled later. p holds now the data length location.
3030 */
3031
3032 /* Export the public part of the ECDH private key from PSA.
3033 * Make one byte space for the length.
3034 */
3035 unsigned char *own_pubkey = p + data_length_size;
3036
Gilles Peskine449bd832023-01-11 14:50:10 +01003037 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3038 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003039
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003040 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003041 own_pubkey, own_pubkey_max_len,
3042 &len);
3043 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003044 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003045 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003046 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3047 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003048 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003049 }
3050
3051 /* Store the length of the exported public key. */
3052 *p = (uint8_t) len;
3053
3054 /* Determine full message length. */
3055 len += header_size;
3056#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003057 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003059
Gilles Peskine449bd832023-01-11 14:50:10 +01003060 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3061 curr_grp_id)) != 0) {
3062 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3063 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003064 }
3065
Gilles Peskine449bd832023-01-11 14:50:10 +01003066 if ((ret = mbedtls_ecdh_make_params(
3067 &ssl->handshake->ecdh_ctx, &len,
3068 ssl->out_msg + ssl->out_msglen,
3069 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3070 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3071 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3072 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003073 }
3074
Gilles Peskine449bd832023-01-11 14:50:10 +01003075 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3076 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003077#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003078
Jerry Yuc5aef882021-12-23 20:15:02 +08003079#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003080 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003081#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003082
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003083 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003084 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003085#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003086
Hanno Becker1aa267c2017-04-28 17:08:27 +01003087 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003088 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003089 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003090 * exchange parameters, compute and add the signature here.
3091 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003092 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003093#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003094 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3095 if (dig_signed == NULL) {
3096 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3097 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003098 }
3099
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003100 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003101 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003102 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003103
Janos Follath865b3eb2019-12-16 11:46:15 +00003104 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003105
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003106 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003107 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003108 * For TLS 1.2, obey signature-hash-algorithm extension
3109 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003110 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003111
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003112 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003113 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003114
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003115 unsigned char sig_hash =
3116 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003118
Gilles Peskine449bd832023-01-11 14:50:10 +01003119 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003120
Ronald Cron8457c122022-03-07 11:32:54 +01003121 /* For TLS 1.2, obey signature-hash-algorithm extension
3122 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003123 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3124 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003125 /* (... because we choose a cipher suite
3126 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003127 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003128 }
3129
Gilles Peskine449bd832023-01-11 14:50:10 +01003130 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003131
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003132 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003133 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003134 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003135 if (md_alg != MBEDTLS_MD_NONE) {
3136 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3137 dig_signed,
3138 dig_signed_len,
3139 md_alg);
3140 if (ret != 0) {
3141 return ret;
3142 }
3143 } else {
3144 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3145 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003146 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003147
Gilles Peskine449bd832023-01-11 14:50:10 +01003148 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003149
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003150 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003151 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003152 */
Ronald Cron8457c122022-03-07 11:32:54 +01003153 /*
3154 * We need to specify signature and hash algorithm explicitly through
3155 * a prefix to the signature.
3156 *
3157 * struct {
3158 * HashAlgorithm hash;
3159 * SignatureAlgorithm signature;
3160 * } SignatureAndHashAlgorithm;
3161 *
3162 * struct {
3163 * SignatureAndHashAlgorithm algorithm;
3164 * opaque signature<0..2^16-1>;
3165 * } DigitallySigned;
3166 *
3167 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003168
Gilles Peskine449bd832023-01-11 14:50:10 +01003169 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3170 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003171
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003172#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003173 if (ssl->conf->f_async_sign_start != NULL) {
3174 ret = ssl->conf->f_async_sign_start(ssl,
3175 mbedtls_ssl_own_cert(ssl),
3176 md_alg, hash, hashlen);
3177 switch (ret) {
3178 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3179 /* act as if f_async_sign was null */
3180 break;
3181 case 0:
3182 ssl->handshake->async_in_progress = 1;
3183 return ssl_resume_server_key_exchange(ssl, signature_len);
3184 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3185 ssl->handshake->async_in_progress = 1;
3186 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3187 default:
3188 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3189 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003190 }
3191 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003192#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003193
Gilles Peskine449bd832023-01-11 14:50:10 +01003194 if (mbedtls_ssl_own_key(ssl) == NULL) {
3195 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3196 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003197 }
3198
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003199 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3200 * signature length which will be added in ssl_write_server_key_exchange
3201 * after the call to ssl_prepare_server_key_exchange.
3202 * ssl_write_server_key_exchange also takes care of incrementing
3203 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003204 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3205 md_alg, hash, hashlen,
3206 ssl->out_msg + ssl->out_msglen + 2,
3207 out_buf_len - ssl->out_msglen - 2,
3208 signature_len,
3209 ssl->conf->f_rng,
3210 ssl->conf->p_rng)) != 0) {
3211 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3212 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003213 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003214 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003215#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003216
Gilles Peskine449bd832023-01-11 14:50:10 +01003217 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003218}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003219
Gilles Peskined3eb0612018-01-08 17:07:44 +01003220/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003221 * that do not include a ServerKeyExchange message, do nothing. Either
3222 * way, if successful, move on to the next step in the SSL state
3223 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003224MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003225static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003226{
Janos Follath865b3eb2019-12-16 11:46:15 +00003227 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003228 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003229#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003230 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003231 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003232#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003233
Gilles Peskine449bd832023-01-11 14:50:10 +01003234 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003235
Gilles Peskineeccd8882020-03-10 12:19:08 +01003236#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003237 /* Extract static ECDH parameters and abort if ServerKeyExchange
3238 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003239 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003240 /* For suites involving ECDH, extract DH parameters
3241 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003242#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003243 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3244 ret = ssl_get_ecdh_params_from_cert(ssl);
3245 if (ret != 0) {
3246 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3247 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003248 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003249 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003250#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003251
3252 /* Key exchanges not involving ephemeral keys don't use
3253 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003255 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003256 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003257 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003258#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003259
Gilles Peskineeccd8882020-03-10 12:19:08 +01003260#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003261 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003262 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003263 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 if (ssl->handshake->async_in_progress != 0) {
3265 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3266 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3267 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003268#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003269 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003270 {
3271 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003272 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003273 }
3274
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003276 /* If we're starting to write a new message, set ssl->out_msglen
3277 * to 0. But if we're resuming after an asynchronous message,
3278 * out_msglen is the amount of data written so far and mst be
3279 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003280 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3281 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3282 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003283 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 }
3285 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003286 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003287
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003288 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003289 * ssl_prepare_server_key_exchange already wrote the signature
3290 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003291#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003292 if (signature_len != 0) {
3293 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3294 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003295
Gilles Peskine449bd832023-01-11 14:50:10 +01003296 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3297 ssl->out_msg + ssl->out_msglen,
3298 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003299
3300 /* Skip over the already-written signature */
3301 ssl->out_msglen += signature_len;
3302 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003303#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003304
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003305 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003306 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3307 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003308
3309 ssl->state++;
3310
Gilles Peskine449bd832023-01-11 14:50:10 +01003311 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3312 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3313 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003314 }
3315
Gilles Peskine449bd832023-01-11 14:50:10 +01003316 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3317 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003318}
3319
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003320MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003321static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003322{
Janos Follath865b3eb2019-12-16 11:46:15 +00003323 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003324
Gilles Peskine449bd832023-01-11 14:50:10 +01003325 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003326
3327 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003328 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3329 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003330
3331 ssl->state++;
3332
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003333#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003334 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3335 mbedtls_ssl_send_flight_completed(ssl);
3336 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003337#endif
3338
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3340 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3341 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003342 }
3343
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003344#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003345 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3346 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3347 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3348 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003349 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003350#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003351
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003353
Gilles Peskine449bd832023-01-11 14:50:10 +01003354 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003355}
3356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003357#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3358 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003359MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003360static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3361 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003362{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003363 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003364 size_t n;
3365
3366 /*
3367 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3368 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003369 if (*p + 2 > end) {
3370 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3371 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003372 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003373
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003374 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003375 *p += 2;
3376
Gilles Peskine449bd832023-01-11 14:50:10 +01003377 if (*p + n > end) {
3378 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3379 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003380 }
3381
Gilles Peskine449bd832023-01-11 14:50:10 +01003382 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3383 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3384 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003385 }
3386
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003387 *p += n;
3388
Gilles Peskine449bd832023-01-11 14:50:10 +01003389 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003390
Gilles Peskine449bd832023-01-11 14:50:10 +01003391 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003392}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003393#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3394 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003396#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3397 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003398
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003399#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003400MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003401static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3402 unsigned char *peer_pms,
3403 size_t *peer_pmslen,
3404 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003405{
Gilles Peskine449bd832023-01-11 14:50:10 +01003406 int ret = ssl->conf->f_async_resume(ssl,
3407 peer_pms, peer_pmslen, peer_pmssize);
3408 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003409 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003410 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003411 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003412 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3413 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003414}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003415#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003416
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003418static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3419 const unsigned char *p,
3420 const unsigned char *end,
3421 unsigned char *peer_pms,
3422 size_t *peer_pmslen,
3423 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003424{
Janos Follath865b3eb2019-12-16 11:46:15 +00003425 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003426
Gilles Peskine449bd832023-01-11 14:50:10 +01003427 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3428 if (own_cert == NULL) {
3429 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3430 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003431 }
3432 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003433 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3434 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003435
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003436#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003437 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003438 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003439 if (ssl->handshake->async_in_progress != 0) {
3440 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3441 return ssl_resume_decrypt_pms(ssl,
3442 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003443 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003444#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003445
3446 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003447 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003448 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003449 if (p + 2 > end) {
3450 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3451 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003452 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003453 if (*p++ != MBEDTLS_BYTE_1(len) ||
3454 *p++ != MBEDTLS_BYTE_0(len)) {
3455 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3456 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003457 }
3458
Gilles Peskine449bd832023-01-11 14:50:10 +01003459 if (p + len != end) {
3460 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3461 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003462 }
3463
Gilles Peskine422ccab2018-01-11 18:29:01 +01003464 /*
3465 * Decrypt the premaster secret
3466 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003467#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003468 if (ssl->conf->f_async_decrypt_start != NULL) {
3469 ret = ssl->conf->f_async_decrypt_start(ssl,
3470 mbedtls_ssl_own_cert(ssl),
3471 p, len);
3472 switch (ret) {
3473 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3474 /* act as if f_async_decrypt_start was null */
3475 break;
3476 case 0:
3477 ssl->handshake->async_in_progress = 1;
3478 return ssl_resume_decrypt_pms(ssl,
3479 peer_pms,
3480 peer_pmslen,
3481 peer_pmssize);
3482 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3483 ssl->handshake->async_in_progress = 1;
3484 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3485 default:
3486 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3487 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003488 }
3489 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003490#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003491
Gilles Peskine449bd832023-01-11 14:50:10 +01003492 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3493 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3494 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003495 }
3496
Gilles Peskine449bd832023-01-11 14:50:10 +01003497 ret = mbedtls_pk_decrypt(private_key, p, len,
3498 peer_pms, peer_pmslen, peer_pmssize,
3499 ssl->conf->f_rng, ssl->conf->p_rng);
3500 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003501}
3502
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003503MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003504static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3505 const unsigned char *p,
3506 const unsigned char *end,
3507 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003508{
Janos Follath865b3eb2019-12-16 11:46:15 +00003509 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003510 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3511 unsigned char ver[2];
3512 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003513 size_t peer_pmslen;
3514 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003515
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003516 /* In case of a failure in decryption, the decryption may write less than
3517 * 2 bytes of output, but we always read the first two bytes. It doesn't
3518 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003519 * ret being nonzero, and we only care whether diff is 0.
3520 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3521 * also makes memory analyzers happy (don't access uninitialized memory,
3522 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003523 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003524 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003525
Gilles Peskine449bd832023-01-11 14:50:10 +01003526 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3527 peer_pms,
3528 &peer_pmslen,
3529 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003530
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003531#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003532 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3533 return ret;
3534 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003535#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003536
Gilles Peskine449bd832023-01-11 14:50:10 +01003537 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3538 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003539
3540 /* Avoid data-dependent branches while checking for invalid
3541 * padding, to protect against timing-based Bleichenbacher-type
3542 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003543 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003544 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3545 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3546 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003547
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003548 /*
3549 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3550 * must not cause the connection to end immediately; instead, send a
3551 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003552 * To protect against timing-based variants of the attack, we must
3553 * not have any branch that depends on whether the decryption was
3554 * successful. In particular, always generate the fake premaster secret,
3555 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003556 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003557 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3558 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003559 /* It's ok to abort on an RNG failure, since this does not reveal
3560 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003561 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003562 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003563
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003564#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003565 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003566 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3567 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003568#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003569
Gilles Peskine449bd832023-01-11 14:50:10 +01003570 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3571 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3572 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3573 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003574 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003575 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003576
Gilles Peskine422ccab2018-01-11 18:29:01 +01003577 /* Set pms to either the true or the fake PMS, without
3578 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003579 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003580
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003582}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003583#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3584 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003585
Gilles Peskineeccd8882020-03-10 12:19:08 +01003586#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003587MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003588static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3589 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003590{
Paul Bakker6db455e2013-09-18 17:29:31 +02003591 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003592 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003593
Gilles Peskine449bd832023-01-11 14:50:10 +01003594 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3595 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3596 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003597 }
3598
3599 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003600 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003601 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003602 if (end - *p < 2) {
3603 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3604 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003605 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003606
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003607 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003608 *p += 2;
3609
Gilles Peskine449bd832023-01-11 14:50:10 +01003610 if (n == 0 || n > end - *p) {
3611 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3612 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003613 }
3614
Gilles Peskine449bd832023-01-11 14:50:10 +01003615 if (ssl->conf->f_psk != NULL) {
3616 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003617 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003618 }
3619 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003620 /* Identity is not a big secret since clients send it in the clear,
3621 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003622 if (n != ssl->conf->psk_identity_len ||
3623 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003624 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003625 }
3626 }
3627
Gilles Peskine449bd832023-01-11 14:50:10 +01003628 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3629 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3630 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3631 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3632 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003633 }
3634
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003635 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003636
Gilles Peskine449bd832023-01-11 14:50:10 +01003637 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003638}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003639#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003640
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003641MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003642static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003643{
Janos Follath865b3eb2019-12-16 11:46:15 +00003644 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003645 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003646 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003647
Hanno Beckere694c3e2017-12-27 21:34:08 +00003648 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003649
Gilles Peskine449bd832023-01-11 14:50:10 +01003650 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003651
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003652#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003653 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3654 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3655 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3656 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3657 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003658 /* We've already read a record and there is an asynchronous
3659 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003660 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003661 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3662 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003663#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003664 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3665 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3666 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003667 }
3668
Gilles Peskine449bd832023-01-11 14:50:10 +01003669 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003670 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003671
Gilles Peskine449bd832023-01-11 14:50:10 +01003672 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3673 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3674 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003675 }
3676
Gilles Peskine449bd832023-01-11 14:50:10 +01003677 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3678 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3679 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003680 }
3681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003682#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003683 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3684 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3685 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3686 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003687 }
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 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3695 ssl->handshake->premaster,
3696 MBEDTLS_PREMASTER_SIZE,
3697 &ssl->handshake->pmslen,
3698 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3699 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3700 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003701 }
3702
Gilles Peskine449bd832023-01-11 14:50:10 +01003703 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3704 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003705#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003706#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3707 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3708 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3709 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003710 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003711 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3712 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003713 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003714#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003715 size_t data_len = (size_t) (*p++);
3716 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003717 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3718 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3719
Gilles Peskine530c4232023-10-02 15:37:23 +02003720 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003721
3722 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003723 * We must have at least two bytes (1 for length, at least 1 for data)
3724 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003726 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3727 buf_len));
3728 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003729 }
3730
Gilles Peskine449bd832023-01-11 14:50:10 +01003731 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003732 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3733 " > %" MBEDTLS_PRINTF_SIZET,
3734 data_len, buf_len));
3735 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003736 }
3737
3738 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003739 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003740 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3741 " > %" MBEDTLS_PRINTF_SIZET,
3742 data_len,
3743 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003744 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3745 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003746 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3747 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003748
3749 /* Compute ECDH shared secret. */
3750 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003751 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3752 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003753 handshake->premaster, sizeof(handshake->premaster),
3754 &handshake->pmslen);
3755 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003756 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003757 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003758 if (handshake->xxdh_psa_privkey_is_external == 0) {
3759 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003760 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003761 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003762 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003763 }
3764
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003765 if (handshake->xxdh_psa_privkey_is_external == 0) {
3766 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003767
Gilles Peskine449bd832023-01-11 14:50:10 +01003768 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003769 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003770 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3771 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003772 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003773 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003774 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003775#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003776 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003777 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3779 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003780 }
3781
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3783 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003784
Gilles Peskine449bd832023-01-11 14:50:10 +01003785 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3786 &ssl->handshake->pmslen,
3787 ssl->handshake->premaster,
3788 MBEDTLS_MPI_MAX_SIZE,
3789 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3790 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3791 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003792 }
3793
Gilles Peskine449bd832023-01-11 14:50:10 +01003794 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3795 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003796#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003798#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3799 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3800 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3801 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3802#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3804 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3805 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3806 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003807 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003808
Gilles Peskine449bd832023-01-11 14:50:10 +01003809 if (p != end) {
3810 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3811 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003812 }
3813
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003814#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003815 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003816 (mbedtls_key_exchange_type_t) ciphersuite_info->
3817 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003818 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3819 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003820 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003821#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003822 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003823#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3824#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003826#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003827 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003828 /* There is an asynchronous operation in progress to
3829 * decrypt the encrypted premaster secret, so skip
3830 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003831 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003832 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3833 * won't actually use it, but maintain p anyway for robustness. */
3834 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003835 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003836#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3838 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3839 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003840 }
3841
Gilles Peskine449bd832023-01-11 14:50:10 +01003842 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3843 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3844 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003845 }
3846
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003847#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003849 (mbedtls_key_exchange_type_t) ciphersuite_info->
3850 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003851 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3852 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003853 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003854#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003856#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3857#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003858 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3859 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3860 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3861 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003862 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003863 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3864 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3865 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003866 }
3867
Gilles Peskine449bd832023-01-11 14:50:10 +01003868 if (p != end) {
3869 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3870 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003871 }
3872
Neil Armstrong80f6f322022-05-03 17:56:38 +02003873#if defined(MBEDTLS_USE_PSA_CRYPTO)
3874 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003875 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003876 size_t pms_len;
3877
3878 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003879 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3880 pms + 2, pms_end - (pms + 2), &pms_len,
3881 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3882 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3883 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003884 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003886 pms += 2 + pms_len;
3887
Gilles Peskine449bd832023-01-11 14:50:10 +01003888 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003889#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003890 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003891 (mbedtls_key_exchange_type_t) ciphersuite_info->
3892 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3894 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003895 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003896#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003897 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003898#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003899#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003900 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003901#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003902 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3903 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster5be4fd72024-05-27 20:07:05 +02003904 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003905
3906 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3907
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3909 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003910 psa_destroy_key(handshake->xxdh_psa_privkey);
3911 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003912 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003913 }
3914
3915 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003916 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003917 psa_destroy_key(handshake->xxdh_psa_privkey);
3918 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003919 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003920 }
3921
Neil Armstrong039db292022-03-09 11:38:34 +01003922 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003923 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003924 psa_destroy_key(handshake->xxdh_psa_privkey);
3925 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003926 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003927 }
3928
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003929 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3930 the sizes of the FFDH keys which are at least 2048 bits.
3931 The size of the array is thus greater than 256 bytes which is greater than any
3932 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003933#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003934 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3935 psa_destroy_key(handshake->xxdh_psa_privkey);
3936 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003937 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003938 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003939#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003940 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3941 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003942#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003943
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003944 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3945 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003946 p += ecpoint_len;
3947
Neil Armstrong3bcef082022-03-23 18:16:54 +01003948 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003949 * - a uint16 containing the length (in octets) of the ECDH computation
3950 * - the octet string produced by the ECDH computation
3951 * - a uint16 containing the length (in octets) of the PSK
3952 * - the PSK itself
3953 */
Neil Armstrong039db292022-03-09 11:38:34 +01003954 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003955 const unsigned char * const psm_end =
3956 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003957 /* uint16 to store length (in octets) of the ECDH computation */
3958 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003959 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003960
3961 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003963 handshake->xxdh_psa_privkey,
3964 handshake->xxdh_psa_peerkey,
3965 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003966 psm + zlen_size,
3967 psm_end - (psm + zlen_size),
3968 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003969
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003970 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3971 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003972
Gilles Peskine449bd832023-01-11 14:50:10 +01003973 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003974 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003976 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003977 }
Neil Armstrong039db292022-03-09 11:38:34 +01003978
Neil Armstrong3bcef082022-03-23 18:16:54 +01003979 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003981 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003982
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003983#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003984 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3985 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3986 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003987 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003988
Gilles Peskine449bd832023-01-11 14:50:10 +01003989 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003990 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003991 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3992 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003993 }
3994
Gilles Peskine449bd832023-01-11 14:50:10 +01003995 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3996 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003997
Gilles Peskine449bd832023-01-11 14:50:10 +01003998 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003999 (mbedtls_key_exchange_type_t) ciphersuite_info->
4000 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01004001 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
4002 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004003 }
Neil Armstrong913b3642022-04-13 14:59:48 +02004004#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004005 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004006#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4007#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004008 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4009 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4010 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4011 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004012 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004013 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004014#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004015#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004016 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004017#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004018 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004019 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01004020 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4021 psa_destroy_key(ssl->handshake->psa_pake_password);
4022 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004023
Gilles Peskine449bd832023-01-11 14:50:10 +01004024 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4025 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004026 }
4027#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004028 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004029 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 if (ret != 0) {
4031 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4032 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004033 }
4034
Gilles Peskine449bd832023-01-11 14:50:10 +01004035 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4036 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4037 ssl->conf->f_rng, ssl->conf->p_rng);
4038 if (ret != 0) {
4039 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4040 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004041 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004042#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004043 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004044#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004045 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004046 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4047 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004048 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004049
Gilles Peskine449bd832023-01-11 14:50:10 +01004050 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4051 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4052 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004053 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004054
Paul Bakker5121ce52009-01-03 21:22:43 +00004055 ssl->state++;
4056
Gilles Peskine449bd832023-01-11 14:50:10 +01004057 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004058
Gilles Peskine449bd832023-01-11 14:50:10 +01004059 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004060}
4061
Gilles Peskineeccd8882020-03-10 12:19:08 +01004062#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004063MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004064static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004065{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004066 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004067 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004068
Gilles Peskine449bd832023-01-11 14:50:10 +01004069 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004070
Gilles Peskine449bd832023-01-11 14:50:10 +01004071 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4072 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004073 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004074 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004075 }
4076
Gilles Peskine449bd832023-01-11 14:50:10 +01004077 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4078 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004079}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004080#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004081MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004082static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004083{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004084 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004085 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004086 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004087 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004088 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004089 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004090 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004091 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004092 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004093 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004094
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004096
Gilles Peskine449bd832023-01-11 14:50:10 +01004097 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4098 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004099 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004101 }
4102
Hanno Becker2a831a42019-02-07 13:17:25 +00004103#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004104 if (ssl->session_negotiate->peer_cert == NULL) {
4105 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004106 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004107 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004108 }
4109#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004110 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4111 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004112 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004113 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004114 }
4115#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4116
Simon Butcher99000142016-10-13 17:21:01 +01004117 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004118 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4119 if (0 != ret) {
4120 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4121 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004122 }
4123
4124 ssl->state++;
4125
Simon Butcher99000142016-10-13 17:21:01 +01004126 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004127 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4128 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4129 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4130 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004131 }
4132
Gilles Peskine449bd832023-01-11 14:50:10 +01004133 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004134
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004135#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4136 peer_pk = &ssl->handshake->peer_pubkey;
4137#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004138 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004139 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004140 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004141 }
4142 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4143#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4144
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004145 /*
4146 * struct {
4147 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4148 * opaque signature<0..2^16-1>;
4149 * } DigitallySigned;
4150 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004151 if (i + 2 > ssl->in_hslen) {
4152 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4153 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004154 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004155
Ronald Cron8457c122022-03-07 11:32:54 +01004156 /*
4157 * Hash
4158 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004159 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004160
Gilles Peskine449bd832023-01-11 14:50:10 +01004161 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4162 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4163 " for verify message"));
4164 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004165 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004166
Simon Butcher99000142016-10-13 17:21:01 +01004167#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004168 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004169 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004170 }
Simon Butcher99000142016-10-13 17:21:01 +01004171#endif
Paul Bakker926af752012-11-23 13:38:07 +01004172
Ronald Cron8457c122022-03-07 11:32:54 +01004173 /* Info from md_alg will be used instead */
4174 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004175
Ronald Cron8457c122022-03-07 11:32:54 +01004176 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004177
Ronald Cron8457c122022-03-07 11:32:54 +01004178 /*
4179 * Signature
4180 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004181 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4182 == MBEDTLS_PK_NONE) {
4183 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4184 " for verify message"));
4185 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004186 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004187
Ronald Cron8457c122022-03-07 11:32:54 +01004188 /*
4189 * Check the certificate's key type matches the signature alg
4190 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004191 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4192 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4193 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004194 }
4195
4196 i++;
4197
Gilles Peskine449bd832023-01-11 14:50:10 +01004198 if (i + 2 > ssl->in_hslen) {
4199 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4200 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004201 }
4202
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004203 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004204 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004205
Gilles Peskine449bd832023-01-11 14:50:10 +01004206 if (i + sig_len != ssl->in_hslen) {
4207 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4208 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004209 }
4210
Simon Butcher99000142016-10-13 17:21:01 +01004211 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004212 {
4213 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004214 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4215 if (0 != ret) {
4216 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4217 return ret;
4218 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004219 }
Simon Butcher99000142016-10-13 17:21:01 +01004220
Gilles Peskine449bd832023-01-11 14:50:10 +01004221 if ((ret = mbedtls_pk_verify(peer_pk,
4222 md_alg, hash_start, hashlen,
4223 ssl->in_msg + i, sig_len)) != 0) {
4224 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4225 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004226 }
4227
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004228 ret = mbedtls_ssl_update_handshake_status(ssl);
4229 if (0 != ret) {
4230 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4231 return ret;
4232 }
Simon Butcher99000142016-10-13 17:21:01 +01004233
Gilles Peskine449bd832023-01-11 14:50:10 +01004234 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004235
Gilles Peskine449bd832023-01-11 14:50:10 +01004236 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004237}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004238#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004239
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004240#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004241MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004242static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004243{
Janos Follath865b3eb2019-12-16 11:46:15 +00004244 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004245 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004246 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004247
Gilles Peskine449bd832023-01-11 14:50:10 +01004248 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004250 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4251 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004252
4253 /*
4254 * struct {
4255 * uint32 ticket_lifetime_hint;
4256 * opaque ticket<0..2^16-1>;
4257 * } NewSessionTicket;
4258 *
4259 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4260 * 8 . 9 ticket_len (n)
4261 * 10 . 9+n ticket content
4262 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004263
Ronald Cron3c0072b2023-11-22 10:00:14 +01004264#if defined(MBEDTLS_HAVE_TIME)
4265 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4266#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004267 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4268 ssl->session_negotiate,
4269 ssl->out_msg + 10,
4270 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4271 &tlen, &lifetime)) != 0) {
4272 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004273 tlen = 0;
4274 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004275
Gilles Peskine449bd832023-01-11 14:50:10 +01004276 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4277 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004278 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004279
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004280 /*
4281 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4282 * ChangeCipherSpec share the same state.
4283 */
4284 ssl->handshake->new_session_ticket = 0;
4285
Gilles Peskine449bd832023-01-11 14:50:10 +01004286 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4287 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4288 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004289 }
4290
Gilles Peskine449bd832023-01-11 14:50:10 +01004291 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004292
Gilles Peskine449bd832023-01-11 14:50:10 +01004293 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004294}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004295#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004296
Paul Bakker5121ce52009-01-03 21:22:43 +00004297/*
Paul Bakker1961b702013-01-25 14:49:24 +01004298 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004299 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004300int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004301{
4302 int ret = 0;
4303
Gilles Peskine449bd832023-01-11 14:50:10 +01004304 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004305
Gilles Peskine449bd832023-01-11 14:50:10 +01004306 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004307 case MBEDTLS_SSL_HELLO_REQUEST:
4308 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004309 break;
4310
Paul Bakker1961b702013-01-25 14:49:24 +01004311 /*
4312 * <== ClientHello
4313 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004314 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004315 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004316 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004318#if defined(MBEDTLS_SSL_PROTO_DTLS)
4319 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004320 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004321#endif
4322
Paul Bakker1961b702013-01-25 14:49:24 +01004323 /*
4324 * ==> ServerHello
4325 * Certificate
4326 * ( ServerKeyExchange )
4327 * ( CertificateRequest )
4328 * ServerHelloDone
4329 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004330 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004331 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004332 break;
4333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004334 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004335 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004336 break;
4337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004338 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004339 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004340 break;
4341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004342 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004343 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004344 break;
4345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004346 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004347 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004348 break;
4349
4350 /*
4351 * <== ( Certificate/Alert )
4352 * ClientKeyExchange
4353 * ( CertificateVerify )
4354 * ChangeCipherSpec
4355 * Finished
4356 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004357 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004358 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004359 break;
4360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004361 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004362 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004363 break;
4364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004365 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004366 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004367 break;
4368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004369 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004370 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004371 break;
4372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004373 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004374 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004375 break;
4376
4377 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004378 * ==> ( NewSessionTicket )
4379 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004380 * Finished
4381 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004382 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4383#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004384 if (ssl->handshake->new_session_ticket != 0) {
4385 ret = ssl_write_new_session_ticket(ssl);
4386 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004387#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004388 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004389 break;
4390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004391 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004392 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004393 break;
4394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004395 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004396 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004397 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004398 break;
4399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004400 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004401 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004402 break;
4403
4404 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004405 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4406 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004407 }
4408
Gilles Peskine449bd832023-01-11 14:50:10 +01004409 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004410}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004411
Gilles Peskine449bd832023-01-11 14:50:10 +01004412void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004413{
TRodziewicz3946f792021-06-14 12:11:18 +02004414 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004415}
4416
Jerry Yufb4b6472022-01-27 15:03:26 +08004417#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */