blob: 5811de5f054867c5d775b6b04d49921c67a575d8 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS server-side functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
7
Harry Ramsey0f6bc412024-10-04 10:36:54 +01008#include "ssl_misc.h"
Paul Bakker5121ce52009-01-03 21:22:43 +00009
Jerry Yufb4b6472022-01-27 15:03:26 +080010#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080011
SimonBd5800b72016-04-26 07:43:27 +010012#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010013
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000014#include "mbedtls/ssl.h"
Valerio Settib4f50762024-01-17 10:24:52 +010015#include "debug_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000016#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050017#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020018#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020019#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000020
21#include <string.h>
22
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050023#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek00644842023-05-30 05:45:00 -040024/* Define a local translating function to save code size by not using too many
25 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040026#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
27 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040028static int local_err_translation(psa_status_t status)
29{
30 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040031 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040032 psa_generic_status_to_mbedtls);
33}
34#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050035#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050036#endif
37
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020038#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000039#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010040#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000041
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020042#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010043#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020044#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010047int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
48 const unsigned char *info,
49 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020050{
Gilles Peskine449bd832023-01-11 14:50:10 +010051 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
52 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
53 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020054
Gilles Peskine449bd832023-01-11 14:50:10 +010055 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020056
Gilles Peskine449bd832023-01-11 14:50:10 +010057 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
58 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
59 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020060
Gilles Peskine449bd832023-01-11 14:50:10 +010061 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020062 ssl->cli_id_len = ilen;
63
Gilles Peskine449bd832023-01-11 14:50:10 +010064 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020065}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020066
Gilles Peskine449bd832023-01-11 14:50:10 +010067void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
68 mbedtls_ssl_cookie_write_t *f_cookie_write,
69 mbedtls_ssl_cookie_check_t *f_cookie_check,
70 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020071{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020072 conf->f_cookie_write = f_cookie_write;
73 conf->f_cookie_check = f_cookie_check;
74 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020075}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020077
Gilles Peskineeccd8882020-03-10 12:19:08 +010078#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020079MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010080static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010081{
Gilles Peskine449bd832023-01-11 14:50:10 +010082 if (conf->f_psk != NULL) {
83 return 1;
84 }
Hanno Becker845b9462018-10-26 12:07:29 +010085
Gilles Peskine449bd832023-01-11 14:50:10 +010086 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
87 return 0;
88 }
Hanno Becker845b9462018-10-26 12:07:29 +010089
Hanno Becker845b9462018-10-26 12:07:29 +010090
91#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +010092 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
93 return 1;
94 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020095#endif /* MBEDTLS_USE_PSA_CRYPTO */
96
Gilles Peskine449bd832023-01-11 14:50:10 +010097 if (conf->psk != NULL && conf->psk_len != 0) {
98 return 1;
99 }
Hanno Becker845b9462018-10-26 12:07:29 +0100100
Gilles Peskine449bd832023-01-11 14:50:10 +0100101 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100102}
Gilles Peskineeccd8882020-03-10 12:19:08 +0100103#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100104
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200105MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100106static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
107 const unsigned char *buf,
108 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000109{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100112 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100114 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
116 ssl->verify_data_len) != 0) {
117 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
118 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
119 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
120 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100121 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000124 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 if (len != 1 || buf[0] != 0x0) {
126 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
127 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
128 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
129 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000130 }
131
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000133 }
Paul Bakker48916f92012-09-16 19:57:18 +0000134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000136}
137
Valerio Setti60d3b912023-07-25 10:43:53 +0200138#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200139 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100140 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800141/*
Jerry Yud491ea42022-01-13 16:15:25 +0800142 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
143 * curves (TLS 1.2) extension.
144 *
145 * The "extension_data" field of a supported groups extension contains a
146 * "NamedGroupList" value (TLS 1.3 RFC8446):
147 * enum {
148 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
149 * x25519(0x001D), x448(0x001E),
150 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
151 * ffdhe6144(0x0103), ffdhe8192(0x0104),
152 * ffdhe_private_use(0x01FC..0x01FF),
153 * ecdhe_private_use(0xFE00..0xFEFF),
154 * (0xFFFF)
155 * } NamedGroup;
156 * struct {
157 * NamedGroup named_group_list<2..2^16-1>;
158 * } NamedGroupList;
159 *
160 * The "extension_data" field of a supported elliptic curves extension contains
161 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
162 * enum {
163 * deprecated(1..22),
164 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
165 * x25519(29), x448(30),
166 * reserved (0xFE00..0xFEFF),
167 * deprecated(0xFF01..0xFF02),
168 * (0xFFFF)
169 * } NamedCurve;
170 * struct {
171 * NamedCurve named_curve_list<2..2^16-1>
172 * } NamedCurveList;
173 *
Jerry Yub925f212022-01-12 11:17:02 +0800174 * The TLS 1.3 supported groups extension was defined to be a compatible
175 * generalization of the TLS 1.2 supported elliptic curves extension. They both
176 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800177 *
Jerry Yub925f212022-01-12 11:17:02 +0800178 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200179MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100180static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
181 const unsigned char *buf,
182 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100183{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200184 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100185 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100186 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100187
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 if (len < 2) {
189 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
190 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
191 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
192 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200193 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000194 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 if (list_size + 2 != len ||
196 list_size % 2 != 0) {
197 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
198 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
199 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
200 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100201 }
202
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200203 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 if (ssl->handshake->curves_tls_id != NULL) {
205 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
206 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
207 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
208 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200209 }
210
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100211 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200212 * and leave room for a final 0 */
213 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200217
Gilles Peskine449bd832023-01-11 14:50:10 +0100218 if ((curves_tls_id = mbedtls_calloc(our_size,
219 sizeof(*curves_tls_id))) == NULL) {
220 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
221 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
222 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200223 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200224
Valerio Setti18c9fed2022-12-30 17:44:24 +0100225 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200226
Paul Bakker41c83d32013-03-20 14:39:14 +0100227 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 while (list_size > 0 && our_size > 1) {
229 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
232 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100233 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200234 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100235 }
236
237 list_size -= 2;
238 p += 2;
239 }
240
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100242}
243
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200244MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100245static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
246 const unsigned char *buf,
247 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100248{
249 size_t list_size;
250 const unsigned char *p;
251
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 if (len == 0 || (size_t) (buf[0] + 1) != len) {
253 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
254 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
255 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
256 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100257 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200258 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100259
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200260 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 while (list_size > 0) {
262 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
263 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200264#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
265 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200266 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200267#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200268#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
270 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
271 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200272#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
274 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100275 }
276
277 list_size--;
278 p++;
279 }
280
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100282}
Valerio Setti60d3b912023-07-25 10:43:53 +0200283#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200284 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200285 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100286
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200287#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200288MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100289static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
290 const unsigned char *buf,
291 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200292{
Janos Follath865b3eb2019-12-16 11:46:15 +0000293 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200294
Neil Armstrongca7d5062022-05-31 14:43:23 +0200295#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200297#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200299#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200300 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
302 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200303 }
304
Neil Armstrongca7d5062022-05-31 14:43:23 +0200305#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 if ((ret = mbedtls_psa_ecjpake_read_round(
307 &ssl->handshake->psa_pake_ctx, buf, len,
308 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
309 psa_destroy_key(ssl->handshake->psa_pake_password);
310 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200311
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100313 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 ssl,
315 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
316 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200317
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200319 }
320#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
322 buf, len)) != 0) {
323 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
324 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
325 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
326 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200327 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200328#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200329
330 /* Only mark the extension as OK when we're sure it is */
331 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
332
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200334}
335#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200338MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100339static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
340 const unsigned char *buf,
341 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200342{
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
344 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
345 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
346 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
347 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200348 }
349
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200350 ssl->session_negotiate->mfl_code = buf[0];
351
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200353}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200355
Hanno Beckera0e20d02019-05-15 14:03:01 +0100356#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200357MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100358static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
359 const unsigned char *buf,
360 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100361{
362 size_t peer_cid_len;
363
364 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
366 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
367 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
368 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
369 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100370 }
371
372 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100373 * struct {
374 * opaque cid<0..2^8-1>;
375 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100376 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100377
Gilles Peskine449bd832023-01-11 14:50:10 +0100378 if (len < 1) {
379 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
380 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
381 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
382 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100383 }
384
385 peer_cid_len = *buf++;
386 len--;
387
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 if (len != peer_cid_len) {
389 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
390 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
391 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
392 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100393 }
394
395 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100396 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100397 /* Leave ssl->handshake->cid_in_use in its default
398 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
400 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100401 }
402
Gilles Peskine449bd832023-01-11 14:50:10 +0100403 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
404 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
405 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
406 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
407 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100408 }
409
Hanno Becker08556bf2019-05-03 12:43:44 +0100410 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100411 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100413
Gilles Peskine449bd832023-01-11 14:50:10 +0100414 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
415 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100416
Gilles Peskine449bd832023-01-11 14:50:10 +0100417 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100418}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100419#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200422MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100423static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
424 const unsigned char *buf,
425 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100426{
Gilles Peskine449bd832023-01-11 14:50:10 +0100427 if (len != 0) {
428 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
429 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
430 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
431 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100432 }
433
434 ((void) buf);
435
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100438 }
439
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100441}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200442#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200445MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100446static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
447 const unsigned char *buf,
448 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200449{
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 if (len != 0) {
451 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
452 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
453 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
454 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200455 }
456
457 ((void) buf);
458
Gilles Peskine449bd832023-01-11 14:50:10 +0100459 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200461 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200462
Gilles Peskine449bd832023-01-11 14:50:10 +0100463 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200464}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200465#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200468MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100469static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
470 unsigned char *buf,
471 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200472{
Janos Follath865b3eb2019-12-16 11:46:15 +0000473 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200474 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200475
Gilles Peskine449bd832023-01-11 14:50:10 +0100476 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 if (ssl->conf->f_ticket_parse == NULL ||
479 ssl->conf->f_ticket_write == NULL) {
480 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200481 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200482
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200483 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200484 ssl->handshake->new_session_ticket = 1;
485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200487
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 if (len == 0) {
489 return 0;
490 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200492#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
494 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
495 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200496 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200498
499 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200500 * Failures are ok: just ignore the ticket and proceed.
501 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
503 buf, len)) != 0) {
504 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200505
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
507 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
508 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
509 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
510 } else {
511 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
512 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200513
Gilles Peskine449bd832023-01-11 14:50:10 +0100514 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200515 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200516
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200517 /*
518 * Keep the session ID sent by the client, since we MUST send it back to
519 * inform them we're accepting the ticket (RFC 5077 section 3.4)
520 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200521 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100522 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200523
Gilles Peskine449bd832023-01-11 14:50:10 +0100524 mbedtls_ssl_session_free(ssl->session_negotiate);
525 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200526
527 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100528 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200529
Gilles Peskine449bd832023-01-11 14:50:10 +0100530 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200531
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200532 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200533
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200534 /* Don't send a new ticket after all, this one is OK */
535 ssl->handshake->new_session_ticket = 0;
536
Gilles Peskine449bd832023-01-11 14:50:10 +0100537 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200538}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200540
Johan Pascalb62bb512015-12-03 21:56:45 +0100541#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200542MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100543static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
544 const unsigned char *buf,
545 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100546{
Johan Pascal43f94902020-09-22 12:25:52 +0200547 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200549 size_t profile_length;
550 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200551 /*! 2 bytes for profile length and 1 byte for mki len */
552 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100553
554 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
556 (ssl->conf->dtls_srtp_profile_list == NULL) ||
557 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
558 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200559 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100560
561 /* RFC5764 section 4.1.1
562 * uint8 SRTPProtectionProfile[2];
563 *
564 * struct {
565 * SRTPProtectionProfiles SRTPProtectionProfiles;
566 * opaque srtp_mki<0..255>;
567 * } UseSRTPData;
568
569 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100570 */
571
Ron Eldoref72faf2018-07-12 11:54:20 +0300572 /*
573 * Min length is 5: at least one protection profile(2 bytes)
574 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200575 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200576 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300577 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 if (len < size_of_lengths) {
579 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
580 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
581 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200582 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100583
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200585
Ron Eldoref72faf2018-07-12 11:54:20 +0300586 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100587 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200588 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200589
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200590 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 if (profile_length > len - size_of_lengths ||
592 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
593 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
594 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
595 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200596 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300597 /*
598 * parse the extension list values are defined in
599 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
600 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200602 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100604
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
606 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
607 mbedtls_ssl_get_srtp_profile_as_string(
608 client_protection)));
609 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200610 continue;
611 }
Ron Eldor591f1622018-01-22 12:30:04 +0200612 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
614 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200615 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
617 mbedtls_ssl_get_srtp_profile_as_string(
618 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200619 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100620 }
621 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100622 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200623 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100624 }
Ron Eldor591f1622018-01-22 12:30:04 +0200625 }
Johan Pascal042d4562020-08-25 12:14:02 +0200626 buf += profile_length; /* buf points to the mki length */
627 mki_length = *buf;
628 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200629
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
631 mki_length + profile_length + size_of_lengths != len) {
632 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
633 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
634 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200635 }
636
637 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100638 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
639 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200640 ssl->dtls_srtp_info.mki_len = mki_length;
641
Gilles Peskine449bd832023-01-11 14:50:10 +0100642 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300643
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
645 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100646 }
647
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100649}
650#endif /* MBEDTLS_SSL_DTLS_SRTP */
651
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100652/*
653 * Auxiliary functions for ServerHello parsing and related actions
654 */
655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100657/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100658 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100659 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200660#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200661MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100662static int ssl_check_key_curve(mbedtls_pk_context *pk,
663 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100664{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100665 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100666 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100667 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100668
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 while (*curr_tls_id != 0) {
670 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
671 if (curr_grp_id == grp_id) {
672 return 0;
673 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100674 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100675 }
676
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100678}
Valerio Settie9646ec2023-08-02 20:02:28 +0200679#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100680
681/*
682 * Try picking a certificate for this ciphersuite,
683 * return 0 on success and -1 on failure.
684 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200685MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100686static int ssl_pick_cert(mbedtls_ssl_context *ssl,
687 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100688{
Glenn Strauss041a3762022-03-15 06:08:29 -0400689 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200690#if defined(MBEDTLS_USE_PSA_CRYPTO)
691 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100692 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200693 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100694 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200695#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100696 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100697 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200698#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200699 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100703 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100704 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100705#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100706 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100707
David Horstmann3a334c22022-10-25 10:53:44 +0100708 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200709#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100710 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200711#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100712 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200713#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 if (pk_alg_is_none) {
715 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200716 }
717
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
719
720 if (list == NULL) {
721 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
722 return -1;
723 }
724
725 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400726 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100727 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
728 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000729
David Horstmann3a334c22022-10-25 10:53:44 +0100730 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200731#if defined(MBEDTLS_USE_PSA_CRYPTO)
732#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100733 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
734 ssl->conf->f_async_decrypt_start != NULL ||
735 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
736 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200737#else
David Horstmann3a334c22022-10-25 10:53:44 +0100738 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200740#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
741#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200743#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100744 if (!key_type_matches) {
745 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100746 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000747 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100748
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200749 /*
750 * This avoids sending the client a cert it'll reject based on
751 * keyUsage or other extensions.
752 *
753 * It also allows the user to provision different certificates for
754 * different uses based on keyUsage, eg if they want to avoid signing
755 * and decrypting with the same RSA key.
756 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200758 MBEDTLS_SSL_IS_CLIENT,
759 MBEDTLS_SSL_VERSION_TLS1_2,
760 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100761 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
762 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200763 continue;
764 }
765
Valerio Settie9646ec2023-08-02 20:02:28 +0200766#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 if (pk_alg == MBEDTLS_PK_ECDSA &&
768 ssl_check_key_curve(&cur->cert->pk,
769 ssl->handshake->curves_tls_id) != 0) {
770 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100771 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000772 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100773#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100774
775 /* If we get there, we got a winner */
776 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100777 }
778
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200779 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100781 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
783 ssl->handshake->key_cert->cert);
784 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100785 }
786
Gilles Peskine449bd832023-01-11 14:50:10 +0100787 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100788}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200789#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100790
791/*
792 * Check if a given ciphersuite is suitable for use with our config/keys/etc
793 * Sets ciphersuite_info only if the suite matches.
794 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200795MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100796static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
797 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100798{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200799 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100800
Jerry Yue7541932022-01-28 10:21:24 +0800801#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100802 mbedtls_pk_type_t sig_type;
803#endif
804
Gilles Peskine449bd832023-01-11 14:50:10 +0100805 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
806 if (suite_info == NULL) {
807 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
808 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100809 }
810
Gilles Peskine449bd832023-01-11 14:50:10 +0100811 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
812 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 if (suite_info->min_tls_version > ssl->tls_version ||
815 suite_info->max_tls_version < ssl->tls_version) {
816 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
817 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000818 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100819
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200820#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
822 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
823 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
824 "not configured or ext missing"));
825 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200826 }
827#endif
828
829
Valerio Setti60d3b912023-07-25 10:43:53 +0200830#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200831 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
833 (ssl->handshake->curves_tls_id == NULL ||
834 ssl->handshake->curves_tls_id[0] == 0)) {
835 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
836 "no common elliptic curve"));
837 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000838 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100839#endif
840
Gilles Peskineeccd8882020-03-10 12:19:08 +0100841#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100842 /* If the ciphersuite requires a pre-shared key and we don't
843 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100844 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
845 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
846 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
847 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000848 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100849#endif
850
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200851#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100852 /*
853 * Final check: if ciphersuite requires us to have a
854 * certificate/key of a particular type:
855 * - select the appropriate certificate if we have one, or
856 * - try the next ciphersuite if we don't
857 * This must be done last since we modify the key_cert list.
858 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100859 if (ssl_pick_cert(ssl, suite_info) != 0) {
860 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
861 "no suitable certificate"));
862 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000863 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100864#endif
865
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200866#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
867 /* If the ciphersuite requires signing, check whether
868 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100869 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
870 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200871 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
873 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
874 "for signature algorithm %u", (unsigned) sig_type));
875 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200876 }
877
878#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
879
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100880 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100882}
883
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200884/* This function doesn't alert on errors that happen early during
885 ClientHello parsing because they might indicate that the client is
886 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200887MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100888static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000889{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100890 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200891 size_t i, j;
892 size_t ciph_offset, comp_offset, ext_offset;
893 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200894#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200895 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100896#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000897 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200898#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000899 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100900#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000901 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200902 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000904
Hanno Becker7e5437a2017-04-28 17:15:26 +0100905 /* If there is no signature-algorithm extension present,
906 * we need to fall back to the default values for allowed
907 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800908#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100909 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800910#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100911
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000913
David Horstmanne0af39a2022-10-06 18:19:18 +0100914 int renegotiating;
915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200916#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200917read_record_header:
918#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100919 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100921 * otherwise read it ourselves manually in order to support SSLv2
922 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100923 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
924 * ClientHello has been already fully fetched by the TLS 1.3 code and the
925 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100926 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100927 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100930#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100931 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100932 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200933 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
935 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000936 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000937 }
938
939 buf = ssl->in_hdr;
940
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000942
Paul Bakkerec636f32012-09-09 19:17:02 +0000943 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100944 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000945 *
946 * Record layer:
947 * 0 . 0 message type
948 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200949 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000950 * 3 . 4 message length
951 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
953 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100954
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
956 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
957 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100958 }
959
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000961 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100962
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
964 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100965
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200966 /* For DTLS if this is the initial handshake, remember the client sequence
967 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200968#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970#if defined(MBEDTLS_SSL_RENEGOTIATION)
971 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000972#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200974 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
976 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
977 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200978 }
979
Gilles Peskine449bd832023-01-11 14:50:10 +0100980 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
981 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100984 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
985 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200986 ssl->next_record_offset = 0;
987 ssl->in_left = 0;
988 goto read_record_header;
989 }
990
991 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100992 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200993#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200994 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200995#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200996
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000997 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000998
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200999#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001002 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001003 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001004#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001005 {
Ronald Cron6291b232023-03-08 15:51:25 +01001006 if (ssl->keep_current_message) {
1007 ssl->keep_current_message = 0;
1008 } else {
1009 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1010 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1011 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1012 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001013
Ronald Cron6291b232023-03-08 15:51:25 +01001014 if ((ret = mbedtls_ssl_fetch_input(ssl,
1015 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1016 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1017 return ret;
1018 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001019
Ronald Cron6291b232023-03-08 15:51:25 +01001020 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001022 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1023 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1024 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001025#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001026 ssl->in_left = 0;
1027 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001028 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001029
1030 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001031
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001033
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001034 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1035 if (0 != ret) {
1036 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1037 return ret;
1038 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001039
1040 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001041 * Handshake layer:
1042 * 0 . 0 handshake type
1043 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001044 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001045 * 6 . 8 DTLS only: fragment offset
1046 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001047 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001048 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1049 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1050 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001051 }
1052
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001054
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1056 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1057 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001058 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001059 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1061 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1062 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001063
1064 /* The record layer has a record size limit of 2^14 - 1 and
1065 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001066 if (buf[1] != 0) {
1067 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1068 (unsigned) buf[1]));
1069 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001070 }
1071
1072 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1074 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1075 (unsigned) msg_len,
1076 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1077 (unsigned) handshake_len));
1078 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001079 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001080 }
1081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001084 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001085 * Copy the client's handshake message_seq on initial handshakes,
1086 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001087 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001089 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001090 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001091 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1093 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1094 "%u (expected %u)", cli_msg_seq,
1095 ssl->handshake->in_msg_seq));
1096 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001097 }
1098
1099 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001101#endif
1102 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001103 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001104 ssl->handshake->out_msg_seq = cli_msg_seq;
1105 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1106 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001107 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001108 /*
1109 * For now we don't support fragmentation, so make sure
1110 * fragment_offset == 0 and fragment_length == length
1111 */
1112 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001113 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1114 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1115 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001116 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001117 4, ("fragment_offset=%u fragment_length=%u length=%u",
1118 (unsigned) fragment_offset, (unsigned) fragment_length,
1119 (unsigned) length));
1120 if (fragment_offset != 0 || length != fragment_length) {
1121 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1122 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001123 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001124 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001125 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001126#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001127
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 buf += mbedtls_ssl_hs_hdr_len(ssl);
1129 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001130
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001131 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001132 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001133 * 0 . 1 protocol version
1134 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001135 * 34 . 34 session id length (1 byte)
1136 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001137 * 35+x . 35+x DTLS only: cookie length (1 byte)
1138 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001139 * .. . .. ciphersuite list length (2 bytes)
1140 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001141 * .. . .. compression alg. list length (1 byte)
1142 * .. . .. compression alg. list
1143 * .. . .. extensions length (2 bytes, optional)
1144 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001145 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001146
1147 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001148 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001149 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1150 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001151 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001152 if (msg_len < 38) {
1153 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1154 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001155 }
1156
1157 /*
1158 * Check and save the protocol version
1159 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001161
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001162 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1163 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001164 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001165 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001166
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1168 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1169 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1170 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1171 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001172 }
1173
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001174 /*
1175 * Save client random (inc. Unix time)
1176 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001178
Gilles Peskine449bd832023-01-11 14:50:10 +01001179 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001180
1181 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001182 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001183 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001184 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001185
Gilles Peskine449bd832023-01-11 14:50:10 +01001186 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1187 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1188 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1189 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1190 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1191 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001192 }
1193
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001195
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001196 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001197 memset(ssl->session_negotiate->id, 0,
1198 sizeof(ssl->session_negotiate->id));
1199 memcpy(ssl->session_negotiate->id, buf + 35,
1200 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001201
1202 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001203 * Check the cookie length and content
1204 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001206 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001207 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001208 cookie_len = buf[cookie_offset];
1209
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1211 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1212 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1213 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1214 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001215 }
1216
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1218 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001220#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222#if defined(MBEDTLS_SSL_RENEGOTIATION)
1223 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001224#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 ) {
1226 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1227 buf + cookie_offset + 1, cookie_len,
1228 ssl->cli_id, ssl->cli_id_len) != 0) {
1229 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001230 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 } else {
1232 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001233 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001234 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001237 {
1238 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001240 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001241 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1242 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001243 }
1244
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001246 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001247
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 /*
1249 * Check the ciphersuitelist length (will be parsed later)
1250 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001251 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001255
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001256 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001259 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 (ciph_len % 2) != 0) {
1261 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1262 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1263 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1264 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001265 }
1266
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1268 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001269
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001270 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001271 * Check the compression algorithm's length.
1272 * The list contents are ignored because implementing
1273 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1274 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001275 */
1276 comp_offset = ciph_offset + 2 + ciph_len;
1277
1278 comp_len = buf[comp_offset];
1279
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001281 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001282 comp_len + comp_offset + 1 > msg_len) {
1283 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1284 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1285 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1286 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001287 }
1288
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1290 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001291
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 /*
1293 * Check the extension length
1294 */
1295 ext_offset = comp_offset + 1 + comp_len;
1296 if (msg_len > ext_offset) {
1297 if (msg_len < ext_offset + 2) {
1298 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1299 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1300 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1301 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001302 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001303
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001304 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001305
Gilles Peskine449bd832023-01-11 14:50:10 +01001306 if (msg_len != ext_offset + 2 + ext_len) {
1307 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1308 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1309 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1310 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1311 }
1312 } else {
1313 ext_len = 0;
1314 }
Paul Bakker48916f92012-09-16 19:57:18 +00001315
Gilles Peskine449bd832023-01-11 14:50:10 +01001316 ext = buf + ext_offset + 2;
1317 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1318
1319 while (ext_len != 0) {
1320 unsigned int ext_id;
1321 unsigned int ext_size;
1322 if (ext_len < 4) {
1323 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1324 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1325 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1326 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1327 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001328 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1329 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001330
1331 if (ext_size + 4 > ext_len) {
1332 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1333 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1334 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1335 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1336 }
1337 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001339 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001340 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1341 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1342 ext + 4 + ext_size);
1343 if (ret != 0) {
1344 return ret;
1345 }
Simon Butcher584a5472016-05-23 16:24:52 +01001346 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001347#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001348
Simon Butcher584a5472016-05-23 16:24:52 +01001349 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001351#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001352 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001353#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001354
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1356 if (ret != 0) {
1357 return ret;
1358 }
Simon Butcher584a5472016-05-23 16:24:52 +01001359 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001360
Jerry Yue7541932022-01-28 10:21:24 +08001361#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001362 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1366 if (ret != 0) {
1367 return ret;
1368 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001369
1370 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001371 break;
Jerry Yue7541932022-01-28 10:21:24 +08001372#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001373
Valerio Setti60d3b912023-07-25 10:43:53 +02001374#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001375 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001377 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001378 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001379
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1381 if (ret != 0) {
1382 return ret;
1383 }
Simon Butcher584a5472016-05-23 16:24:52 +01001384 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001385
Simon Butcher584a5472016-05-23 16:24:52 +01001386 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001388 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001389
Gilles Peskine449bd832023-01-11 14:50:10 +01001390 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1391 if (ret != 0) {
1392 return ret;
1393 }
Simon Butcher584a5472016-05-23 16:24:52 +01001394 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001395#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001396 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001397 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001398
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001399#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001400 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001402
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1404 if (ret != 0) {
1405 return ret;
1406 }
Simon Butcher584a5472016-05-23 16:24:52 +01001407 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001408#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001410#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001411 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001413
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1415 if (ret != 0) {
1416 return ret;
1417 }
Simon Butcher584a5472016-05-23 16:24:52 +01001418 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001420
Hanno Beckera0e20d02019-05-15 14:03:01 +01001421#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001422 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1426 if (ret != 0) {
1427 return ret;
1428 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001429 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001430#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001432#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001433 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001434 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001435
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1437 if (ret != 0) {
1438 return ret;
1439 }
Simon Butcher584a5472016-05-23 16:24:52 +01001440 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001444 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001446
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1448 if (ret != 0) {
1449 return ret;
1450 }
Simon Butcher584a5472016-05-23 16:24:52 +01001451 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001455 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001457
Gilles Peskine449bd832023-01-11 14:50:10 +01001458 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1459 if (ret != 0) {
1460 return ret;
1461 }
Simon Butcher584a5472016-05-23 16:24:52 +01001462 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001464
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001465#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001466 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001467 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001468
Gilles Peskine449bd832023-01-11 14:50:10 +01001469 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1470 ext + 4 + ext_size);
1471 if (ret != 0) {
1472 return ret;
1473 }
Simon Butcher584a5472016-05-23 16:24:52 +01001474 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001475#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001476
Johan Pascalb62bb512015-12-03 21:56:45 +01001477#if defined(MBEDTLS_SSL_DTLS_SRTP)
1478 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001479 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001480
Gilles Peskine449bd832023-01-11 14:50:10 +01001481 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1482 if (ret != 0) {
1483 return ret;
1484 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001485 break;
1486#endif /* MBEDTLS_SSL_DTLS_SRTP */
1487
Simon Butcher584a5472016-05-23 16:24:52 +01001488 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1490 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001491 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001492
Gilles Peskine449bd832023-01-11 14:50:10 +01001493 ext_len -= 4 + ext_size;
1494 ext += 4 + ext_size;
1495 }
1496
Jerry Yue7541932022-01-28 10:21:24 +08001497#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001498
1499 /*
1500 * Try to fall back to default hash SHA1 if the client
1501 * hasn't provided any preferred signature-hash combinations.
1502 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001503 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001504 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1505 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001506#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001507 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1508 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001509#endif
1510#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001511 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1512 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001513#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001514 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001515 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001516
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001517 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1518 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1519 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001520
Gilles Peskine449bd832023-01-11 14:50:10 +01001521 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001522 }
1523
Jerry Yue7541932022-01-28 10:21:24 +08001524#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001525
Paul Bakker48916f92012-09-16 19:57:18 +00001526 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001527 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1528 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001529 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1530 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1531 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001532#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1534 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1535 "during renegotiation"));
1536 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1537 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1538 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001539 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001540#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001541 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001542 break;
1543 }
1544 }
1545
1546 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001547 * Renegotiation security checks
1548 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001549 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1550 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1551 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001552 handshake_failure = 1;
1553 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001556 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001557 renegotiation_info_seen == 0) {
1558 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001559 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001560 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1561 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1562 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1563 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001564 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1566 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1567 renegotiation_info_seen == 1) {
1568 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001569 handshake_failure = 1;
1570 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001571#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001572
Gilles Peskine449bd832023-01-11 14:50:10 +01001573 if (handshake_failure == 1) {
1574 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1575 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1576 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001577 }
Paul Bakker380da532012-04-18 16:10:25 +00001578
Paul Bakker41c83d32013-03-20 14:39:14 +01001579 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001580 * Server certification selection (after processing TLS extensions)
1581 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001582 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1583 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1584 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001585 }
Glenn Strauss69894072022-01-24 12:58:00 -05001586#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1587 ssl->handshake->sni_name = NULL;
1588 ssl->handshake->sni_name_len = 0;
1589#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001590
1591 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001592 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001593 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001594 * and certificate from the SNI callback triggered by the SNI extension
1595 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001596 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001597 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001598 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001599 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001600
Gilles Peskine449bd832023-01-11 14:50:10 +01001601 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1602 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1603 for (i = 0; ciphersuites[i] != 0; i++) {
1604 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001605 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001607
TRodziewicz8476f2f2021-06-02 14:34:47 +02001608 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001609
Gilles Peskine449bd832023-01-11 14:50:10 +01001610 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1611 &ciphersuite_info)) != 0) {
1612 return ret;
1613 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001614
Gilles Peskine449bd832023-01-11 14:50:10 +01001615 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001616 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001617 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001618 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001620 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001621 for (i = 0; ciphersuites[i] != 0; i++) {
1622 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1623 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001624 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001626
1627 got_common_suite = 1;
1628
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1630 &ciphersuite_info)) != 0) {
1631 return ret;
1632 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001633
Gilles Peskine449bd832023-01-11 14:50:10 +01001634 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001635 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001636 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001637 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001638 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001639 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001640
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 if (got_common_suite) {
1642 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1643 "but none of them usable"));
1644 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1645 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1646 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1647 } else {
1648 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1649 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1650 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1651 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001652 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001653
1654have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001655 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001656
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001657 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001658 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001659
Paul Bakker5121ce52009-01-03 21:22:43 +00001660 ssl->state++;
1661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001662#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001663 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1664 mbedtls_ssl_recv_flight_completed(ssl);
1665 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001666#endif
1667
Hanno Becker7e5437a2017-04-28 17:15:26 +01001668 /* Debugging-only output for testsuite */
1669#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001670 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001671 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1672 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001673 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001674 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1675 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1676 sig_hash));
1677 } else {
1678 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1679 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001680 }
1681#endif
1682
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001684
Gilles Peskine449bd832023-01-11 14:50:10 +01001685 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001686}
1687
Hanno Beckera0e20d02019-05-15 14:03:01 +01001688#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001689static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1690 unsigned char *buf,
1691 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001692{
1693 unsigned char *p = buf;
1694 size_t ext_len;
1695 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1696
1697 *olen = 0;
1698
1699 /* Skip writing the extension if we don't want to use it or if
1700 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001702 return;
1703 }
1704
Gilles Peskine449bd832023-01-11 14:50:10 +01001705 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1706 * which is at most 255, so the increment cannot overflow. */
1707 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1708 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1709 return;
1710 }
1711
1712 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001713
1714 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001715 * struct {
1716 * opaque cid<0..2^8-1>;
1717 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001718 */
1719 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001720 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001721 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001722 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001723 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001724
1725 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001726 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001727
1728 *olen = ssl->own_cid_len + 5;
1729}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001730#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001731
Neil Armstrong76b74072022-04-06 13:43:54 +02001732#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001733static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1734 unsigned char *buf,
1735 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001736{
1737 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001738 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001739
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001740 /*
1741 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1742 * from a client and then selects a stream or Authenticated Encryption
1743 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1744 * encrypt-then-MAC response extension back to the client."
1745 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001746 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001747 ssl->session_negotiate->ciphersuite);
1748 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001749 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001750 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001751 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001752 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001753 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001755
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001757 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001758 }
Ronald Cron862902d2022-03-24 14:15:28 +01001759 }
1760
Gilles Peskine449bd832023-01-11 14:50:10 +01001761 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001762 *olen = 0;
1763 return;
1764 }
1765
Gilles Peskine449bd832023-01-11 14:50:10 +01001766 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001767
Gilles Peskine449bd832023-01-11 14:50:10 +01001768 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001769 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001770
1771 *p++ = 0x00;
1772 *p++ = 0x00;
1773
1774 *olen = 4;
1775}
Neil Armstrong76b74072022-04-06 13:43:54 +02001776#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001777
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001778#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001779static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1780 unsigned char *buf,
1781 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001782{
1783 unsigned char *p = buf;
1784
Gilles Peskine449bd832023-01-11 14:50:10 +01001785 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001786 *olen = 0;
1787 return;
1788 }
1789
Gilles Peskine449bd832023-01-11 14:50:10 +01001790 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1791 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001792
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001794 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001795
1796 *p++ = 0x00;
1797 *p++ = 0x00;
1798
1799 *olen = 4;
1800}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001803#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001804static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1805 unsigned char *buf,
1806 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001807{
1808 unsigned char *p = buf;
1809
Gilles Peskine449bd832023-01-11 14:50:10 +01001810 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001811 *olen = 0;
1812 return;
1813 }
1814
Gilles Peskine449bd832023-01-11 14:50:10 +01001815 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001816
Gilles Peskine449bd832023-01-11 14:50:10 +01001817 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001818 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001819
1820 *p++ = 0x00;
1821 *p++ = 0x00;
1822
1823 *olen = 4;
1824}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001825#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001826
Gilles Peskine449bd832023-01-11 14:50:10 +01001827static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1828 unsigned char *buf,
1829 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001830{
1831 unsigned char *p = buf;
1832
Gilles Peskine449bd832023-01-11 14:50:10 +01001833 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001834 *olen = 0;
1835 return;
1836 }
1837
Gilles Peskine449bd832023-01-11 14:50:10 +01001838 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001839
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001841 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001843#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001845 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001846 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001847 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001848
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001850 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001851 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001852 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001853 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001854#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001855 {
1856 *p++ = 0x00;
1857 *p++ = 0x01;
1858 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001859 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001860
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001861 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001862}
1863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001865static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1866 unsigned char *buf,
1867 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001868{
1869 unsigned char *p = buf;
1870
Gilles Peskine449bd832023-01-11 14:50:10 +01001871 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001872 *olen = 0;
1873 return;
1874 }
1875
Gilles Peskine449bd832023-01-11 14:50:10 +01001876 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001877
Gilles Peskine449bd832023-01-11 14:50:10 +01001878 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001879 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001880
1881 *p++ = 0x00;
1882 *p++ = 1;
1883
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001884 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001885
1886 *olen = 5;
1887}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001888#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001889
Valerio Setti7aeec542023-07-05 18:57:21 +02001890#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001891 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001892 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001893static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1894 unsigned char *buf,
1895 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001896{
1897 unsigned char *p = buf;
1898 ((void) ssl);
1899
Gilles Peskine449bd832023-01-11 14:50:10 +01001900 if ((ssl->handshake->cli_exts &
1901 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001902 *olen = 0;
1903 return;
1904 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001905
Gilles Peskine449bd832023-01-11 14:50:10 +01001906 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001907
Gilles Peskine449bd832023-01-11 14:50:10 +01001908 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001909 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001910
1911 *p++ = 0x00;
1912 *p++ = 2;
1913
1914 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001915 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001916
1917 *olen = 6;
1918}
Valerio Setti45d56f32023-07-13 17:23:20 +02001919#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001920 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001921 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001922
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001923#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001924static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1925 unsigned char *buf,
1926 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001927{
Janos Follath865b3eb2019-12-16 11:46:15 +00001928 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001929 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001930 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001931 size_t kkpp_len;
1932
1933 *olen = 0;
1934
1935 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001936 if (ssl->handshake->ciphersuite_info->key_exchange !=
1937 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001938 return;
1939 }
1940
Gilles Peskine449bd832023-01-11 14:50:10 +01001941 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1942
1943 if (end - p < 4) {
1944 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1945 return;
1946 }
1947
1948 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001949 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001950
Neil Armstrongca7d5062022-05-31 14:43:23 +02001951#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001953 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 MBEDTLS_ECJPAKE_ROUND_ONE);
1955 if (ret != 0) {
1956 psa_destroy_key(ssl->handshake->psa_pake_password);
1957 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1958 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001959 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001960 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001961#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001962 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001963 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 ssl->conf->f_rng, ssl->conf->p_rng);
1965 if (ret != 0) {
1966 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001967 return;
1968 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001969#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001970
Gilles Peskine449bd832023-01-11 14:50:10 +01001971 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001972 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001973
1974 *olen = kkpp_len + 4;
1975}
1976#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1977
Gilles Peskine449bd832023-01-11 14:50:10 +01001978#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1979static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1980 unsigned char *buf,
1981 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001982{
Ron Eldor75870ec2018-12-06 17:31:55 +02001983 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001984 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001985 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1986
1987 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001988
Gilles Peskine449bd832023-01-11 14:50:10 +01001989 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1990 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001991 return;
1992 }
1993
Gilles Peskine449bd832023-01-11 14:50:10 +01001994 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001995
Gilles Peskine449bd832023-01-11 14:50:10 +01001996 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001997 mki_len = ssl->dtls_srtp_info.mki_len;
1998 }
1999
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002000 /* The extension total size is 9 bytes :
2001 * - 2 bytes for the extension tag
2002 * - 2 bytes for the total size
2003 * - 2 bytes for the protection profile length
2004 * - 2 bytes for the protection profile
2005 * - 1 byte for the mki length
2006 * + the actual mki length
2007 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 if ((size_t) (end - buf) < mki_len + 9) {
2009 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002010 return;
2011 }
2012
Johan Pascalb62bb512015-12-03 21:56:45 +01002013 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002015 /*
2016 * total length 5 and mki value: only one profile(2 bytes)
2017 * and length(2 bytes) and srtp_mki )
2018 */
Ron Eldor591f1622018-01-22 12:30:04 +02002019 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002021
2022 /* protection profile length: 2 */
2023 buf[4] = 0x00;
2024 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002025 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2027 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2028 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2029 } else {
2030 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002031 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002032 }
2033
Ron Eldor591f1622018-01-22 12:30:04 +02002034 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002035 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002036
Ron Eldor591f1622018-01-22 12:30:04 +02002037 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002038}
2039#endif /* MBEDTLS_SSL_DTLS_SRTP */
2040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002042MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002043static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002044{
Janos Follath865b3eb2019-12-16 11:46:15 +00002045 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002046 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002047 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002048
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002050
2051 /*
2052 * struct {
2053 * ProtocolVersion server_version;
2054 * opaque cookie<0..2^8-1>;
2055 * } HelloVerifyRequest;
2056 */
2057
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002058 /* The RFC is not clear on this point, but sending the actual negotiated
2059 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002060 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2061 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002062 p += 2;
2063
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002064 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002065 if (ssl->conf->f_cookie_write == NULL) {
2066 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2067 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002068 }
2069
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002070 /* Skip length byte until we know the length */
2071 cookie_len_byte = p++;
2072
Gilles Peskine449bd832023-01-11 14:50:10 +01002073 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2074 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2075 ssl->cli_id, ssl->cli_id_len)) != 0) {
2076 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2077 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002078 }
2079
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002081
Gilles Peskine449bd832023-01-11 14:50:10 +01002082 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002083
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002084 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002085 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2086 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002087
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002088 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002089
Gilles Peskine449bd832023-01-11 14:50:10 +01002090 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2091 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2092 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002093 }
2094
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002095#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002096 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2097 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2098 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2099 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002100 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002101#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002102
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002104
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002106}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002107#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002108
Gilles Peskine449bd832023-01-11 14:50:10 +01002109static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002110{
2111 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002112 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002113 mbedtls_ssl_session * const session = ssl->session_negotiate;
2114
2115 /* Resume is 0 by default, see ssl_handshake_init().
2116 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002118 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 }
2120 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002121 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 }
2123 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002124 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002126#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002128 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002130#endif
2131
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002133
Gilles Peskine449bd832023-01-11 14:50:10 +01002134 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2135 session->id,
2136 session->id_len,
2137 &session_tmp);
2138 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002139 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002140 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002141
Gilles Peskine449bd832023-01-11 14:50:10 +01002142 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002143 /* Mismatch between cached and negotiated session */
2144 goto exit;
2145 }
2146
2147 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002149 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002151
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002153 ssl->handshake->resume = 1;
2154
2155exit:
2156
Gilles Peskine449bd832023-01-11 14:50:10 +01002157 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002158}
2159
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002160MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002161static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002162{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002163#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002164 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002165#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002166 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002167 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002168 unsigned char *buf, *p;
2169
Gilles Peskine449bd832023-01-11 14:50:10 +01002170 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002171
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002172#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002173 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2174 ssl->handshake->cookie_verify_result != 0) {
2175 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2176 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002179 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002180#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002181
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 /*
2183 * 0 . 0 handshake type
2184 * 1 . 3 handshake length
2185 * 4 . 5 protocol version
2186 * 6 . 9 UNIX time()
2187 * 10 . 37 random bytes
2188 */
2189 buf = ssl->out_msg;
2190 p = buf + 4;
2191
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002193 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002194
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2196 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002198#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002199 t = mbedtls_time(NULL);
2200 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002201 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002202
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2204 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002205#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002206 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2207 return ret;
2208 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002209
2210 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002211#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002212
Ronald Cronc5649382023-04-04 15:33:42 +02002213 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 return ret;
2215 }
Ronald Cronc5649382023-04-04 15:33:42 +02002216 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002217
Ronald Cronc5649382023-04-04 15:33:42 +02002218#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2219 /*
2220 * RFC 8446
2221 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2222 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2223 * response to a ClientHello MUST set the last 8 bytes of their Random
2224 * value specially in their ServerHello.
2225 */
2226 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2227 static const unsigned char magic_tls12_downgrade_string[] =
2228 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2229
2230 MBEDTLS_STATIC_ASSERT(
2231 sizeof(magic_tls12_downgrade_string) == 8,
2232 "magic_tls12_downgrade_string does not have the expected size");
2233
Ronald Cronfe01ec22023-04-06 09:56:53 +02002234 memcpy(p, magic_tls12_downgrade_string,
2235 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002236 } else
2237#endif
2238 {
2239 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2240 return ret;
2241 }
2242 }
2243 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002244
Gilles Peskine449bd832023-01-11 14:50:10 +01002245 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002246
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002248
Gilles Peskine449bd832023-01-11 14:50:10 +01002249 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002250
Gilles Peskine449bd832023-01-11 14:50:10 +01002251 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002252 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002253 * New session, create a new session id,
2254 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002256 ssl->state++;
2257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002258#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002259 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002260#endif
2261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002262#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002263 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002264 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002265 memset(ssl->session_negotiate->id, 0, 32);
2266 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002267#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002268 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002269 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002270 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2271 n)) != 0) {
2272 return ret;
2273 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002274 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002276 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002277 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002278 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002279 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002280 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002281
Gilles Peskine449bd832023-01-11 14:50:10 +01002282 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2283 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2284 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002285 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002286 }
2287
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002288 /*
2289 * 38 . 38 session id length
2290 * 39 . 38+n session id
2291 * 39+n . 40+n chosen ciphersuite
2292 * 41+n . 41+n chosen compression alg.
2293 * 42+n . 43+n extensions length
2294 * 44+n . 43+n+m extensions
2295 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002296 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002297 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002298 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002299
Gilles Peskine449bd832023-01-11 14:50:10 +01002300 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2301 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2302 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2303 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002304
Gilles Peskine449bd832023-01-11 14:50:10 +01002305 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002306 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002308
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2310 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2311 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2312 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002313
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002314 /*
2315 * First write extensions, then the total length
2316 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002317 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002318 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002319
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002320#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002321 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002322 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002323#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002324
Hanno Beckera0e20d02019-05-15 14:03:01 +01002325#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002326 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002327 ext_len += olen;
2328#endif
2329
Neil Armstrong76b74072022-04-06 13:43:54 +02002330#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002331 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002332 ext_len += olen;
2333#endif
2334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002335#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002336 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002337 ext_len += olen;
2338#endif
2339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002340#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002342 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002343#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002344
Valerio Setti7aeec542023-07-05 18:57:21 +02002345#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002346 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002347 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002348 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002349 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2350 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2351 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002352 ext_len += olen;
2353 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002354#endif
2355
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002356#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002358 ext_len += olen;
2359#endif
2360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002361#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002362 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002363 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2364 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002365 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 }
Paul Elliottf518f812022-07-11 12:36:20 +01002367
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002368 ext_len += olen;
2369#endif
2370
Johan Pascalb62bb512015-12-03 21:56:45 +01002371#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002372 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002373 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002374#endif
2375
Gilles Peskine449bd832023-01-11 14:50:10 +01002376 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2377 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002378
Gilles Peskine449bd832023-01-11 14:50:10 +01002379 if (ext_len > 0) {
2380 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002381 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002382 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002383
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002384 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002385 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2386 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
Gilles Peskine449bd832023-01-11 14:50:10 +01002388 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002389
Gilles Peskine449bd832023-01-11 14:50:10 +01002390 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002391
Gilles Peskine449bd832023-01-11 14:50:10 +01002392 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002393}
2394
Gilles Peskineeccd8882020-03-10 12:19:08 +01002395#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002396MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002397static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002398{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002399 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002400 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002401
Gilles Peskine449bd832023-01-11 14:50:10 +01002402 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002403
Gilles Peskine449bd832023-01-11 14:50:10 +01002404 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2405 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002406 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002407 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002408 }
2409
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2411 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002412}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002413#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002414MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002415static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002416{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002417 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002418 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002419 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002420 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002421 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002422 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002423 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002424 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002425 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002428
2429 ssl->state++;
2430
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002431#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002432 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002433 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002434 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002435#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002436 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002437
Gilles Peskine449bd832023-01-11 14:50:10 +01002438 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2439 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2440 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2441 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 }
2443
2444 /*
2445 * 0 . 0 handshake type
2446 * 1 . 3 handshake length
2447 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002448 * 5 .. m-1 cert types
2449 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002450 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002451 * n .. n+1 length of all DNs
2452 * n+2 .. n+3 length of DN 1
2453 * n+4 .. ... Distinguished Name #1
2454 * ... .. ... length of DN 2, etc.
2455 */
2456 buf = ssl->out_msg;
2457 p = buf + 4;
2458
2459 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002460 * Supported certificate types
2461 *
2462 * ClientCertificateType certificate_types<1..2^8-1>;
2463 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002464 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002465 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002467#if defined(MBEDTLS_RSA_C)
2468 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002469#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002470#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002471 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002472#endif
2473
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002474 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002475 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002476
Paul Bakker577e0062013-08-28 11:57:20 +02002477 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002478
Paul Bakker926af752012-11-23 13:38:07 +01002479 /*
2480 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002481 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002482 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2483 *
2484 * struct {
2485 * HashAlgorithm hash;
2486 * SignatureAlgorithm signature;
2487 * } SignatureAndHashAlgorithm;
2488 *
2489 * enum { (255) } HashAlgorithm;
2490 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002491 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002492 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2493 if (sig_alg == NULL) {
2494 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2495 }
Ronald Cron8457c122022-03-07 11:32:54 +01002496
Gilles Peskine449bd832023-01-11 14:50:10 +01002497 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2498 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002499
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002501 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002502 }
2503 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002504 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 }
Simon Butcher99000142016-10-13 17:21:01 +01002506
Paul Elliott96a0fd92022-11-08 17:09:56 +00002507 /* Write elements at offsets starting from 1 (offset 0 is for the
2508 * length). Thus the offset of each element is the length of the
2509 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002510 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002511 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002512
Paul Bakker926af752012-11-23 13:38:07 +01002513 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002514
Paul Elliott96a0fd92022-11-08 17:09:56 +00002515 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002516 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002517 sa_len += 2;
2518 p += sa_len;
2519
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002520 /*
2521 * DistinguishedName certificate_authorities<0..2^16-1>;
2522 * opaque DistinguishedName<1..2^16-1>;
2523 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002524 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002525
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002526 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002527
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002529 /* NOTE: If trusted certificates are provisioned
2530 * via a CA callback (configured through
2531 * `mbedtls_ssl_conf_ca_cb()`, then the
2532 * CertificateRequest is currently left empty. */
2533
Glenn Strauss999ef702022-03-11 01:37:23 -05002534#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2535#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002537 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002538 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002539#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002540 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002541 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002542 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002543#endif
Janos Follath088ce432017-04-10 12:42:31 +01002544#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002545 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002546 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002547 } else
Janos Follath088ce432017-04-10 12:42:31 +01002548#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002549 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002550
Gilles Peskine449bd832023-01-11 14:50:10 +01002551 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002552 /* It follows from RFC 5280 A.1 that this length
2553 * can be represented in at most 11 bits. */
2554 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002555
Gilles Peskine449bd832023-01-11 14:50:10 +01002556 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2557 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002558 break;
2559 }
2560
Gilles Peskine449bd832023-01-11 14:50:10 +01002561 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002562 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002564 p += dn_size;
2565
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002567
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002568 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002569 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002570 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002571 }
2572
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002573 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002574 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2575 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002576 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002577
Gilles Peskine449bd832023-01-11 14:50:10 +01002578 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002579
Gilles Peskine449bd832023-01-11 14:50:10 +01002580 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002581
Gilles Peskine449bd832023-01-11 14:50:10 +01002582 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002583}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002584#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002585
Valerio Setti4d0e8462023-10-06 13:20:21 +02002586#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002587 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002588#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002589MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002590static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002591{
2592 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2593 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002594 mbedtls_pk_context *pk;
2595 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002596 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002597 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2598 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002599#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002600 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002601 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002602 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002603 mbedtls_ecp_keypair *key;
2604#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002605
Gilles Peskine449bd832023-01-11 14:50:10 +01002606 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002607
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 if (pk == NULL) {
2609 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2610 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002611
Valerio Setti0813b6f2023-06-16 12:18:53 +02002612 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002613
Valerio Setti0813b6f2023-06-16 12:18:53 +02002614 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002615 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002616#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2617 case MBEDTLS_PK_ECKEY:
2618 case MBEDTLS_PK_ECKEY_DH:
2619 case MBEDTLS_PK_ECDSA:
2620#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002621 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2622 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2623 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002624
Valerio Settibced8bc2023-12-06 10:40:47 +01002625 /* Get the attributes of the key previously parsed by PK module in
2626 * order to extract its type and length (in bits). */
2627 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002628 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002629 ret = PSA_TO_MBEDTLS_ERR(status);
2630 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002631 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002632 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002633 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002634
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002635#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2636 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002637 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2638 * module and only have ECDSA capabilities. Since we need
2639 * them for ECDH later, we export and then re-import them with
2640 * proper flags and algorithm. Of course We also set key's type
2641 * and bits that we just got above. */
2642 key_attributes = psa_key_attributes_init();
2643 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2644 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2645 psa_set_key_type(&key_attributes,
2646 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2647 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002648
Valerio Setti202bb712023-12-06 17:05:24 +01002649 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2650 if (status != PSA_SUCCESS) {
2651 ret = PSA_TO_MBEDTLS_ERR(status);
2652 goto exit;
2653 }
2654 status = psa_import_key(&key_attributes, buf, key_len,
2655 &ssl->handshake->xxdh_psa_privkey);
2656 if (status != PSA_SUCCESS) {
2657 ret = PSA_TO_MBEDTLS_ERR(status);
2658 goto exit;
2659 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002660
Valerio Setti202bb712023-12-06 17:05:24 +01002661 /* Set this key as owned by the TLS library: it will be its duty
2662 * to clear it exit. */
2663 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002664
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002665 ret = 0;
2666 break;
2667 }
2668#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2669
2670 /* Opaque key is created by the user (externally from Mbed TLS)
2671 * so we assume it already has the right algorithm and flags
2672 * set. Just copy its ID as reference. */
2673 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2674 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002675 ret = 0;
2676 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002677
Valerio Setti0813b6f2023-06-16 12:18:53 +02002678#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002679 case MBEDTLS_PK_ECKEY:
2680 case MBEDTLS_PK_ECKEY_DH:
2681 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002682 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002683 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002684 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002685 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2686 }
Valerio Setti97207782023-05-18 18:59:06 +02002687 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 if (tls_id == 0) {
2689 /* This elliptic curve is not supported */
2690 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2691 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002692
Gilles Peskine449bd832023-01-11 14:50:10 +01002693 /* If the above conversion to TLS ID was fine, then also this one will
2694 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002695 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002696 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002697
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002698 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002699
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 key_attributes = psa_key_attributes_init();
2701 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2702 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2703 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002704 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002705 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002706
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002707 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002708 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002709 mbedtls_platform_zeroize(buf, sizeof(buf));
2710 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002711 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002712
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002714 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002715 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002716 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002717 mbedtls_platform_zeroize(buf, sizeof(buf));
2718 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002719 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002720
Valerio Setti6835b4a2023-06-22 09:06:31 +02002721 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 ret = 0;
2723 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002724#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002725 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002726 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002727 }
2728
Valerio Settibced8bc2023-12-06 10:40:47 +01002729exit:
2730 psa_reset_key_attributes(&key_attributes);
2731 mbedtls_platform_zeroize(buf, sizeof(buf));
2732
Gilles Peskine449bd832023-01-11 14:50:10 +01002733 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002734}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002735#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002736MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002737static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002738{
Janos Follath865b3eb2019-12-16 11:46:15 +00002739 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002740
Gilles Peskine449bd832023-01-11 14:50:10 +01002741 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2742 if (private_key == NULL) {
2743 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2744 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002745 }
2746
Gilles Peskine449bd832023-01-11 14:50:10 +01002747 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2748 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2749 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002750 }
2751
Gilles Peskine449bd832023-01-11 14:50:10 +01002752 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002753 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002754 MBEDTLS_ECDH_OURS)) != 0) {
2755 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2756 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002757 }
2758
Gilles Peskine449bd832023-01-11 14:50:10 +01002759 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002760}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002761#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002762#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2763 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002764
Gilles Peskineeccd8882020-03-10 12:19:08 +01002765#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002766 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002767MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002768static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2769 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002770{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002771 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2772 * signature length which will be added in ssl_write_server_key_exchange
2773 * after the call to ssl_prepare_server_key_exchange.
2774 * ssl_write_server_key_exchange also takes care of incrementing
2775 * ssl->out_msglen. */
2776 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002777 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2778 - sig_start);
2779 int ret = ssl->conf->f_async_resume(ssl,
2780 sig_start, signature_len, sig_max_len);
2781 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002782 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002783 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002784 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002785 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2786 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002787}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002788#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002789 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002790
Gilles Peskined3eb0612018-01-08 17:07:44 +01002791/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002792 * calculating the signature if any, but excluding formatting the
2793 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002794MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002795static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2796 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002797{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002798 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002799 ssl->handshake->ciphersuite_info;
2800
Gilles Peskineeccd8882020-03-10 12:19:08 +01002801#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002802#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002803 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002804#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002805#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002806
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002807 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002808#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002809 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002810#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002811
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002812#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002813#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002814 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002815#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002816 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 +02002817#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002818#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002819
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002820 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002821
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002822 /*
2823 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002824 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002825 *
2826 */
2827
2828 /*
2829 * - ECJPAKE key exchanges
2830 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002831#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002832 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002833 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002834#if defined(MBEDTLS_USE_PSA_CRYPTO)
2835 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2836 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2837 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002838 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002839 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002840
Valerio Setti6f1b5742022-11-16 10:00:32 +01002841 /*
2842 * The first 3 bytes are:
2843 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2844 * [1, 2] elliptic curve's TLS ID
2845 *
2846 * However since we only support secp256r1 for now, we hardcode its
2847 * TLS ID here
2848 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002849 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002850 MBEDTLS_ECP_DP_SECP256R1);
2851 if (tls_id == 0) {
2852 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002853 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002854 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002855 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002856 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002857
Gilles Peskine449bd832023-01-11 14:50:10 +01002858 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2859 out_p + output_offset,
2860 end_p - out_p - output_offset, &output_len,
2861 MBEDTLS_ECJPAKE_ROUND_TWO);
2862 if (ret != 0) {
2863 psa_destroy_key(ssl->handshake->psa_pake_password);
2864 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2865 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2866 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002867 }
2868
Valerio Setti02c25b52022-11-15 14:08:42 +01002869 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002870 ssl->out_msglen += output_offset;
2871#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002872 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002873
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002874 ret = mbedtls_ecjpake_write_round_two(
2875 &ssl->handshake->ecjpake_ctx,
2876 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002877 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002878 ssl->conf->f_rng, ssl->conf->p_rng);
2879 if (ret != 0) {
2880 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2881 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002882 }
2883
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002884 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002885#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002886 }
2887#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2888
Hanno Becker1aa267c2017-04-28 17:08:27 +01002889 /*
2890 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2891 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2892 * we use empty support identity hints here.
2893 **/
2894#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002895 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002896 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2897 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002898 ssl->out_msg[ssl->out_msglen++] = 0x00;
2899 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002900 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002901#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2902 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002903
Hanno Becker7e5437a2017-04-28 17:15:26 +01002904 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002905 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002906 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002907#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002908 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002909 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002910 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002911
Gilles Peskine449bd832023-01-11 14:50:10 +01002912 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2913 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2914 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002915 }
2916
Paul Bakker41c83d32013-03-20 14:39:14 +01002917 /*
2918 * Ephemeral DH parameters:
2919 *
2920 * struct {
2921 * opaque dh_p<1..2^16-1>;
2922 * opaque dh_g<1..2^16-1>;
2923 * opaque dh_Ys<1..2^16-1>;
2924 * } ServerDHParams;
2925 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002926 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2927 &ssl->conf->dhm_P,
2928 &ssl->conf->dhm_G)) != 0) {
2929 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2930 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002931 }
Paul Bakker48916f92012-09-16 19:57:18 +00002932
Gilles Peskine449bd832023-01-11 14:50:10 +01002933 if ((ret = mbedtls_dhm_make_params(
2934 &ssl->handshake->dhm_ctx,
2935 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2936 ssl->out_msg + ssl->out_msglen, &len,
2937 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2938 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2939 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002940 }
2941
Jerry Yuc5aef882021-12-23 20:15:02 +08002942#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002943 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002944#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002945
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002946 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002947
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2949 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2950 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2951 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002952 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002953#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002954
Hanno Becker1aa267c2017-04-28 17:08:27 +01002955 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002956 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002957 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002958#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002959 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002960 /*
2961 * Ephemeral ECDH parameters:
2962 *
2963 * struct {
2964 * ECParameters curve_params;
2965 * ECPoint public;
2966 * } ServerECDHParams;
2967 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002968 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002969 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002970 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002971 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002972
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002973 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2975 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2976 }
2977 for (; *group_list != 0; group_list++) {
2978 for (curr_tls_id = ssl->handshake->curves_tls_id;
2979 *curr_tls_id != 0; curr_tls_id++) {
2980 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002981 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002982 }
2983 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002984 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002985
Gilles Peskine449bd832023-01-11 14:50:10 +01002986curve_matching_done:
2987 if (*curr_tls_id == 0) {
2988 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2989 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2990 }
2991
2992 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2993 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002994
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002995#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002996 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2997 psa_key_attributes_t key_attributes;
2998 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002999 uint8_t *p = ssl->out_msg + ssl->out_msglen;
3000 const size_t header_size = 4; // curve_type(1), namedcurve(2),
3001 // data length(1)
3002 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02003003 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01003004 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003005
Gilles Peskine449bd832023-01-11 14:50:10 +01003006 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003007
Valerio Setti40d9ca92023-01-04 16:08:04 +01003008 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003009 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02003010 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01003011 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
3012 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
3013 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01003014 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003015 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02003016 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003017
3018 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01003019 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3020 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003021 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003022 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003023
3024 /*
3025 * ECParameters curve_params
3026 *
3027 * First byte is curve_type, always named_curve
3028 */
3029 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3030
3031 /*
3032 * Next two bytes are the namedcurve value
3033 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003034 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003035 p += 2;
3036
3037 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003038 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003039 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003040 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003041 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003042 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3043 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003044 }
3045
3046 /*
3047 * ECPoint public
3048 *
3049 * First byte is data length.
3050 * It will be filled later. p holds now the data length location.
3051 */
3052
3053 /* Export the public part of the ECDH private key from PSA.
3054 * Make one byte space for the length.
3055 */
3056 unsigned char *own_pubkey = p + data_length_size;
3057
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3059 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003060
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003061 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003062 own_pubkey, own_pubkey_max_len,
3063 &len);
3064 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003065 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003066 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003067 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3068 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003070 }
3071
3072 /* Store the length of the exported public key. */
3073 *p = (uint8_t) len;
3074
3075 /* Determine full message length. */
3076 len += header_size;
3077#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003078 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003079 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003080
Gilles Peskine449bd832023-01-11 14:50:10 +01003081 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3082 curr_grp_id)) != 0) {
3083 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3084 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003085 }
3086
Gilles Peskine449bd832023-01-11 14:50:10 +01003087 if ((ret = mbedtls_ecdh_make_params(
3088 &ssl->handshake->ecdh_ctx, &len,
3089 ssl->out_msg + ssl->out_msglen,
3090 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3091 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3092 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3093 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003094 }
3095
Gilles Peskine449bd832023-01-11 14:50:10 +01003096 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3097 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003098#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003099
Jerry Yuc5aef882021-12-23 20:15:02 +08003100#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003101 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003102#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003103
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003104 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003105 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003106#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003107
Hanno Becker1aa267c2017-04-28 17:08:27 +01003108 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003109 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003110 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003111 * exchange parameters, compute and add the signature here.
3112 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003113 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003114#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003115 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3116 if (dig_signed == NULL) {
3117 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3118 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003119 }
3120
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003121 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003122 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003123 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003124
Janos Follath865b3eb2019-12-16 11:46:15 +00003125 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003126
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003127 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003128 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003129 * For TLS 1.2, obey signature-hash-algorithm extension
3130 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003131 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003132
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003133 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003134 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003135
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003136 unsigned char sig_hash =
3137 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003138 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003139
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003141
Ronald Cron8457c122022-03-07 11:32:54 +01003142 /* For TLS 1.2, obey signature-hash-algorithm extension
3143 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003144 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3145 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003146 /* (... because we choose a cipher suite
3147 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003148 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003149 }
3150
Gilles Peskine449bd832023-01-11 14:50:10 +01003151 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003152
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003153 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003154 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003155 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003156 if (md_alg != MBEDTLS_MD_NONE) {
3157 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3158 dig_signed,
3159 dig_signed_len,
3160 md_alg);
3161 if (ret != 0) {
3162 return ret;
3163 }
3164 } else {
3165 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3166 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003167 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003168
Gilles Peskine449bd832023-01-11 14:50:10 +01003169 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003170
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003171 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003172 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003173 */
Ronald Cron8457c122022-03-07 11:32:54 +01003174 /*
3175 * We need to specify signature and hash algorithm explicitly through
3176 * a prefix to the signature.
3177 *
3178 * struct {
3179 * HashAlgorithm hash;
3180 * SignatureAlgorithm signature;
3181 * } SignatureAndHashAlgorithm;
3182 *
3183 * struct {
3184 * SignatureAndHashAlgorithm algorithm;
3185 * opaque signature<0..2^16-1>;
3186 * } DigitallySigned;
3187 *
3188 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003189
Gilles Peskine449bd832023-01-11 14:50:10 +01003190 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3191 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003192
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003193#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003194 if (ssl->conf->f_async_sign_start != NULL) {
3195 ret = ssl->conf->f_async_sign_start(ssl,
3196 mbedtls_ssl_own_cert(ssl),
3197 md_alg, hash, hashlen);
3198 switch (ret) {
3199 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3200 /* act as if f_async_sign was null */
3201 break;
3202 case 0:
3203 ssl->handshake->async_in_progress = 1;
3204 return ssl_resume_server_key_exchange(ssl, signature_len);
3205 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3206 ssl->handshake->async_in_progress = 1;
3207 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3208 default:
3209 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3210 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003211 }
3212 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003213#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003214
Gilles Peskine449bd832023-01-11 14:50:10 +01003215 if (mbedtls_ssl_own_key(ssl) == NULL) {
3216 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3217 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003218 }
3219
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003220 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3221 * signature length which will be added in ssl_write_server_key_exchange
3222 * after the call to ssl_prepare_server_key_exchange.
3223 * ssl_write_server_key_exchange also takes care of incrementing
3224 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3226 md_alg, hash, hashlen,
3227 ssl->out_msg + ssl->out_msglen + 2,
3228 out_buf_len - ssl->out_msglen - 2,
3229 signature_len,
3230 ssl->conf->f_rng,
3231 ssl->conf->p_rng)) != 0) {
3232 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3233 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003234 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003235 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003236#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003237
Gilles Peskine449bd832023-01-11 14:50:10 +01003238 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003239}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003240
Gilles Peskined3eb0612018-01-08 17:07:44 +01003241/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003242 * that do not include a ServerKeyExchange message, do nothing. Either
3243 * way, if successful, move on to the next step in the SSL state
3244 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003245MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003246static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003247{
Janos Follath865b3eb2019-12-16 11:46:15 +00003248 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003249 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003250#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003251 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003252 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003253#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003254
Gilles Peskine449bd832023-01-11 14:50:10 +01003255 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003256
Gilles Peskineeccd8882020-03-10 12:19:08 +01003257#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003258 /* Extract static ECDH parameters and abort if ServerKeyExchange
3259 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003260 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003261 /* For suites involving ECDH, extract DH parameters
3262 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003263#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3265 ret = ssl_get_ecdh_params_from_cert(ssl);
3266 if (ret != 0) {
3267 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3268 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003269 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003270 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003271#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003272
3273 /* Key exchanges not involving ephemeral keys don't use
3274 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003275 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003276 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003277 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003278 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003279#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003280
Gilles Peskineeccd8882020-03-10 12:19:08 +01003281#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003282 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003283 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003284 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (ssl->handshake->async_in_progress != 0) {
3286 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3287 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3288 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003289#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003290 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003291 {
3292 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003293 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003294 }
3295
Gilles Peskine449bd832023-01-11 14:50:10 +01003296 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003297 /* If we're starting to write a new message, set ssl->out_msglen
3298 * to 0. But if we're resuming after an asynchronous message,
3299 * out_msglen is the amount of data written so far and mst be
3300 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003301 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3302 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3303 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003304 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003305 }
3306 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003307 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003308
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003309 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003310 * ssl_prepare_server_key_exchange already wrote the signature
3311 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003312#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003313 if (signature_len != 0) {
3314 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3315 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003316
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3318 ssl->out_msg + ssl->out_msglen,
3319 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003320
3321 /* Skip over the already-written signature */
3322 ssl->out_msglen += signature_len;
3323 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003324#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003325
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003326 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003327 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3328 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003329
3330 ssl->state++;
3331
Gilles Peskine449bd832023-01-11 14:50:10 +01003332 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3333 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3334 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003335 }
3336
Gilles Peskine449bd832023-01-11 14:50:10 +01003337 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3338 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003339}
3340
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003341MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003342static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003343{
Janos Follath865b3eb2019-12-16 11:46:15 +00003344 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003345
Gilles Peskine449bd832023-01-11 14:50:10 +01003346 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003347
3348 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003349 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3350 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003351
3352 ssl->state++;
3353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003354#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3356 mbedtls_ssl_send_flight_completed(ssl);
3357 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003358#endif
3359
Gilles Peskine449bd832023-01-11 14:50:10 +01003360 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3361 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3362 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003363 }
3364
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003365#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003366 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3367 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3368 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3369 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003370 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003371#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003372
Gilles Peskine449bd832023-01-11 14:50:10 +01003373 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003374
Gilles Peskine449bd832023-01-11 14:50:10 +01003375 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003376}
3377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003378#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3379 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003380MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003381static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3382 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003383{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003384 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003385 size_t n;
3386
3387 /*
3388 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3389 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003390 if (*p + 2 > end) {
3391 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3392 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003393 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003394
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003395 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003396 *p += 2;
3397
Gilles Peskine449bd832023-01-11 14:50:10 +01003398 if (*p + n > end) {
3399 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3400 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003401 }
3402
Gilles Peskine449bd832023-01-11 14:50:10 +01003403 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3404 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3405 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003406 }
3407
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003408 *p += n;
3409
Gilles Peskine449bd832023-01-11 14:50:10 +01003410 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003411
Gilles Peskine449bd832023-01-11 14:50:10 +01003412 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003413}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003414#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3415 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003416
Gilles Peskineac767e52024-09-20 18:08:44 +02003417#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003418
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003419#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003420MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003421static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3422 unsigned char *peer_pms,
3423 size_t *peer_pmslen,
3424 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003425{
Gilles Peskine449bd832023-01-11 14:50:10 +01003426 int ret = ssl->conf->f_async_resume(ssl,
3427 peer_pms, peer_pmslen, peer_pmssize);
3428 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003429 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003430 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003431 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003432 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3433 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003434}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003435#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003436
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003437MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003438static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3439 const unsigned char *p,
3440 const unsigned char *end,
3441 unsigned char *peer_pms,
3442 size_t *peer_pmslen,
3443 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003444{
Janos Follath865b3eb2019-12-16 11:46:15 +00003445 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003446
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3448 if (own_cert == NULL) {
3449 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3450 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003451 }
3452 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003453 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3454 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003455
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003456#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003457 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003458 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003459 if (ssl->handshake->async_in_progress != 0) {
3460 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3461 return ssl_resume_decrypt_pms(ssl,
3462 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003463 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003464#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003465
3466 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003467 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003468 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003469 if (p + 2 > end) {
3470 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3471 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003472 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 if (*p++ != MBEDTLS_BYTE_1(len) ||
3474 *p++ != MBEDTLS_BYTE_0(len)) {
3475 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3476 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003477 }
3478
Gilles Peskine449bd832023-01-11 14:50:10 +01003479 if (p + len != end) {
3480 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3481 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003482 }
3483
Gilles Peskine422ccab2018-01-11 18:29:01 +01003484 /*
3485 * Decrypt the premaster secret
3486 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003487#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003488 if (ssl->conf->f_async_decrypt_start != NULL) {
3489 ret = ssl->conf->f_async_decrypt_start(ssl,
3490 mbedtls_ssl_own_cert(ssl),
3491 p, len);
3492 switch (ret) {
3493 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3494 /* act as if f_async_decrypt_start was null */
3495 break;
3496 case 0:
3497 ssl->handshake->async_in_progress = 1;
3498 return ssl_resume_decrypt_pms(ssl,
3499 peer_pms,
3500 peer_pmslen,
3501 peer_pmssize);
3502 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3503 ssl->handshake->async_in_progress = 1;
3504 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3505 default:
3506 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3507 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003508 }
3509 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003510#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003511
Gilles Peskine449bd832023-01-11 14:50:10 +01003512 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3513 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3514 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003515 }
3516
Gilles Peskine449bd832023-01-11 14:50:10 +01003517 ret = mbedtls_pk_decrypt(private_key, p, len,
3518 peer_pms, peer_pmslen, peer_pmssize,
3519 ssl->conf->f_rng, ssl->conf->p_rng);
3520 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003521}
3522
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003523MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003524static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3525 const unsigned char *p,
3526 const unsigned char *end,
3527 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003528{
Janos Follath865b3eb2019-12-16 11:46:15 +00003529 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003530 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3531 unsigned char ver[2];
3532 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003533 size_t peer_pmslen;
3534 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003535
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003536 /* In case of a failure in decryption, the decryption may write less than
3537 * 2 bytes of output, but we always read the first two bytes. It doesn't
3538 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003539 * ret being nonzero, and we only care whether diff is 0.
3540 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3541 * also makes memory analyzers happy (don't access uninitialized memory,
3542 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003543 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003544 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003545
Gilles Peskine449bd832023-01-11 14:50:10 +01003546 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3547 peer_pms,
3548 &peer_pmslen,
3549 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003550
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003551#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003552 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3553 return ret;
3554 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003555#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003556
Gilles Peskine449bd832023-01-11 14:50:10 +01003557 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3558 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003559
3560 /* Avoid data-dependent branches while checking for invalid
3561 * padding, to protect against timing-based Bleichenbacher-type
3562 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003563 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003564 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3565 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3566 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003567
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003568 /*
3569 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3570 * must not cause the connection to end immediately; instead, send a
3571 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003572 * To protect against timing-based variants of the attack, we must
3573 * not have any branch that depends on whether the decryption was
3574 * successful. In particular, always generate the fake premaster secret,
3575 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003576 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003577 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3578 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003579 /* It's ok to abort on an RNG failure, since this does not reveal
3580 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003581 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003582 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003583
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003584#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003585 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003586 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3587 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003588#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003589
Gilles Peskine449bd832023-01-11 14:50:10 +01003590 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3591 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3592 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3593 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003594 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003595 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003596
Gilles Peskine422ccab2018-01-11 18:29:01 +01003597 /* Set pms to either the true or the fake PMS, without
3598 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003599 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003600
Gilles Peskine449bd832023-01-11 14:50:10 +01003601 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003602}
Gilles Peskineac767e52024-09-20 18:08:44 +02003603#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003604
Gilles Peskineeccd8882020-03-10 12:19:08 +01003605#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003606MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003607static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3608 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003609{
Paul Bakker6db455e2013-09-18 17:29:31 +02003610 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003611 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003612
Gilles Peskine449bd832023-01-11 14:50:10 +01003613 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3614 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3615 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003616 }
3617
3618 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003619 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003620 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003621 if (end - *p < 2) {
3622 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3623 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003624 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003625
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003626 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003627 *p += 2;
3628
Gilles Peskine449bd832023-01-11 14:50:10 +01003629 if (n == 0 || n > end - *p) {
3630 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3631 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003632 }
3633
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 if (ssl->conf->f_psk != NULL) {
3635 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003636 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003637 }
3638 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003639 /* Identity is not a big secret since clients send it in the clear,
3640 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003641 if (n != ssl->conf->psk_identity_len ||
3642 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003643 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003644 }
3645 }
3646
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3648 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3649 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3650 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3651 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003652 }
3653
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003654 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003655
Gilles Peskine449bd832023-01-11 14:50:10 +01003656 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003657}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003658#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003659
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003660MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003661static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003662{
Janos Follath865b3eb2019-12-16 11:46:15 +00003663 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003664 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003665 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003666
Hanno Beckere694c3e2017-12-27 21:34:08 +00003667 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003668
Gilles Peskine449bd832023-01-11 14:50:10 +01003669 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003670
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003671#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskineac767e52024-09-20 18:08:44 +02003672 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003673 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3674 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3675 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003676 /* We've already read a record and there is an asynchronous
3677 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003678 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003679 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3680 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003681#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003682 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3683 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3684 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003685 }
3686
Gilles Peskine449bd832023-01-11 14:50:10 +01003687 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003688 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003689
Gilles Peskine449bd832023-01-11 14:50:10 +01003690 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3691 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3692 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003693 }
3694
Gilles Peskine449bd832023-01-11 14:50:10 +01003695 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3696 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3697 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003698 }
3699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003700#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003701 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3702 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3703 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3704 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003705 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003706
Gilles Peskine449bd832023-01-11 14:50:10 +01003707 if (p != end) {
3708 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3709 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003710 }
3711
Gilles Peskine449bd832023-01-11 14:50:10 +01003712 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3713 ssl->handshake->premaster,
3714 MBEDTLS_PREMASTER_SIZE,
3715 &ssl->handshake->pmslen,
3716 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3717 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3718 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003719 }
3720
Gilles Peskine449bd832023-01-11 14:50:10 +01003721 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3722 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003723#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003724#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3725 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3726 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3727 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003728 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003729 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3730 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003731 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003732#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003733 size_t data_len = (size_t) (*p++);
3734 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003735 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3736 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3737
Gilles Peskine530c4232023-10-02 15:37:23 +02003738 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003739
3740 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003741 * We must have at least two bytes (1 for length, at least 1 for data)
3742 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003743 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003744 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3745 buf_len));
3746 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003747 }
3748
Gilles Peskine449bd832023-01-11 14:50:10 +01003749 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003750 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3751 " > %" MBEDTLS_PRINTF_SIZET,
3752 data_len, buf_len));
3753 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003754 }
3755
3756 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003757 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003758 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3759 " > %" MBEDTLS_PRINTF_SIZET,
3760 data_len,
3761 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003762 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3763 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003764 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3765 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003766
3767 /* Compute ECDH shared secret. */
3768 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003769 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3770 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003771 handshake->premaster, sizeof(handshake->premaster),
3772 &handshake->pmslen);
3773 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003774 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003775 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003776 if (handshake->xxdh_psa_privkey_is_external == 0) {
3777 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003779 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003781 }
3782
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003783 if (handshake->xxdh_psa_privkey_is_external == 0) {
3784 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003785
Gilles Peskine449bd832023-01-11 14:50:10 +01003786 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003787 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003788 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3789 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003790 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003791 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003792 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003793#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003794 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003795 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003796 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3797 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003798 }
3799
Gilles Peskine449bd832023-01-11 14:50:10 +01003800 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3801 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003802
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3804 &ssl->handshake->pmslen,
3805 ssl->handshake->premaster,
3806 MBEDTLS_MPI_MAX_SIZE,
3807 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3808 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3809 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003810 }
3811
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3813 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003814#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003815 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003816#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3817 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3818 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3819 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3820#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003821 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3822 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3823 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3824 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003825 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003826
Gilles Peskine449bd832023-01-11 14:50:10 +01003827 if (p != end) {
3828 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3829 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003830 }
3831
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003832#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003833 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003834 (mbedtls_key_exchange_type_t) ciphersuite_info->
3835 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003836 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3837 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003838 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003839#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003840 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003841#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003842#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003843 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3844 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3845 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3846 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003847 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3849 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3850 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003851 }
3852
Gilles Peskine449bd832023-01-11 14:50:10 +01003853 if (p != end) {
3854 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3855 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003856 }
3857
Neil Armstrong80f6f322022-05-03 17:56:38 +02003858#if defined(MBEDTLS_USE_PSA_CRYPTO)
3859 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003860 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003861 size_t pms_len;
3862
3863 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3865 pms + 2, pms_end - (pms + 2), &pms_len,
3866 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3867 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3868 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003869 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003870 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003871 pms += 2 + pms_len;
3872
Gilles Peskine449bd832023-01-11 14:50:10 +01003873 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003874#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003875 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003876 (mbedtls_key_exchange_type_t) ciphersuite_info->
3877 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003878 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3879 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003880 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003881#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003882 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003883#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003884#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003886#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003887 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3888 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003889 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003890
3891 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3892
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3894 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003895 psa_destroy_key(handshake->xxdh_psa_privkey);
3896 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003897 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003898 }
3899
3900 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003901 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003902 psa_destroy_key(handshake->xxdh_psa_privkey);
3903 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003904 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003905 }
3906
Neil Armstrong039db292022-03-09 11:38:34 +01003907 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003909 psa_destroy_key(handshake->xxdh_psa_privkey);
3910 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003911 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003912 }
3913
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003914 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3915 the sizes of the FFDH keys which are at least 2048 bits.
3916 The size of the array is thus greater than 256 bytes which is greater than any
3917 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003918#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003919 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3920 psa_destroy_key(handshake->xxdh_psa_privkey);
3921 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003922 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003923 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003924#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003925 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3926 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003927#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003928
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003929 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3930 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003931 p += ecpoint_len;
3932
Neil Armstrong3bcef082022-03-23 18:16:54 +01003933 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003934 * - a uint16 containing the length (in octets) of the ECDH computation
3935 * - the octet string produced by the ECDH computation
3936 * - a uint16 containing the length (in octets) of the PSK
3937 * - the PSK itself
3938 */
Neil Armstrong039db292022-03-09 11:38:34 +01003939 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003940 const unsigned char * const psm_end =
3941 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003942 /* uint16 to store length (in octets) of the ECDH computation */
3943 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003944 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003945
3946 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003947 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003948 handshake->xxdh_psa_privkey,
3949 handshake->xxdh_psa_peerkey,
3950 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003951 psm + zlen_size,
3952 psm_end - (psm + zlen_size),
3953 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003954
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003955 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3956 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003957
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003959 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003960 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003961 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 }
Neil Armstrong039db292022-03-09 11:38:34 +01003963
Neil Armstrong3bcef082022-03-23 18:16:54 +01003964 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003965 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003966 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003967
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003968#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003969 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3970 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3971 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003972 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003973
Gilles Peskine449bd832023-01-11 14:50:10 +01003974 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003975 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003976 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3977 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003978 }
3979
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3981 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003982
Gilles Peskine449bd832023-01-11 14:50:10 +01003983 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003984 (mbedtls_key_exchange_type_t) ciphersuite_info->
3985 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003986 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3987 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003988 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003989#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003990 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003991#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3992#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003993 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3994 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3995 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3996 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003997 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003998 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003999#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004000#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004001 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004002#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004003 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004004 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01004005 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4006 psa_destroy_key(ssl->handshake->psa_pake_password);
4007 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004008
Gilles Peskine449bd832023-01-11 14:50:10 +01004009 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4010 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004011 }
4012#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004013 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00004014 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01004015 if (ret != 0) {
4016 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4017 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004018 }
4019
Gilles Peskine449bd832023-01-11 14:50:10 +01004020 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4021 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4022 ssl->conf->f_rng, ssl->conf->p_rng);
4023 if (ret != 0) {
4024 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4025 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004026 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004027#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004028 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004029#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004030 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004031 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4032 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004033 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004034
Gilles Peskine449bd832023-01-11 14:50:10 +01004035 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4036 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4037 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004039
Paul Bakker5121ce52009-01-03 21:22:43 +00004040 ssl->state++;
4041
Gilles Peskine449bd832023-01-11 14:50:10 +01004042 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004043
Gilles Peskine449bd832023-01-11 14:50:10 +01004044 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004045}
4046
Gilles Peskineeccd8882020-03-10 12:19:08 +01004047#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004048MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004049static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004050{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004051 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004052 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004053
Gilles Peskine449bd832023-01-11 14:50:10 +01004054 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004055
Gilles Peskine449bd832023-01-11 14:50:10 +01004056 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4057 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004058 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004059 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004060 }
4061
Gilles Peskine449bd832023-01-11 14:50:10 +01004062 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4063 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004064}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004065#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004066MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004067static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004068{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004069 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004070 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004071 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004072 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004073 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004074 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004075 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004076 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004077 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004078 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004079
Gilles Peskine449bd832023-01-11 14:50:10 +01004080 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004081
Gilles Peskine449bd832023-01-11 14:50:10 +01004082 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4083 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004084 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004085 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004086 }
4087
Hanno Becker2a831a42019-02-07 13:17:25 +00004088#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004089 if (ssl->session_negotiate->peer_cert == NULL) {
4090 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004091 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004092 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004093 }
4094#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4096 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004097 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004098 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004099 }
4100#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4101
Simon Butcher99000142016-10-13 17:21:01 +01004102 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004103 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4104 if (0 != ret) {
4105 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4106 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004107 }
4108
4109 ssl->state++;
4110
Simon Butcher99000142016-10-13 17:21:01 +01004111 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004112 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4113 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4114 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4115 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004116 }
4117
Gilles Peskine449bd832023-01-11 14:50:10 +01004118 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004119
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004120#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4121 peer_pk = &ssl->handshake->peer_pubkey;
4122#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004123 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004124 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004125 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004126 }
4127 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4128#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4129
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004130 /*
4131 * struct {
4132 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4133 * opaque signature<0..2^16-1>;
4134 * } DigitallySigned;
4135 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004136 if (i + 2 > ssl->in_hslen) {
4137 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4138 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004139 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004140
Ronald Cron8457c122022-03-07 11:32:54 +01004141 /*
4142 * Hash
4143 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004144 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004145
Gilles Peskine449bd832023-01-11 14:50:10 +01004146 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4147 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4148 " for verify message"));
4149 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004150 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004151
Simon Butcher99000142016-10-13 17:21:01 +01004152#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004153 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004154 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004155 }
Simon Butcher99000142016-10-13 17:21:01 +01004156#endif
Paul Bakker926af752012-11-23 13:38:07 +01004157
Ronald Cron8457c122022-03-07 11:32:54 +01004158 /* Info from md_alg will be used instead */
4159 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004160
Ronald Cron8457c122022-03-07 11:32:54 +01004161 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004162
Ronald Cron8457c122022-03-07 11:32:54 +01004163 /*
4164 * Signature
4165 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004166 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4167 == MBEDTLS_PK_NONE) {
4168 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4169 " for verify message"));
4170 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004171 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004172
Ronald Cron8457c122022-03-07 11:32:54 +01004173 /*
4174 * Check the certificate's key type matches the signature alg
4175 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004176 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4177 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4178 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004179 }
4180
4181 i++;
4182
Gilles Peskine449bd832023-01-11 14:50:10 +01004183 if (i + 2 > ssl->in_hslen) {
4184 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4185 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004186 }
4187
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004188 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004189 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004190
Gilles Peskine449bd832023-01-11 14:50:10 +01004191 if (i + sig_len != ssl->in_hslen) {
4192 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4193 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004194 }
4195
Simon Butcher99000142016-10-13 17:21:01 +01004196 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004197 {
4198 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004199 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4200 if (0 != ret) {
4201 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4202 return ret;
4203 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004204 }
Simon Butcher99000142016-10-13 17:21:01 +01004205
Gilles Peskine449bd832023-01-11 14:50:10 +01004206 if ((ret = mbedtls_pk_verify(peer_pk,
4207 md_alg, hash_start, hashlen,
4208 ssl->in_msg + i, sig_len)) != 0) {
4209 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4210 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004211 }
4212
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004213 ret = mbedtls_ssl_update_handshake_status(ssl);
4214 if (0 != ret) {
4215 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4216 return ret;
4217 }
Simon Butcher99000142016-10-13 17:21:01 +01004218
Gilles Peskine449bd832023-01-11 14:50:10 +01004219 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004220
Gilles Peskine449bd832023-01-11 14:50:10 +01004221 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004222}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004223#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004225#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004226MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004227static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004228{
Janos Follath865b3eb2019-12-16 11:46:15 +00004229 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004230 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004231 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004232
Gilles Peskine449bd832023-01-11 14:50:10 +01004233 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004235 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4236 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004237
4238 /*
4239 * struct {
4240 * uint32 ticket_lifetime_hint;
4241 * opaque ticket<0..2^16-1>;
4242 * } NewSessionTicket;
4243 *
4244 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4245 * 8 . 9 ticket_len (n)
4246 * 10 . 9+n ticket content
4247 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004248
Ronald Cron3c0072b2023-11-22 10:00:14 +01004249#if defined(MBEDTLS_HAVE_TIME)
4250 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4251#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004252 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4253 ssl->session_negotiate,
4254 ssl->out_msg + 10,
4255 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4256 &tlen, &lifetime)) != 0) {
4257 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004258 tlen = 0;
4259 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004260
Gilles Peskine449bd832023-01-11 14:50:10 +01004261 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4262 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004263 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004264
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004265 /*
4266 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4267 * ChangeCipherSpec share the same state.
4268 */
4269 ssl->handshake->new_session_ticket = 0;
4270
Gilles Peskine449bd832023-01-11 14:50:10 +01004271 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4272 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4273 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004274 }
4275
Gilles Peskine449bd832023-01-11 14:50:10 +01004276 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004277
Gilles Peskine449bd832023-01-11 14:50:10 +01004278 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004279}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004280#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004281
Paul Bakker5121ce52009-01-03 21:22:43 +00004282/*
Paul Bakker1961b702013-01-25 14:49:24 +01004283 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004284 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004285int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004286{
4287 int ret = 0;
4288
Gilles Peskine449bd832023-01-11 14:50:10 +01004289 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004290
Gilles Peskine449bd832023-01-11 14:50:10 +01004291 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004292 case MBEDTLS_SSL_HELLO_REQUEST:
4293 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004294 break;
4295
Paul Bakker1961b702013-01-25 14:49:24 +01004296 /*
4297 * <== ClientHello
4298 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004299 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004300 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004301 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004303#if defined(MBEDTLS_SSL_PROTO_DTLS)
4304 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004305 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004306#endif
4307
Paul Bakker1961b702013-01-25 14:49:24 +01004308 /*
4309 * ==> ServerHello
4310 * Certificate
4311 * ( ServerKeyExchange )
4312 * ( CertificateRequest )
4313 * ServerHelloDone
4314 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004315 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004316 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004317 break;
4318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004319 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004320 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004321 break;
4322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004323 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004324 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004325 break;
4326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004327 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004328 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004329 break;
4330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004331 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004332 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004333 break;
4334
4335 /*
4336 * <== ( Certificate/Alert )
4337 * ClientKeyExchange
4338 * ( CertificateVerify )
4339 * ChangeCipherSpec
4340 * Finished
4341 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004342 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004343 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004344 break;
4345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004346 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004347 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004348 break;
4349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004350 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004351 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004352 break;
4353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004354 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004355 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004356 break;
4357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004358 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004359 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004360 break;
4361
4362 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004363 * ==> ( NewSessionTicket )
4364 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004365 * Finished
4366 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004367 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4368#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004369 if (ssl->handshake->new_session_ticket != 0) {
4370 ret = ssl_write_new_session_ticket(ssl);
4371 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004372#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004373 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004374 break;
4375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004376 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004377 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004378 break;
4379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004380 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004381 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004382 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004383 break;
4384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004385 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004386 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004387 break;
4388
4389 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004390 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4391 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004392 }
4393
Gilles Peskine449bd832023-01-11 14:50:10 +01004394 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004395}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004396
Gilles Peskine449bd832023-01-11 14:50:10 +01004397void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004398{
TRodziewicz3946f792021-06-14 12:11:18 +02004399 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004400}
4401
Jerry Yufb4b6472022-01-27 15:03:26 +08004402#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */