blob: 03722ac33cbeaff86464d11e58189579c3fd7af9 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS server-side functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
7
Gilles Peskinedb09ef62020-06-03 01:43:33 +02008#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +00009
Jerry Yufb4b6472022-01-27 15:03:26 +080010#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080011
SimonBd5800b72016-04-26 07:43:27 +010012#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010013
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000014#include "mbedtls/ssl.h"
Chris Jones84a773f2021-03-05 18:38:47 +000015#include "ssl_misc.h"
Valerio Settib4f50762024-01-17 10:24:52 +010016#include "debug_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000017#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050018#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020019#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020020#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000021
22#include <string.h>
23
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050024#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek00644842023-05-30 05:45:00 -040025/* Define a local translating function to save code size by not using too many
26 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040027#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
28 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040029static int local_err_translation(psa_status_t status)
30{
31 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040032 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040033 psa_generic_status_to_mbedtls);
34}
35#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050036#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050037#endif
38
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010041#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010044#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010048int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
49 const unsigned char *info,
50 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020051{
Gilles Peskine449bd832023-01-11 14:50:10 +010052 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
53 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
54 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020055
Gilles Peskine449bd832023-01-11 14:50:10 +010056 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020057
Gilles Peskine449bd832023-01-11 14:50:10 +010058 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
59 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
60 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020061
Gilles Peskine449bd832023-01-11 14:50:10 +010062 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063 ssl->cli_id_len = ilen;
64
Gilles Peskine449bd832023-01-11 14:50:10 +010065 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020066}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020067
Gilles Peskine449bd832023-01-11 14:50:10 +010068void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
69 mbedtls_ssl_cookie_write_t *f_cookie_write,
70 mbedtls_ssl_cookie_check_t *f_cookie_check,
71 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020072{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020073 conf->f_cookie_write = f_cookie_write;
74 conf->f_cookie_check = f_cookie_check;
75 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020076}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020078
Gilles Peskineeccd8882020-03-10 12:19:08 +010079#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020080MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010081static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010082{
Gilles Peskine449bd832023-01-11 14:50:10 +010083 if (conf->f_psk != NULL) {
84 return 1;
85 }
Hanno Becker845b9462018-10-26 12:07:29 +010086
Gilles Peskine449bd832023-01-11 14:50:10 +010087 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
88 return 0;
89 }
Hanno Becker845b9462018-10-26 12:07:29 +010090
Hanno Becker845b9462018-10-26 12:07:29 +010091
92#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +010093 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
94 return 1;
95 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020096#endif /* MBEDTLS_USE_PSA_CRYPTO */
97
Gilles Peskine449bd832023-01-11 14:50:10 +010098 if (conf->psk != NULL && conf->psk_len != 0) {
99 return 1;
100 }
Hanno Becker845b9462018-10-26 12:07:29 +0100101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100103}
Gilles Peskineeccd8882020-03-10 12:19:08 +0100104#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100105
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200106MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100107static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
108 const unsigned char *buf,
109 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000110{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100113 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100115 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
117 ssl->verify_data_len) != 0) {
118 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
119 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
120 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
121 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100122 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200124#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000125 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 if (len != 1 || buf[0] != 0x0) {
127 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
128 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
129 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
130 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000131 }
132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000134 }
Paul Bakker48916f92012-09-16 19:57:18 +0000135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000137}
138
Valerio Setti60d3b912023-07-25 10:43:53 +0200139#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200140 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100141 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800142/*
Jerry Yud491ea42022-01-13 16:15:25 +0800143 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
144 * curves (TLS 1.2) extension.
145 *
146 * The "extension_data" field of a supported groups extension contains a
147 * "NamedGroupList" value (TLS 1.3 RFC8446):
148 * enum {
149 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
150 * x25519(0x001D), x448(0x001E),
151 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
152 * ffdhe6144(0x0103), ffdhe8192(0x0104),
153 * ffdhe_private_use(0x01FC..0x01FF),
154 * ecdhe_private_use(0xFE00..0xFEFF),
155 * (0xFFFF)
156 * } NamedGroup;
157 * struct {
158 * NamedGroup named_group_list<2..2^16-1>;
159 * } NamedGroupList;
160 *
161 * The "extension_data" field of a supported elliptic curves extension contains
162 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
163 * enum {
164 * deprecated(1..22),
165 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
166 * x25519(29), x448(30),
167 * reserved (0xFE00..0xFEFF),
168 * deprecated(0xFF01..0xFF02),
169 * (0xFFFF)
170 * } NamedCurve;
171 * struct {
172 * NamedCurve named_curve_list<2..2^16-1>
173 * } NamedCurveList;
174 *
Jerry Yub925f212022-01-12 11:17:02 +0800175 * The TLS 1.3 supported groups extension was defined to be a compatible
176 * generalization of the TLS 1.2 supported elliptic curves extension. They both
177 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800178 *
Jerry Yub925f212022-01-12 11:17:02 +0800179 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200180MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100181static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
182 const unsigned char *buf,
183 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100184{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200185 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100186 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100187 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 if (len < 2) {
190 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
191 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
192 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
193 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200194 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000195 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100196 if (list_size + 2 != len ||
197 list_size % 2 != 0) {
198 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
199 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
200 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
201 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100202 }
203
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200204 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 if (ssl->handshake->curves_tls_id != NULL) {
206 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
207 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
208 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
209 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200210 }
211
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100212 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200213 * and leave room for a final 0 */
214 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200216 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100217 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200218
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 if ((curves_tls_id = mbedtls_calloc(our_size,
220 sizeof(*curves_tls_id))) == NULL) {
221 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
222 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
223 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200224 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200225
Valerio Setti18c9fed2022-12-30 17:44:24 +0100226 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200227
Paul Bakker41c83d32013-03-20 14:39:14 +0100228 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 while (list_size > 0 && our_size > 1) {
230 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200231
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
233 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100234 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200235 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100236 }
237
238 list_size -= 2;
239 p += 2;
240 }
241
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100243}
244
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200245MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100246static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
247 const unsigned char *buf,
248 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100249{
250 size_t list_size;
251 const unsigned char *p;
252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 if (len == 0 || (size_t) (buf[0] + 1) != len) {
254 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
255 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
256 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
257 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100258 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200259 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100260
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200261 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 while (list_size > 0) {
263 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
264 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200265#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
266 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200267 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200268#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200269#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
271 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
272 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200273#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
275 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100276 }
277
278 list_size--;
279 p++;
280 }
281
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100283}
Valerio Setti60d3b912023-07-25 10:43:53 +0200284#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200285 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200286 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100287
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200288#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200289MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100290static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
291 const unsigned char *buf,
292 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200293{
Janos Follath865b3eb2019-12-16 11:46:15 +0000294 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200295
Neil Armstrongca7d5062022-05-31 14:43:23 +0200296#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200298#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200300#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200301 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
303 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200304 }
305
Neil Armstrongca7d5062022-05-31 14:43:23 +0200306#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 if ((ret = mbedtls_psa_ecjpake_read_round(
308 &ssl->handshake->psa_pake_ctx, buf, len,
309 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
310 psa_destroy_key(ssl->handshake->psa_pake_password);
311 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200312
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100314 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 ssl,
316 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
317 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200318
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200320 }
321#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
323 buf, len)) != 0) {
324 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
325 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
326 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
327 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200328 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200329#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200330
331 /* Only mark the extension as OK when we're sure it is */
332 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
333
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200335}
336#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200339MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100340static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
341 const unsigned char *buf,
342 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200343{
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
345 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
346 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
347 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
348 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200349 }
350
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200351 ssl->session_negotiate->mfl_code = buf[0];
352
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200354}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200356
Hanno Beckera0e20d02019-05-15 14:03:01 +0100357#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200358MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100359static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
360 const unsigned char *buf,
361 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100362{
363 size_t peer_cid_len;
364
365 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
367 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
368 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
369 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
370 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100371 }
372
373 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100374 * struct {
375 * opaque cid<0..2^8-1>;
376 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100378
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 if (len < 1) {
380 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
381 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
382 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
383 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100384 }
385
386 peer_cid_len = *buf++;
387 len--;
388
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 if (len != peer_cid_len) {
390 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
391 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
392 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
393 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100394 }
395
396 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100398 /* Leave ssl->handshake->cid_in_use in its default
399 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
401 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100402 }
403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
405 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
406 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
407 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
408 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100409 }
410
Hanno Becker08556bf2019-05-03 12:43:44 +0100411 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100412 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100413 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
416 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100417
Gilles Peskine449bd832023-01-11 14:50:10 +0100418 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100419}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100420#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200422#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200423MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100424static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
425 const unsigned char *buf,
426 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100427{
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 if (len != 0) {
429 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
430 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
431 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
432 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100433 }
434
435 ((void) buf);
436
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100439 }
440
Gilles Peskine449bd832023-01-11 14:50:10 +0100441 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100442}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200446MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100447static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
448 const unsigned char *buf,
449 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200450{
Gilles Peskine449bd832023-01-11 14:50:10 +0100451 if (len != 0) {
452 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
453 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
454 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
455 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200456 }
457
458 ((void) buf);
459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200462 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200463
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200465}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200469MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100470static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
471 unsigned char *buf,
472 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200473{
Janos Follath865b3eb2019-12-16 11:46:15 +0000474 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200475 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200476
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200478
Gilles Peskine449bd832023-01-11 14:50:10 +0100479 if (ssl->conf->f_ticket_parse == NULL ||
480 ssl->conf->f_ticket_write == NULL) {
481 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200482 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200483
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200484 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200485 ssl->handshake->new_session_ticket = 1;
486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 if (len == 0) {
490 return 0;
491 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
495 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
496 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200497 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200499
500 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200501 * Failures are ok: just ignore the ticket and proceed.
502 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
504 buf, len)) != 0) {
505 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200506
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
508 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
509 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
510 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
511 } else {
512 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
513 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200514
Gilles Peskine449bd832023-01-11 14:50:10 +0100515 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200516 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200517
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200518 /*
519 * Keep the session ID sent by the client, since we MUST send it back to
520 * inform them we're accepting the ticket (RFC 5077 section 3.4)
521 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200522 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200524
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 mbedtls_ssl_session_free(ssl->session_negotiate);
526 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200527
528 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100529 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200530
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200532
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200533 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200534
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200535 /* Don't send a new ticket after all, this one is OK */
536 ssl->handshake->new_session_ticket = 0;
537
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200539}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200541
Johan Pascalb62bb512015-12-03 21:56:45 +0100542#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200543MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100544static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
545 const unsigned char *buf,
546 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100547{
Johan Pascal43f94902020-09-22 12:25:52 +0200548 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200550 size_t profile_length;
551 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200552 /*! 2 bytes for profile length and 1 byte for mki len */
553 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100554
555 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
557 (ssl->conf->dtls_srtp_profile_list == NULL) ||
558 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
559 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200560 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100561
562 /* RFC5764 section 4.1.1
563 * uint8 SRTPProtectionProfile[2];
564 *
565 * struct {
566 * SRTPProtectionProfiles SRTPProtectionProfiles;
567 * opaque srtp_mki<0..255>;
568 * } UseSRTPData;
569
570 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100571 */
572
Ron Eldoref72faf2018-07-12 11:54:20 +0300573 /*
574 * Min length is 5: at least one protection profile(2 bytes)
575 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200576 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200577 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300578 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100579 if (len < size_of_lengths) {
580 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
581 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
582 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200583 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100584
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200586
Ron Eldoref72faf2018-07-12 11:54:20 +0300587 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200589 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200590
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200591 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100592 if (profile_length > len - size_of_lengths ||
593 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
594 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
595 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
596 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200597 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300598 /*
599 * parse the extension list values are defined in
600 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
601 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200603 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100605
Gilles Peskine449bd832023-01-11 14:50:10 +0100606 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
607 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
608 mbedtls_ssl_get_srtp_profile_as_string(
609 client_protection)));
610 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200611 continue;
612 }
Ron Eldor591f1622018-01-22 12:30:04 +0200613 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
615 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200616 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
618 mbedtls_ssl_get_srtp_profile_as_string(
619 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200620 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100621 }
622 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200624 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 }
Ron Eldor591f1622018-01-22 12:30:04 +0200626 }
Johan Pascal042d4562020-08-25 12:14:02 +0200627 buf += profile_length; /* buf points to the mki length */
628 mki_length = *buf;
629 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200630
Gilles Peskine449bd832023-01-11 14:50:10 +0100631 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
632 mki_length + profile_length + size_of_lengths != len) {
633 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
634 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
635 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200636 }
637
638 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100639 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
640 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200641 ssl->dtls_srtp_info.mki_len = mki_length;
642
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300644
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
646 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100647 }
648
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100650}
651#endif /* MBEDTLS_SSL_DTLS_SRTP */
652
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100653/*
654 * Auxiliary functions for ServerHello parsing and related actions
655 */
656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100658/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100659 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100660 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200661#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200662MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100663static int ssl_check_key_curve(mbedtls_pk_context *pk,
664 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100665{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100666 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100667 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100668 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100669
Gilles Peskine449bd832023-01-11 14:50:10 +0100670 while (*curr_tls_id != 0) {
671 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
672 if (curr_grp_id == grp_id) {
673 return 0;
674 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100675 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100676 }
677
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100679}
Valerio Settie9646ec2023-08-02 20:02:28 +0200680#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100681
682/*
683 * Try picking a certificate for this ciphersuite,
684 * return 0 on success and -1 on failure.
685 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200686MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100687static int ssl_pick_cert(mbedtls_ssl_context *ssl,
688 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100689{
Glenn Strauss041a3762022-03-15 06:08:29 -0400690 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200691#if defined(MBEDTLS_USE_PSA_CRYPTO)
692 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100693 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200694 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200696#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100697 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200699#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200700 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100701
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100704 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100706#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100708
David Horstmann3a334c22022-10-25 10:53:44 +0100709 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200710#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200712#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200714#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (pk_alg_is_none) {
716 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200717 }
718
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
720
721 if (list == NULL) {
722 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
723 return -1;
724 }
725
726 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400727 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
729 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000730
David Horstmann3a334c22022-10-25 10:53:44 +0100731 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200732#if defined(MBEDTLS_USE_PSA_CRYPTO)
733#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
735 ssl->conf->f_async_decrypt_start != NULL ||
736 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
737 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200738#else
David Horstmann3a334c22022-10-25 10:53:44 +0100739 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200741#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
742#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100743 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200744#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 if (!key_type_matches) {
746 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000748 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100749
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200750 /*
751 * This avoids sending the client a cert it'll reject based on
752 * keyUsage or other extensions.
753 *
754 * It also allows the user to provision different certificates for
755 * different uses based on keyUsage, eg if they want to avoid signing
756 * and decrypting with the same RSA key.
757 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard4938b692024-08-09 11:49:12 +0200759 MBEDTLS_SSL_IS_CLIENT,
760 MBEDTLS_SSL_VERSION_TLS1_2,
761 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100762 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
763 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200764 continue;
765 }
766
Valerio Settie9646ec2023-08-02 20:02:28 +0200767#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100768 if (pk_alg == MBEDTLS_PK_ECDSA &&
769 ssl_check_key_curve(&cur->cert->pk,
770 ssl->handshake->curves_tls_id) != 0) {
771 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100772 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000773 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100774#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100775
776 /* If we get there, we got a winner */
777 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100778 }
779
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200780 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100782 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
784 ssl->handshake->key_cert->cert);
785 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100786 }
787
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100789}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200790#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100791
792/*
793 * Check if a given ciphersuite is suitable for use with our config/keys/etc
794 * Sets ciphersuite_info only if the suite matches.
795 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200796MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100797static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
798 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100801
Jerry Yue7541932022-01-28 10:21:24 +0800802#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100803 mbedtls_pk_type_t sig_type;
804#endif
805
Gilles Peskine449bd832023-01-11 14:50:10 +0100806 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
807 if (suite_info == NULL) {
808 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
809 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810 }
811
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
813 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000814
Gilles Peskine449bd832023-01-11 14:50:10 +0100815 if (suite_info->min_tls_version > ssl->tls_version ||
816 suite_info->max_tls_version < ssl->tls_version) {
817 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
818 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000819 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100820
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200821#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
823 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
824 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
825 "not configured or ext missing"));
826 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200827 }
828#endif
829
830
Valerio Setti60d3b912023-07-25 10:43:53 +0200831#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200832 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100833 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
834 (ssl->handshake->curves_tls_id == NULL ||
835 ssl->handshake->curves_tls_id[0] == 0)) {
836 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
837 "no common elliptic curve"));
838 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000839 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100840#endif
841
Gilles Peskineeccd8882020-03-10 12:19:08 +0100842#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100843 /* If the ciphersuite requires a pre-shared key and we don't
844 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
846 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
847 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
848 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000849 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850#endif
851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100853 /*
854 * Final check: if ciphersuite requires us to have a
855 * certificate/key of a particular type:
856 * - select the appropriate certificate if we have one, or
857 * - try the next ciphersuite if we don't
858 * This must be done last since we modify the key_cert list.
859 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 if (ssl_pick_cert(ssl, suite_info) != 0) {
861 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
862 "no suitable certificate"));
863 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000864 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100865#endif
866
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200867#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
868 /* If the ciphersuite requires signing, check whether
869 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100870 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
871 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200872 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
874 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
875 "for signature algorithm %u", (unsigned) sig_type));
876 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200877 }
878
879#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
880
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100881 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100883}
884
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200885/* This function doesn't alert on errors that happen early during
886 ClientHello parsing because they might indicate that the client is
887 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200888MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100889static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000890{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100891 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200892 size_t i, j;
893 size_t ciph_offset, comp_offset, ext_offset;
894 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200896 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100897#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000898 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200899#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000900 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100901#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000902 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200903 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000905
Hanno Becker7e5437a2017-04-28 17:15:26 +0100906 /* If there is no signature-algorithm extension present,
907 * we need to fall back to the default values for allowed
908 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800909#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100910 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800911#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000914
David Horstmanne0af39a2022-10-06 18:19:18 +0100915 int renegotiating;
916
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200917#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200918read_record_header:
919#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100920 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100922 * otherwise read it ourselves manually in order to support SSLv2
923 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100924 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
925 * ClientHello has been already fully fetched by the TLS 1.3 code and the
926 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100927 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100928 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100930 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100931#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100932 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200934 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
936 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000937 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000938 }
939
940 buf = ssl->in_hdr;
941
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000943
Paul Bakkerec636f32012-09-09 19:17:02 +0000944 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100945 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000946 *
947 * Record layer:
948 * 0 . 0 message type
949 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200950 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000951 * 3 . 4 message length
952 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
954 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100955
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
957 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
958 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100959 }
960
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000962 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100963
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
965 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100966
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200967 /* For DTLS if this is the initial handshake, remember the client sequence
968 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971#if defined(MBEDTLS_SSL_RENEGOTIATION)
972 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000973#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200975 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
977 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
978 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200979 }
980
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
982 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200983
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200984#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100985 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
986 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200987 ssl->next_record_offset = 0;
988 ssl->in_left = 0;
989 goto read_record_header;
990 }
991
992 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100993 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200994#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200995 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200997
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000998 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000999
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001001 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001003 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001004 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001005#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001006 {
Ronald Cron6291b232023-03-08 15:51:25 +01001007 if (ssl->keep_current_message) {
1008 ssl->keep_current_message = 0;
1009 } else {
1010 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1011 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1012 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1013 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001014
Ronald Cron6291b232023-03-08 15:51:25 +01001015 if ((ret = mbedtls_ssl_fetch_input(ssl,
1016 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1017 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1018 return ret;
1019 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001020
Ronald Cron6291b232023-03-08 15:51:25 +01001021 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001023 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1024 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1025 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001026#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001027 ssl->in_left = 0;
1028 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001029 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001030
1031 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001032
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001034
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001035 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1036 if (0 != ret) {
1037 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1038 return ret;
1039 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001040
1041 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001042 * Handshake layer:
1043 * 0 . 0 handshake type
1044 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001045 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001046 * 6 . 8 DTLS only: fragment offset
1047 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001048 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1050 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1051 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001052 }
1053
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001055
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1057 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1058 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001059 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001060 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1062 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1063 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001064
1065 /* The record layer has a record size limit of 2^14 - 1 and
1066 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (buf[1] != 0) {
1068 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1069 (unsigned) buf[1]));
1070 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001071 }
1072
1073 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001074 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1075 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1076 (unsigned) msg_len,
1077 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1078 (unsigned) handshake_len));
1079 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001080 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001081 }
1082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001083#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001085 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001086 * Copy the client's handshake message_seq on initial handshakes,
1087 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001088 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001091 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001092 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001093 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1094 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1095 "%u (expected %u)", cli_msg_seq,
1096 ssl->handshake->in_msg_seq));
1097 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001098 }
1099
1100 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001102#endif
1103 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001104 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001105 ssl->handshake->out_msg_seq = cli_msg_seq;
1106 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1107 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001108 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001109 /*
1110 * For now we don't support fragmentation, so make sure
1111 * fragment_offset == 0 and fragment_length == length
1112 */
1113 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001114 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1115 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1116 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001117 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001118 4, ("fragment_offset=%u fragment_length=%u length=%u",
1119 (unsigned) fragment_offset, (unsigned) fragment_length,
1120 (unsigned) length));
1121 if (fragment_offset != 0 || length != fragment_length) {
1122 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1123 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001124 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001125 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001126 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001127#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001128
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 buf += mbedtls_ssl_hs_hdr_len(ssl);
1130 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001131
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001132 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001133 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001134 * 0 . 1 protocol version
1135 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001136 * 34 . 34 session id length (1 byte)
1137 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001138 * 35+x . 35+x DTLS only: cookie length (1 byte)
1139 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001140 * .. . .. ciphersuite list length (2 bytes)
1141 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001142 * .. . .. compression alg. list length (1 byte)
1143 * .. . .. compression alg. list
1144 * .. . .. extensions length (2 bytes, optional)
1145 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001146 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001147
1148 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001149 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001150 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1151 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001152 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001153 if (msg_len < 38) {
1154 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1155 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001156 }
1157
1158 /*
1159 * Check and save the protocol version
1160 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001162
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001163 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1164 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001165 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001166 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001167
Gilles Peskine449bd832023-01-11 14:50:10 +01001168 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1169 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1170 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1171 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1172 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001173 }
1174
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001175 /*
1176 * Save client random (inc. Unix time)
1177 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001179
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001181
1182 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001183 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001184 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001185 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001186
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1188 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1189 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1190 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1191 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1192 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001193 }
1194
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001196
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001197 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 memset(ssl->session_negotiate->id, 0,
1199 sizeof(ssl->session_negotiate->id));
1200 memcpy(ssl->session_negotiate->id, buf + 35,
1201 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001202
1203 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001204 * Check the cookie length and content
1205 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001206#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001208 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001209 cookie_len = buf[cookie_offset];
1210
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1212 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1213 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1214 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1215 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001216 }
1217
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1219 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001223#if defined(MBEDTLS_SSL_RENEGOTIATION)
1224 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001225#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 ) {
1227 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1228 buf + cookie_offset + 1, cookie_len,
1229 ssl->cli_id, ssl->cli_id_len) != 0) {
1230 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001231 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 } else {
1233 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001234 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001235 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001236 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001238 {
1239 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001240 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001241 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1243 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001244 }
1245
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001247 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001248
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 /*
1250 * Check the ciphersuitelist length (will be parsed later)
1251 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001252 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001253 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001254#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001256
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001257 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001258
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001260 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 (ciph_len % 2) != 0) {
1262 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1263 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1264 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1265 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001266 }
1267
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1269 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001270
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001271 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001272 * Check the compression algorithm's length.
1273 * The list contents are ignored because implementing
1274 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1275 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001276 */
1277 comp_offset = ciph_offset + 2 + ciph_len;
1278
1279 comp_len = buf[comp_offset];
1280
Gilles Peskine449bd832023-01-11 14:50:10 +01001281 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001282 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001283 comp_len + comp_offset + 1 > msg_len) {
1284 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1285 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1286 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1287 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001288 }
1289
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1291 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001292
Gilles Peskine449bd832023-01-11 14:50:10 +01001293 /*
1294 * Check the extension length
1295 */
1296 ext_offset = comp_offset + 1 + comp_len;
1297 if (msg_len > ext_offset) {
1298 if (msg_len < ext_offset + 2) {
1299 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1300 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1301 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1302 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001303 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001304
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001305 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001306
Gilles Peskine449bd832023-01-11 14:50:10 +01001307 if (msg_len != ext_offset + 2 + ext_len) {
1308 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1309 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1310 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1311 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1312 }
1313 } else {
1314 ext_len = 0;
1315 }
Paul Bakker48916f92012-09-16 19:57:18 +00001316
Gilles Peskine449bd832023-01-11 14:50:10 +01001317 ext = buf + ext_offset + 2;
1318 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1319
1320 while (ext_len != 0) {
1321 unsigned int ext_id;
1322 unsigned int ext_size;
1323 if (ext_len < 4) {
1324 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1325 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1326 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1327 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1328 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001329 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1330 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001331
1332 if (ext_size + 4 > ext_len) {
1333 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1334 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1335 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1336 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1337 }
1338 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001339#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001340 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1342 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1343 ext + 4 + ext_size);
1344 if (ret != 0) {
1345 return ret;
1346 }
Simon Butcher584a5472016-05-23 16:24:52 +01001347 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001349
Simon Butcher584a5472016-05-23 16:24:52 +01001350 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001352#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001353 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001354#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001355
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1357 if (ret != 0) {
1358 return ret;
1359 }
Simon Butcher584a5472016-05-23 16:24:52 +01001360 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001361
Jerry Yue7541932022-01-28 10:21:24 +08001362#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001363 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001365
Gilles Peskine449bd832023-01-11 14:50:10 +01001366 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1367 if (ret != 0) {
1368 return ret;
1369 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001370
1371 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001372 break;
Jerry Yue7541932022-01-28 10:21:24 +08001373#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001374
Valerio Setti60d3b912023-07-25 10:43:53 +02001375#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001376 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001377 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001378 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001379 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001380
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1382 if (ret != 0) {
1383 return ret;
1384 }
Simon Butcher584a5472016-05-23 16:24:52 +01001385 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001386
Simon Butcher584a5472016-05-23 16:24:52 +01001387 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001388 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001389 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001390
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1392 if (ret != 0) {
1393 return ret;
1394 }
Simon Butcher584a5472016-05-23 16:24:52 +01001395 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001396#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001397 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001398 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001399
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001400#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001401 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001402 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001403
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1405 if (ret != 0) {
1406 return ret;
1407 }
Simon Butcher584a5472016-05-23 16:24:52 +01001408 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001409#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001412 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001414
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1416 if (ret != 0) {
1417 return ret;
1418 }
Simon Butcher584a5472016-05-23 16:24:52 +01001419 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001420#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001421
Hanno Beckera0e20d02019-05-15 14:03:01 +01001422#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001423 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1427 if (ret != 0) {
1428 return ret;
1429 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001430 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001431#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001434 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1438 if (ret != 0) {
1439 return ret;
1440 }
Simon Butcher584a5472016-05-23 16:24:52 +01001441 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001442#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001444#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001445 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001447
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1449 if (ret != 0) {
1450 return ret;
1451 }
Simon Butcher584a5472016-05-23 16:24:52 +01001452 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001453#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001456 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001458
Gilles Peskine449bd832023-01-11 14:50:10 +01001459 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1460 if (ret != 0) {
1461 return ret;
1462 }
Simon Butcher584a5472016-05-23 16:24:52 +01001463 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001467 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001469
Gilles Peskine449bd832023-01-11 14:50:10 +01001470 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1471 ext + 4 + ext_size);
1472 if (ret != 0) {
1473 return ret;
1474 }
Simon Butcher584a5472016-05-23 16:24:52 +01001475 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001477
Johan Pascalb62bb512015-12-03 21:56:45 +01001478#if defined(MBEDTLS_SSL_DTLS_SRTP)
1479 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001480 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001481
Gilles Peskine449bd832023-01-11 14:50:10 +01001482 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1483 if (ret != 0) {
1484 return ret;
1485 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001486 break;
1487#endif /* MBEDTLS_SSL_DTLS_SRTP */
1488
Simon Butcher584a5472016-05-23 16:24:52 +01001489 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001490 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1491 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001492 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001493
Gilles Peskine449bd832023-01-11 14:50:10 +01001494 ext_len -= 4 + ext_size;
1495 ext += 4 + ext_size;
1496 }
1497
Jerry Yue7541932022-01-28 10:21:24 +08001498#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001499
1500 /*
1501 * Try to fall back to default hash SHA1 if the client
1502 * hasn't provided any preferred signature-hash combinations.
1503 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001504 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001505 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1506 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001507#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001508 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1509 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001510#endif
1511#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1513 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001514#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001515 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001516 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001517
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001518 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1519 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1520 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001521
Gilles Peskine449bd832023-01-11 14:50:10 +01001522 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001523 }
1524
Jerry Yue7541932022-01-28 10:21:24 +08001525#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001526
Paul Bakker48916f92012-09-16 19:57:18 +00001527 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001528 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1529 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001530 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1531 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1532 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001533#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001534 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1535 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1536 "during renegotiation"));
1537 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1538 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1539 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001540 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001541#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001542 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001543 break;
1544 }
1545 }
1546
1547 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001548 * Renegotiation security checks
1549 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001550 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1551 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1552 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001553 handshake_failure = 1;
1554 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001555#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001556 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001557 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001558 renegotiation_info_seen == 0) {
1559 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001560 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1562 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1563 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1564 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001565 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001566 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1567 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1568 renegotiation_info_seen == 1) {
1569 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001570 handshake_failure = 1;
1571 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001572#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001573
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 if (handshake_failure == 1) {
1575 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1576 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1577 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001578 }
Paul Bakker380da532012-04-18 16:10:25 +00001579
Paul Bakker41c83d32013-03-20 14:39:14 +01001580 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001581 * Server certification selection (after processing TLS extensions)
1582 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001583 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1584 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1585 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001586 }
Glenn Strauss69894072022-01-24 12:58:00 -05001587#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1588 ssl->handshake->sni_name = NULL;
1589 ssl->handshake->sni_name_len = 0;
1590#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001591
1592 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001593 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001594 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001595 * and certificate from the SNI callback triggered by the SNI extension
1596 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001597 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001598 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001599 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001600 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001601
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1603 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1604 for (i = 0; ciphersuites[i] != 0; i++) {
1605 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001606 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001607 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001608
TRodziewicz8476f2f2021-06-02 14:34:47 +02001609 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001610
Gilles Peskine449bd832023-01-11 14:50:10 +01001611 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1612 &ciphersuite_info)) != 0) {
1613 return ret;
1614 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001615
Gilles Peskine449bd832023-01-11 14:50:10 +01001616 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001617 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001618 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001619 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001620 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001621 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 for (i = 0; ciphersuites[i] != 0; i++) {
1623 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1624 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001625 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001626 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001627
1628 got_common_suite = 1;
1629
Gilles Peskine449bd832023-01-11 14:50:10 +01001630 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1631 &ciphersuite_info)) != 0) {
1632 return ret;
1633 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001634
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001636 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001638 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001639 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001640 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001641
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 if (got_common_suite) {
1643 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1644 "but none of them usable"));
1645 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1646 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1647 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1648 } else {
1649 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1650 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1651 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1652 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001653 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001654
1655have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001656 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001657
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001658 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001659 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001660
Paul Bakker5121ce52009-01-03 21:22:43 +00001661 ssl->state++;
1662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001663#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1665 mbedtls_ssl_recv_flight_completed(ssl);
1666 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001667#endif
1668
Hanno Becker7e5437a2017-04-28 17:15:26 +01001669 /* Debugging-only output for testsuite */
1670#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001671 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001672 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1673 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001674 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001675 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1676 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1677 sig_hash));
1678 } else {
1679 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1680 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001681 }
1682#endif
1683
Gilles Peskine449bd832023-01-11 14:50:10 +01001684 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001685
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001687}
1688
Hanno Beckera0e20d02019-05-15 14:03:01 +01001689#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001690static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1691 unsigned char *buf,
1692 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001693{
1694 unsigned char *p = buf;
1695 size_t ext_len;
1696 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1697
1698 *olen = 0;
1699
1700 /* Skip writing the extension if we don't want to use it or if
1701 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001702 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001703 return;
1704 }
1705
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1707 * which is at most 255, so the increment cannot overflow. */
1708 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1709 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1710 return;
1711 }
1712
1713 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001714
1715 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001716 * struct {
1717 * opaque cid<0..2^8-1>;
1718 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001719 */
1720 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001721 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001722 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001723 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001724 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001725
1726 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001727 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001728
1729 *olen = ssl->own_cid_len + 5;
1730}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001731#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001732
Neil Armstrong76b74072022-04-06 13:43:54 +02001733#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001734static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1735 unsigned char *buf,
1736 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001737{
1738 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001739 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001740
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001741 /*
1742 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1743 * from a client and then selects a stream or Authenticated Encryption
1744 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1745 * encrypt-then-MAC response extension back to the client."
1746 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001747 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001748 ssl->session_negotiate->ciphersuite);
1749 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001750 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001751 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001752 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001753 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001754 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001756
Gilles Peskine449bd832023-01-11 14:50:10 +01001757 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001758 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 }
Ronald Cron862902d2022-03-24 14:15:28 +01001760 }
1761
Gilles Peskine449bd832023-01-11 14:50:10 +01001762 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001763 *olen = 0;
1764 return;
1765 }
1766
Gilles Peskine449bd832023-01-11 14:50:10 +01001767 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001768
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001770 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001771
1772 *p++ = 0x00;
1773 *p++ = 0x00;
1774
1775 *olen = 4;
1776}
Neil Armstrong76b74072022-04-06 13:43:54 +02001777#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001778
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001779#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001780static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1781 unsigned char *buf,
1782 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001783{
1784 unsigned char *p = buf;
1785
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001787 *olen = 0;
1788 return;
1789 }
1790
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1792 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001793
Gilles Peskine449bd832023-01-11 14:50:10 +01001794 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001795 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001796
1797 *p++ = 0x00;
1798 *p++ = 0x00;
1799
1800 *olen = 4;
1801}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001802#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001805static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1806 unsigned char *buf,
1807 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001808{
1809 unsigned char *p = buf;
1810
Gilles Peskine449bd832023-01-11 14:50:10 +01001811 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001812 *olen = 0;
1813 return;
1814 }
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001817
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001819 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001820
1821 *p++ = 0x00;
1822 *p++ = 0x00;
1823
1824 *olen = 4;
1825}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001827
Gilles Peskine449bd832023-01-11 14:50:10 +01001828static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1829 unsigned char *buf,
1830 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001831{
1832 unsigned char *p = buf;
1833
Gilles Peskine449bd832023-01-11 14:50:10 +01001834 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001835 *olen = 0;
1836 return;
1837 }
1838
Gilles Peskine449bd832023-01-11 14:50:10 +01001839 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001840
Gilles Peskine449bd832023-01-11 14:50:10 +01001841 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001842 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001843
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001844#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001845 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001846 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001848 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001849
Gilles Peskine449bd832023-01-11 14:50:10 +01001850 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001851 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001853 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001855#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001856 {
1857 *p++ = 0x00;
1858 *p++ = 0x01;
1859 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001860 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001861
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001862 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001863}
1864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001865#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001866static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1867 unsigned char *buf,
1868 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001869{
1870 unsigned char *p = buf;
1871
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001873 *olen = 0;
1874 return;
1875 }
1876
Gilles Peskine449bd832023-01-11 14:50:10 +01001877 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001878
Gilles Peskine449bd832023-01-11 14:50:10 +01001879 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001880 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001881
1882 *p++ = 0x00;
1883 *p++ = 1;
1884
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001885 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001886
1887 *olen = 5;
1888}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001889#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001890
Valerio Setti7aeec542023-07-05 18:57:21 +02001891#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001892 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001893 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001894static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1895 unsigned char *buf,
1896 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001897{
1898 unsigned char *p = buf;
1899 ((void) ssl);
1900
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 if ((ssl->handshake->cli_exts &
1902 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001903 *olen = 0;
1904 return;
1905 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001906
Gilles Peskine449bd832023-01-11 14:50:10 +01001907 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001908
Gilles Peskine449bd832023-01-11 14:50:10 +01001909 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001910 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001911
1912 *p++ = 0x00;
1913 *p++ = 2;
1914
1915 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001916 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001917
1918 *olen = 6;
1919}
Valerio Setti45d56f32023-07-13 17:23:20 +02001920#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001921 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001922 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001923
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001924#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001925static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1926 unsigned char *buf,
1927 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001928{
Janos Follath865b3eb2019-12-16 11:46:15 +00001929 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001930 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001931 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001932 size_t kkpp_len;
1933
1934 *olen = 0;
1935
1936 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001937 if (ssl->handshake->ciphersuite_info->key_exchange !=
1938 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001939 return;
1940 }
1941
Gilles Peskine449bd832023-01-11 14:50:10 +01001942 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1943
1944 if (end - p < 4) {
1945 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1946 return;
1947 }
1948
1949 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001950 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001951
Neil Armstrongca7d5062022-05-31 14:43:23 +02001952#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001953 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001954 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001955 MBEDTLS_ECJPAKE_ROUND_ONE);
1956 if (ret != 0) {
1957 psa_destroy_key(ssl->handshake->psa_pake_password);
1958 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1959 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001960 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001961 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001962#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001964 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001965 ssl->conf->f_rng, ssl->conf->p_rng);
1966 if (ret != 0) {
1967 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001968 return;
1969 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001970#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001971
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001973 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001974
1975 *olen = kkpp_len + 4;
1976}
1977#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1978
Gilles Peskine449bd832023-01-11 14:50:10 +01001979#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1980static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1981 unsigned char *buf,
1982 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001983{
Ron Eldor75870ec2018-12-06 17:31:55 +02001984 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001985 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001986 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1987
1988 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001989
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1991 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001992 return;
1993 }
1994
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001996
Gilles Peskine449bd832023-01-11 14:50:10 +01001997 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001998 mki_len = ssl->dtls_srtp_info.mki_len;
1999 }
2000
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002001 /* The extension total size is 9 bytes :
2002 * - 2 bytes for the extension tag
2003 * - 2 bytes for the total size
2004 * - 2 bytes for the protection profile length
2005 * - 2 bytes for the protection profile
2006 * - 1 byte for the mki length
2007 * + the actual mki length
2008 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 if ((size_t) (end - buf) < mki_len + 9) {
2010 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002011 return;
2012 }
2013
Johan Pascalb62bb512015-12-03 21:56:45 +01002014 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002015 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002016 /*
2017 * total length 5 and mki value: only one profile(2 bytes)
2018 * and length(2 bytes) and srtp_mki )
2019 */
Ron Eldor591f1622018-01-22 12:30:04 +02002020 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002021 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002022
2023 /* protection profile length: 2 */
2024 buf[4] = 0x00;
2025 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002026 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002027 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2028 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2029 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2030 } else {
2031 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002032 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002033 }
2034
Ron Eldor591f1622018-01-22 12:30:04 +02002035 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002037
Ron Eldor591f1622018-01-22 12:30:04 +02002038 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002039}
2040#endif /* MBEDTLS_SSL_DTLS_SRTP */
2041
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002042#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002043MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002044static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002045{
Janos Follath865b3eb2019-12-16 11:46:15 +00002046 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002047 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002048 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002049
Gilles Peskine449bd832023-01-11 14:50:10 +01002050 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002051
2052 /*
2053 * struct {
2054 * ProtocolVersion server_version;
2055 * opaque cookie<0..2^8-1>;
2056 * } HelloVerifyRequest;
2057 */
2058
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002059 /* The RFC is not clear on this point, but sending the actual negotiated
2060 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2062 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002063 p += 2;
2064
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002065 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002066 if (ssl->conf->f_cookie_write == NULL) {
2067 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2068 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002069 }
2070
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002071 /* Skip length byte until we know the length */
2072 cookie_len_byte = p++;
2073
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2075 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2076 ssl->cli_id, ssl->cli_id_len)) != 0) {
2077 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2078 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002079 }
2080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002082
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002084
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002085 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002086 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2087 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002090
Gilles Peskine449bd832023-01-11 14:50:10 +01002091 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2092 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2093 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002094 }
2095
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002096#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002097 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2098 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2099 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2100 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002101 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002102#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002103
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002107}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002108#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002109
Gilles Peskine449bd832023-01-11 14:50:10 +01002110static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002111{
2112 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002113 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002114 mbedtls_ssl_session * const session = ssl->session_negotiate;
2115
2116 /* Resume is 0 by default, see ssl_handshake_init().
2117 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002119 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002120 }
2121 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002122 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 }
2124 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002125 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002126 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002127#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002129 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002131#endif
2132
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002134
Gilles Peskine449bd832023-01-11 14:50:10 +01002135 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2136 session->id,
2137 session->id_len,
2138 &session_tmp);
2139 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002140 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002142
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002144 /* Mismatch between cached and negotiated session */
2145 goto exit;
2146 }
2147
2148 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002149 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002150 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002151 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002152
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002154 ssl->handshake->resume = 1;
2155
2156exit:
2157
Gilles Peskine449bd832023-01-11 14:50:10 +01002158 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002159}
2160
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002161MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002162static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002163{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002164#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002165 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002166#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002167 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002168 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002169 unsigned char *buf, *p;
2170
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002172
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002173#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2175 ssl->handshake->cookie_verify_result != 0) {
2176 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2177 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002178
Gilles Peskine449bd832023-01-11 14:50:10 +01002179 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002180 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002181#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002182
Paul Bakker5121ce52009-01-03 21:22:43 +00002183 /*
2184 * 0 . 0 handshake type
2185 * 1 . 3 handshake length
2186 * 4 . 5 protocol version
2187 * 6 . 9 UNIX time()
2188 * 10 . 37 random bytes
2189 */
2190 buf = ssl->out_msg;
2191 p = buf + 4;
2192
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002194 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002195
Gilles Peskine449bd832023-01-11 14:50:10 +01002196 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2197 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002199#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002200 t = mbedtls_time(NULL);
2201 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002202 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002203
Gilles Peskine449bd832023-01-11 14:50:10 +01002204 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2205 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002206#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002207 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2208 return ret;
2209 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002210
2211 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002212#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002213
Ronald Cronc5649382023-04-04 15:33:42 +02002214 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 return ret;
2216 }
Ronald Cronc5649382023-04-04 15:33:42 +02002217 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002218
Ronald Cronc5649382023-04-04 15:33:42 +02002219#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2220 /*
2221 * RFC 8446
2222 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2223 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2224 * response to a ClientHello MUST set the last 8 bytes of their Random
2225 * value specially in their ServerHello.
2226 */
2227 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2228 static const unsigned char magic_tls12_downgrade_string[] =
2229 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2230
2231 MBEDTLS_STATIC_ASSERT(
2232 sizeof(magic_tls12_downgrade_string) == 8,
2233 "magic_tls12_downgrade_string does not have the expected size");
2234
Ronald Cronfe01ec22023-04-06 09:56:53 +02002235 memcpy(p, magic_tls12_downgrade_string,
2236 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002237 } else
2238#endif
2239 {
2240 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2241 return ret;
2242 }
2243 }
2244 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002245
Gilles Peskine449bd832023-01-11 14:50:10 +01002246 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002247
Gilles Peskine449bd832023-01-11 14:50:10 +01002248 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002249
Gilles Peskine449bd832023-01-11 14:50:10 +01002250 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002251
Gilles Peskine449bd832023-01-11 14:50:10 +01002252 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002253 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002254 * New session, create a new session id,
2255 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002256 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002257 ssl->state++;
2258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002259#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002260 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002261#endif
2262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002263#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002264 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002265 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 memset(ssl->session_negotiate->id, 0, 32);
2267 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002268#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002269 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002270 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002271 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2272 n)) != 0) {
2273 return ret;
2274 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002275 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002276 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002277 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002278 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002279 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002280 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002281 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002282
Gilles Peskine449bd832023-01-11 14:50:10 +01002283 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2284 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2285 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002286 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002287 }
2288
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002289 /*
2290 * 38 . 38 session id length
2291 * 39 . 38+n session id
2292 * 39+n . 40+n chosen ciphersuite
2293 * 41+n . 41+n chosen compression alg.
2294 * 42+n . 43+n extensions length
2295 * 44+n . 43+n+m extensions
2296 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002297 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002298 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002299 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002300
Gilles Peskine449bd832023-01-11 14:50:10 +01002301 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2302 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2303 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2304 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002305
Gilles Peskine449bd832023-01-11 14:50:10 +01002306 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002307 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002308 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002309
Gilles Peskine449bd832023-01-11 14:50:10 +01002310 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2311 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2312 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2313 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002314
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002315 /*
2316 * First write extensions, then the total length
2317 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002319 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002321#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002322 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002323 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002324#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002325
Hanno Beckera0e20d02019-05-15 14:03:01 +01002326#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002327 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002328 ext_len += olen;
2329#endif
2330
Neil Armstrong76b74072022-04-06 13:43:54 +02002331#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002332 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002333 ext_len += olen;
2334#endif
2335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002336#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002338 ext_len += olen;
2339#endif
2340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002341#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002342 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002343 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002344#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002345
Valerio Setti7aeec542023-07-05 18:57:21 +02002346#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002347 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002348 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002349 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002350 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2351 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2352 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002353 ext_len += olen;
2354 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002355#endif
2356
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002357#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002358 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002359 ext_len += olen;
2360#endif
2361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002362#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002363 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2365 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002366 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002367 }
Paul Elliottf518f812022-07-11 12:36:20 +01002368
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002369 ext_len += olen;
2370#endif
2371
Johan Pascalb62bb512015-12-03 21:56:45 +01002372#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002373 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002374 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002375#endif
2376
Gilles Peskine449bd832023-01-11 14:50:10 +01002377 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2378 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002379
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 if (ext_len > 0) {
2381 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002382 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002383 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002384
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002385 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002386 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2387 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002388
Gilles Peskine449bd832023-01-11 14:50:10 +01002389 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002390
Gilles Peskine449bd832023-01-11 14:50:10 +01002391 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394}
2395
Gilles Peskineeccd8882020-03-10 12:19:08 +01002396#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002397MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002398static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002399{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002400 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002401 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002402
Gilles Peskine449bd832023-01-11 14:50:10 +01002403 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002404
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2406 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002407 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002408 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002409 }
2410
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2412 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002413}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002414#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002415MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002416static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002417{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002418 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002419 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002420 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002421 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002422 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002423 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002424 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002426 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002427
Gilles Peskine449bd832023-01-11 14:50:10 +01002428 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002429
2430 ssl->state++;
2431
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002432#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002433 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002434 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002435 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002436#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002438
Gilles Peskine449bd832023-01-11 14:50:10 +01002439 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2440 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2441 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2442 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002443 }
2444
2445 /*
2446 * 0 . 0 handshake type
2447 * 1 . 3 handshake length
2448 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002449 * 5 .. m-1 cert types
2450 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002451 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002452 * n .. n+1 length of all DNs
2453 * n+2 .. n+3 length of DN 1
2454 * n+4 .. ... Distinguished Name #1
2455 * ... .. ... length of DN 2, etc.
2456 */
2457 buf = ssl->out_msg;
2458 p = buf + 4;
2459
2460 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002461 * Supported certificate types
2462 *
2463 * ClientCertificateType certificate_types<1..2^8-1>;
2464 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002465 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002466 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002468#if defined(MBEDTLS_RSA_C)
2469 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002470#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002471#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002472 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002473#endif
2474
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002475 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002476 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002477
Paul Bakker577e0062013-08-28 11:57:20 +02002478 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002479
Paul Bakker926af752012-11-23 13:38:07 +01002480 /*
2481 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002482 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002483 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2484 *
2485 * struct {
2486 * HashAlgorithm hash;
2487 * SignatureAlgorithm signature;
2488 * } SignatureAndHashAlgorithm;
2489 *
2490 * enum { (255) } HashAlgorithm;
2491 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002492 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002493 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2494 if (sig_alg == NULL) {
2495 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2496 }
Ronald Cron8457c122022-03-07 11:32:54 +01002497
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2499 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002500
Gilles Peskine449bd832023-01-11 14:50:10 +01002501 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002502 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002503 }
2504 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002505 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 }
Simon Butcher99000142016-10-13 17:21:01 +01002507
Paul Elliott96a0fd92022-11-08 17:09:56 +00002508 /* Write elements at offsets starting from 1 (offset 0 is for the
2509 * length). Thus the offset of each element is the length of the
2510 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002511 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002512 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002513
Paul Bakker926af752012-11-23 13:38:07 +01002514 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002515
Paul Elliott96a0fd92022-11-08 17:09:56 +00002516 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002518 sa_len += 2;
2519 p += sa_len;
2520
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002521 /*
2522 * DistinguishedName certificate_authorities<0..2^16-1>;
2523 * opaque DistinguishedName<1..2^16-1>;
2524 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002525 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002526
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002527 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002528
Gilles Peskine449bd832023-01-11 14:50:10 +01002529 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002530 /* NOTE: If trusted certificates are provisioned
2531 * via a CA callback (configured through
2532 * `mbedtls_ssl_conf_ca_cb()`, then the
2533 * CertificateRequest is currently left empty. */
2534
Glenn Strauss999ef702022-03-11 01:37:23 -05002535#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2536#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002537 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002538 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002539 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002540#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002541 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002542 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002543 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002544#endif
Janos Follath088ce432017-04-10 12:42:31 +01002545#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002546 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002547 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002548 } else
Janos Follath088ce432017-04-10 12:42:31 +01002549#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002550 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002551
Gilles Peskine449bd832023-01-11 14:50:10 +01002552 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002553 /* It follows from RFC 5280 A.1 that this length
2554 * can be represented in at most 11 bits. */
2555 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002556
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2558 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002559 break;
2560 }
2561
Gilles Peskine449bd832023-01-11 14:50:10 +01002562 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002563 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002564 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002565 p += dn_size;
2566
Gilles Peskine449bd832023-01-11 14:50:10 +01002567 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002568
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002569 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002570 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002571 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002572 }
2573
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002574 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002575 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2576 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002577 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002578
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002580
Gilles Peskine449bd832023-01-11 14:50:10 +01002581 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002582
Gilles Peskine449bd832023-01-11 14:50:10 +01002583 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002584}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002585#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002586
Valerio Setti4d0e8462023-10-06 13:20:21 +02002587#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002588 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002589#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002590MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002591static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002592{
2593 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2594 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002595 mbedtls_pk_context *pk;
2596 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002597 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002598 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2599 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002600#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002601 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002602 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002603 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002604 mbedtls_ecp_keypair *key;
2605#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002606
Gilles Peskine449bd832023-01-11 14:50:10 +01002607 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002608
Gilles Peskine449bd832023-01-11 14:50:10 +01002609 if (pk == NULL) {
2610 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2611 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002612
Valerio Setti0813b6f2023-06-16 12:18:53 +02002613 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002614
Valerio Setti0813b6f2023-06-16 12:18:53 +02002615 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002616 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002617#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2618 case MBEDTLS_PK_ECKEY:
2619 case MBEDTLS_PK_ECKEY_DH:
2620 case MBEDTLS_PK_ECDSA:
2621#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002622 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2623 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2624 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002625
Valerio Settibced8bc2023-12-06 10:40:47 +01002626 /* Get the attributes of the key previously parsed by PK module in
2627 * order to extract its type and length (in bits). */
2628 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002629 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002630 ret = PSA_TO_MBEDTLS_ERR(status);
2631 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002632 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002633 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002634 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002635
Gilles Peskinedc492582023-12-18 20:38:38 +01002636#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2637 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002638 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2639 * module and only have ECDSA capabilities. Since we need
2640 * them for ECDH later, we export and then re-import them with
2641 * proper flags and algorithm. Of course We also set key's type
2642 * and bits that we just got above. */
2643 key_attributes = psa_key_attributes_init();
2644 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2645 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2646 psa_set_key_type(&key_attributes,
2647 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2648 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002649
Valerio Setti202bb712023-12-06 17:05:24 +01002650 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2651 if (status != PSA_SUCCESS) {
2652 ret = PSA_TO_MBEDTLS_ERR(status);
2653 goto exit;
2654 }
2655 status = psa_import_key(&key_attributes, buf, key_len,
2656 &ssl->handshake->xxdh_psa_privkey);
2657 if (status != PSA_SUCCESS) {
2658 ret = PSA_TO_MBEDTLS_ERR(status);
2659 goto exit;
2660 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002661
Valerio Setti202bb712023-12-06 17:05:24 +01002662 /* Set this key as owned by the TLS library: it will be its duty
2663 * to clear it exit. */
2664 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002665
Gilles Peskinedc492582023-12-18 20:38:38 +01002666 ret = 0;
2667 break;
2668 }
2669#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2670
2671 /* Opaque key is created by the user (externally from Mbed TLS)
2672 * so we assume it already has the right algorithm and flags
2673 * set. Just copy its ID as reference. */
2674 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2675 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 ret = 0;
2677 break;
Gilles Peskinedc492582023-12-18 20:38:38 +01002678
Valerio Setti0813b6f2023-06-16 12:18:53 +02002679#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002680 case MBEDTLS_PK_ECKEY:
2681 case MBEDTLS_PK_ECKEY_DH:
2682 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002683 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002684 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002685 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2687 }
Valerio Setti97207782023-05-18 18:59:06 +02002688 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002689 if (tls_id == 0) {
2690 /* This elliptic curve is not supported */
2691 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2692 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002693
Gilles Peskine449bd832023-01-11 14:50:10 +01002694 /* If the above conversion to TLS ID was fine, then also this one will
2695 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002696 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002697 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002698
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002699 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002700
Gilles Peskine449bd832023-01-11 14:50:10 +01002701 key_attributes = psa_key_attributes_init();
2702 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2703 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2704 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002705 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002706 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002707
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002708 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002709 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002710 mbedtls_platform_zeroize(buf, sizeof(buf));
2711 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002712 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002713
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002715 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002716 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002717 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002718 mbedtls_platform_zeroize(buf, sizeof(buf));
2719 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002720 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002721
Valerio Setti6835b4a2023-06-22 09:06:31 +02002722 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002723 ret = 0;
2724 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002725#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002726 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002727 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002728 }
2729
Valerio Settibced8bc2023-12-06 10:40:47 +01002730exit:
2731 psa_reset_key_attributes(&key_attributes);
2732 mbedtls_platform_zeroize(buf, sizeof(buf));
2733
Gilles Peskine449bd832023-01-11 14:50:10 +01002734 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002735}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002736#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002737MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002738static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002739{
Janos Follath865b3eb2019-12-16 11:46:15 +00002740 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002741
Gilles Peskine449bd832023-01-11 14:50:10 +01002742 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2743 if (private_key == NULL) {
2744 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2745 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002746 }
2747
Gilles Peskine449bd832023-01-11 14:50:10 +01002748 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2749 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2750 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002751 }
2752
Gilles Peskine449bd832023-01-11 14:50:10 +01002753 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002754 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002755 MBEDTLS_ECDH_OURS)) != 0) {
2756 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2757 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002758 }
2759
Gilles Peskine449bd832023-01-11 14:50:10 +01002760 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002761}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002762#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002763#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2764 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002765
Gilles Peskineeccd8882020-03-10 12:19:08 +01002766#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002767 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002768MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002769static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2770 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002771{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002772 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2773 * signature length which will be added in ssl_write_server_key_exchange
2774 * after the call to ssl_prepare_server_key_exchange.
2775 * ssl_write_server_key_exchange also takes care of incrementing
2776 * ssl->out_msglen. */
2777 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002778 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2779 - sig_start);
2780 int ret = ssl->conf->f_async_resume(ssl,
2781 sig_start, signature_len, sig_max_len);
2782 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002783 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002784 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002785 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002786 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2787 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002788}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002789#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002790 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002791
Gilles Peskined3eb0612018-01-08 17:07:44 +01002792/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002793 * calculating the signature if any, but excluding formatting the
2794 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002795MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002796static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2797 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002798{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002799 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002800 ssl->handshake->ciphersuite_info;
2801
Gilles Peskineeccd8882020-03-10 12:19:08 +01002802#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002803#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002804 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002805#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002806#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002807
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002808 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002809#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002810 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002811#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002812
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002813#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002814#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002815 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002816#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002817 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 +02002818#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002819#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002820
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002821 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002822
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002823 /*
2824 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002825 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002826 *
2827 */
2828
2829 /*
2830 * - ECJPAKE key exchanges
2831 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002832#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002833 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002834 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002835#if defined(MBEDTLS_USE_PSA_CRYPTO)
2836 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2837 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2838 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002839 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002840 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002841
Valerio Setti6f1b5742022-11-16 10:00:32 +01002842 /*
2843 * The first 3 bytes are:
2844 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2845 * [1, 2] elliptic curve's TLS ID
2846 *
2847 * However since we only support secp256r1 for now, we hardcode its
2848 * TLS ID here
2849 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002850 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002851 MBEDTLS_ECP_DP_SECP256R1);
2852 if (tls_id == 0) {
2853 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002854 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002855 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002856 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002857 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002858
Gilles Peskine449bd832023-01-11 14:50:10 +01002859 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2860 out_p + output_offset,
2861 end_p - out_p - output_offset, &output_len,
2862 MBEDTLS_ECJPAKE_ROUND_TWO);
2863 if (ret != 0) {
2864 psa_destroy_key(ssl->handshake->psa_pake_password);
2865 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2866 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2867 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002868 }
2869
Valerio Setti02c25b52022-11-15 14:08:42 +01002870 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002871 ssl->out_msglen += output_offset;
2872#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002873 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002874
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002875 ret = mbedtls_ecjpake_write_round_two(
2876 &ssl->handshake->ecjpake_ctx,
2877 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002878 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002879 ssl->conf->f_rng, ssl->conf->p_rng);
2880 if (ret != 0) {
2881 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2882 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002883 }
2884
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002885 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002886#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002887 }
2888#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2889
Hanno Becker1aa267c2017-04-28 17:08:27 +01002890 /*
2891 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2892 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2893 * we use empty support identity hints here.
2894 **/
2895#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002896 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2898 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002899 ssl->out_msg[ssl->out_msglen++] = 0x00;
2900 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002901 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002902#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2903 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002904
Hanno Becker7e5437a2017-04-28 17:15:26 +01002905 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002906 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002907 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002908#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002909 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002910 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002911 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002912
Gilles Peskine449bd832023-01-11 14:50:10 +01002913 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2914 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2915 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002916 }
2917
Paul Bakker41c83d32013-03-20 14:39:14 +01002918 /*
2919 * Ephemeral DH parameters:
2920 *
2921 * struct {
2922 * opaque dh_p<1..2^16-1>;
2923 * opaque dh_g<1..2^16-1>;
2924 * opaque dh_Ys<1..2^16-1>;
2925 * } ServerDHParams;
2926 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002927 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2928 &ssl->conf->dhm_P,
2929 &ssl->conf->dhm_G)) != 0) {
2930 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2931 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002932 }
Paul Bakker48916f92012-09-16 19:57:18 +00002933
Gilles Peskine449bd832023-01-11 14:50:10 +01002934 if ((ret = mbedtls_dhm_make_params(
2935 &ssl->handshake->dhm_ctx,
2936 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2937 ssl->out_msg + ssl->out_msglen, &len,
2938 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2939 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2940 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002941 }
2942
Jerry Yuc5aef882021-12-23 20:15:02 +08002943#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002944 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002945#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002946
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002947 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002948
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2950 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2951 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2952 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002953 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002954#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002955
Hanno Becker1aa267c2017-04-28 17:08:27 +01002956 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002957 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002958 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002959#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002960 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002961 /*
2962 * Ephemeral ECDH parameters:
2963 *
2964 * struct {
2965 * ECParameters curve_params;
2966 * ECPoint public;
2967 * } ServerECDHParams;
2968 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002969 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002970 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002971 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002972 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002973
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002974 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002975 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2976 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2977 }
2978 for (; *group_list != 0; group_list++) {
2979 for (curr_tls_id = ssl->handshake->curves_tls_id;
2980 *curr_tls_id != 0; curr_tls_id++) {
2981 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002982 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002983 }
2984 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002985 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002986
Gilles Peskine449bd832023-01-11 14:50:10 +01002987curve_matching_done:
2988 if (*curr_tls_id == 0) {
2989 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2990 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2991 }
2992
2993 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2994 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002995
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002996#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002997 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2998 psa_key_attributes_t key_attributes;
2999 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003000 uint8_t *p = ssl->out_msg + ssl->out_msglen;
3001 const size_t header_size = 4; // curve_type(1), namedcurve(2),
3002 // data length(1)
3003 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02003004 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01003005 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003006
Gilles Peskine449bd832023-01-11 14:50:10 +01003007 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003008
Valerio Setti40d9ca92023-01-04 16:08:04 +01003009 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003010 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02003011 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01003012 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
3013 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
3014 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01003015 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003016 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02003017 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003018
3019 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01003020 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3021 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003022 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003023 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003024
3025 /*
3026 * ECParameters curve_params
3027 *
3028 * First byte is curve_type, always named_curve
3029 */
3030 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3031
3032 /*
3033 * Next two bytes are the namedcurve value
3034 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003035 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003036 p += 2;
3037
3038 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003039 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003040 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003041 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003042 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003043 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3044 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003045 }
3046
3047 /*
3048 * ECPoint public
3049 *
3050 * First byte is data length.
3051 * It will be filled later. p holds now the data length location.
3052 */
3053
3054 /* Export the public part of the ECDH private key from PSA.
3055 * Make one byte space for the length.
3056 */
3057 unsigned char *own_pubkey = p + data_length_size;
3058
Gilles Peskine449bd832023-01-11 14:50:10 +01003059 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3060 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003061
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003062 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003063 own_pubkey, own_pubkey_max_len,
3064 &len);
3065 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003066 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003067 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003068 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3069 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003070 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003071 }
3072
3073 /* Store the length of the exported public key. */
3074 *p = (uint8_t) len;
3075
3076 /* Determine full message length. */
3077 len += header_size;
3078#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003079 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003080 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003081
Gilles Peskine449bd832023-01-11 14:50:10 +01003082 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3083 curr_grp_id)) != 0) {
3084 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3085 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003086 }
3087
Gilles Peskine449bd832023-01-11 14:50:10 +01003088 if ((ret = mbedtls_ecdh_make_params(
3089 &ssl->handshake->ecdh_ctx, &len,
3090 ssl->out_msg + ssl->out_msglen,
3091 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3092 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3093 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3094 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003095 }
3096
Gilles Peskine449bd832023-01-11 14:50:10 +01003097 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3098 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003099#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003100
Jerry Yuc5aef882021-12-23 20:15:02 +08003101#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003102 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003103#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003104
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003105 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003106 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003107#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003108
Hanno Becker1aa267c2017-04-28 17:08:27 +01003109 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003110 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003111 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003112 * exchange parameters, compute and add the signature here.
3113 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003114 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003115#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003116 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3117 if (dig_signed == NULL) {
3118 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3119 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003120 }
3121
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003122 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003123 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003124 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003125
Janos Follath865b3eb2019-12-16 11:46:15 +00003126 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003127
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003128 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003129 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003130 * For TLS 1.2, obey signature-hash-algorithm extension
3131 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003132 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003133
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003134 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003135 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003136
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003137 unsigned char sig_hash =
3138 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003139 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003140
Gilles Peskine449bd832023-01-11 14:50:10 +01003141 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003142
Ronald Cron8457c122022-03-07 11:32:54 +01003143 /* For TLS 1.2, obey signature-hash-algorithm extension
3144 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003145 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3146 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003147 /* (... because we choose a cipher suite
3148 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003149 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003150 }
3151
Gilles Peskine449bd832023-01-11 14:50:10 +01003152 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003153
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003154 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003155 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003156 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003157 if (md_alg != MBEDTLS_MD_NONE) {
3158 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3159 dig_signed,
3160 dig_signed_len,
3161 md_alg);
3162 if (ret != 0) {
3163 return ret;
3164 }
3165 } else {
3166 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3167 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003168 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003169
Gilles Peskine449bd832023-01-11 14:50:10 +01003170 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003171
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003172 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003173 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003174 */
Ronald Cron8457c122022-03-07 11:32:54 +01003175 /*
3176 * We need to specify signature and hash algorithm explicitly through
3177 * a prefix to the signature.
3178 *
3179 * struct {
3180 * HashAlgorithm hash;
3181 * SignatureAlgorithm signature;
3182 * } SignatureAndHashAlgorithm;
3183 *
3184 * struct {
3185 * SignatureAndHashAlgorithm algorithm;
3186 * opaque signature<0..2^16-1>;
3187 * } DigitallySigned;
3188 *
3189 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003190
Gilles Peskine449bd832023-01-11 14:50:10 +01003191 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3192 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003193
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003194#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003195 if (ssl->conf->f_async_sign_start != NULL) {
3196 ret = ssl->conf->f_async_sign_start(ssl,
3197 mbedtls_ssl_own_cert(ssl),
3198 md_alg, hash, hashlen);
3199 switch (ret) {
3200 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3201 /* act as if f_async_sign was null */
3202 break;
3203 case 0:
3204 ssl->handshake->async_in_progress = 1;
3205 return ssl_resume_server_key_exchange(ssl, signature_len);
3206 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3207 ssl->handshake->async_in_progress = 1;
3208 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3209 default:
3210 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3211 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003212 }
3213 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003214#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003215
Gilles Peskine449bd832023-01-11 14:50:10 +01003216 if (mbedtls_ssl_own_key(ssl) == NULL) {
3217 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3218 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003219 }
3220
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003221 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3222 * signature length which will be added in ssl_write_server_key_exchange
3223 * after the call to ssl_prepare_server_key_exchange.
3224 * ssl_write_server_key_exchange also takes care of incrementing
3225 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003226 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3227 md_alg, hash, hashlen,
3228 ssl->out_msg + ssl->out_msglen + 2,
3229 out_buf_len - ssl->out_msglen - 2,
3230 signature_len,
3231 ssl->conf->f_rng,
3232 ssl->conf->p_rng)) != 0) {
3233 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3234 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003235 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003236 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003237#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003238
Gilles Peskine449bd832023-01-11 14:50:10 +01003239 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003240}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003241
Gilles Peskined3eb0612018-01-08 17:07:44 +01003242/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003243 * that do not include a ServerKeyExchange message, do nothing. Either
3244 * way, if successful, move on to the next step in the SSL state
3245 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003246MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003247static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003248{
Janos Follath865b3eb2019-12-16 11:46:15 +00003249 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003250 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003251#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003252 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003253 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003254#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003255
Gilles Peskine449bd832023-01-11 14:50:10 +01003256 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003257
Gilles Peskineeccd8882020-03-10 12:19:08 +01003258#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003259 /* Extract static ECDH parameters and abort if ServerKeyExchange
3260 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003262 /* For suites involving ECDH, extract DH parameters
3263 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003264#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003265 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3266 ret = ssl_get_ecdh_params_from_cert(ssl);
3267 if (ret != 0) {
3268 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3269 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003270 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003271 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003272#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003273
3274 /* Key exchanges not involving ephemeral keys don't use
3275 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003276 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003277 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003278 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003279 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003280#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003281
Gilles Peskineeccd8882020-03-10 12:19:08 +01003282#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003283 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003284 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003285 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003286 if (ssl->handshake->async_in_progress != 0) {
3287 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3288 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3289 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003290#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003291 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003292 {
3293 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003294 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003295 }
3296
Gilles Peskine449bd832023-01-11 14:50:10 +01003297 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003298 /* If we're starting to write a new message, set ssl->out_msglen
3299 * to 0. But if we're resuming after an asynchronous message,
3300 * out_msglen is the amount of data written so far and mst be
3301 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003302 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3303 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3304 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003305 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003306 }
3307 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003308 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003309
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003310 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003311 * ssl_prepare_server_key_exchange already wrote the signature
3312 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003313#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003314 if (signature_len != 0) {
3315 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3316 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003317
Gilles Peskine449bd832023-01-11 14:50:10 +01003318 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3319 ssl->out_msg + ssl->out_msglen,
3320 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003321
3322 /* Skip over the already-written signature */
3323 ssl->out_msglen += signature_len;
3324 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003325#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003326
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003327 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003328 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3329 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003330
3331 ssl->state++;
3332
Gilles Peskine449bd832023-01-11 14:50:10 +01003333 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3334 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3335 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003336 }
3337
Gilles Peskine449bd832023-01-11 14:50:10 +01003338 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3339 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003340}
3341
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003342MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003343static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003344{
Janos Follath865b3eb2019-12-16 11:46:15 +00003345 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003346
Gilles Peskine449bd832023-01-11 14:50:10 +01003347 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003348
3349 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003350 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3351 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003352
3353 ssl->state++;
3354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003355#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003356 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3357 mbedtls_ssl_send_flight_completed(ssl);
3358 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003359#endif
3360
Gilles Peskine449bd832023-01-11 14:50:10 +01003361 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3362 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3363 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003364 }
3365
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003366#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003367 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3368 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3369 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3370 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003371 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003372#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003373
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003375
Gilles Peskine449bd832023-01-11 14:50:10 +01003376 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003377}
3378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003379#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3380 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003381MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003382static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3383 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003384{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003385 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003386 size_t n;
3387
3388 /*
3389 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3390 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003391 if (*p + 2 > end) {
3392 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3393 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003394 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003395
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003396 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003397 *p += 2;
3398
Gilles Peskine449bd832023-01-11 14:50:10 +01003399 if (*p + n > end) {
3400 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3401 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003402 }
3403
Gilles Peskine449bd832023-01-11 14:50:10 +01003404 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3405 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3406 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003407 }
3408
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003409 *p += n;
3410
Gilles Peskine449bd832023-01-11 14:50:10 +01003411 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003412
Gilles Peskine449bd832023-01-11 14:50:10 +01003413 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003414}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003415#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3416 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003417
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003418#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3419 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003420
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003421#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003422MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003423static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3424 unsigned char *peer_pms,
3425 size_t *peer_pmslen,
3426 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003427{
Gilles Peskine449bd832023-01-11 14:50:10 +01003428 int ret = ssl->conf->f_async_resume(ssl,
3429 peer_pms, peer_pmslen, peer_pmssize);
3430 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003431 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003432 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003433 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003434 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3435 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003436}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003437#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003438
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003439MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003440static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3441 const unsigned char *p,
3442 const unsigned char *end,
3443 unsigned char *peer_pms,
3444 size_t *peer_pmslen,
3445 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003446{
Janos Follath865b3eb2019-12-16 11:46:15 +00003447 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003448
Gilles Peskine449bd832023-01-11 14:50:10 +01003449 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3450 if (own_cert == NULL) {
3451 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3452 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003453 }
3454 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003455 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3456 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003457
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003458#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003459 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003460 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003461 if (ssl->handshake->async_in_progress != 0) {
3462 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3463 return ssl_resume_decrypt_pms(ssl,
3464 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003465 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003466#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003467
3468 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003469 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003470 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003471 if (p + 2 > end) {
3472 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3473 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003474 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003475 if (*p++ != MBEDTLS_BYTE_1(len) ||
3476 *p++ != MBEDTLS_BYTE_0(len)) {
3477 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3478 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003479 }
3480
Gilles Peskine449bd832023-01-11 14:50:10 +01003481 if (p + len != end) {
3482 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3483 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003484 }
3485
Gilles Peskine422ccab2018-01-11 18:29:01 +01003486 /*
3487 * Decrypt the premaster secret
3488 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003489#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003490 if (ssl->conf->f_async_decrypt_start != NULL) {
3491 ret = ssl->conf->f_async_decrypt_start(ssl,
3492 mbedtls_ssl_own_cert(ssl),
3493 p, len);
3494 switch (ret) {
3495 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3496 /* act as if f_async_decrypt_start was null */
3497 break;
3498 case 0:
3499 ssl->handshake->async_in_progress = 1;
3500 return ssl_resume_decrypt_pms(ssl,
3501 peer_pms,
3502 peer_pmslen,
3503 peer_pmssize);
3504 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3505 ssl->handshake->async_in_progress = 1;
3506 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3507 default:
3508 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3509 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003510 }
3511 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003512#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003513
Gilles Peskine449bd832023-01-11 14:50:10 +01003514 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3515 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3516 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003517 }
3518
Gilles Peskine449bd832023-01-11 14:50:10 +01003519 ret = mbedtls_pk_decrypt(private_key, p, len,
3520 peer_pms, peer_pmslen, peer_pmssize,
3521 ssl->conf->f_rng, ssl->conf->p_rng);
3522 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003523}
3524
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003525MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003526static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3527 const unsigned char *p,
3528 const unsigned char *end,
3529 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003530{
Janos Follath865b3eb2019-12-16 11:46:15 +00003531 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003532 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3533 unsigned char ver[2];
3534 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003535 size_t peer_pmslen;
3536 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003537
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003538 /* In case of a failure in decryption, the decryption may write less than
3539 * 2 bytes of output, but we always read the first two bytes. It doesn't
3540 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003541 * ret being nonzero, and we only care whether diff is 0.
3542 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3543 * also makes memory analyzers happy (don't access uninitialized memory,
3544 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003545 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003546 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003547
Gilles Peskine449bd832023-01-11 14:50:10 +01003548 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3549 peer_pms,
3550 &peer_pmslen,
3551 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003552
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003553#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003554 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3555 return ret;
3556 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003557#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003558
Gilles Peskine449bd832023-01-11 14:50:10 +01003559 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3560 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003561
3562 /* Avoid data-dependent branches while checking for invalid
3563 * padding, to protect against timing-based Bleichenbacher-type
3564 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003565 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003566 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3567 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3568 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003569
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003570 /*
3571 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3572 * must not cause the connection to end immediately; instead, send a
3573 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003574 * To protect against timing-based variants of the attack, we must
3575 * not have any branch that depends on whether the decryption was
3576 * successful. In particular, always generate the fake premaster secret,
3577 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003579 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3580 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003581 /* It's ok to abort on an RNG failure, since this does not reveal
3582 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003583 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003584 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003585
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003586#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003587 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003588 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3589 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003590#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003591
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3593 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3594 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3595 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003596 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003597 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003598
Gilles Peskine422ccab2018-01-11 18:29:01 +01003599 /* Set pms to either the true or the fake PMS, without
3600 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003601 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003602
Gilles Peskine449bd832023-01-11 14:50:10 +01003603 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003604}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003605#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3606 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003607
Gilles Peskineeccd8882020-03-10 12:19:08 +01003608#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003609MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003610static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3611 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003612{
Paul Bakker6db455e2013-09-18 17:29:31 +02003613 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003614 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003615
Gilles Peskine449bd832023-01-11 14:50:10 +01003616 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3617 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3618 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003619 }
3620
3621 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003622 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003623 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 if (end - *p < 2) {
3625 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3626 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003627 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003628
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003629 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003630 *p += 2;
3631
Gilles Peskine449bd832023-01-11 14:50:10 +01003632 if (n == 0 || n > end - *p) {
3633 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3634 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003635 }
3636
Gilles Peskine449bd832023-01-11 14:50:10 +01003637 if (ssl->conf->f_psk != NULL) {
3638 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003639 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003640 }
3641 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003642 /* Identity is not a big secret since clients send it in the clear,
3643 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003644 if (n != ssl->conf->psk_identity_len ||
3645 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003646 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003647 }
3648 }
3649
Gilles Peskine449bd832023-01-11 14:50:10 +01003650 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3651 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3652 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3653 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3654 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003655 }
3656
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003657 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003658
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003660}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003661#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003662
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003663MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003664static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003665{
Janos Follath865b3eb2019-12-16 11:46:15 +00003666 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003667 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003668 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003669
Hanno Beckere694c3e2017-12-27 21:34:08 +00003670 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003671
Gilles Peskine449bd832023-01-11 14:50:10 +01003672 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003673
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003674#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003675 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3676 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3677 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3678 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3679 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003680 /* We've already read a record and there is an asynchronous
3681 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003682 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003683 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3684 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003685#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003686 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3687 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3688 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003689 }
3690
Gilles Peskine449bd832023-01-11 14:50:10 +01003691 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003692 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003693
Gilles Peskine449bd832023-01-11 14:50:10 +01003694 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3695 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3696 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003697 }
3698
Gilles Peskine449bd832023-01-11 14:50:10 +01003699 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3700 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3701 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003702 }
3703
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003704#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003705 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3706 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3707 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3708 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003709 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003710
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 if (p != end) {
3712 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3713 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003714 }
3715
Gilles Peskine449bd832023-01-11 14:50:10 +01003716 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3717 ssl->handshake->premaster,
3718 MBEDTLS_PREMASTER_SIZE,
3719 &ssl->handshake->pmslen,
3720 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3721 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3722 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003723 }
3724
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3726 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003727#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003728#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3729 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3730 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3731 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003732 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003733 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3734 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003735 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003736#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003737 size_t data_len = (size_t) (*p++);
3738 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003739 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3740 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3741
Gilles Peskine530c4232023-10-02 15:37:23 +02003742 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003743
3744 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003745 * We must have at least two bytes (1 for length, at least 1 for data)
3746 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003747 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003748 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3749 buf_len));
3750 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003751 }
3752
Gilles Peskine449bd832023-01-11 14:50:10 +01003753 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003754 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3755 " > %" MBEDTLS_PRINTF_SIZET,
3756 data_len, buf_len));
3757 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003758 }
3759
3760 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003761 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003762 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3763 " > %" MBEDTLS_PRINTF_SIZET,
3764 data_len,
3765 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003766 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3767 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003768 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3769 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003770
3771 /* Compute ECDH shared secret. */
3772 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003773 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3774 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003775 handshake->premaster, sizeof(handshake->premaster),
3776 &handshake->pmslen);
3777 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003778 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003779 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003780 if (handshake->xxdh_psa_privkey_is_external == 0) {
3781 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003783 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003784 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003785 }
3786
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003787 if (handshake->xxdh_psa_privkey_is_external == 0) {
3788 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003789
Gilles Peskine449bd832023-01-11 14:50:10 +01003790 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003791 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003792 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3793 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003794 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003795 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003796 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003797#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003798 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003799 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003800 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3801 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003802 }
3803
Gilles Peskine449bd832023-01-11 14:50:10 +01003804 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3805 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003806
Gilles Peskine449bd832023-01-11 14:50:10 +01003807 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3808 &ssl->handshake->pmslen,
3809 ssl->handshake->premaster,
3810 MBEDTLS_MPI_MAX_SIZE,
3811 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3812 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3813 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003814 }
3815
Gilles Peskine449bd832023-01-11 14:50:10 +01003816 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3817 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003818#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003819 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003820#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3821 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3822 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3823 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3824#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3826 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3827 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3828 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003829 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003830
Gilles Peskine449bd832023-01-11 14:50:10 +01003831 if (p != end) {
3832 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3833 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003834 }
3835
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003836#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003838 (mbedtls_key_exchange_type_t) ciphersuite_info->
3839 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003840 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3841 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003842 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003843#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003844 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003845#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3846#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003847 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003848#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003849 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003850 /* There is an asynchronous operation in progress to
3851 * decrypt the encrypted premaster secret, so skip
3852 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003853 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003854 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3855 * won't actually use it, but maintain p anyway for robustness. */
3856 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003857 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003858#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003859 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3860 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3861 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003862 }
3863
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3865 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3866 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003867 }
3868
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003869#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003870 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003871 (mbedtls_key_exchange_type_t) ciphersuite_info->
3872 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003873 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3874 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003875 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003876#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003877 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003878#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3879#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003880 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3881 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3882 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3883 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003884 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3886 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3887 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003888 }
3889
Gilles Peskine449bd832023-01-11 14:50:10 +01003890 if (p != end) {
3891 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3892 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003893 }
3894
Neil Armstrong80f6f322022-05-03 17:56:38 +02003895#if defined(MBEDTLS_USE_PSA_CRYPTO)
3896 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003897 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003898 size_t pms_len;
3899
3900 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003901 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3902 pms + 2, pms_end - (pms + 2), &pms_len,
3903 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3904 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3905 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003906 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003907 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003908 pms += 2 + pms_len;
3909
Gilles Peskine449bd832023-01-11 14:50:10 +01003910 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003911#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003912 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003913 (mbedtls_key_exchange_type_t) ciphersuite_info->
3914 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003915 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3916 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003917 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003918#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003919 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003920#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003921#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003922 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003923#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003924 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3925 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster5be4fd72024-05-27 20:07:05 +02003926 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003927
3928 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3929
Gilles Peskine449bd832023-01-11 14:50:10 +01003930 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3931 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003932 psa_destroy_key(handshake->xxdh_psa_privkey);
3933 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003934 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003935 }
3936
3937 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003938 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003939 psa_destroy_key(handshake->xxdh_psa_privkey);
3940 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003941 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003942 }
3943
Neil Armstrong039db292022-03-09 11:38:34 +01003944 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003945 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003946 psa_destroy_key(handshake->xxdh_psa_privkey);
3947 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003948 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003949 }
3950
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003951 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3952 the sizes of the FFDH keys which are at least 2048 bits.
3953 The size of the array is thus greater than 256 bytes which is greater than any
3954 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003955#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003956 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3957 psa_destroy_key(handshake->xxdh_psa_privkey);
3958 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003959 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003960 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003961#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003962 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3963 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003964#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003965
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003966 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3967 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003968 p += ecpoint_len;
3969
Neil Armstrong3bcef082022-03-23 18:16:54 +01003970 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003971 * - a uint16 containing the length (in octets) of the ECDH computation
3972 * - the octet string produced by the ECDH computation
3973 * - a uint16 containing the length (in octets) of the PSK
3974 * - the PSK itself
3975 */
Neil Armstrong039db292022-03-09 11:38:34 +01003976 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003977 const unsigned char * const psm_end =
3978 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003979 /* uint16 to store length (in octets) of the ECDH computation */
3980 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003981 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003982
3983 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003984 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003985 handshake->xxdh_psa_privkey,
3986 handshake->xxdh_psa_peerkey,
3987 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003988 psm + zlen_size,
3989 psm_end - (psm + zlen_size),
3990 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003991
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003992 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3993 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003994
Gilles Peskine449bd832023-01-11 14:50:10 +01003995 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003996 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003997 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003998 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003999 }
Neil Armstrong039db292022-03-09 11:38:34 +01004000
Neil Armstrong3bcef082022-03-23 18:16:54 +01004001 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01004002 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01004003 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01004004
Przemek Stekiel14d11b02022-04-14 08:33:29 +02004005#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004006 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
4007 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
4008 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004009 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004010
Gilles Peskine449bd832023-01-11 14:50:10 +01004011 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004012 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01004013 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
4014 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004015 }
4016
Gilles Peskine449bd832023-01-11 14:50:10 +01004017 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
4018 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004019
Gilles Peskine449bd832023-01-11 14:50:10 +01004020 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01004021 (mbedtls_key_exchange_type_t) ciphersuite_info->
4022 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01004023 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
4024 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004025 }
Neil Armstrong913b3642022-04-13 14:59:48 +02004026#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004027 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004028#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4029#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4031 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4032 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4033 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004034 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004035 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004036#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004037#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004038 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004039#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004040 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004041 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01004042 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4043 psa_destroy_key(ssl->handshake->psa_pake_password);
4044 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004045
Gilles Peskine449bd832023-01-11 14:50:10 +01004046 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4047 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004048 }
4049#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004050 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004051 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01004052 if (ret != 0) {
4053 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4054 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004055 }
4056
Gilles Peskine449bd832023-01-11 14:50:10 +01004057 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4058 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4059 ssl->conf->f_rng, ssl->conf->p_rng);
4060 if (ret != 0) {
4061 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4062 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004063 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004064#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004065 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004066#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004067 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004068 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4069 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004070 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004071
Gilles Peskine449bd832023-01-11 14:50:10 +01004072 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4073 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4074 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004075 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004076
Paul Bakker5121ce52009-01-03 21:22:43 +00004077 ssl->state++;
4078
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004080
Gilles Peskine449bd832023-01-11 14:50:10 +01004081 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004082}
4083
Gilles Peskineeccd8882020-03-10 12:19:08 +01004084#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004085MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004086static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004087{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004088 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004089 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004090
Gilles Peskine449bd832023-01-11 14:50:10 +01004091 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004092
Gilles Peskine449bd832023-01-11 14:50:10 +01004093 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4094 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004095 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004096 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004097 }
4098
Gilles Peskine449bd832023-01-11 14:50:10 +01004099 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4100 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004101}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004102#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004103MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004104static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004105{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004106 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004107 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004108 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004109 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004110 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004111 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004112 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004113 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004114 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004115 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004116
Gilles Peskine449bd832023-01-11 14:50:10 +01004117 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004118
Gilles Peskine449bd832023-01-11 14:50:10 +01004119 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4120 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004121 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004122 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004123 }
4124
Hanno Becker2a831a42019-02-07 13:17:25 +00004125#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004126 if (ssl->session_negotiate->peer_cert == NULL) {
4127 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004128 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004129 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004130 }
4131#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004132 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4133 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004134 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004135 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004136 }
4137#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4138
Simon Butcher99000142016-10-13 17:21:01 +01004139 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004140 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4141 if (0 != ret) {
4142 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4143 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004144 }
4145
4146 ssl->state++;
4147
Simon Butcher99000142016-10-13 17:21:01 +01004148 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004149 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4150 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4151 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4152 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004153 }
4154
Gilles Peskine449bd832023-01-11 14:50:10 +01004155 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004156
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004157#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4158 peer_pk = &ssl->handshake->peer_pubkey;
4159#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004160 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004161 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004162 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004163 }
4164 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4165#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4166
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004167 /*
4168 * struct {
4169 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4170 * opaque signature<0..2^16-1>;
4171 * } DigitallySigned;
4172 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004173 if (i + 2 > ssl->in_hslen) {
4174 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4175 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004176 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004177
Ronald Cron8457c122022-03-07 11:32:54 +01004178 /*
4179 * Hash
4180 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004181 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004182
Gilles Peskine449bd832023-01-11 14:50:10 +01004183 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4184 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4185 " for verify message"));
4186 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004187 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004188
Simon Butcher99000142016-10-13 17:21:01 +01004189#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004190 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004191 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004192 }
Simon Butcher99000142016-10-13 17:21:01 +01004193#endif
Paul Bakker926af752012-11-23 13:38:07 +01004194
Ronald Cron8457c122022-03-07 11:32:54 +01004195 /* Info from md_alg will be used instead */
4196 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004197
Ronald Cron8457c122022-03-07 11:32:54 +01004198 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004199
Ronald Cron8457c122022-03-07 11:32:54 +01004200 /*
4201 * Signature
4202 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004203 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4204 == MBEDTLS_PK_NONE) {
4205 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4206 " for verify message"));
4207 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004208 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004209
Ronald Cron8457c122022-03-07 11:32:54 +01004210 /*
4211 * Check the certificate's key type matches the signature alg
4212 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004213 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4214 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4215 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004216 }
4217
4218 i++;
4219
Gilles Peskine449bd832023-01-11 14:50:10 +01004220 if (i + 2 > ssl->in_hslen) {
4221 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4222 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004223 }
4224
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004225 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004226 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004227
Gilles Peskine449bd832023-01-11 14:50:10 +01004228 if (i + sig_len != ssl->in_hslen) {
4229 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4230 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004231 }
4232
Simon Butcher99000142016-10-13 17:21:01 +01004233 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004234 {
4235 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004236 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4237 if (0 != ret) {
4238 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4239 return ret;
4240 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004241 }
Simon Butcher99000142016-10-13 17:21:01 +01004242
Gilles Peskine449bd832023-01-11 14:50:10 +01004243 if ((ret = mbedtls_pk_verify(peer_pk,
4244 md_alg, hash_start, hashlen,
4245 ssl->in_msg + i, sig_len)) != 0) {
4246 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4247 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004248 }
4249
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004250 ret = mbedtls_ssl_update_handshake_status(ssl);
4251 if (0 != ret) {
4252 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4253 return ret;
4254 }
Simon Butcher99000142016-10-13 17:21:01 +01004255
Gilles Peskine449bd832023-01-11 14:50:10 +01004256 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004257
Gilles Peskine449bd832023-01-11 14:50:10 +01004258 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004259}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004260#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004262#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004263MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004264static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004265{
Janos Follath865b3eb2019-12-16 11:46:15 +00004266 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004267 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004268 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004269
Gilles Peskine449bd832023-01-11 14:50:10 +01004270 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004272 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4273 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004274
4275 /*
4276 * struct {
4277 * uint32 ticket_lifetime_hint;
4278 * opaque ticket<0..2^16-1>;
4279 * } NewSessionTicket;
4280 *
4281 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4282 * 8 . 9 ticket_len (n)
4283 * 10 . 9+n ticket content
4284 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004285
Ronald Cron3c0072b2023-11-22 10:00:14 +01004286#if defined(MBEDTLS_HAVE_TIME)
4287 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4288#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004289 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4290 ssl->session_negotiate,
4291 ssl->out_msg + 10,
4292 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4293 &tlen, &lifetime)) != 0) {
4294 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004295 tlen = 0;
4296 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004297
Gilles Peskine449bd832023-01-11 14:50:10 +01004298 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4299 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004300 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004301
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004302 /*
4303 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4304 * ChangeCipherSpec share the same state.
4305 */
4306 ssl->handshake->new_session_ticket = 0;
4307
Gilles Peskine449bd832023-01-11 14:50:10 +01004308 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4309 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4310 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004311 }
4312
Gilles Peskine449bd832023-01-11 14:50:10 +01004313 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004314
Gilles Peskine449bd832023-01-11 14:50:10 +01004315 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004316}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004317#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004318
Paul Bakker5121ce52009-01-03 21:22:43 +00004319/*
Paul Bakker1961b702013-01-25 14:49:24 +01004320 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004321 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004322int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004323{
4324 int ret = 0;
4325
Gilles Peskine449bd832023-01-11 14:50:10 +01004326 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004327
Gilles Peskine449bd832023-01-11 14:50:10 +01004328 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004329 case MBEDTLS_SSL_HELLO_REQUEST:
4330 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004331 break;
4332
Paul Bakker1961b702013-01-25 14:49:24 +01004333 /*
4334 * <== ClientHello
4335 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004336 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004337 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004338 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004340#if defined(MBEDTLS_SSL_PROTO_DTLS)
4341 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004342 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004343#endif
4344
Paul Bakker1961b702013-01-25 14:49:24 +01004345 /*
4346 * ==> ServerHello
4347 * Certificate
4348 * ( ServerKeyExchange )
4349 * ( CertificateRequest )
4350 * ServerHelloDone
4351 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004352 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004353 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004354 break;
4355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004356 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004357 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004358 break;
4359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004360 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004361 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004362 break;
4363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004364 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004365 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004366 break;
4367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004368 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004369 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004370 break;
4371
4372 /*
4373 * <== ( Certificate/Alert )
4374 * ClientKeyExchange
4375 * ( CertificateVerify )
4376 * ChangeCipherSpec
4377 * Finished
4378 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004379 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004380 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004381 break;
4382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004383 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004384 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004385 break;
4386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004387 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004388 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004389 break;
4390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004391 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004392 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004393 break;
4394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004395 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004396 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004397 break;
4398
4399 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004400 * ==> ( NewSessionTicket )
4401 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004402 * Finished
4403 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004404 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4405#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004406 if (ssl->handshake->new_session_ticket != 0) {
4407 ret = ssl_write_new_session_ticket(ssl);
4408 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004409#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004410 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004411 break;
4412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004413 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004414 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004415 break;
4416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004417 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004418 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004419 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004420 break;
4421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004422 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004423 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004424 break;
4425
4426 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004427 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4428 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004429 }
4430
Gilles Peskine449bd832023-01-11 14:50:10 +01004431 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004432}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004433
Gilles Peskine449bd832023-01-11 14:50:10 +01004434void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004435{
TRodziewicz3946f792021-06-14 12:11:18 +02004436 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004437}
4438
Jerry Yufb4b6472022-01-27 15:03:26 +08004439#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */