blob: f9ce7a6b643ab6bd960d837ea0461c6a0660c863 [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"
Janos Follath73c616b2019-12-18 15:07:04 +000016#include "mbedtls/debug.h"
17#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 Setti74cb4042023-10-16 13:40:50 +0200667 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_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,
759 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
760 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
761 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200762 continue;
763 }
764
Valerio Settie9646ec2023-08-02 20:02:28 +0200765#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100766 if (pk_alg == MBEDTLS_PK_ECDSA &&
767 ssl_check_key_curve(&cur->cert->pk,
768 ssl->handshake->curves_tls_id) != 0) {
769 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100770 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000771 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100772#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100773
774 /* If we get there, we got a winner */
775 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100776 }
777
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200778 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100779 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100780 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
782 ssl->handshake->key_cert->cert);
783 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100784 }
785
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100787}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200788#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100789
790/*
791 * Check if a given ciphersuite is suitable for use with our config/keys/etc
792 * Sets ciphersuite_info only if the suite matches.
793 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200794MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100795static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
796 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100797{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799
Jerry Yue7541932022-01-28 10:21:24 +0800800#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100801 mbedtls_pk_type_t sig_type;
802#endif
803
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
805 if (suite_info == NULL) {
806 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
807 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100808 }
809
Gilles Peskine449bd832023-01-11 14:50:10 +0100810 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
811 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000812
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 if (suite_info->min_tls_version > ssl->tls_version ||
814 suite_info->max_tls_version < ssl->tls_version) {
815 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
816 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000817 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100818
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200819#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100820 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
821 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
822 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
823 "not configured or ext missing"));
824 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200825 }
826#endif
827
828
Valerio Setti60d3b912023-07-25 10:43:53 +0200829#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200830 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
832 (ssl->handshake->curves_tls_id == NULL ||
833 ssl->handshake->curves_tls_id[0] == 0)) {
834 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
835 "no common elliptic curve"));
836 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000837 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100838#endif
839
Gilles Peskineeccd8882020-03-10 12:19:08 +0100840#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100841 /* If the ciphersuite requires a pre-shared key and we don't
842 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
844 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
845 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
846 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000847 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100848#endif
849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100851 /*
852 * Final check: if ciphersuite requires us to have a
853 * certificate/key of a particular type:
854 * - select the appropriate certificate if we have one, or
855 * - try the next ciphersuite if we don't
856 * This must be done last since we modify the key_cert list.
857 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100858 if (ssl_pick_cert(ssl, suite_info) != 0) {
859 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
860 "no suitable certificate"));
861 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000862 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100863#endif
864
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200865#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
866 /* If the ciphersuite requires signing, check whether
867 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100868 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
869 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200870 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
872 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
873 "for signature algorithm %u", (unsigned) sig_type));
874 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200875 }
876
877#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
878
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100879 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100881}
882
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200883/* This function doesn't alert on errors that happen early during
884 ClientHello parsing because they might indicate that the client is
885 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200886MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100887static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000888{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100889 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200890 size_t i, j;
891 size_t ciph_offset, comp_offset, ext_offset;
892 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200894 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100895#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000896 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000898 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100899#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000900 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200901 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200902 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000903
Hanno Becker7e5437a2017-04-28 17:15:26 +0100904 /* If there is no signature-algorithm extension present,
905 * we need to fall back to the default values for allowed
906 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800907#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100908 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800909#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100910
Gilles Peskine449bd832023-01-11 14:50:10 +0100911 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000912
David Horstmanne0af39a2022-10-06 18:19:18 +0100913 int renegotiating;
914
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200916read_record_header:
917#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100918 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200919 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100920 * otherwise read it ourselves manually in order to support SSLv2
921 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100922 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
923 * ClientHello has been already fully fetched by the TLS 1.3 code and the
924 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100925 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100926 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100929#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100930 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200932 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
934 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000935 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000936 }
937
938 buf = ssl->in_hdr;
939
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000941
Paul Bakkerec636f32012-09-09 19:17:02 +0000942 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100943 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000944 *
945 * Record layer:
946 * 0 . 0 message type
947 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200948 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000949 * 3 . 4 message length
950 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100951 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
952 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100953
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
955 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
956 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100957 }
958
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000960 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100961
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
963 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100964
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200965 /* For DTLS if this is the initial handshake, remember the client sequence
966 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969#if defined(MBEDTLS_SSL_RENEGOTIATION)
970 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000971#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100972 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200973 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
975 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
976 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200977 }
978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
980 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200981
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200982#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100983 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
984 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200985 ssl->next_record_offset = 0;
986 ssl->in_left = 0;
987 goto read_record_header;
988 }
989
990 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200992#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200993 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200995
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000996 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000997
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100999 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001001 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001002 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001003#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001004 {
Ronald Cron6291b232023-03-08 15:51:25 +01001005 if (ssl->keep_current_message) {
1006 ssl->keep_current_message = 0;
1007 } else {
1008 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1009 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1010 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1011 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001012
Ronald Cron6291b232023-03-08 15:51:25 +01001013 if ((ret = mbedtls_ssl_fetch_input(ssl,
1014 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1015 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1016 return ret;
1017 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001018
Ronald Cron6291b232023-03-08 15:51:25 +01001019 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001021 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1022 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1023 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001024#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001025 ssl->in_left = 0;
1026 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001027 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001028
1029 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001030
Gilles Peskine449bd832023-01-11 14:50:10 +01001031 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001032
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001033 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1034 if (0 != ret) {
1035 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1036 return ret;
1037 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001038
1039 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001040 * Handshake layer:
1041 * 0 . 0 handshake type
1042 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001043 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001044 * 6 . 8 DTLS only: fragment offset
1045 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001046 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1048 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1049 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001050 }
1051
Gilles Peskine449bd832023-01-11 14:50:10 +01001052 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001053
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1055 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1056 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001057 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001058 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1060 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1061 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001062
1063 /* The record layer has a record size limit of 2^14 - 1 and
1064 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001065 if (buf[1] != 0) {
1066 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1067 (unsigned) buf[1]));
1068 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001069 }
1070
1071 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001072 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1073 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1074 (unsigned) msg_len,
1075 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1076 (unsigned) handshake_len));
1077 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001078 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001079 }
1080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001082 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001083 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001084 * Copy the client's handshake message_seq on initial handshakes,
1085 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001086 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001089 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001090 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1092 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1093 "%u (expected %u)", cli_msg_seq,
1094 ssl->handshake->in_msg_seq));
1095 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001096 }
1097
1098 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001100#endif
1101 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001102 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001103 ssl->handshake->out_msg_seq = cli_msg_seq;
1104 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1105 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001106 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001107 /*
1108 * For now we don't support fragmentation, so make sure
1109 * fragment_offset == 0 and fragment_length == length
1110 */
1111 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001112 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1113 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1114 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001115 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 4, ("fragment_offset=%u fragment_length=%u length=%u",
1117 (unsigned) fragment_offset, (unsigned) fragment_length,
1118 (unsigned) length));
1119 if (fragment_offset != 0 || length != fragment_length) {
1120 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1121 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001122 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001123 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001124 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001125#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001126
Gilles Peskine449bd832023-01-11 14:50:10 +01001127 buf += mbedtls_ssl_hs_hdr_len(ssl);
1128 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001129
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001130 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001131 * ClientHello layer:
1132 * 0 . 1 protocol version
1133 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1134 * 34 . 35 session id length (1 byte)
1135 * 35 . 34+x session id
1136 * 35+x . 35+x DTLS only: cookie length (1 byte)
1137 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001138 * .. . .. ciphersuite list length (2 bytes)
1139 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001140 * .. . .. compression alg. list length (1 byte)
1141 * .. . .. compression alg. list
1142 * .. . .. extensions length (2 bytes, optional)
1143 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001144 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001145
1146 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001147 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001148 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1149 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001150 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001151 if (msg_len < 38) {
1152 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1153 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001154 }
1155
1156 /*
1157 * Check and save the protocol version
1158 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001160
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001161 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1162 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001163 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakkerec636f32012-09-09 19:17:02 +00001164
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1166 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1167 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1168 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1169 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001170 }
1171
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001172 /*
1173 * Save client random (inc. Unix time)
1174 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001178
1179 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001180 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001181 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001182 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001183
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1185 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1186 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1187 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1188 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1189 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001190 }
1191
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001193
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001194 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 memset(ssl->session_negotiate->id, 0,
1196 sizeof(ssl->session_negotiate->id));
1197 memcpy(ssl->session_negotiate->id, buf + 35,
1198 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001199
1200 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001201 * Check the cookie length and content
1202 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001203#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001205 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001206 cookie_len = buf[cookie_offset];
1207
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1209 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1210 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1211 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1212 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001213 }
1214
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1216 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001218#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001220#if defined(MBEDTLS_SSL_RENEGOTIATION)
1221 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001222#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 ) {
1224 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1225 buf + cookie_offset + 1, cookie_len,
1226 ssl->cli_id, ssl->cli_id_len) != 0) {
1227 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001228 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 } else {
1230 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001231 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001232 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001234#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001235 {
1236 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001238 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1240 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001241 }
1242
Gilles Peskine449bd832023-01-11 14:50:10 +01001243 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001244 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001245
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 /*
1247 * Check the ciphersuitelist length (will be parsed later)
1248 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001249 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001250 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001251#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001253
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001254 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001255
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001257 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 (ciph_len % 2) != 0) {
1259 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1260 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1261 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1262 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001263 }
1264
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1266 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001267
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001268 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001269 * Check the compression algorithm's length.
1270 * The list contents are ignored because implementing
1271 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1272 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001273 */
1274 comp_offset = ciph_offset + 2 + ciph_len;
1275
1276 comp_len = buf[comp_offset];
1277
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001279 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 comp_len + comp_offset + 1 > msg_len) {
1281 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1282 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1283 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1284 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001285 }
1286
Gilles Peskine449bd832023-01-11 14:50:10 +01001287 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1288 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001289
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 /*
1291 * Check the extension length
1292 */
1293 ext_offset = comp_offset + 1 + comp_len;
1294 if (msg_len > ext_offset) {
1295 if (msg_len < ext_offset + 2) {
1296 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1297 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1298 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1299 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001300 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001301
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001302 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001303
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 if (msg_len != ext_offset + 2 + ext_len) {
1305 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1306 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1307 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1308 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1309 }
1310 } else {
1311 ext_len = 0;
1312 }
Paul Bakker48916f92012-09-16 19:57:18 +00001313
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 ext = buf + ext_offset + 2;
1315 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1316
1317 while (ext_len != 0) {
1318 unsigned int ext_id;
1319 unsigned int ext_size;
1320 if (ext_len < 4) {
1321 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1322 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1323 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1324 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1325 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001326 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1327 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001328
1329 if (ext_size + 4 > ext_len) {
1330 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1331 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1332 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1333 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1334 }
1335 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001336#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001337 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001338 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1339 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1340 ext + 4 + ext_size);
1341 if (ret != 0) {
1342 return ret;
1343 }
Simon Butcher584a5472016-05-23 16:24:52 +01001344 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001346
Simon Butcher584a5472016-05-23 16:24:52 +01001347 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001350 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001351#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001352
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1354 if (ret != 0) {
1355 return ret;
1356 }
Simon Butcher584a5472016-05-23 16:24:52 +01001357 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001358
Jerry Yue7541932022-01-28 10:21:24 +08001359#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001360 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1364 if (ret != 0) {
1365 return ret;
1366 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001367
1368 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001369 break;
Jerry Yue7541932022-01-28 10:21:24 +08001370#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001371
Valerio Setti60d3b912023-07-25 10:43:53 +02001372#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001373 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001374 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001375 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001377
Gilles Peskine449bd832023-01-11 14:50:10 +01001378 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1379 if (ret != 0) {
1380 return ret;
1381 }
Simon Butcher584a5472016-05-23 16:24:52 +01001382 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001383
Simon Butcher584a5472016-05-23 16:24:52 +01001384 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001386 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001387
Gilles Peskine449bd832023-01-11 14:50:10 +01001388 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1389 if (ret != 0) {
1390 return ret;
1391 }
Simon Butcher584a5472016-05-23 16:24:52 +01001392 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001393#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001394 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001395 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001396
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001397#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001398 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001400
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1402 if (ret != 0) {
1403 return ret;
1404 }
Simon Butcher584a5472016-05-23 16:24:52 +01001405 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001406#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1407
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001408#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001409 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001410 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001411
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1413 if (ret != 0) {
1414 return ret;
1415 }
Simon Butcher584a5472016-05-23 16:24:52 +01001416 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001418
Hanno Beckera0e20d02019-05-15 14:03:01 +01001419#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001420 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001421 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001422
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1424 if (ret != 0) {
1425 return ret;
1426 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001427 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001428#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001431 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001433
Gilles Peskine449bd832023-01-11 14:50:10 +01001434 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1435 if (ret != 0) {
1436 return ret;
1437 }
Simon Butcher584a5472016-05-23 16:24:52 +01001438 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001439#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001442 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001444
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1446 if (ret != 0) {
1447 return ret;
1448 }
Simon Butcher584a5472016-05-23 16:24:52 +01001449 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001450#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001453 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001454 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001455
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1457 if (ret != 0) {
1458 return ret;
1459 }
Simon Butcher584a5472016-05-23 16:24:52 +01001460 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001461#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001464 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001465 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001466
Gilles Peskine449bd832023-01-11 14:50:10 +01001467 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1468 ext + 4 + ext_size);
1469 if (ret != 0) {
1470 return ret;
1471 }
Simon Butcher584a5472016-05-23 16:24:52 +01001472 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001473#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001474
Johan Pascalb62bb512015-12-03 21:56:45 +01001475#if defined(MBEDTLS_SSL_DTLS_SRTP)
1476 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001477 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001478
Gilles Peskine449bd832023-01-11 14:50:10 +01001479 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1480 if (ret != 0) {
1481 return ret;
1482 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001483 break;
1484#endif /* MBEDTLS_SSL_DTLS_SRTP */
1485
Simon Butcher584a5472016-05-23 16:24:52 +01001486 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001487 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1488 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001489 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001490
Gilles Peskine449bd832023-01-11 14:50:10 +01001491 ext_len -= 4 + ext_size;
1492 ext += 4 + ext_size;
1493 }
1494
Jerry Yue7541932022-01-28 10:21:24 +08001495#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001496
1497 /*
1498 * Try to fall back to default hash SHA1 if the client
1499 * hasn't provided any preferred signature-hash combinations.
1500 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001501 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001502 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1503 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001504#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1506 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001507#endif
1508#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1510 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001511#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001512 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001513 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001514
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001515 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1516 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1517 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001518
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001520 }
1521
Jerry Yue7541932022-01-28 10:21:24 +08001522#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001523
Paul Bakker48916f92012-09-16 19:57:18 +00001524 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001525 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1526 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001527 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1528 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1529 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001530#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001531 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1532 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1533 "during renegotiation"));
1534 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1535 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1536 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001537 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001538#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001539 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001540 break;
1541 }
1542 }
1543
1544 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001545 * Renegotiation security checks
1546 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001547 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1548 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1549 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001550 handshake_failure = 1;
1551 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001552#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001553 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 renegotiation_info_seen == 0) {
1556 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001557 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001558 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1559 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1560 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1561 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001562 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001563 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1564 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1565 renegotiation_info_seen == 1) {
1566 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001567 handshake_failure = 1;
1568 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001569#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001570
Gilles Peskine449bd832023-01-11 14:50:10 +01001571 if (handshake_failure == 1) {
1572 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1573 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1574 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001575 }
Paul Bakker380da532012-04-18 16:10:25 +00001576
Paul Bakker41c83d32013-03-20 14:39:14 +01001577 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001578 * Server certification selection (after processing TLS extensions)
1579 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001580 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1581 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1582 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001583 }
Glenn Strauss69894072022-01-24 12:58:00 -05001584#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1585 ssl->handshake->sni_name = NULL;
1586 ssl->handshake->sni_name_len = 0;
1587#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001588
1589 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001590 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001591 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001592 * and certificate from the SNI callback triggered by the SNI extension
1593 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001594 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001595 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001596 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001597 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001598
Gilles Peskine449bd832023-01-11 14:50:10 +01001599 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1600 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1601 for (i = 0; ciphersuites[i] != 0; i++) {
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 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001605
TRodziewicz8476f2f2021-06-02 14:34:47 +02001606 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001607
Gilles Peskine449bd832023-01-11 14:50:10 +01001608 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1609 &ciphersuite_info)) != 0) {
1610 return ret;
1611 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001612
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 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 for (i = 0; ciphersuites[i] != 0; i++) {
1620 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1621 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001622 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001623 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001624
1625 got_common_suite = 1;
1626
Gilles Peskine449bd832023-01-11 14:50:10 +01001627 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1628 &ciphersuite_info)) != 0) {
1629 return ret;
1630 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001631
Gilles Peskine449bd832023-01-11 14:50:10 +01001632 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001633 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001634 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001635 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001636 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001637 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001638
Gilles Peskine449bd832023-01-11 14:50:10 +01001639 if (got_common_suite) {
1640 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1641 "but none of them usable"));
1642 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1643 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1644 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1645 } else {
1646 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1647 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1648 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1649 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001650 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001651
1652have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001653 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001654
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001655 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001656 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001657
Paul Bakker5121ce52009-01-03 21:22:43 +00001658 ssl->state++;
1659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001660#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1662 mbedtls_ssl_recv_flight_completed(ssl);
1663 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001664#endif
1665
Hanno Becker7e5437a2017-04-28 17:15:26 +01001666 /* Debugging-only output for testsuite */
1667#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001668 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001669 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1670 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001671 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001672 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1673 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1674 sig_hash));
1675 } else {
1676 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1677 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001678 }
1679#endif
1680
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001682
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001684}
1685
Hanno Beckera0e20d02019-05-15 14:03:01 +01001686#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001687static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1688 unsigned char *buf,
1689 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001690{
1691 unsigned char *p = buf;
1692 size_t ext_len;
1693 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1694
1695 *olen = 0;
1696
1697 /* Skip writing the extension if we don't want to use it or if
1698 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001699 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001700 return;
1701 }
1702
Gilles Peskine449bd832023-01-11 14:50:10 +01001703 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1704 * which is at most 255, so the increment cannot overflow. */
1705 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1706 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1707 return;
1708 }
1709
1710 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001711
1712 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001713 * struct {
1714 * opaque cid<0..2^8-1>;
1715 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001716 */
1717 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001718 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001719 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001720 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001721 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001722
1723 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001724 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001725
1726 *olen = ssl->own_cid_len + 5;
1727}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001728#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001729
Neil Armstrong76b74072022-04-06 13:43:54 +02001730#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001731static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1732 unsigned char *buf,
1733 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001734{
1735 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001736 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001737
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001738 /*
1739 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1740 * from a client and then selects a stream or Authenticated Encryption
1741 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1742 * encrypt-then-MAC response extension back to the client."
1743 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001744 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001745 ssl->session_negotiate->ciphersuite);
1746 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001747 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001748 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001749 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001750 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001751 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001753
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001755 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 }
Ronald Cron862902d2022-03-24 14:15:28 +01001757 }
1758
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001760 *olen = 0;
1761 return;
1762 }
1763
Gilles Peskine449bd832023-01-11 14:50:10 +01001764 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001765
Gilles Peskine449bd832023-01-11 14:50:10 +01001766 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001767 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001768
1769 *p++ = 0x00;
1770 *p++ = 0x00;
1771
1772 *olen = 4;
1773}
Neil Armstrong76b74072022-04-06 13:43:54 +02001774#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001775
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001776#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001777static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1778 unsigned char *buf,
1779 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001780{
1781 unsigned char *p = buf;
1782
Gilles Peskine449bd832023-01-11 14:50:10 +01001783 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001784 *olen = 0;
1785 return;
1786 }
1787
Gilles Peskine449bd832023-01-11 14:50:10 +01001788 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1789 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001790
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001792 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001793
1794 *p++ = 0x00;
1795 *p++ = 0x00;
1796
1797 *olen = 4;
1798}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001799#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001802static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1803 unsigned char *buf,
1804 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001805{
1806 unsigned char *p = buf;
1807
Gilles Peskine449bd832023-01-11 14:50:10 +01001808 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001809 *olen = 0;
1810 return;
1811 }
1812
Gilles Peskine449bd832023-01-11 14:50:10 +01001813 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001814
Gilles Peskine449bd832023-01-11 14:50:10 +01001815 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001816 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001817
1818 *p++ = 0x00;
1819 *p++ = 0x00;
1820
1821 *olen = 4;
1822}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001823#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001824
Gilles Peskine449bd832023-01-11 14:50:10 +01001825static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1826 unsigned char *buf,
1827 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001828{
1829 unsigned char *p = buf;
1830
Gilles Peskine449bd832023-01-11 14:50:10 +01001831 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001832 *olen = 0;
1833 return;
1834 }
1835
Gilles Peskine449bd832023-01-11 14:50:10 +01001836 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001837
Gilles Peskine449bd832023-01-11 14:50:10 +01001838 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001839 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001840
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001841#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001842 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001843 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001845 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001846
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001848 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001850 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001851 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001852#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001853 {
1854 *p++ = 0x00;
1855 *p++ = 0x01;
1856 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001857 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001858
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001859 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001860}
1861
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001862#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001863static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1864 unsigned char *buf,
1865 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001866{
1867 unsigned char *p = buf;
1868
Gilles Peskine449bd832023-01-11 14:50:10 +01001869 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001870 *olen = 0;
1871 return;
1872 }
1873
Gilles Peskine449bd832023-01-11 14:50:10 +01001874 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001875
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001877 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001878
1879 *p++ = 0x00;
1880 *p++ = 1;
1881
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001882 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001883
1884 *olen = 5;
1885}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001886#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001887
Valerio Setti7aeec542023-07-05 18:57:21 +02001888#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001889 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001890 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001891static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1892 unsigned char *buf,
1893 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001894{
1895 unsigned char *p = buf;
1896 ((void) ssl);
1897
Gilles Peskine449bd832023-01-11 14:50:10 +01001898 if ((ssl->handshake->cli_exts &
1899 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001900 *olen = 0;
1901 return;
1902 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001903
Gilles Peskine449bd832023-01-11 14:50:10 +01001904 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001905
Gilles Peskine449bd832023-01-11 14:50:10 +01001906 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001907 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001908
1909 *p++ = 0x00;
1910 *p++ = 2;
1911
1912 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001913 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001914
1915 *olen = 6;
1916}
Valerio Setti45d56f32023-07-13 17:23:20 +02001917#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001918 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001919 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001920
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001921#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001922static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1923 unsigned char *buf,
1924 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001925{
Janos Follath865b3eb2019-12-16 11:46:15 +00001926 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001927 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001928 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001929 size_t kkpp_len;
1930
1931 *olen = 0;
1932
1933 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001934 if (ssl->handshake->ciphersuite_info->key_exchange !=
1935 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001936 return;
1937 }
1938
Gilles Peskine449bd832023-01-11 14:50:10 +01001939 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1940
1941 if (end - p < 4) {
1942 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1943 return;
1944 }
1945
1946 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001947 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001948
Neil Armstrongca7d5062022-05-31 14:43:23 +02001949#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001951 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 MBEDTLS_ECJPAKE_ROUND_ONE);
1953 if (ret != 0) {
1954 psa_destroy_key(ssl->handshake->psa_pake_password);
1955 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1956 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001957 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001958 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001959#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001960 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001961 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001962 ssl->conf->f_rng, ssl->conf->p_rng);
1963 if (ret != 0) {
1964 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001965 return;
1966 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001967#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001968
Gilles Peskine449bd832023-01-11 14:50:10 +01001969 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001970 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001971
1972 *olen = kkpp_len + 4;
1973}
1974#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1975
Gilles Peskine449bd832023-01-11 14:50:10 +01001976#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1977static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1978 unsigned char *buf,
1979 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001980{
Ron Eldor75870ec2018-12-06 17:31:55 +02001981 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001982 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001983 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1984
1985 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001986
Gilles Peskine449bd832023-01-11 14:50:10 +01001987 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1988 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001989 return;
1990 }
1991
Gilles Peskine449bd832023-01-11 14:50:10 +01001992 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001993
Gilles Peskine449bd832023-01-11 14:50:10 +01001994 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001995 mki_len = ssl->dtls_srtp_info.mki_len;
1996 }
1997
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001998 /* The extension total size is 9 bytes :
1999 * - 2 bytes for the extension tag
2000 * - 2 bytes for the total size
2001 * - 2 bytes for the protection profile length
2002 * - 2 bytes for the protection profile
2003 * - 1 byte for the mki length
2004 * + the actual mki length
2005 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002006 if ((size_t) (end - buf) < mki_len + 9) {
2007 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002008 return;
2009 }
2010
Johan Pascalb62bb512015-12-03 21:56:45 +01002011 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002013 /*
2014 * total length 5 and mki value: only one profile(2 bytes)
2015 * and length(2 bytes) and srtp_mki )
2016 */
Ron Eldor591f1622018-01-22 12:30:04 +02002017 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002018 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002019
2020 /* protection profile length: 2 */
2021 buf[4] = 0x00;
2022 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002023 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002024 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2025 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2026 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2027 } else {
2028 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002029 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002030 }
2031
Ron Eldor591f1622018-01-22 12:30:04 +02002032 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002033 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002034
Ron Eldor591f1622018-01-22 12:30:04 +02002035 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002036}
2037#endif /* MBEDTLS_SSL_DTLS_SRTP */
2038
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002040MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002041static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002042{
Janos Follath865b3eb2019-12-16 11:46:15 +00002043 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002044 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002045 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002046
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002048
2049 /*
2050 * struct {
2051 * ProtocolVersion server_version;
2052 * opaque cookie<0..2^8-1>;
2053 * } HelloVerifyRequest;
2054 */
2055
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002056 /* The RFC is not clear on this point, but sending the actual negotiated
2057 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2059 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002060 p += 2;
2061
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002062 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 if (ssl->conf->f_cookie_write == NULL) {
2064 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2065 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002066 }
2067
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002068 /* Skip length byte until we know the length */
2069 cookie_len_byte = p++;
2070
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2072 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2073 ssl->cli_id, ssl->cli_id_len)) != 0) {
2074 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2075 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002076 }
2077
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002079
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002081
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002082 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002083 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2084 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002085
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002086 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002087
Gilles Peskine449bd832023-01-11 14:50:10 +01002088 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2089 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2090 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002091 }
2092
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002093#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002094 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2095 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2096 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2097 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002098 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002099#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002100
Gilles Peskine449bd832023-01-11 14:50:10 +01002101 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002102
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002104}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002105#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002108{
2109 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002110 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002111 mbedtls_ssl_session * const session = ssl->session_negotiate;
2112
2113 /* Resume is 0 by default, see ssl_handshake_init().
2114 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002115 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002116 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 }
2118 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002119 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002120 }
2121 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002122 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002124#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002126 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002128#endif
2129
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002131
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2133 session->id,
2134 session->id_len,
2135 &session_tmp);
2136 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002137 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002138 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002139
Gilles Peskine449bd832023-01-11 14:50:10 +01002140 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002141 /* Mismatch between cached and negotiated session */
2142 goto exit;
2143 }
2144
2145 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002147 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002149
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002151 ssl->handshake->resume = 1;
2152
2153exit:
2154
Gilles Peskine449bd832023-01-11 14:50:10 +01002155 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002156}
2157
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002158MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002159static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002160{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002161#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002162 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002163#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002164 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002165 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002166 unsigned char *buf, *p;
2167
Gilles Peskine449bd832023-01-11 14:50:10 +01002168 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002170#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2172 ssl->handshake->cookie_verify_result != 0) {
2173 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2174 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002177 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002178#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 if (ssl->conf->f_rng == NULL) {
2181 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2182 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002183 }
2184
Paul Bakker5121ce52009-01-03 21:22:43 +00002185 /*
2186 * 0 . 0 handshake type
2187 * 1 . 3 handshake length
2188 * 4 . 5 protocol version
2189 * 6 . 9 UNIX time()
2190 * 10 . 37 random bytes
2191 */
2192 buf = ssl->out_msg;
2193 p = buf + 4;
2194
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002196 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002197
Gilles Peskine449bd832023-01-11 14:50:10 +01002198 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2199 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002201#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002202 t = mbedtls_time(NULL);
2203 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002204 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002205
Gilles Peskine449bd832023-01-11 14:50:10 +01002206 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2207 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002208#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2210 return ret;
2211 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002212
2213 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002214#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002215
Ronald Cronc5649382023-04-04 15:33:42 +02002216 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002217 return ret;
2218 }
Ronald Cronc5649382023-04-04 15:33:42 +02002219 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002220
Ronald Cronc5649382023-04-04 15:33:42 +02002221#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2222 /*
2223 * RFC 8446
2224 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2225 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2226 * response to a ClientHello MUST set the last 8 bytes of their Random
2227 * value specially in their ServerHello.
2228 */
2229 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2230 static const unsigned char magic_tls12_downgrade_string[] =
2231 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2232
2233 MBEDTLS_STATIC_ASSERT(
2234 sizeof(magic_tls12_downgrade_string) == 8,
2235 "magic_tls12_downgrade_string does not have the expected size");
2236
Ronald Cronfe01ec22023-04-06 09:56:53 +02002237 memcpy(p, magic_tls12_downgrade_string,
2238 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002239 } else
2240#endif
2241 {
2242 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2243 return ret;
2244 }
2245 }
2246 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002247
Gilles Peskine449bd832023-01-11 14:50:10 +01002248 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002249
Gilles Peskine449bd832023-01-11 14:50:10 +01002250 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002251
Gilles Peskine449bd832023-01-11 14:50:10 +01002252 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002256 * New session, create a new session id,
2257 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002258 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 ssl->state++;
2260
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002261#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002262 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002263#endif
2264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002265#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002267 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002268 memset(ssl->session_negotiate->id, 0, 32);
2269 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002270#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002271 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002272 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002273 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2274 n)) != 0) {
2275 return ret;
2276 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002277 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002278 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002279 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002280 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002281 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002282 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002283 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002284
Gilles Peskine449bd832023-01-11 14:50:10 +01002285 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2286 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2287 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002288 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002289 }
2290
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002291 /*
2292 * 38 . 38 session id length
2293 * 39 . 38+n session id
2294 * 39+n . 40+n chosen ciphersuite
2295 * 41+n . 41+n chosen compression alg.
2296 * 42+n . 43+n extensions length
2297 * 44+n . 43+n+m extensions
2298 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002299 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002300 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002301 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002302
Gilles Peskine449bd832023-01-11 14:50:10 +01002303 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2304 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2305 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2306 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002307
Gilles Peskine449bd832023-01-11 14:50:10 +01002308 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002309 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002310 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002311
Gilles Peskine449bd832023-01-11 14:50:10 +01002312 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2313 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2314 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2315 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002316
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002317 /*
2318 * First write extensions, then the total length
2319 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002320 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002321 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002323#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002325 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002326#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002327
Hanno Beckera0e20d02019-05-15 14:03:01 +01002328#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002329 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002330 ext_len += olen;
2331#endif
2332
Neil Armstrong76b74072022-04-06 13:43:54 +02002333#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002335 ext_len += olen;
2336#endif
2337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002338#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002339 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002340 ext_len += olen;
2341#endif
2342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002343#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002344 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002345 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002346#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002347
Valerio Setti7aeec542023-07-05 18:57:21 +02002348#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002349 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002350 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002351 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002352 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2353 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2354 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002355 ext_len += olen;
2356 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002357#endif
2358
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002359#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002360 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002361 ext_len += olen;
2362#endif
2363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002364#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002365 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2367 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002368 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002369 }
Paul Elliottf518f812022-07-11 12:36:20 +01002370
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002371 ext_len += olen;
2372#endif
2373
Johan Pascalb62bb512015-12-03 21:56:45 +01002374#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002375 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002376 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002377#endif
2378
Gilles Peskine449bd832023-01-11 14:50:10 +01002379 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2380 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002381
Gilles Peskine449bd832023-01-11 14:50:10 +01002382 if (ext_len > 0) {
2383 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002384 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002385 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002386
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002387 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002388 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2389 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002390
Gilles Peskine449bd832023-01-11 14:50:10 +01002391 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Gilles Peskine449bd832023-01-11 14:50:10 +01002395 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002396}
2397
Gilles Peskineeccd8882020-03-10 12:19:08 +01002398#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002399MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002400static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002401{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002402 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002403 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002404
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002406
Gilles Peskine449bd832023-01-11 14:50:10 +01002407 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2408 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002409 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002411 }
2412
Gilles Peskine449bd832023-01-11 14:50:10 +01002413 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2414 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002415}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002416#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002418static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002419{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002420 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002421 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002422 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002423 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002424 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002425 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002426 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002427 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002428 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002429
Gilles Peskine449bd832023-01-11 14:50:10 +01002430 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002431
2432 ssl->state++;
2433
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002434#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002435 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002436 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002438#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002439 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002440
Gilles Peskine449bd832023-01-11 14:50:10 +01002441 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2442 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2443 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2444 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002445 }
2446
2447 /*
2448 * 0 . 0 handshake type
2449 * 1 . 3 handshake length
2450 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002451 * 5 .. m-1 cert types
2452 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002453 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 * n .. n+1 length of all DNs
2455 * n+2 .. n+3 length of DN 1
2456 * n+4 .. ... Distinguished Name #1
2457 * ... .. ... length of DN 2, etc.
2458 */
2459 buf = ssl->out_msg;
2460 p = buf + 4;
2461
2462 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002463 * Supported certificate types
2464 *
2465 * ClientCertificateType certificate_types<1..2^8-1>;
2466 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002467 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002468 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002470#if defined(MBEDTLS_RSA_C)
2471 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002472#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002473#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002474 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002475#endif
2476
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002477 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002478 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002479
Paul Bakker577e0062013-08-28 11:57:20 +02002480 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002481
Paul Bakker926af752012-11-23 13:38:07 +01002482 /*
2483 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002484 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002485 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2486 *
2487 * struct {
2488 * HashAlgorithm hash;
2489 * SignatureAlgorithm signature;
2490 * } SignatureAndHashAlgorithm;
2491 *
2492 * enum { (255) } HashAlgorithm;
2493 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002494 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002495 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2496 if (sig_alg == NULL) {
2497 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2498 }
Ronald Cron8457c122022-03-07 11:32:54 +01002499
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2501 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002502
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002504 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 }
2506 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002507 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 }
Simon Butcher99000142016-10-13 17:21:01 +01002509
Paul Elliott96a0fd92022-11-08 17:09:56 +00002510 /* Write elements at offsets starting from 1 (offset 0 is for the
2511 * length). Thus the offset of each element is the length of the
2512 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002513 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002514 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002515
Paul Bakker926af752012-11-23 13:38:07 +01002516 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002517
Paul Elliott96a0fd92022-11-08 17:09:56 +00002518 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002520 sa_len += 2;
2521 p += sa_len;
2522
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002523 /*
2524 * DistinguishedName certificate_authorities<0..2^16-1>;
2525 * opaque DistinguishedName<1..2^16-1>;
2526 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002527 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002528
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002529 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002530
Gilles Peskine449bd832023-01-11 14:50:10 +01002531 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002532 /* NOTE: If trusted certificates are provisioned
2533 * via a CA callback (configured through
2534 * `mbedtls_ssl_conf_ca_cb()`, then the
2535 * CertificateRequest is currently left empty. */
2536
Glenn Strauss999ef702022-03-11 01:37:23 -05002537#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2538#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002539 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002540 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002541 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002542#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002543 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002544 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002545 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002546#endif
Janos Follath088ce432017-04-10 12:42:31 +01002547#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002548 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002549 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002550 } else
Janos Follath088ce432017-04-10 12:42:31 +01002551#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002552 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002553
Gilles Peskine449bd832023-01-11 14:50:10 +01002554 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002555 /* It follows from RFC 5280 A.1 that this length
2556 * can be represented in at most 11 bits. */
2557 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002558
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2560 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002561 break;
2562 }
2563
Gilles Peskine449bd832023-01-11 14:50:10 +01002564 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002565 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002567 p += dn_size;
2568
Gilles Peskine449bd832023-01-11 14:50:10 +01002569 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002570
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002571 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002572 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002573 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002574 }
2575
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002576 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002577 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2578 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002580
Gilles Peskine449bd832023-01-11 14:50:10 +01002581 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002582
Gilles Peskine449bd832023-01-11 14:50:10 +01002583 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002584
Gilles Peskine449bd832023-01-11 14:50:10 +01002585 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002586}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002587#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002588
Valerio Setti4d0e8462023-10-06 13:20:21 +02002589#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002590 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002591#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002592MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002593static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002594{
2595 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2596 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002597 mbedtls_pk_context *pk;
2598 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002599 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002600 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2601 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002602#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002603 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002604 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002605 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002606 mbedtls_ecp_keypair *key;
2607#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002608
Gilles Peskine449bd832023-01-11 14:50:10 +01002609 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002610
Gilles Peskine449bd832023-01-11 14:50:10 +01002611 if (pk == NULL) {
2612 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2613 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002614
Valerio Setti0813b6f2023-06-16 12:18:53 +02002615 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002616
Valerio Setti0813b6f2023-06-16 12:18:53 +02002617 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002618 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002619#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2620 case MBEDTLS_PK_ECKEY:
2621 case MBEDTLS_PK_ECKEY_DH:
2622 case MBEDTLS_PK_ECDSA:
2623#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002624 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2625 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2626 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002627
Valerio Settibced8bc2023-12-06 10:40:47 +01002628 /* Get the attributes of the key previously parsed by PK module in
2629 * order to extract its type and length (in bits). */
2630 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002631 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002632 ret = PSA_TO_MBEDTLS_ERR(status);
2633 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002634 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002635 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002636 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002637
Valerio Settibced8bc2023-12-06 10:40:47 +01002638 /* Now export and then re-import the same key with proper flags
2639 * and algorithm. We also set key's type and bits that we just got
2640 * above. */
2641 key_attributes = psa_key_attributes_init();
2642 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2643 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2644 psa_set_key_type(&key_attributes,
2645 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2646 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
2647
2648 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2649 if (status != PSA_SUCCESS) {
2650 ret = PSA_TO_MBEDTLS_ERR(status);
2651 goto exit;
2652 }
2653 status = psa_import_key(&key_attributes, buf, key_len,
2654 &ssl->handshake->xxdh_psa_privkey);
2655 if (status != PSA_SUCCESS) {
2656 ret = PSA_TO_MBEDTLS_ERR(status);
2657 goto exit;
2658 }
2659
2660 /* Set this key as owned by the TLS library: it will be its duty
2661 * to clear it exit. */
2662 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002663
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 ret = 0;
2665 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002666#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 case MBEDTLS_PK_ECKEY:
2668 case MBEDTLS_PK_ECKEY_DH:
2669 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002670 key = mbedtls_pk_ec_rw(*pk);
Valerio Settid0405092023-05-24 13:16:40 +02002671 grp_id = mbedtls_pk_get_group_id(pk);
2672 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002673 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2674 }
Valerio Setti97207782023-05-18 18:59:06 +02002675 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 if (tls_id == 0) {
2677 /* This elliptic curve is not supported */
2678 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2679 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002680
Gilles Peskine449bd832023-01-11 14:50:10 +01002681 /* If the above conversion to TLS ID was fine, then also this one will
2682 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002683 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002684 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002685
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002686 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002687
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 key_attributes = psa_key_attributes_init();
2689 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2690 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2691 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002692 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002693 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002694
Gilles Peskine449bd832023-01-11 14:50:10 +01002695 key_len = PSA_BITS_TO_BYTES(key->grp.pbits);
2696 ret = mbedtls_ecp_write_key(key, buf, key_len);
2697 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002698 mbedtls_platform_zeroize(buf, sizeof(buf));
2699 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002701
Gilles Peskine449bd832023-01-11 14:50:10 +01002702 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002703 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002705 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002706 mbedtls_platform_zeroize(buf, sizeof(buf));
2707 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002708 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002709
Valerio Setti6835b4a2023-06-22 09:06:31 +02002710 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002711 ret = 0;
2712 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002713#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002715 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002716 }
2717
Valerio Settibced8bc2023-12-06 10:40:47 +01002718exit:
2719 psa_reset_key_attributes(&key_attributes);
2720 mbedtls_platform_zeroize(buf, sizeof(buf));
2721
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002723}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002724#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002725MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002726static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002727{
Janos Follath865b3eb2019-12-16 11:46:15 +00002728 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002729
Gilles Peskine449bd832023-01-11 14:50:10 +01002730 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2731 if (private_key == NULL) {
2732 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2733 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002734 }
2735
Gilles Peskine449bd832023-01-11 14:50:10 +01002736 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2737 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2738 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002739 }
2740
Gilles Peskine449bd832023-01-11 14:50:10 +01002741 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002742 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002743 MBEDTLS_ECDH_OURS)) != 0) {
2744 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2745 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002746 }
2747
Gilles Peskine449bd832023-01-11 14:50:10 +01002748 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002749}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002750#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002751#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2752 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002753
Gilles Peskineeccd8882020-03-10 12:19:08 +01002754#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002755 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002756MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002757static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2758 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002759{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002760 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2761 * signature length which will be added in ssl_write_server_key_exchange
2762 * after the call to ssl_prepare_server_key_exchange.
2763 * ssl_write_server_key_exchange also takes care of incrementing
2764 * ssl->out_msglen. */
2765 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002766 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2767 - sig_start);
2768 int ret = ssl->conf->f_async_resume(ssl,
2769 sig_start, signature_len, sig_max_len);
2770 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002771 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002772 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002773 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002774 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2775 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002776}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002777#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002778 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002779
Gilles Peskined3eb0612018-01-08 17:07:44 +01002780/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002781 * calculating the signature if any, but excluding formatting the
2782 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002783MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002784static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2785 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002786{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002787 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002788 ssl->handshake->ciphersuite_info;
2789
Gilles Peskineeccd8882020-03-10 12:19:08 +01002790#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002791#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002792 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002793#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002794#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002795
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002796 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002797#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002798 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002799#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002800
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002801#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002802#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002803 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002804#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002805 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 +02002806#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002807#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002808
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002809 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002810
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002811 /*
2812 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002813 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002814 *
2815 */
2816
2817 /*
2818 * - ECJPAKE key exchanges
2819 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002820#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002821 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002822 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002823#if defined(MBEDTLS_USE_PSA_CRYPTO)
2824 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2825 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2826 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002827 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002828 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002829
Valerio Setti6f1b5742022-11-16 10:00:32 +01002830 /*
2831 * The first 3 bytes are:
2832 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2833 * [1, 2] elliptic curve's TLS ID
2834 *
2835 * However since we only support secp256r1 for now, we hardcode its
2836 * TLS ID here
2837 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002838 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002839 MBEDTLS_ECP_DP_SECP256R1);
2840 if (tls_id == 0) {
2841 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002842 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002843 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002844 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002845 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002846
Gilles Peskine449bd832023-01-11 14:50:10 +01002847 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2848 out_p + output_offset,
2849 end_p - out_p - output_offset, &output_len,
2850 MBEDTLS_ECJPAKE_ROUND_TWO);
2851 if (ret != 0) {
2852 psa_destroy_key(ssl->handshake->psa_pake_password);
2853 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2854 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2855 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002856 }
2857
Valerio Setti02c25b52022-11-15 14:08:42 +01002858 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002859 ssl->out_msglen += output_offset;
2860#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002861 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002862
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002863 ret = mbedtls_ecjpake_write_round_two(
2864 &ssl->handshake->ecjpake_ctx,
2865 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002866 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002867 ssl->conf->f_rng, ssl->conf->p_rng);
2868 if (ret != 0) {
2869 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2870 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002871 }
2872
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002873 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002874#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002875 }
2876#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2877
Hanno Becker1aa267c2017-04-28 17:08:27 +01002878 /*
2879 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2880 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2881 * we use empty support identity hints here.
2882 **/
2883#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002884 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002885 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2886 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002887 ssl->out_msg[ssl->out_msglen++] = 0x00;
2888 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002889 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002890#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2891 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002892
Hanno Becker7e5437a2017-04-28 17:15:26 +01002893 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002894 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002895 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002896#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002898 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002899 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002900
Gilles Peskine449bd832023-01-11 14:50:10 +01002901 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2902 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2903 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002904 }
2905
Paul Bakker41c83d32013-03-20 14:39:14 +01002906 /*
2907 * Ephemeral DH parameters:
2908 *
2909 * struct {
2910 * opaque dh_p<1..2^16-1>;
2911 * opaque dh_g<1..2^16-1>;
2912 * opaque dh_Ys<1..2^16-1>;
2913 * } ServerDHParams;
2914 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002915 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2916 &ssl->conf->dhm_P,
2917 &ssl->conf->dhm_G)) != 0) {
2918 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2919 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002920 }
Paul Bakker48916f92012-09-16 19:57:18 +00002921
Gilles Peskine449bd832023-01-11 14:50:10 +01002922 if ((ret = mbedtls_dhm_make_params(
2923 &ssl->handshake->dhm_ctx,
2924 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2925 ssl->out_msg + ssl->out_msglen, &len,
2926 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2927 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2928 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002929 }
2930
Jerry Yuc5aef882021-12-23 20:15:02 +08002931#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002932 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002933#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002934
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002935 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002936
Gilles Peskine449bd832023-01-11 14:50:10 +01002937 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2938 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2939 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2940 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002941 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002942#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002943
Hanno Becker1aa267c2017-04-28 17:08:27 +01002944 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002945 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002946 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002947#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002949 /*
2950 * Ephemeral ECDH parameters:
2951 *
2952 * struct {
2953 * ECParameters curve_params;
2954 * ECPoint public;
2955 * } ServerECDHParams;
2956 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002957 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002958 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002959 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002960 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002961
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002962 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002963 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2964 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2965 }
2966 for (; *group_list != 0; group_list++) {
2967 for (curr_tls_id = ssl->handshake->curves_tls_id;
2968 *curr_tls_id != 0; curr_tls_id++) {
2969 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002970 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002971 }
2972 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002973 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002974
Gilles Peskine449bd832023-01-11 14:50:10 +01002975curve_matching_done:
2976 if (*curr_tls_id == 0) {
2977 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2978 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2979 }
2980
2981 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2982 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002983
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002984#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002985 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2986 psa_key_attributes_t key_attributes;
2987 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002988 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2989 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2990 // data length(1)
2991 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002992 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002993 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002994
Gilles Peskine449bd832023-01-11 14:50:10 +01002995 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002996
Valerio Setti40d9ca92023-01-04 16:08:04 +01002997 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002998 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002999 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01003000 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
3001 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
3002 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01003003 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003004 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02003005 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003006
3007 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01003008 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3009 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003010 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003011 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003012
3013 /*
3014 * ECParameters curve_params
3015 *
3016 * First byte is curve_type, always named_curve
3017 */
3018 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3019
3020 /*
3021 * Next two bytes are the namedcurve value
3022 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003023 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003024 p += 2;
3025
3026 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003027 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003028 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003029 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003030 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003031 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3032 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003033 }
3034
3035 /*
3036 * ECPoint public
3037 *
3038 * First byte is data length.
3039 * It will be filled later. p holds now the data length location.
3040 */
3041
3042 /* Export the public part of the ECDH private key from PSA.
3043 * Make one byte space for the length.
3044 */
3045 unsigned char *own_pubkey = p + data_length_size;
3046
Gilles Peskine449bd832023-01-11 14:50:10 +01003047 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3048 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003049
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003050 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003051 own_pubkey, own_pubkey_max_len,
3052 &len);
3053 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003054 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003055 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003056 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3057 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003059 }
3060
3061 /* Store the length of the exported public key. */
3062 *p = (uint8_t) len;
3063
3064 /* Determine full message length. */
3065 len += header_size;
3066#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003067 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003068 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003069
Gilles Peskine449bd832023-01-11 14:50:10 +01003070 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3071 curr_grp_id)) != 0) {
3072 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3073 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003074 }
3075
Gilles Peskine449bd832023-01-11 14:50:10 +01003076 if ((ret = mbedtls_ecdh_make_params(
3077 &ssl->handshake->ecdh_ctx, &len,
3078 ssl->out_msg + ssl->out_msglen,
3079 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3080 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3081 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3082 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003083 }
3084
Gilles Peskine449bd832023-01-11 14:50:10 +01003085 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3086 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003087#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003088
Jerry Yuc5aef882021-12-23 20:15:02 +08003089#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003090 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003091#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003092
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003093 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003094 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003095#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003096
Hanno Becker1aa267c2017-04-28 17:08:27 +01003097 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003098 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003099 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003100 * exchange parameters, compute and add the signature here.
3101 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003102 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003103#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003104 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3105 if (dig_signed == NULL) {
3106 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3107 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003108 }
3109
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003110 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003111 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003112 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003113
Janos Follath865b3eb2019-12-16 11:46:15 +00003114 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003115
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003116 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003117 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003118 * For TLS 1.2, obey signature-hash-algorithm extension
3119 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003120 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003121
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003122 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003123 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003124
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003125 unsigned char sig_hash =
3126 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003127 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003128
Gilles Peskine449bd832023-01-11 14:50:10 +01003129 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003130
Ronald Cron8457c122022-03-07 11:32:54 +01003131 /* For TLS 1.2, obey signature-hash-algorithm extension
3132 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003133 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3134 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003135 /* (... because we choose a cipher suite
3136 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003137 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003138 }
3139
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003141
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003142 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003143 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003144 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003145 if (md_alg != MBEDTLS_MD_NONE) {
3146 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3147 dig_signed,
3148 dig_signed_len,
3149 md_alg);
3150 if (ret != 0) {
3151 return ret;
3152 }
3153 } else {
3154 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3155 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003156 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003157
Gilles Peskine449bd832023-01-11 14:50:10 +01003158 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003159
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003160 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003161 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003162 */
Ronald Cron8457c122022-03-07 11:32:54 +01003163 /*
3164 * We need to specify signature and hash algorithm explicitly through
3165 * a prefix to the signature.
3166 *
3167 * struct {
3168 * HashAlgorithm hash;
3169 * SignatureAlgorithm signature;
3170 * } SignatureAndHashAlgorithm;
3171 *
3172 * struct {
3173 * SignatureAndHashAlgorithm algorithm;
3174 * opaque signature<0..2^16-1>;
3175 * } DigitallySigned;
3176 *
3177 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003178
Gilles Peskine449bd832023-01-11 14:50:10 +01003179 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3180 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003181
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003182#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003183 if (ssl->conf->f_async_sign_start != NULL) {
3184 ret = ssl->conf->f_async_sign_start(ssl,
3185 mbedtls_ssl_own_cert(ssl),
3186 md_alg, hash, hashlen);
3187 switch (ret) {
3188 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3189 /* act as if f_async_sign was null */
3190 break;
3191 case 0:
3192 ssl->handshake->async_in_progress = 1;
3193 return ssl_resume_server_key_exchange(ssl, signature_len);
3194 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3195 ssl->handshake->async_in_progress = 1;
3196 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3197 default:
3198 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3199 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003200 }
3201 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003202#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003203
Gilles Peskine449bd832023-01-11 14:50:10 +01003204 if (mbedtls_ssl_own_key(ssl) == NULL) {
3205 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3206 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003207 }
3208
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003209 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3210 * signature length which will be added in ssl_write_server_key_exchange
3211 * after the call to ssl_prepare_server_key_exchange.
3212 * ssl_write_server_key_exchange also takes care of incrementing
3213 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003214 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3215 md_alg, hash, hashlen,
3216 ssl->out_msg + ssl->out_msglen + 2,
3217 out_buf_len - ssl->out_msglen - 2,
3218 signature_len,
3219 ssl->conf->f_rng,
3220 ssl->conf->p_rng)) != 0) {
3221 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3222 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003223 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003224 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003225#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003226
Gilles Peskine449bd832023-01-11 14:50:10 +01003227 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003228}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003229
Gilles Peskined3eb0612018-01-08 17:07:44 +01003230/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003231 * that do not include a ServerKeyExchange message, do nothing. Either
3232 * way, if successful, move on to the next step in the SSL state
3233 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003234MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003235static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003236{
Janos Follath865b3eb2019-12-16 11:46:15 +00003237 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003238 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003239#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003240 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003241 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003242#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003243
Gilles Peskine449bd832023-01-11 14:50:10 +01003244 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003245
Gilles Peskineeccd8882020-03-10 12:19:08 +01003246#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003247 /* Extract static ECDH parameters and abort if ServerKeyExchange
3248 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003249 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003250 /* For suites involving ECDH, extract DH parameters
3251 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003252#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003253 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3254 ret = ssl_get_ecdh_params_from_cert(ssl);
3255 if (ret != 0) {
3256 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3257 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003258 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003259 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003260#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003261
3262 /* Key exchanges not involving ephemeral keys don't use
3263 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003265 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003266 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003267 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003268#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003269
Gilles Peskineeccd8882020-03-10 12:19:08 +01003270#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003271 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003272 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003273 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 if (ssl->handshake->async_in_progress != 0) {
3275 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3276 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3277 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003278#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003279 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003280 {
3281 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003282 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003283 }
3284
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003286 /* If we're starting to write a new message, set ssl->out_msglen
3287 * to 0. But if we're resuming after an asynchronous message,
3288 * out_msglen is the amount of data written so far and mst be
3289 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003290 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3291 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3292 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003293 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003294 }
3295 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003296 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003297
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003298 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003299 * ssl_prepare_server_key_exchange already wrote the signature
3300 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003301#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003302 if (signature_len != 0) {
3303 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3304 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003305
Gilles Peskine449bd832023-01-11 14:50:10 +01003306 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3307 ssl->out_msg + ssl->out_msglen,
3308 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003309
3310 /* Skip over the already-written signature */
3311 ssl->out_msglen += signature_len;
3312 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003313#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003314
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003315 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003316 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3317 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003318
3319 ssl->state++;
3320
Gilles Peskine449bd832023-01-11 14:50:10 +01003321 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3322 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3323 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003324 }
3325
Gilles Peskine449bd832023-01-11 14:50:10 +01003326 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3327 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003328}
3329
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003330MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003331static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003332{
Janos Follath865b3eb2019-12-16 11:46:15 +00003333 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003334
Gilles Peskine449bd832023-01-11 14:50:10 +01003335 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003336
3337 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003338 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3339 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003340
3341 ssl->state++;
3342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003343#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3345 mbedtls_ssl_send_flight_completed(ssl);
3346 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003347#endif
3348
Gilles Peskine449bd832023-01-11 14:50:10 +01003349 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3350 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3351 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003352 }
3353
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003354#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3356 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3357 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3358 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003359 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003360#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003361
Gilles Peskine449bd832023-01-11 14:50:10 +01003362 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003363
Gilles Peskine449bd832023-01-11 14:50:10 +01003364 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003365}
3366
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003367#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3368 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003369MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003370static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3371 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003372{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003373 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003374 size_t n;
3375
3376 /*
3377 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3378 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003379 if (*p + 2 > end) {
3380 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3381 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003382 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003383
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003384 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003385 *p += 2;
3386
Gilles Peskine449bd832023-01-11 14:50:10 +01003387 if (*p + n > end) {
3388 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3389 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003390 }
3391
Gilles Peskine449bd832023-01-11 14:50:10 +01003392 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3393 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3394 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003395 }
3396
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003397 *p += n;
3398
Gilles Peskine449bd832023-01-11 14:50:10 +01003399 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003400
Gilles Peskine449bd832023-01-11 14:50:10 +01003401 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003402}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003403#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3404 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003405
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003406#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3407 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003408
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003409#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003410MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003411static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3412 unsigned char *peer_pms,
3413 size_t *peer_pmslen,
3414 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003415{
Gilles Peskine449bd832023-01-11 14:50:10 +01003416 int ret = ssl->conf->f_async_resume(ssl,
3417 peer_pms, peer_pmslen, peer_pmssize);
3418 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003419 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003420 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003421 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003422 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3423 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003424}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003425#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003426
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003427MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003428static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3429 const unsigned char *p,
3430 const unsigned char *end,
3431 unsigned char *peer_pms,
3432 size_t *peer_pmslen,
3433 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003434{
Janos Follath865b3eb2019-12-16 11:46:15 +00003435 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003436
Gilles Peskine449bd832023-01-11 14:50:10 +01003437 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3438 if (own_cert == NULL) {
3439 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3440 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003441 }
3442 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003443 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3444 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003445
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003446#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003447 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003448 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003449 if (ssl->handshake->async_in_progress != 0) {
3450 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3451 return ssl_resume_decrypt_pms(ssl,
3452 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003453 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003454#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003455
3456 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003457 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003458 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003459 if (p + 2 > end) {
3460 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3461 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003462 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003463 if (*p++ != MBEDTLS_BYTE_1(len) ||
3464 *p++ != MBEDTLS_BYTE_0(len)) {
3465 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3466 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003467 }
3468
Gilles Peskine449bd832023-01-11 14:50:10 +01003469 if (p + len != end) {
3470 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3471 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003472 }
3473
Gilles Peskine422ccab2018-01-11 18:29:01 +01003474 /*
3475 * Decrypt the premaster secret
3476 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003477#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003478 if (ssl->conf->f_async_decrypt_start != NULL) {
3479 ret = ssl->conf->f_async_decrypt_start(ssl,
3480 mbedtls_ssl_own_cert(ssl),
3481 p, len);
3482 switch (ret) {
3483 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3484 /* act as if f_async_decrypt_start was null */
3485 break;
3486 case 0:
3487 ssl->handshake->async_in_progress = 1;
3488 return ssl_resume_decrypt_pms(ssl,
3489 peer_pms,
3490 peer_pmslen,
3491 peer_pmssize);
3492 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3493 ssl->handshake->async_in_progress = 1;
3494 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3495 default:
3496 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3497 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003498 }
3499 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003500#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003501
Gilles Peskine449bd832023-01-11 14:50:10 +01003502 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3503 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3504 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003505 }
3506
Gilles Peskine449bd832023-01-11 14:50:10 +01003507 ret = mbedtls_pk_decrypt(private_key, p, len,
3508 peer_pms, peer_pmslen, peer_pmssize,
3509 ssl->conf->f_rng, ssl->conf->p_rng);
3510 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003511}
3512
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003513MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003514static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3515 const unsigned char *p,
3516 const unsigned char *end,
3517 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003518{
Janos Follath865b3eb2019-12-16 11:46:15 +00003519 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003520 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3521 unsigned char ver[2];
3522 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003523 size_t peer_pmslen;
3524 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003525
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003526 /* In case of a failure in decryption, the decryption may write less than
3527 * 2 bytes of output, but we always read the first two bytes. It doesn't
3528 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003529 * ret being nonzero, and we only care whether diff is 0.
3530 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3531 * also makes memory analyzers happy (don't access uninitialized memory,
3532 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003533 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003534 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003535
Gilles Peskine449bd832023-01-11 14:50:10 +01003536 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3537 peer_pms,
3538 &peer_pmslen,
3539 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003540
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003541#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3543 return ret;
3544 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003545#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003546
Gilles Peskine449bd832023-01-11 14:50:10 +01003547 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3548 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003549
3550 /* Avoid data-dependent branches while checking for invalid
3551 * padding, to protect against timing-based Bleichenbacher-type
3552 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003553 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003554 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3555 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3556 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003557
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003558 /*
3559 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3560 * must not cause the connection to end immediately; instead, send a
3561 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003562 * To protect against timing-based variants of the attack, we must
3563 * not have any branch that depends on whether the decryption was
3564 * successful. In particular, always generate the fake premaster secret,
3565 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003566 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003567 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3568 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003569 /* It's ok to abort on an RNG failure, since this does not reveal
3570 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003571 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003572 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003573
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003574#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003575 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003576 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3577 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003579
Gilles Peskine449bd832023-01-11 14:50:10 +01003580 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3581 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3582 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3583 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003584 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003585 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003586
Gilles Peskine422ccab2018-01-11 18:29:01 +01003587 /* Set pms to either the true or the fake PMS, without
3588 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003589 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003590
Gilles Peskine449bd832023-01-11 14:50:10 +01003591 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003592}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003593#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3594 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003595
Gilles Peskineeccd8882020-03-10 12:19:08 +01003596#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003597MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003598static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3599 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003600{
Paul Bakker6db455e2013-09-18 17:29:31 +02003601 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003602 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003603
Gilles Peskine449bd832023-01-11 14:50:10 +01003604 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3605 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3606 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003607 }
3608
3609 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003610 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003611 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003612 if (end - *p < 2) {
3613 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3614 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003615 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003616
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003617 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003618 *p += 2;
3619
Gilles Peskine449bd832023-01-11 14:50:10 +01003620 if (n == 0 || n > end - *p) {
3621 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3622 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003623 }
3624
Gilles Peskine449bd832023-01-11 14:50:10 +01003625 if (ssl->conf->f_psk != NULL) {
3626 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003627 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003628 }
3629 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003630 /* Identity is not a big secret since clients send it in the clear,
3631 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003632 if (n != ssl->conf->psk_identity_len ||
3633 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003634 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003635 }
3636 }
3637
Gilles Peskine449bd832023-01-11 14:50:10 +01003638 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3639 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3640 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3641 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3642 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003643 }
3644
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003645 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003646
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003648}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003649#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003650
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003651MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003652static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003653{
Janos Follath865b3eb2019-12-16 11:46:15 +00003654 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003655 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003656 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003657
Hanno Beckere694c3e2017-12-27 21:34:08 +00003658 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003659
Gilles Peskine449bd832023-01-11 14:50:10 +01003660 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003661
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003662#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003663 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3664 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3665 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3666 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3667 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003668 /* We've already read a record and there is an asynchronous
3669 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003670 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003671 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3672 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003673#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003674 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3675 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3676 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003677 }
3678
Gilles Peskine449bd832023-01-11 14:50:10 +01003679 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003680 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003681
Gilles Peskine449bd832023-01-11 14:50:10 +01003682 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3683 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3684 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003685 }
3686
Gilles Peskine449bd832023-01-11 14:50:10 +01003687 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3688 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3689 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003690 }
3691
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003692#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003693 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3694 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3695 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3696 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003697 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003698
Gilles Peskine449bd832023-01-11 14:50:10 +01003699 if (p != end) {
3700 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3701 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003702 }
3703
Gilles Peskine449bd832023-01-11 14:50:10 +01003704 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3705 ssl->handshake->premaster,
3706 MBEDTLS_PREMASTER_SIZE,
3707 &ssl->handshake->pmslen,
3708 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3709 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3710 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003711 }
3712
Gilles Peskine449bd832023-01-11 14:50:10 +01003713 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3714 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003715#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003716#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3717 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3718 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3719 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003720 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003721 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3722 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003723 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003724#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 size_t data_len = (size_t) (*p++);
3726 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003727 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3728 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3729
Gilles Peskine530c4232023-10-02 15:37:23 +02003730 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003731
3732 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003733 * We must have at least two bytes (1 for length, at least 1 for data)
3734 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003735 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003736 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3737 buf_len));
3738 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003739 }
3740
Gilles Peskine449bd832023-01-11 14:50:10 +01003741 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003742 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3743 " > %" MBEDTLS_PRINTF_SIZET,
3744 data_len, buf_len));
3745 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003746 }
3747
3748 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003749 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003750 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3751 " > %" MBEDTLS_PRINTF_SIZET,
3752 data_len,
3753 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003754 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3755 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003756 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3757 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003758
3759 /* Compute ECDH shared secret. */
3760 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003761 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3762 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003763 handshake->premaster, sizeof(handshake->premaster),
3764 &handshake->pmslen);
3765 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003766 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003767 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003768 if (handshake->xxdh_psa_privkey_is_external == 0) {
3769 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003770 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003771 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003772 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003773 }
3774
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003775 if (handshake->xxdh_psa_privkey_is_external == 0) {
3776 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003777
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003779 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3781 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003782 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003783 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003784 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003785#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003786 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003787 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003788 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3789 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003790 }
3791
Gilles Peskine449bd832023-01-11 14:50:10 +01003792 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3793 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003794
Gilles Peskine449bd832023-01-11 14:50:10 +01003795 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3796 &ssl->handshake->pmslen,
3797 ssl->handshake->premaster,
3798 MBEDTLS_MPI_MAX_SIZE,
3799 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3800 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3801 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003802 }
3803
Gilles Peskine449bd832023-01-11 14:50:10 +01003804 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3805 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003806#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003808#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3809 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3810 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3811 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3812#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003813 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3814 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3815 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3816 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003817 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003818
Gilles Peskine449bd832023-01-11 14:50:10 +01003819 if (p != end) {
3820 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3821 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003822 }
3823
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003824#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003826 (mbedtls_key_exchange_type_t) ciphersuite_info->
3827 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003828 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3829 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003830 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003831#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003832 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003833#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3834#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003835 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003836#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003838 /* There is an asynchronous operation in progress to
3839 * decrypt the encrypted premaster secret, so skip
3840 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003841 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003842 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3843 * won't actually use it, but maintain p anyway for robustness. */
3844 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003845 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003846#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003847 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3848 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3849 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003850 }
3851
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3853 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3854 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003855 }
3856
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003857#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003858 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003859 (mbedtls_key_exchange_type_t) ciphersuite_info->
3860 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003861 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3862 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003863 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003864#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003865 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003866#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3867#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003868 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3869 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3870 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3871 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003872 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003873 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3874 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3875 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003876 }
3877
Gilles Peskine449bd832023-01-11 14:50:10 +01003878 if (p != end) {
3879 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3880 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003881 }
3882
Neil Armstrong80f6f322022-05-03 17:56:38 +02003883#if defined(MBEDTLS_USE_PSA_CRYPTO)
3884 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003886 size_t pms_len;
3887
3888 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003889 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3890 pms + 2, pms_end - (pms + 2), &pms_len,
3891 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3892 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3893 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003894 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003895 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003896 pms += 2 + pms_len;
3897
Gilles Peskine449bd832023-01-11 14:50:10 +01003898 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003899#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003900 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003901 (mbedtls_key_exchange_type_t) ciphersuite_info->
3902 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003903 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3904 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003905 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003906#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003907 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003908#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003909#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003910 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003911#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003912 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3913 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3914 uint8_t ecpoint_len;
3915
3916 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3917
Gilles Peskine449bd832023-01-11 14:50:10 +01003918 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3919 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003920 psa_destroy_key(handshake->xxdh_psa_privkey);
3921 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003922 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003923 }
3924
3925 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003926 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003927 psa_destroy_key(handshake->xxdh_psa_privkey);
3928 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003929 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003930 }
3931
Neil Armstrong039db292022-03-09 11:38:34 +01003932 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003933 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003934 psa_destroy_key(handshake->xxdh_psa_privkey);
3935 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003936 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003937 }
3938
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003939 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3940 the sizes of the FFDH keys which are at least 2048 bits.
3941 The size of the array is thus greater than 256 bytes which is greater than any
3942 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003943#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003944 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3945 psa_destroy_key(handshake->xxdh_psa_privkey);
3946 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003947 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003948 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003949#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003950 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3951 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003952#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003953
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003954 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3955 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003956 p += ecpoint_len;
3957
Neil Armstrong3bcef082022-03-23 18:16:54 +01003958 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003959 * - a uint16 containing the length (in octets) of the ECDH computation
3960 * - the octet string produced by the ECDH computation
3961 * - a uint16 containing the length (in octets) of the PSK
3962 * - the PSK itself
3963 */
Neil Armstrong039db292022-03-09 11:38:34 +01003964 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003965 const unsigned char * const psm_end =
3966 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003967 /* uint16 to store length (in octets) of the ECDH computation */
3968 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003969 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003970
3971 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003972 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003973 handshake->xxdh_psa_privkey,
3974 handshake->xxdh_psa_peerkey,
3975 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003976 psm + zlen_size,
3977 psm_end - (psm + zlen_size),
3978 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003979
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003980 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3981 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003982
Gilles Peskine449bd832023-01-11 14:50:10 +01003983 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003984 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003985 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003986 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003987 }
Neil Armstrong039db292022-03-09 11:38:34 +01003988
Neil Armstrong3bcef082022-03-23 18:16:54 +01003989 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003990 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003991 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003992
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003993#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003994 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3995 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3996 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003997 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003998
Gilles Peskine449bd832023-01-11 14:50:10 +01003999 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004000 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01004001 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
4002 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004003 }
4004
Gilles Peskine449bd832023-01-11 14:50:10 +01004005 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
4006 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004007
Gilles Peskine449bd832023-01-11 14:50:10 +01004008 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01004009 (mbedtls_key_exchange_type_t) ciphersuite_info->
4010 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01004011 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
4012 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004013 }
Neil Armstrong913b3642022-04-13 14:59:48 +02004014#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004015 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004016#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4017#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004018 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4019 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4020 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4021 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004022 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004023 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004024#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004025#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004026 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004027#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004028 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004029 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4031 psa_destroy_key(ssl->handshake->psa_pake_password);
4032 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004033
Gilles Peskine449bd832023-01-11 14:50:10 +01004034 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4035 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004036 }
4037#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004038 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004039 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01004040 if (ret != 0) {
4041 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4042 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004043 }
4044
Gilles Peskine449bd832023-01-11 14:50:10 +01004045 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4046 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4047 ssl->conf->f_rng, ssl->conf->p_rng);
4048 if (ret != 0) {
4049 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4050 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004051 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004052#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004053 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004054#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004055 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004056 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4057 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004058 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004059
Gilles Peskine449bd832023-01-11 14:50:10 +01004060 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4061 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4062 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004063 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004064
Paul Bakker5121ce52009-01-03 21:22:43 +00004065 ssl->state++;
4066
Gilles Peskine449bd832023-01-11 14:50:10 +01004067 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004068
Gilles Peskine449bd832023-01-11 14:50:10 +01004069 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004070}
4071
Gilles Peskineeccd8882020-03-10 12:19:08 +01004072#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004073MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004074static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004075{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004076 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004077 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004078
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004080
Gilles Peskine449bd832023-01-11 14:50:10 +01004081 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4082 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004083 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004084 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004085 }
4086
Gilles Peskine449bd832023-01-11 14:50:10 +01004087 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4088 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004089}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004090#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004091MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004092static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004093{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004094 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004095 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004096 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004097 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004098 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004099 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004101 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004102 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004103 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004104
Gilles Peskine449bd832023-01-11 14:50:10 +01004105 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004106
Gilles Peskine449bd832023-01-11 14:50:10 +01004107 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4108 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004109 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004110 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004111 }
4112
Hanno Becker2a831a42019-02-07 13:17:25 +00004113#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004114 if (ssl->session_negotiate->peer_cert == NULL) {
4115 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004116 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004117 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004118 }
4119#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004120 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4121 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004122 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004123 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004124 }
4125#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4126
Simon Butcher99000142016-10-13 17:21:01 +01004127 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004128 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4129 if (0 != ret) {
4130 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4131 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004132 }
4133
4134 ssl->state++;
4135
Simon Butcher99000142016-10-13 17:21:01 +01004136 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004137 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4138 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4139 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4140 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004141 }
4142
Gilles Peskine449bd832023-01-11 14:50:10 +01004143 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004144
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004145#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4146 peer_pk = &ssl->handshake->peer_pubkey;
4147#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004148 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004149 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004150 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004151 }
4152 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4153#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4154
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004155 /*
4156 * struct {
4157 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4158 * opaque signature<0..2^16-1>;
4159 * } DigitallySigned;
4160 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004161 if (i + 2 > ssl->in_hslen) {
4162 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4163 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004164 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004165
Ronald Cron8457c122022-03-07 11:32:54 +01004166 /*
4167 * Hash
4168 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004169 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004170
Gilles Peskine449bd832023-01-11 14:50:10 +01004171 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4172 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4173 " for verify message"));
4174 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004175 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004176
Simon Butcher99000142016-10-13 17:21:01 +01004177#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004178 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004179 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004180 }
Simon Butcher99000142016-10-13 17:21:01 +01004181#endif
Paul Bakker926af752012-11-23 13:38:07 +01004182
Ronald Cron8457c122022-03-07 11:32:54 +01004183 /* Info from md_alg will be used instead */
4184 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004185
Ronald Cron8457c122022-03-07 11:32:54 +01004186 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004187
Ronald Cron8457c122022-03-07 11:32:54 +01004188 /*
4189 * Signature
4190 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004191 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4192 == MBEDTLS_PK_NONE) {
4193 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4194 " for verify message"));
4195 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004196 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004197
Ronald Cron8457c122022-03-07 11:32:54 +01004198 /*
4199 * Check the certificate's key type matches the signature alg
4200 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004201 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4202 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4203 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004204 }
4205
4206 i++;
4207
Gilles Peskine449bd832023-01-11 14:50:10 +01004208 if (i + 2 > ssl->in_hslen) {
4209 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4210 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004211 }
4212
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004213 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004214 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004215
Gilles Peskine449bd832023-01-11 14:50:10 +01004216 if (i + sig_len != ssl->in_hslen) {
4217 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4218 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004219 }
4220
Simon Butcher99000142016-10-13 17:21:01 +01004221 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004222 {
4223 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004224 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4225 if (0 != ret) {
4226 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4227 return ret;
4228 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004229 }
Simon Butcher99000142016-10-13 17:21:01 +01004230
Gilles Peskine449bd832023-01-11 14:50:10 +01004231 if ((ret = mbedtls_pk_verify(peer_pk,
4232 md_alg, hash_start, hashlen,
4233 ssl->in_msg + i, sig_len)) != 0) {
4234 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4235 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004236 }
4237
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004238 ret = mbedtls_ssl_update_handshake_status(ssl);
4239 if (0 != ret) {
4240 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4241 return ret;
4242 }
Simon Butcher99000142016-10-13 17:21:01 +01004243
Gilles Peskine449bd832023-01-11 14:50:10 +01004244 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004245
Gilles Peskine449bd832023-01-11 14:50:10 +01004246 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004247}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004248#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004250#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004251MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004252static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004253{
Janos Follath865b3eb2019-12-16 11:46:15 +00004254 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004255 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004256 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004257
Gilles Peskine449bd832023-01-11 14:50:10 +01004258 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004260 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4261 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004262
4263 /*
4264 * struct {
4265 * uint32 ticket_lifetime_hint;
4266 * opaque ticket<0..2^16-1>;
4267 * } NewSessionTicket;
4268 *
4269 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4270 * 8 . 9 ticket_len (n)
4271 * 10 . 9+n ticket content
4272 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004273
Gilles Peskine449bd832023-01-11 14:50:10 +01004274 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4275 ssl->session_negotiate,
4276 ssl->out_msg + 10,
4277 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4278 &tlen, &lifetime)) != 0) {
4279 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004280 tlen = 0;
4281 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004282
Gilles Peskine449bd832023-01-11 14:50:10 +01004283 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4284 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004285 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004286
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004287 /*
4288 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4289 * ChangeCipherSpec share the same state.
4290 */
4291 ssl->handshake->new_session_ticket = 0;
4292
Gilles Peskine449bd832023-01-11 14:50:10 +01004293 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4294 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4295 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004296 }
4297
Gilles Peskine449bd832023-01-11 14:50:10 +01004298 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004299
Gilles Peskine449bd832023-01-11 14:50:10 +01004300 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004301}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004302#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004303
Paul Bakker5121ce52009-01-03 21:22:43 +00004304/*
Paul Bakker1961b702013-01-25 14:49:24 +01004305 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004306 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004307int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004308{
4309 int ret = 0;
4310
Gilles Peskine449bd832023-01-11 14:50:10 +01004311 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004312
Gilles Peskine449bd832023-01-11 14:50:10 +01004313 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004314 case MBEDTLS_SSL_HELLO_REQUEST:
4315 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004316 break;
4317
Paul Bakker1961b702013-01-25 14:49:24 +01004318 /*
4319 * <== ClientHello
4320 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004321 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004322 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004323 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004325#if defined(MBEDTLS_SSL_PROTO_DTLS)
4326 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004327 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004328#endif
4329
Paul Bakker1961b702013-01-25 14:49:24 +01004330 /*
4331 * ==> ServerHello
4332 * Certificate
4333 * ( ServerKeyExchange )
4334 * ( CertificateRequest )
4335 * ServerHelloDone
4336 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004337 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004338 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004339 break;
4340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004341 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004342 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004343 break;
4344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004345 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004346 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004347 break;
4348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004349 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004350 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004351 break;
4352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004353 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004354 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004355 break;
4356
4357 /*
4358 * <== ( Certificate/Alert )
4359 * ClientKeyExchange
4360 * ( CertificateVerify )
4361 * ChangeCipherSpec
4362 * Finished
4363 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004364 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004365 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004366 break;
4367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004368 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004369 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004370 break;
4371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004372 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004373 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004374 break;
4375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004376 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004377 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004378 break;
4379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004380 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004381 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004382 break;
4383
4384 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004385 * ==> ( NewSessionTicket )
4386 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004387 * Finished
4388 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004389 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4390#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004391 if (ssl->handshake->new_session_ticket != 0) {
4392 ret = ssl_write_new_session_ticket(ssl);
4393 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004394#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004395 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004396 break;
4397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004398 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004399 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004400 break;
4401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004402 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004403 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004404 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004405 break;
4406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004407 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004408 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004409 break;
4410
4411 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004412 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4413 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004414 }
4415
Gilles Peskine449bd832023-01-11 14:50:10 +01004416 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004417}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004418
Gilles Peskine449bd832023-01-11 14:50:10 +01004419void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004420{
TRodziewicz3946f792021-06-14 12:11:18 +02004421 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004422}
4423
Jerry Yufb4b6472022-01-27 15:03:26 +08004424#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */