blob: 8aad2b888ad2043691a2f66c818f9a57394bb1e5 [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));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001063 }
1064
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001066 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001067 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001068 * Copy the client's handshake message_seq on initial handshakes,
1069 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001070 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001072 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001073 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001074 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1076 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1077 "%u (expected %u)", cli_msg_seq,
1078 ssl->handshake->in_msg_seq));
1079 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001080 }
1081
1082 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001084#endif
1085 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001086 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001087 ssl->handshake->out_msg_seq = cli_msg_seq;
1088 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1089 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001090 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001091 /*
1092 * For now we don't support fragmentation, so make sure
1093 * fragment_offset == 0 and fragment_length == length
1094 */
1095 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1097 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1098 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001099 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 4, ("fragment_offset=%u fragment_length=%u length=%u",
1101 (unsigned) fragment_offset, (unsigned) fragment_length,
1102 (unsigned) length));
1103 if (fragment_offset != 0 || length != fragment_length) {
1104 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1105 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001106 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001107 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001108 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001110
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 buf += mbedtls_ssl_hs_hdr_len(ssl);
1112 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001113
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001114 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001115 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001116 * 0 . 1 protocol version
1117 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001118 * 34 . 34 session id length (1 byte)
1119 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001120 * 35+x . 35+x DTLS only: cookie length (1 byte)
1121 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001122 * .. . .. ciphersuite list length (2 bytes)
1123 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001124 * .. . .. compression alg. list length (1 byte)
1125 * .. . .. compression alg. list
1126 * .. . .. extensions length (2 bytes, optional)
1127 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001128 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001129
1130 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001131 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001132 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1133 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001134 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001135 if (msg_len < 38) {
1136 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1137 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001138 }
1139
1140 /*
1141 * Check and save the protocol version
1142 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001143 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001144
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001145 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1146 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001147 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001148 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1151 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1152 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1153 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1154 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001155 }
1156
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001157 /*
1158 * Save client random (inc. Unix time)
1159 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001161
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001163
1164 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001165 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001166 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001167 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001168
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1170 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1171 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1172 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1173 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1174 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001175 }
1176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001178
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001179 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 memset(ssl->session_negotiate->id, 0,
1181 sizeof(ssl->session_negotiate->id));
1182 memcpy(ssl->session_negotiate->id, buf + 35,
1183 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001184
1185 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001186 * Check the cookie length and content
1187 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001190 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001191 cookie_len = buf[cookie_offset];
1192
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1194 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1195 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1196 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1197 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001198 }
1199
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1201 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001202
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001203#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205#if defined(MBEDTLS_SSL_RENEGOTIATION)
1206 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001207#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 ) {
1209 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1210 buf + cookie_offset + 1, cookie_len,
1211 ssl->cli_id, ssl->cli_id_len) != 0) {
1212 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001213 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001214 } else {
1215 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001216 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001217 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001218 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001220 {
1221 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001223 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001224 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1225 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001226 }
1227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001229 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001230
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 /*
1232 * Check the ciphersuitelist length (will be parsed later)
1233 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001234 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001238
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001239 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001240
Gilles Peskine449bd832023-01-11 14:50:10 +01001241 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001242 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001243 (ciph_len % 2) != 0) {
1244 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1245 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1246 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1247 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001248 }
1249
Gilles Peskine449bd832023-01-11 14:50:10 +01001250 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1251 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001252
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001253 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001254 * Check the compression algorithm's length.
1255 * The list contents are ignored because implementing
1256 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1257 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001258 */
1259 comp_offset = ciph_offset + 2 + ciph_len;
1260
1261 comp_len = buf[comp_offset];
1262
Gilles Peskine449bd832023-01-11 14:50:10 +01001263 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001264 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 comp_len + comp_offset + 1 > msg_len) {
1266 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1267 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1268 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1269 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001270 }
1271
Gilles Peskine449bd832023-01-11 14:50:10 +01001272 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1273 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001274
Gilles Peskine449bd832023-01-11 14:50:10 +01001275 /*
1276 * Check the extension length
1277 */
1278 ext_offset = comp_offset + 1 + comp_len;
1279 if (msg_len > ext_offset) {
1280 if (msg_len < ext_offset + 2) {
1281 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1282 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1283 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1284 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001285 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001286
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001287 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001288
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 if (msg_len != ext_offset + 2 + ext_len) {
1290 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1291 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1292 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1293 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1294 }
1295 } else {
1296 ext_len = 0;
1297 }
Paul Bakker48916f92012-09-16 19:57:18 +00001298
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 ext = buf + ext_offset + 2;
1300 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1301
1302 while (ext_len != 0) {
1303 unsigned int ext_id;
1304 unsigned int ext_size;
1305 if (ext_len < 4) {
1306 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1307 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1308 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1309 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1310 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001311 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1312 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001313
1314 if (ext_size + 4 > ext_len) {
1315 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1316 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1317 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1318 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1319 }
1320 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001321#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001322 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1324 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1325 ext + 4 + ext_size);
1326 if (ret != 0) {
1327 return ret;
1328 }
Simon Butcher584a5472016-05-23 16:24:52 +01001329 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001330#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001331
Simon Butcher584a5472016-05-23 16:24:52 +01001332 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001334#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001335 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001336#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001337
Gilles Peskine449bd832023-01-11 14:50:10 +01001338 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1339 if (ret != 0) {
1340 return ret;
1341 }
Simon Butcher584a5472016-05-23 16:24:52 +01001342 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001343
Jerry Yue7541932022-01-28 10:21:24 +08001344#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001345 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001346 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001347
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1349 if (ret != 0) {
1350 return ret;
1351 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001352
1353 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001354 break;
Jerry Yue7541932022-01-28 10:21:24 +08001355#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001356
Valerio Setti60d3b912023-07-25 10:43:53 +02001357#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001358 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001360 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1364 if (ret != 0) {
1365 return ret;
1366 }
Simon Butcher584a5472016-05-23 16:24:52 +01001367 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001368
Simon Butcher584a5472016-05-23 16:24:52 +01001369 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001371 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001372
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1374 if (ret != 0) {
1375 return ret;
1376 }
Simon Butcher584a5472016-05-23 16:24:52 +01001377 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001378#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001379 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001380 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001381
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001382#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001383 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001385
Gilles Peskine449bd832023-01-11 14:50:10 +01001386 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1387 if (ret != 0) {
1388 return ret;
1389 }
Simon Butcher584a5472016-05-23 16:24:52 +01001390 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001391#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001394 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001396
Gilles Peskine449bd832023-01-11 14:50:10 +01001397 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1398 if (ret != 0) {
1399 return ret;
1400 }
Simon Butcher584a5472016-05-23 16:24:52 +01001401 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001403
Hanno Beckera0e20d02019-05-15 14:03:01 +01001404#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001405 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001407
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1409 if (ret != 0) {
1410 return ret;
1411 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001412 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001413#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001416 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001418
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1420 if (ret != 0) {
1421 return ret;
1422 }
Simon Butcher584a5472016-05-23 16:24:52 +01001423 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001424#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001426#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001427 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001429
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1431 if (ret != 0) {
1432 return ret;
1433 }
Simon Butcher584a5472016-05-23 16:24:52 +01001434 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001435#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001438 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1442 if (ret != 0) {
1443 return ret;
1444 }
Simon Butcher584a5472016-05-23 16:24:52 +01001445 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001449 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001451
Gilles Peskine449bd832023-01-11 14:50:10 +01001452 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1453 ext + 4 + ext_size);
1454 if (ret != 0) {
1455 return ret;
1456 }
Simon Butcher584a5472016-05-23 16:24:52 +01001457 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001458#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001459
Johan Pascalb62bb512015-12-03 21:56:45 +01001460#if defined(MBEDTLS_SSL_DTLS_SRTP)
1461 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001462 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001463
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1465 if (ret != 0) {
1466 return ret;
1467 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001468 break;
1469#endif /* MBEDTLS_SSL_DTLS_SRTP */
1470
Simon Butcher584a5472016-05-23 16:24:52 +01001471 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1473 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001474 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001475
Gilles Peskine449bd832023-01-11 14:50:10 +01001476 ext_len -= 4 + ext_size;
1477 ext += 4 + ext_size;
1478 }
1479
Jerry Yue7541932022-01-28 10:21:24 +08001480#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001481
1482 /*
1483 * Try to fall back to default hash SHA1 if the client
1484 * hasn't provided any preferred signature-hash combinations.
1485 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001487 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1488 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001489#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001490 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1491 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001492#endif
1493#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001494 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1495 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001496#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001497 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001498 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001499
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001500 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1501 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1502 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001503
Gilles Peskine449bd832023-01-11 14:50:10 +01001504 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001505 }
1506
Jerry Yue7541932022-01-28 10:21:24 +08001507#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001508
Paul Bakker48916f92012-09-16 19:57:18 +00001509 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001510 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1511 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1513 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1514 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001515#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001516 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1517 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1518 "during renegotiation"));
1519 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1520 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1521 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001522 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001523#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001525 break;
1526 }
1527 }
1528
1529 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001530 * Renegotiation security checks
1531 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001532 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1533 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1534 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001535 handshake_failure = 1;
1536 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001537#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001538 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001539 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001540 renegotiation_info_seen == 0) {
1541 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001542 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001543 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1544 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1545 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1546 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001547 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001548 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1549 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1550 renegotiation_info_seen == 1) {
1551 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001552 handshake_failure = 1;
1553 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001555
Gilles Peskine449bd832023-01-11 14:50:10 +01001556 if (handshake_failure == 1) {
1557 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1558 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1559 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001560 }
Paul Bakker380da532012-04-18 16:10:25 +00001561
Paul Bakker41c83d32013-03-20 14:39:14 +01001562 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001563 * Server certification selection (after processing TLS extensions)
1564 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1566 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1567 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001568 }
Glenn Strauss69894072022-01-24 12:58:00 -05001569#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1570 ssl->handshake->sni_name = NULL;
1571 ssl->handshake->sni_name_len = 0;
1572#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001573
1574 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001575 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001576 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001577 * and certificate from the SNI callback triggered by the SNI extension
1578 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001579 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001580 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001581 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001582 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001583
Gilles Peskine449bd832023-01-11 14:50:10 +01001584 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1585 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1586 for (i = 0; ciphersuites[i] != 0; i++) {
1587 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001588 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001589 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001590
TRodziewicz8476f2f2021-06-02 14:34:47 +02001591 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001592
Gilles Peskine449bd832023-01-11 14:50:10 +01001593 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1594 &ciphersuite_info)) != 0) {
1595 return ret;
1596 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001597
Gilles Peskine449bd832023-01-11 14:50:10 +01001598 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001599 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001600 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001601 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001603 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001604 for (i = 0; ciphersuites[i] != 0; i++) {
1605 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1606 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001607 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001608 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001609
1610 got_common_suite = 1;
1611
Gilles Peskine449bd832023-01-11 14:50:10 +01001612 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1613 &ciphersuite_info)) != 0) {
1614 return ret;
1615 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001616
Gilles Peskine449bd832023-01-11 14:50:10 +01001617 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001618 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001620 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001621 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001622 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001623
Gilles Peskine449bd832023-01-11 14:50:10 +01001624 if (got_common_suite) {
1625 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1626 "but none of them usable"));
1627 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1628 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1629 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1630 } else {
1631 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1632 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1633 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1634 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001635 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001636
1637have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001638 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001639
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001640 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001641 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001642
Paul Bakker5121ce52009-01-03 21:22:43 +00001643 ssl->state++;
1644
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001645#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001646 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1647 mbedtls_ssl_recv_flight_completed(ssl);
1648 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001649#endif
1650
Hanno Becker7e5437a2017-04-28 17:15:26 +01001651 /* Debugging-only output for testsuite */
1652#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001653 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001654 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1655 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001656 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001657 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1658 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1659 sig_hash));
1660 } else {
1661 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1662 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001663 }
1664#endif
1665
Gilles Peskine449bd832023-01-11 14:50:10 +01001666 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001667
Gilles Peskine449bd832023-01-11 14:50:10 +01001668 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001669}
1670
Hanno Beckera0e20d02019-05-15 14:03:01 +01001671#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001672static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1673 unsigned char *buf,
1674 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001675{
1676 unsigned char *p = buf;
1677 size_t ext_len;
1678 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1679
1680 *olen = 0;
1681
1682 /* Skip writing the extension if we don't want to use it or if
1683 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001684 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001685 return;
1686 }
1687
Gilles Peskine449bd832023-01-11 14:50:10 +01001688 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1689 * which is at most 255, so the increment cannot overflow. */
1690 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1691 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1692 return;
1693 }
1694
1695 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001696
1697 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001698 * struct {
1699 * opaque cid<0..2^8-1>;
1700 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 */
1702 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001703 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001704 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001705 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001706 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001707
1708 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001709 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001710
1711 *olen = ssl->own_cid_len + 5;
1712}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001713#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001714
Neil Armstrong76b74072022-04-06 13:43:54 +02001715#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001716static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1717 unsigned char *buf,
1718 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001719{
1720 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001721 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001722
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001723 /*
1724 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1725 * from a client and then selects a stream or Authenticated Encryption
1726 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1727 * encrypt-then-MAC response extension back to the client."
1728 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001729 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001730 ssl->session_negotiate->ciphersuite);
1731 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001732 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001733 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001734 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001735 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001736 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001737 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001738
Gilles Peskine449bd832023-01-11 14:50:10 +01001739 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001740 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001741 }
Ronald Cron862902d2022-03-24 14:15:28 +01001742 }
1743
Gilles Peskine449bd832023-01-11 14:50:10 +01001744 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001745 *olen = 0;
1746 return;
1747 }
1748
Gilles Peskine449bd832023-01-11 14:50:10 +01001749 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001750
Gilles Peskine449bd832023-01-11 14:50:10 +01001751 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001752 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001753
1754 *p++ = 0x00;
1755 *p++ = 0x00;
1756
1757 *olen = 4;
1758}
Neil Armstrong76b74072022-04-06 13:43:54 +02001759#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001761#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001762static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1763 unsigned char *buf,
1764 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001765{
1766 unsigned char *p = buf;
1767
Gilles Peskine449bd832023-01-11 14:50:10 +01001768 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001769 *olen = 0;
1770 return;
1771 }
1772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1774 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001775
Gilles Peskine449bd832023-01-11 14:50:10 +01001776 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001777 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001778
1779 *p++ = 0x00;
1780 *p++ = 0x00;
1781
1782 *olen = 4;
1783}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001784#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001785
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001786#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001787static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1788 unsigned char *buf,
1789 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001790{
1791 unsigned char *p = buf;
1792
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001794 *olen = 0;
1795 return;
1796 }
1797
Gilles Peskine449bd832023-01-11 14:50:10 +01001798 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001799
Gilles Peskine449bd832023-01-11 14:50:10 +01001800 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001801 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001802
1803 *p++ = 0x00;
1804 *p++ = 0x00;
1805
1806 *olen = 4;
1807}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001808#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001809
Gilles Peskine449bd832023-01-11 14:50:10 +01001810static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1811 unsigned char *buf,
1812 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001813{
1814 unsigned char *p = buf;
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001817 *olen = 0;
1818 return;
1819 }
1820
Gilles Peskine449bd832023-01-11 14:50:10 +01001821 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001822
Gilles Peskine449bd832023-01-11 14:50:10 +01001823 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001824 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001828 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001830 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001831
Gilles Peskine449bd832023-01-11 14:50:10 +01001832 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001833 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001834 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001835 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001836 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001837#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001838 {
1839 *p++ = 0x00;
1840 *p++ = 0x01;
1841 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001842 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001843
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001844 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001845}
1846
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001847#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001848static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1849 unsigned char *buf,
1850 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001851{
1852 unsigned char *p = buf;
1853
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001855 *olen = 0;
1856 return;
1857 }
1858
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001860
Gilles Peskine449bd832023-01-11 14:50:10 +01001861 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001862 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001863
1864 *p++ = 0x00;
1865 *p++ = 1;
1866
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001867 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001868
1869 *olen = 5;
1870}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001871#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001872
Valerio Setti7aeec542023-07-05 18:57:21 +02001873#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001874 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001875 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001876static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1877 unsigned char *buf,
1878 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001879{
1880 unsigned char *p = buf;
1881 ((void) ssl);
1882
Gilles Peskine449bd832023-01-11 14:50:10 +01001883 if ((ssl->handshake->cli_exts &
1884 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001885 *olen = 0;
1886 return;
1887 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001888
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001890
Gilles Peskine449bd832023-01-11 14:50:10 +01001891 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001892 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001893
1894 *p++ = 0x00;
1895 *p++ = 2;
1896
1897 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001898 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001899
1900 *olen = 6;
1901}
Valerio Setti45d56f32023-07-13 17:23:20 +02001902#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001903 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001904 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001905
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001906#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001907static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1908 unsigned char *buf,
1909 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001910{
Janos Follath865b3eb2019-12-16 11:46:15 +00001911 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001912 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001913 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001914 size_t kkpp_len;
1915
1916 *olen = 0;
1917
1918 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 if (ssl->handshake->ciphersuite_info->key_exchange !=
1920 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001921 return;
1922 }
1923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1925
1926 if (end - p < 4) {
1927 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1928 return;
1929 }
1930
1931 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001932 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001933
Neil Armstrongca7d5062022-05-31 14:43:23 +02001934#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001935 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001936 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001937 MBEDTLS_ECJPAKE_ROUND_ONE);
1938 if (ret != 0) {
1939 psa_destroy_key(ssl->handshake->psa_pake_password);
1940 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1941 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001942 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001943 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001944#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001945 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001946 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001947 ssl->conf->f_rng, ssl->conf->p_rng);
1948 if (ret != 0) {
1949 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001950 return;
1951 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001952#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001953
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001955 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001956
1957 *olen = kkpp_len + 4;
1958}
1959#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1960
Gilles Peskine449bd832023-01-11 14:50:10 +01001961#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1962static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1963 unsigned char *buf,
1964 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001965{
Ron Eldor75870ec2018-12-06 17:31:55 +02001966 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001967 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001968 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1969
1970 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001971
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1973 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001974 return;
1975 }
1976
Gilles Peskine449bd832023-01-11 14:50:10 +01001977 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001978
Gilles Peskine449bd832023-01-11 14:50:10 +01001979 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001980 mki_len = ssl->dtls_srtp_info.mki_len;
1981 }
1982
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001983 /* The extension total size is 9 bytes :
1984 * - 2 bytes for the extension tag
1985 * - 2 bytes for the total size
1986 * - 2 bytes for the protection profile length
1987 * - 2 bytes for the protection profile
1988 * - 1 byte for the mki length
1989 * + the actual mki length
1990 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 if ((size_t) (end - buf) < mki_len + 9) {
1992 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001993 return;
1994 }
1995
Johan Pascalb62bb512015-12-03 21:56:45 +01001996 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001997 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001998 /*
1999 * total length 5 and mki value: only one profile(2 bytes)
2000 * and length(2 bytes) and srtp_mki )
2001 */
Ron Eldor591f1622018-01-22 12:30:04 +02002002 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002003 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002004
2005 /* protection profile length: 2 */
2006 buf[4] = 0x00;
2007 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002008 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2010 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2011 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2012 } else {
2013 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002014 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002015 }
2016
Ron Eldor591f1622018-01-22 12:30:04 +02002017 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002018 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002019
Ron Eldor591f1622018-01-22 12:30:04 +02002020 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002021}
2022#endif /* MBEDTLS_SSL_DTLS_SRTP */
2023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002024#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002025MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002026static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002027{
Janos Follath865b3eb2019-12-16 11:46:15 +00002028 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002029 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002030 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002031
Gilles Peskine449bd832023-01-11 14:50:10 +01002032 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002033
2034 /*
2035 * struct {
2036 * ProtocolVersion server_version;
2037 * opaque cookie<0..2^8-1>;
2038 * } HelloVerifyRequest;
2039 */
2040
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002041 /* The RFC is not clear on this point, but sending the actual negotiated
2042 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002043 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2044 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002045 p += 2;
2046
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002047 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002048 if (ssl->conf->f_cookie_write == NULL) {
2049 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2050 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002051 }
2052
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002053 /* Skip length byte until we know the length */
2054 cookie_len_byte = p++;
2055
Gilles Peskine449bd832023-01-11 14:50:10 +01002056 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2057 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2058 ssl->cli_id, ssl->cli_id_len)) != 0) {
2059 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2060 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002061 }
2062
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002064
Gilles Peskine449bd832023-01-11 14:50:10 +01002065 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002066
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002067 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002068 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2069 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002071 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002072
Gilles Peskine449bd832023-01-11 14:50:10 +01002073 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2074 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2075 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002076 }
2077
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002078#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002079 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2080 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2081 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2082 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002083 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002084#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002085
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002087
Gilles Peskine449bd832023-01-11 14:50:10 +01002088 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002089}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002090#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002091
Gilles Peskine449bd832023-01-11 14:50:10 +01002092static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002093{
2094 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002095 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002096 mbedtls_ssl_session * const session = ssl->session_negotiate;
2097
2098 /* Resume is 0 by default, see ssl_handshake_init().
2099 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002101 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 }
2103 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002104 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 }
2106 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002107 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002109#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002111 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002112 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002113#endif
2114
Gilles Peskine449bd832023-01-11 14:50:10 +01002115 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002116
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2118 session->id,
2119 session->id_len,
2120 &session_tmp);
2121 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002122 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002124
Gilles Peskine449bd832023-01-11 14:50:10 +01002125 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002126 /* Mismatch between cached and negotiated session */
2127 goto exit;
2128 }
2129
2130 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002132 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002134
Gilles Peskine449bd832023-01-11 14:50:10 +01002135 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002136 ssl->handshake->resume = 1;
2137
2138exit:
2139
Gilles Peskine449bd832023-01-11 14:50:10 +01002140 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002141}
2142
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002143MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002144static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002145{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002146#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002147 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002148#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002149 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002150 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002151 unsigned char *buf, *p;
2152
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002155#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2157 ssl->handshake->cookie_verify_result != 0) {
2158 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2159 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002160
Gilles Peskine449bd832023-01-11 14:50:10 +01002161 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002162 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002163#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002164
Paul Bakker5121ce52009-01-03 21:22:43 +00002165 /*
2166 * 0 . 0 handshake type
2167 * 1 . 3 handshake length
2168 * 4 . 5 protocol version
2169 * 6 . 9 UNIX time()
2170 * 10 . 37 random bytes
2171 */
2172 buf = ssl->out_msg;
2173 p = buf + 4;
2174
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002176 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2179 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002181#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 t = mbedtls_time(NULL);
2183 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002184 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2187 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002188#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2190 return ret;
2191 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002192
2193 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002194#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002195
Ronald Cronc5649382023-04-04 15:33:42 +02002196 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002197 return ret;
2198 }
Ronald Cronc5649382023-04-04 15:33:42 +02002199 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002200
Ronald Cronc5649382023-04-04 15:33:42 +02002201#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2202 /*
2203 * RFC 8446
2204 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2205 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2206 * response to a ClientHello MUST set the last 8 bytes of their Random
2207 * value specially in their ServerHello.
2208 */
2209 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2210 static const unsigned char magic_tls12_downgrade_string[] =
2211 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2212
2213 MBEDTLS_STATIC_ASSERT(
2214 sizeof(magic_tls12_downgrade_string) == 8,
2215 "magic_tls12_downgrade_string does not have the expected size");
2216
Ronald Cronfe01ec22023-04-06 09:56:53 +02002217 memcpy(p, magic_tls12_downgrade_string,
2218 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002219 } else
2220#endif
2221 {
2222 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2223 return ret;
2224 }
2225 }
2226 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002227
Gilles Peskine449bd832023-01-11 14:50:10 +01002228 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002231
Gilles Peskine449bd832023-01-11 14:50:10 +01002232 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002233
Gilles Peskine449bd832023-01-11 14:50:10 +01002234 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002235 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002236 * New session, create a new session id,
2237 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002238 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002239 ssl->state++;
2240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002242 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002243#endif
2244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002246 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002247 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002248 memset(ssl->session_negotiate->id, 0, 32);
2249 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002250#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002251 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002252 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002253 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2254 n)) != 0) {
2255 return ret;
2256 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002257 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002260 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002261 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002262 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002263 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002264
Gilles Peskine449bd832023-01-11 14:50:10 +01002265 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2266 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2267 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002268 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002269 }
2270
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002271 /*
2272 * 38 . 38 session id length
2273 * 39 . 38+n session id
2274 * 39+n . 40+n chosen ciphersuite
2275 * 41+n . 41+n chosen compression alg.
2276 * 42+n . 43+n extensions length
2277 * 44+n . 43+n+m extensions
2278 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002279 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002281 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002282
Gilles Peskine449bd832023-01-11 14:50:10 +01002283 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2284 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2285 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2286 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002287
Gilles Peskine449bd832023-01-11 14:50:10 +01002288 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002289 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002290 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002291
Gilles Peskine449bd832023-01-11 14:50:10 +01002292 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2293 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2294 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2295 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002296
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002297 /*
2298 * First write extensions, then the total length
2299 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002300 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002301 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002303#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002304 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002305 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002306#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002307
Hanno Beckera0e20d02019-05-15 14:03:01 +01002308#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002310 ext_len += olen;
2311#endif
2312
Neil Armstrong76b74072022-04-06 13:43:54 +02002313#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002315 ext_len += olen;
2316#endif
2317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002318#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002319 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002320 ext_len += olen;
2321#endif
2322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002323#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002325 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002326#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002327
Valerio Setti7aeec542023-07-05 18:57:21 +02002328#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002329 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002330 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002331 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002332 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2333 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2334 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002335 ext_len += olen;
2336 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002337#endif
2338
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002339#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002340 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002341 ext_len += olen;
2342#endif
2343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002344#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002345 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002346 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2347 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002348 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002349 }
Paul Elliottf518f812022-07-11 12:36:20 +01002350
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002351 ext_len += olen;
2352#endif
2353
Johan Pascalb62bb512015-12-03 21:56:45 +01002354#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002355 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002356 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002357#endif
2358
Gilles Peskine449bd832023-01-11 14:50:10 +01002359 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2360 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002361
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 if (ext_len > 0) {
2363 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002364 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002365 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002366
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002367 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002368 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2369 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002370
Gilles Peskine449bd832023-01-11 14:50:10 +01002371 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002372
Gilles Peskine449bd832023-01-11 14:50:10 +01002373 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002374
Gilles Peskine449bd832023-01-11 14:50:10 +01002375 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002376}
2377
Gilles Peskineeccd8882020-03-10 12:19:08 +01002378#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002379MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002380static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002381{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002382 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002383 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002384
Gilles Peskine449bd832023-01-11 14:50:10 +01002385 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002386
Gilles Peskine449bd832023-01-11 14:50:10 +01002387 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2388 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002389 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002390 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002391 }
2392
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2394 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002395}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002396#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002397MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002398static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002399{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002401 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002402 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002403 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002404 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002405 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002406 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002407 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002408 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002411
2412 ssl->state++;
2413
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002414#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002415 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002416 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002417 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002418#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002419 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002420
Gilles Peskine449bd832023-01-11 14:50:10 +01002421 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2422 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2423 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2424 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002425 }
2426
2427 /*
2428 * 0 . 0 handshake type
2429 * 1 . 3 handshake length
2430 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002431 * 5 .. m-1 cert types
2432 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002433 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002434 * n .. n+1 length of all DNs
2435 * n+2 .. n+3 length of DN 1
2436 * n+4 .. ... Distinguished Name #1
2437 * ... .. ... length of DN 2, etc.
2438 */
2439 buf = ssl->out_msg;
2440 p = buf + 4;
2441
2442 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002443 * Supported certificate types
2444 *
2445 * ClientCertificateType certificate_types<1..2^8-1>;
2446 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002447 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002448 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002449
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002450#if defined(MBEDTLS_RSA_C)
2451 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002452#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002453#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002454 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002455#endif
2456
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002457 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002458 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002459
Paul Bakker577e0062013-08-28 11:57:20 +02002460 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002461
Paul Bakker926af752012-11-23 13:38:07 +01002462 /*
2463 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002464 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002465 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2466 *
2467 * struct {
2468 * HashAlgorithm hash;
2469 * SignatureAlgorithm signature;
2470 * } SignatureAndHashAlgorithm;
2471 *
2472 * enum { (255) } HashAlgorithm;
2473 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002474 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2476 if (sig_alg == NULL) {
2477 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2478 }
Ronald Cron8457c122022-03-07 11:32:54 +01002479
Gilles Peskine449bd832023-01-11 14:50:10 +01002480 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2481 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002482
Gilles Peskine449bd832023-01-11 14:50:10 +01002483 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002484 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002485 }
2486 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002487 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002488 }
Simon Butcher99000142016-10-13 17:21:01 +01002489
Paul Elliott96a0fd92022-11-08 17:09:56 +00002490 /* Write elements at offsets starting from 1 (offset 0 is for the
2491 * length). Thus the offset of each element is the length of the
2492 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002493 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002495
Paul Bakker926af752012-11-23 13:38:07 +01002496 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002497
Paul Elliott96a0fd92022-11-08 17:09:56 +00002498 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002499 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002500 sa_len += 2;
2501 p += sa_len;
2502
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002503 /*
2504 * DistinguishedName certificate_authorities<0..2^16-1>;
2505 * opaque DistinguishedName<1..2^16-1>;
2506 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002507 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002508
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002509 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002510
Gilles Peskine449bd832023-01-11 14:50:10 +01002511 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002512 /* NOTE: If trusted certificates are provisioned
2513 * via a CA callback (configured through
2514 * `mbedtls_ssl_conf_ca_cb()`, then the
2515 * CertificateRequest is currently left empty. */
2516
Glenn Strauss999ef702022-03-11 01:37:23 -05002517#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2518#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002520 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002521 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002522#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002523 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002524 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002525 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002526#endif
Janos Follath088ce432017-04-10 12:42:31 +01002527#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002529 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002530 } else
Janos Follath088ce432017-04-10 12:42:31 +01002531#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002532 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002533
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002535 /* It follows from RFC 5280 A.1 that this length
2536 * can be represented in at most 11 bits. */
2537 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002538
Gilles Peskine449bd832023-01-11 14:50:10 +01002539 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2540 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002541 break;
2542 }
2543
Gilles Peskine449bd832023-01-11 14:50:10 +01002544 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002545 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002546 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002547 p += dn_size;
2548
Gilles Peskine449bd832023-01-11 14:50:10 +01002549 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002550
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002551 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002552 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002553 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002554 }
2555
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002556 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002557 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2558 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002560
Gilles Peskine449bd832023-01-11 14:50:10 +01002561 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002562
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002564
Gilles Peskine449bd832023-01-11 14:50:10 +01002565 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002566}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002567#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002568
Valerio Setti4d0e8462023-10-06 13:20:21 +02002569#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002570 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002571#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002572MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002573static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002574{
2575 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2576 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002577 mbedtls_pk_context *pk;
2578 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002579 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002580 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2581 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002582#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002583 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002584 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002585 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002586 mbedtls_ecp_keypair *key;
2587#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002588
Gilles Peskine449bd832023-01-11 14:50:10 +01002589 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002590
Gilles Peskine449bd832023-01-11 14:50:10 +01002591 if (pk == NULL) {
2592 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2593 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002594
Valerio Setti0813b6f2023-06-16 12:18:53 +02002595 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002596
Valerio Setti0813b6f2023-06-16 12:18:53 +02002597 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002598 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002599#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2600 case MBEDTLS_PK_ECKEY:
2601 case MBEDTLS_PK_ECKEY_DH:
2602 case MBEDTLS_PK_ECDSA:
2603#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2605 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2606 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002607
Valerio Settibced8bc2023-12-06 10:40:47 +01002608 /* Get the attributes of the key previously parsed by PK module in
2609 * order to extract its type and length (in bits). */
2610 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002611 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002612 ret = PSA_TO_MBEDTLS_ERR(status);
2613 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002615 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002616 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002617
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002618#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2619 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002620 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2621 * module and only have ECDSA capabilities. Since we need
2622 * them for ECDH later, we export and then re-import them with
2623 * proper flags and algorithm. Of course We also set key's type
2624 * and bits that we just got above. */
2625 key_attributes = psa_key_attributes_init();
2626 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2627 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2628 psa_set_key_type(&key_attributes,
2629 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2630 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002631
Valerio Setti202bb712023-12-06 17:05:24 +01002632 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2633 if (status != PSA_SUCCESS) {
2634 ret = PSA_TO_MBEDTLS_ERR(status);
2635 goto exit;
2636 }
2637 status = psa_import_key(&key_attributes, buf, key_len,
2638 &ssl->handshake->xxdh_psa_privkey);
2639 if (status != PSA_SUCCESS) {
2640 ret = PSA_TO_MBEDTLS_ERR(status);
2641 goto exit;
2642 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002643
Valerio Setti202bb712023-12-06 17:05:24 +01002644 /* Set this key as owned by the TLS library: it will be its duty
2645 * to clear it exit. */
2646 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002647
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002648 ret = 0;
2649 break;
2650 }
2651#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2652
2653 /* Opaque key is created by the user (externally from Mbed TLS)
2654 * so we assume it already has the right algorithm and flags
2655 * set. Just copy its ID as reference. */
2656 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2657 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002658 ret = 0;
2659 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002660
Valerio Setti0813b6f2023-06-16 12:18:53 +02002661#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002662 case MBEDTLS_PK_ECKEY:
2663 case MBEDTLS_PK_ECKEY_DH:
2664 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002665 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002666 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002667 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002668 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2669 }
Valerio Setti97207782023-05-18 18:59:06 +02002670 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002671 if (tls_id == 0) {
2672 /* This elliptic curve is not supported */
2673 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2674 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002675
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 /* If the above conversion to TLS ID was fine, then also this one will
2677 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002678 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002679 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002680
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002681 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002682
Gilles Peskine449bd832023-01-11 14:50:10 +01002683 key_attributes = psa_key_attributes_init();
2684 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2685 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2686 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002687 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002688 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002689
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002690 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002691 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002692 mbedtls_platform_zeroize(buf, sizeof(buf));
2693 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002694 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002695
Gilles Peskine449bd832023-01-11 14:50:10 +01002696 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002697 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002699 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002700 mbedtls_platform_zeroize(buf, sizeof(buf));
2701 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002702 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002703
Valerio Setti6835b4a2023-06-22 09:06:31 +02002704 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002705 ret = 0;
2706 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002707#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002708 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002709 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002710 }
2711
Valerio Settibced8bc2023-12-06 10:40:47 +01002712exit:
2713 psa_reset_key_attributes(&key_attributes);
2714 mbedtls_platform_zeroize(buf, sizeof(buf));
2715
Gilles Peskine449bd832023-01-11 14:50:10 +01002716 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002717}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002718#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002719MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002720static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002721{
Janos Follath865b3eb2019-12-16 11:46:15 +00002722 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002723
Gilles Peskine449bd832023-01-11 14:50:10 +01002724 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2725 if (private_key == NULL) {
2726 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2727 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002728 }
2729
Gilles Peskine449bd832023-01-11 14:50:10 +01002730 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2731 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2732 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002733 }
2734
Gilles Peskine449bd832023-01-11 14:50:10 +01002735 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002736 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002737 MBEDTLS_ECDH_OURS)) != 0) {
2738 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2739 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002740 }
2741
Gilles Peskine449bd832023-01-11 14:50:10 +01002742 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002743}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002744#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002745#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2746 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002747
Gilles Peskineeccd8882020-03-10 12:19:08 +01002748#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002749 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002750MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002751static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2752 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002753{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002754 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2755 * signature length which will be added in ssl_write_server_key_exchange
2756 * after the call to ssl_prepare_server_key_exchange.
2757 * ssl_write_server_key_exchange also takes care of incrementing
2758 * ssl->out_msglen. */
2759 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002760 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2761 - sig_start);
2762 int ret = ssl->conf->f_async_resume(ssl,
2763 sig_start, signature_len, sig_max_len);
2764 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002765 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002766 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002767 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002768 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2769 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002770}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002771#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002772 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002773
Gilles Peskined3eb0612018-01-08 17:07:44 +01002774/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002775 * calculating the signature if any, but excluding formatting the
2776 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002777MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002778static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2779 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002780{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002781 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002782 ssl->handshake->ciphersuite_info;
2783
Gilles Peskineeccd8882020-03-10 12:19:08 +01002784#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002785#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002786 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002787#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002788#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002789
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002790 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002791#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002792 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002793#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002794
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002795#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002796#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002797 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002798#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002799 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 +02002800#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002801#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002802
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002803 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002804
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002805 /*
2806 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002807 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002808 *
2809 */
2810
2811 /*
2812 * - ECJPAKE key exchanges
2813 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002814#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002815 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002816 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002817#if defined(MBEDTLS_USE_PSA_CRYPTO)
2818 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2819 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2820 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002821 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002822 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002823
Valerio Setti6f1b5742022-11-16 10:00:32 +01002824 /*
2825 * The first 3 bytes are:
2826 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2827 * [1, 2] elliptic curve's TLS ID
2828 *
2829 * However since we only support secp256r1 for now, we hardcode its
2830 * TLS ID here
2831 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002832 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002833 MBEDTLS_ECP_DP_SECP256R1);
2834 if (tls_id == 0) {
2835 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002836 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002837 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002838 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002839 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002840
Gilles Peskine449bd832023-01-11 14:50:10 +01002841 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2842 out_p + output_offset,
2843 end_p - out_p - output_offset, &output_len,
2844 MBEDTLS_ECJPAKE_ROUND_TWO);
2845 if (ret != 0) {
2846 psa_destroy_key(ssl->handshake->psa_pake_password);
2847 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2848 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2849 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002850 }
2851
Valerio Setti02c25b52022-11-15 14:08:42 +01002852 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002853 ssl->out_msglen += output_offset;
2854#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002855 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002856
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002857 ret = mbedtls_ecjpake_write_round_two(
2858 &ssl->handshake->ecjpake_ctx,
2859 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002860 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002861 ssl->conf->f_rng, ssl->conf->p_rng);
2862 if (ret != 0) {
2863 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2864 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002865 }
2866
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002867 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002868#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002869 }
2870#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2871
Hanno Becker1aa267c2017-04-28 17:08:27 +01002872 /*
2873 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2874 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2875 * we use empty support identity hints here.
2876 **/
2877#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002878 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002879 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2880 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002881 ssl->out_msg[ssl->out_msglen++] = 0x00;
2882 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002883 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002884#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2885 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002886
Hanno Becker7e5437a2017-04-28 17:15:26 +01002887 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002888 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002889 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002890#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002891 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002892 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002893 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002894
Gilles Peskine449bd832023-01-11 14:50:10 +01002895 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2896 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2897 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002898 }
2899
Paul Bakker41c83d32013-03-20 14:39:14 +01002900 /*
2901 * Ephemeral DH parameters:
2902 *
2903 * struct {
2904 * opaque dh_p<1..2^16-1>;
2905 * opaque dh_g<1..2^16-1>;
2906 * opaque dh_Ys<1..2^16-1>;
2907 * } ServerDHParams;
2908 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002909 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2910 &ssl->conf->dhm_P,
2911 &ssl->conf->dhm_G)) != 0) {
2912 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2913 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002914 }
Paul Bakker48916f92012-09-16 19:57:18 +00002915
Gilles Peskine449bd832023-01-11 14:50:10 +01002916 if ((ret = mbedtls_dhm_make_params(
2917 &ssl->handshake->dhm_ctx,
2918 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2919 ssl->out_msg + ssl->out_msglen, &len,
2920 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2921 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2922 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002923 }
2924
Jerry Yuc5aef882021-12-23 20:15:02 +08002925#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002926 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002927#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002928
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002929 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002930
Gilles Peskine449bd832023-01-11 14:50:10 +01002931 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2932 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2933 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2934 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002935 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002936#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002937
Hanno Becker1aa267c2017-04-28 17:08:27 +01002938 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002939 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002940 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002941#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002942 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002943 /*
2944 * Ephemeral ECDH parameters:
2945 *
2946 * struct {
2947 * ECParameters curve_params;
2948 * ECPoint public;
2949 * } ServerECDHParams;
2950 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002951 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002952 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002953 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002954 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002955
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002956 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002957 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2958 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2959 }
2960 for (; *group_list != 0; group_list++) {
2961 for (curr_tls_id = ssl->handshake->curves_tls_id;
2962 *curr_tls_id != 0; curr_tls_id++) {
2963 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002964 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002965 }
2966 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002967 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002968
Gilles Peskine449bd832023-01-11 14:50:10 +01002969curve_matching_done:
2970 if (*curr_tls_id == 0) {
2971 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2972 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2973 }
2974
2975 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2976 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002977
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002978#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002979 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2980 psa_key_attributes_t key_attributes;
2981 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002982 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2983 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2984 // data length(1)
2985 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002986 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002987 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002988
Gilles Peskine449bd832023-01-11 14:50:10 +01002989 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002990
Valerio Setti40d9ca92023-01-04 16:08:04 +01002991 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002992 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002993 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002994 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2995 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2996 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002997 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002998 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002999 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003000
3001 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01003002 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3003 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003004 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003005 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003006
3007 /*
3008 * ECParameters curve_params
3009 *
3010 * First byte is curve_type, always named_curve
3011 */
3012 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3013
3014 /*
3015 * Next two bytes are the namedcurve value
3016 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003017 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003018 p += 2;
3019
3020 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003021 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003022 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003023 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003024 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003025 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3026 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003027 }
3028
3029 /*
3030 * ECPoint public
3031 *
3032 * First byte is data length.
3033 * It will be filled later. p holds now the data length location.
3034 */
3035
3036 /* Export the public part of the ECDH private key from PSA.
3037 * Make one byte space for the length.
3038 */
3039 unsigned char *own_pubkey = p + data_length_size;
3040
Gilles Peskine449bd832023-01-11 14:50:10 +01003041 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3042 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003043
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003044 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003045 own_pubkey, own_pubkey_max_len,
3046 &len);
3047 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003048 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003049 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003050 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3051 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003052 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003053 }
3054
3055 /* Store the length of the exported public key. */
3056 *p = (uint8_t) len;
3057
3058 /* Determine full message length. */
3059 len += header_size;
3060#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003061 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003062 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003063
Gilles Peskine449bd832023-01-11 14:50:10 +01003064 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3065 curr_grp_id)) != 0) {
3066 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3067 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003068 }
3069
Gilles Peskine449bd832023-01-11 14:50:10 +01003070 if ((ret = mbedtls_ecdh_make_params(
3071 &ssl->handshake->ecdh_ctx, &len,
3072 ssl->out_msg + ssl->out_msglen,
3073 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3074 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3075 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3076 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003077 }
3078
Gilles Peskine449bd832023-01-11 14:50:10 +01003079 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3080 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003081#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003082
Jerry Yuc5aef882021-12-23 20:15:02 +08003083#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003084 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003085#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003086
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003087 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003088 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003089#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003090
Hanno Becker1aa267c2017-04-28 17:08:27 +01003091 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003092 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003093 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003094 * exchange parameters, compute and add the signature here.
3095 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003096 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003097#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003098 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3099 if (dig_signed == NULL) {
3100 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3101 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003102 }
3103
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003104 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003105 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003106 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003107
Janos Follath865b3eb2019-12-16 11:46:15 +00003108 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003109
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003110 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003111 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003112 * For TLS 1.2, obey signature-hash-algorithm extension
3113 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003114 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003115
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003116 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003118
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003119 unsigned char sig_hash =
3120 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003121 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003122
Gilles Peskine449bd832023-01-11 14:50:10 +01003123 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003124
Ronald Cron8457c122022-03-07 11:32:54 +01003125 /* For TLS 1.2, obey signature-hash-algorithm extension
3126 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003127 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3128 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003129 /* (... because we choose a cipher suite
3130 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003131 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003132 }
3133
Gilles Peskine449bd832023-01-11 14:50:10 +01003134 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003135
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003136 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003137 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003138 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003139 if (md_alg != MBEDTLS_MD_NONE) {
3140 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3141 dig_signed,
3142 dig_signed_len,
3143 md_alg);
3144 if (ret != 0) {
3145 return ret;
3146 }
3147 } else {
3148 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3149 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003150 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003151
Gilles Peskine449bd832023-01-11 14:50:10 +01003152 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003153
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003154 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003155 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003156 */
Ronald Cron8457c122022-03-07 11:32:54 +01003157 /*
3158 * We need to specify signature and hash algorithm explicitly through
3159 * a prefix to the signature.
3160 *
3161 * struct {
3162 * HashAlgorithm hash;
3163 * SignatureAlgorithm signature;
3164 * } SignatureAndHashAlgorithm;
3165 *
3166 * struct {
3167 * SignatureAndHashAlgorithm algorithm;
3168 * opaque signature<0..2^16-1>;
3169 * } DigitallySigned;
3170 *
3171 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003172
Gilles Peskine449bd832023-01-11 14:50:10 +01003173 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3174 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003175
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003176#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003177 if (ssl->conf->f_async_sign_start != NULL) {
3178 ret = ssl->conf->f_async_sign_start(ssl,
3179 mbedtls_ssl_own_cert(ssl),
3180 md_alg, hash, hashlen);
3181 switch (ret) {
3182 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3183 /* act as if f_async_sign was null */
3184 break;
3185 case 0:
3186 ssl->handshake->async_in_progress = 1;
3187 return ssl_resume_server_key_exchange(ssl, signature_len);
3188 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3189 ssl->handshake->async_in_progress = 1;
3190 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3191 default:
3192 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3193 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003194 }
3195 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003196#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003197
Gilles Peskine449bd832023-01-11 14:50:10 +01003198 if (mbedtls_ssl_own_key(ssl) == NULL) {
3199 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3200 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003201 }
3202
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003203 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3204 * signature length which will be added in ssl_write_server_key_exchange
3205 * after the call to ssl_prepare_server_key_exchange.
3206 * ssl_write_server_key_exchange also takes care of incrementing
3207 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003208 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3209 md_alg, hash, hashlen,
3210 ssl->out_msg + ssl->out_msglen + 2,
3211 out_buf_len - ssl->out_msglen - 2,
3212 signature_len,
3213 ssl->conf->f_rng,
3214 ssl->conf->p_rng)) != 0) {
3215 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3216 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003217 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003218 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003219#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003220
Gilles Peskine449bd832023-01-11 14:50:10 +01003221 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003222}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003223
Gilles Peskined3eb0612018-01-08 17:07:44 +01003224/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003225 * that do not include a ServerKeyExchange message, do nothing. Either
3226 * way, if successful, move on to the next step in the SSL state
3227 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003228MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003229static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003230{
Janos Follath865b3eb2019-12-16 11:46:15 +00003231 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003232 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003233#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003234 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003235 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003236#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003237
Gilles Peskine449bd832023-01-11 14:50:10 +01003238 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003239
Gilles Peskineeccd8882020-03-10 12:19:08 +01003240#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003241 /* Extract static ECDH parameters and abort if ServerKeyExchange
3242 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003243 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003244 /* For suites involving ECDH, extract DH parameters
3245 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003246#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003247 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3248 ret = ssl_get_ecdh_params_from_cert(ssl);
3249 if (ret != 0) {
3250 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3251 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003252 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003253 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003254#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003255
3256 /* Key exchanges not involving ephemeral keys don't use
3257 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003258 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003259 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003260 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003261 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003262#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003263
Gilles Peskineeccd8882020-03-10 12:19:08 +01003264#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003265 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003266 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003267 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003268 if (ssl->handshake->async_in_progress != 0) {
3269 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3270 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3271 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003272#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003273 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003274 {
3275 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003276 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003277 }
3278
Gilles Peskine449bd832023-01-11 14:50:10 +01003279 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003280 /* If we're starting to write a new message, set ssl->out_msglen
3281 * to 0. But if we're resuming after an asynchronous message,
3282 * out_msglen is the amount of data written so far and mst be
3283 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3285 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3286 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003287 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 }
3289 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003290 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003291
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003292 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003293 * ssl_prepare_server_key_exchange already wrote the signature
3294 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003295#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003296 if (signature_len != 0) {
3297 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3298 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003299
Gilles Peskine449bd832023-01-11 14:50:10 +01003300 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3301 ssl->out_msg + ssl->out_msglen,
3302 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003303
3304 /* Skip over the already-written signature */
3305 ssl->out_msglen += signature_len;
3306 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003307#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003308
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003309 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003310 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3311 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003312
3313 ssl->state++;
3314
Gilles Peskine449bd832023-01-11 14:50:10 +01003315 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3316 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3317 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003318 }
3319
Gilles Peskine449bd832023-01-11 14:50:10 +01003320 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3321 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003322}
3323
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003324MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003325static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003326{
Janos Follath865b3eb2019-12-16 11:46:15 +00003327 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003328
Gilles Peskine449bd832023-01-11 14:50:10 +01003329 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003330
3331 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003332 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3333 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003334
3335 ssl->state++;
3336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003337#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003338 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3339 mbedtls_ssl_send_flight_completed(ssl);
3340 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003341#endif
3342
Gilles Peskine449bd832023-01-11 14:50:10 +01003343 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3344 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3345 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003346 }
3347
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003348#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003349 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3350 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3351 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3352 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003353 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003354#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003355
Gilles Peskine449bd832023-01-11 14:50:10 +01003356 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003357
Gilles Peskine449bd832023-01-11 14:50:10 +01003358 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003359}
3360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003361#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3362 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003363MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003364static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3365 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003366{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003367 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003368 size_t n;
3369
3370 /*
3371 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3372 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003373 if (*p + 2 > end) {
3374 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3375 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003376 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003377
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003378 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003379 *p += 2;
3380
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 if (*p + n > end) {
3382 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3383 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003384 }
3385
Gilles Peskine449bd832023-01-11 14:50:10 +01003386 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3387 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3388 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003389 }
3390
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003391 *p += n;
3392
Gilles Peskine449bd832023-01-11 14:50:10 +01003393 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003394
Gilles Peskine449bd832023-01-11 14:50:10 +01003395 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003396}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003397#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3398 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003399
Gilles Peskineac767e52024-09-20 18:08:44 +02003400#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003401
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003402#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003403MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003404static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3405 unsigned char *peer_pms,
3406 size_t *peer_pmslen,
3407 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003408{
Gilles Peskine449bd832023-01-11 14:50:10 +01003409 int ret = ssl->conf->f_async_resume(ssl,
3410 peer_pms, peer_pmslen, peer_pmssize);
3411 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003412 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003413 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003414 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003415 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3416 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003417}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003418#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003419
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003420MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003421static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3422 const unsigned char *p,
3423 const unsigned char *end,
3424 unsigned char *peer_pms,
3425 size_t *peer_pmslen,
3426 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003427{
Janos Follath865b3eb2019-12-16 11:46:15 +00003428 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003429
Gilles Peskine449bd832023-01-11 14:50:10 +01003430 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3431 if (own_cert == NULL) {
3432 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3433 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003434 }
3435 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003436 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3437 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003438
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003439#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003440 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003441 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003442 if (ssl->handshake->async_in_progress != 0) {
3443 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3444 return ssl_resume_decrypt_pms(ssl,
3445 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003446 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003447#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003448
3449 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003450 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003451 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003452 if (p + 2 > end) {
3453 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3454 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003455 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003456 if (*p++ != MBEDTLS_BYTE_1(len) ||
3457 *p++ != MBEDTLS_BYTE_0(len)) {
3458 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3459 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003460 }
3461
Gilles Peskine449bd832023-01-11 14:50:10 +01003462 if (p + len != end) {
3463 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3464 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003465 }
3466
Gilles Peskine422ccab2018-01-11 18:29:01 +01003467 /*
3468 * Decrypt the premaster secret
3469 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003470#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003471 if (ssl->conf->f_async_decrypt_start != NULL) {
3472 ret = ssl->conf->f_async_decrypt_start(ssl,
3473 mbedtls_ssl_own_cert(ssl),
3474 p, len);
3475 switch (ret) {
3476 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3477 /* act as if f_async_decrypt_start was null */
3478 break;
3479 case 0:
3480 ssl->handshake->async_in_progress = 1;
3481 return ssl_resume_decrypt_pms(ssl,
3482 peer_pms,
3483 peer_pmslen,
3484 peer_pmssize);
3485 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3486 ssl->handshake->async_in_progress = 1;
3487 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3488 default:
3489 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3490 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003491 }
3492 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003493#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003494
Gilles Peskine449bd832023-01-11 14:50:10 +01003495 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3496 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3497 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003498 }
3499
Gilles Peskine449bd832023-01-11 14:50:10 +01003500 ret = mbedtls_pk_decrypt(private_key, p, len,
3501 peer_pms, peer_pmslen, peer_pmssize,
3502 ssl->conf->f_rng, ssl->conf->p_rng);
3503 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003504}
3505
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003506MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003507static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3508 const unsigned char *p,
3509 const unsigned char *end,
3510 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003511{
Janos Follath865b3eb2019-12-16 11:46:15 +00003512 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003513 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3514 unsigned char ver[2];
3515 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003516 size_t peer_pmslen;
3517 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003518
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003519 /* In case of a failure in decryption, the decryption may write less than
3520 * 2 bytes of output, but we always read the first two bytes. It doesn't
3521 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003522 * ret being nonzero, and we only care whether diff is 0.
3523 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3524 * also makes memory analyzers happy (don't access uninitialized memory,
3525 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003526 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003527 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003528
Gilles Peskine449bd832023-01-11 14:50:10 +01003529 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3530 peer_pms,
3531 &peer_pmslen,
3532 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003533
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003534#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003535 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3536 return ret;
3537 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003538#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003539
Gilles Peskine449bd832023-01-11 14:50:10 +01003540 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3541 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003542
3543 /* Avoid data-dependent branches while checking for invalid
3544 * padding, to protect against timing-based Bleichenbacher-type
3545 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003546 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003547 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3548 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3549 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003550
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003551 /*
3552 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3553 * must not cause the connection to end immediately; instead, send a
3554 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003555 * To protect against timing-based variants of the attack, we must
3556 * not have any branch that depends on whether the decryption was
3557 * successful. In particular, always generate the fake premaster secret,
3558 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003559 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003560 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3561 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003562 /* It's ok to abort on an RNG failure, since this does not reveal
3563 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003564 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003565 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003566
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003567#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003568 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003569 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3570 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003571#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003572
Gilles Peskine449bd832023-01-11 14:50:10 +01003573 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3574 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3575 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3576 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003577 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003579
Gilles Peskine422ccab2018-01-11 18:29:01 +01003580 /* Set pms to either the true or the fake PMS, without
3581 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003582 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003583
Gilles Peskine449bd832023-01-11 14:50:10 +01003584 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003585}
Gilles Peskineac767e52024-09-20 18:08:44 +02003586#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003587
Gilles Peskineeccd8882020-03-10 12:19:08 +01003588#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003589MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003590static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3591 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003592{
Paul Bakker6db455e2013-09-18 17:29:31 +02003593 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003594 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003595
Gilles Peskine449bd832023-01-11 14:50:10 +01003596 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3597 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3598 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003599 }
3600
3601 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003602 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003603 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003604 if (end - *p < 2) {
3605 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3606 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003607 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003608
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003609 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003610 *p += 2;
3611
Gilles Peskine449bd832023-01-11 14:50:10 +01003612 if (n == 0 || n > end - *p) {
3613 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3614 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003615 }
3616
Gilles Peskine449bd832023-01-11 14:50:10 +01003617 if (ssl->conf->f_psk != NULL) {
3618 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003619 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003620 }
3621 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003622 /* Identity is not a big secret since clients send it in the clear,
3623 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 if (n != ssl->conf->psk_identity_len ||
3625 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003626 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003627 }
3628 }
3629
Gilles Peskine449bd832023-01-11 14:50:10 +01003630 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3631 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3632 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3633 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3634 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003635 }
3636
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003637 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003638
Gilles Peskine449bd832023-01-11 14:50:10 +01003639 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003640}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003641#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003642
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003643MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003644static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003645{
Janos Follath865b3eb2019-12-16 11:46:15 +00003646 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003647 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003648 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003649
Hanno Beckere694c3e2017-12-27 21:34:08 +00003650 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003651
Gilles Peskine449bd832023-01-11 14:50:10 +01003652 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003653
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003654#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskineac767e52024-09-20 18:08:44 +02003655 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine712e9a12024-09-20 18:11:31 +02003656 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA &&
Gilles Peskine449bd832023-01-11 14:50:10 +01003657 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003658 /* We've already read a record and there is an asynchronous
3659 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003660 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003661 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3662 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003663#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003664 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3665 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3666 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003667 }
3668
Gilles Peskine449bd832023-01-11 14:50:10 +01003669 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003670 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003671
Gilles Peskine449bd832023-01-11 14:50:10 +01003672 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3673 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3674 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003675 }
3676
Gilles Peskine449bd832023-01-11 14:50:10 +01003677 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3678 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3679 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003680 }
3681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003682#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003683 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3684 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3685 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3686 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003687 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003688
Gilles Peskine449bd832023-01-11 14:50:10 +01003689 if (p != end) {
3690 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3691 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003692 }
3693
Gilles Peskine449bd832023-01-11 14:50:10 +01003694 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3695 ssl->handshake->premaster,
3696 MBEDTLS_PREMASTER_SIZE,
3697 &ssl->handshake->pmslen,
3698 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3699 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3700 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003701 }
3702
Gilles Peskine449bd832023-01-11 14:50:10 +01003703 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3704 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003705#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003706#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3707 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3708 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3709 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003710 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003711 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3712 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003713 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003714#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003715 size_t data_len = (size_t) (*p++);
3716 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003717 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3718 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3719
Gilles Peskine530c4232023-10-02 15:37:23 +02003720 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003721
3722 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003723 * We must have at least two bytes (1 for length, at least 1 for data)
3724 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003726 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3727 buf_len));
3728 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003729 }
3730
Gilles Peskine449bd832023-01-11 14:50:10 +01003731 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003732 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3733 " > %" MBEDTLS_PRINTF_SIZET,
3734 data_len, buf_len));
3735 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003736 }
3737
3738 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003739 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003740 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3741 " > %" MBEDTLS_PRINTF_SIZET,
3742 data_len,
3743 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003744 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3745 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003746 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3747 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003748
3749 /* Compute ECDH shared secret. */
3750 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003751 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3752 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003753 handshake->premaster, sizeof(handshake->premaster),
3754 &handshake->pmslen);
3755 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003756 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003757 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003758 if (handshake->xxdh_psa_privkey_is_external == 0) {
3759 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003760 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003761 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003762 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003763 }
3764
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003765 if (handshake->xxdh_psa_privkey_is_external == 0) {
3766 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003767
Gilles Peskine449bd832023-01-11 14:50:10 +01003768 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003769 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003770 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3771 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003772 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003773 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003774 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003775#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003776 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003777 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3779 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003780 }
3781
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3783 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003784
Gilles Peskine449bd832023-01-11 14:50:10 +01003785 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3786 &ssl->handshake->pmslen,
3787 ssl->handshake->premaster,
3788 MBEDTLS_MPI_MAX_SIZE,
3789 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3790 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3791 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003792 }
3793
Gilles Peskine449bd832023-01-11 14:50:10 +01003794 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3795 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003796#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003798#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3799 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3800 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3801 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3802#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3804 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3805 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3806 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003807 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003808
Gilles Peskine449bd832023-01-11 14:50:10 +01003809 if (p != end) {
3810 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3811 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003812 }
3813
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003814#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003815 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003816 (mbedtls_key_exchange_type_t) ciphersuite_info->
3817 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003818 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3819 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003820 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003821#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003822 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003823#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003824#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3826 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3827 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3828 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003829 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003830 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3831 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3832 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003833 }
3834
Gilles Peskine449bd832023-01-11 14:50:10 +01003835 if (p != end) {
3836 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3837 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003838 }
3839
Neil Armstrong80f6f322022-05-03 17:56:38 +02003840#if defined(MBEDTLS_USE_PSA_CRYPTO)
3841 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003842 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003843 size_t pms_len;
3844
3845 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003846 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3847 pms + 2, pms_end - (pms + 2), &pms_len,
3848 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3849 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3850 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003851 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003853 pms += 2 + pms_len;
3854
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003856#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003857 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003858 (mbedtls_key_exchange_type_t) ciphersuite_info->
3859 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003860 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3861 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003862 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003863#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003865#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003866#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003867 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003868#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003869 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3870 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003871 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003872
3873 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3874
Gilles Peskine449bd832023-01-11 14:50:10 +01003875 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3876 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003877 psa_destroy_key(handshake->xxdh_psa_privkey);
3878 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003879 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003880 }
3881
3882 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003883 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003884 psa_destroy_key(handshake->xxdh_psa_privkey);
3885 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003886 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003887 }
3888
Neil Armstrong039db292022-03-09 11:38:34 +01003889 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003890 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003891 psa_destroy_key(handshake->xxdh_psa_privkey);
3892 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003894 }
3895
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003896 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3897 the sizes of the FFDH keys which are at least 2048 bits.
3898 The size of the array is thus greater than 256 bytes which is greater than any
3899 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003900#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003901 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3902 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_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003905 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003906#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003907 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3908 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003909#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003910
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003911 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3912 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003913 p += ecpoint_len;
3914
Neil Armstrong3bcef082022-03-23 18:16:54 +01003915 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003916 * - a uint16 containing the length (in octets) of the ECDH computation
3917 * - the octet string produced by the ECDH computation
3918 * - a uint16 containing the length (in octets) of the PSK
3919 * - the PSK itself
3920 */
Neil Armstrong039db292022-03-09 11:38:34 +01003921 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003922 const unsigned char * const psm_end =
3923 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003924 /* uint16 to store length (in octets) of the ECDH computation */
3925 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003926 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003927
3928 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003929 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003930 handshake->xxdh_psa_privkey,
3931 handshake->xxdh_psa_peerkey,
3932 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003933 psm + zlen_size,
3934 psm_end - (psm + zlen_size),
3935 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003936
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003937 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3938 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003939
Gilles Peskine449bd832023-01-11 14:50:10 +01003940 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003941 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003942 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003943 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003944 }
Neil Armstrong039db292022-03-09 11:38:34 +01003945
Neil Armstrong3bcef082022-03-23 18:16:54 +01003946 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003947 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003948 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003949
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003950#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003951 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3952 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3953 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003954 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003955
Gilles Peskine449bd832023-01-11 14:50:10 +01003956 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003957 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3959 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003960 }
3961
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3963 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003964
Gilles Peskine449bd832023-01-11 14:50:10 +01003965 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003966 (mbedtls_key_exchange_type_t) ciphersuite_info->
3967 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003968 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3969 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003970 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003971#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003972 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003973#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3974#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3976 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3977 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3978 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003979 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003981#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003982#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003983 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02003984#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003985 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003986 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003987 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3988 psa_destroy_key(ssl->handshake->psa_pake_password);
3989 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003990
Gilles Peskine449bd832023-01-11 14:50:10 +01003991 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3992 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003993 }
3994#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003995 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003996 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01003997 if (ret != 0) {
3998 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
3999 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004000 }
4001
Gilles Peskine449bd832023-01-11 14:50:10 +01004002 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4003 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4004 ssl->conf->f_rng, ssl->conf->p_rng);
4005 if (ret != 0) {
4006 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4007 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004008 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004009#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004010 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004011#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004012 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004013 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4014 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004015 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004016
Gilles Peskine449bd832023-01-11 14:50:10 +01004017 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4018 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4019 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004020 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004021
Paul Bakker5121ce52009-01-03 21:22:43 +00004022 ssl->state++;
4023
Gilles Peskine449bd832023-01-11 14:50:10 +01004024 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004025
Gilles Peskine449bd832023-01-11 14:50:10 +01004026 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004027}
4028
Gilles Peskineeccd8882020-03-10 12:19:08 +01004029#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004030MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004031static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004032{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004033 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004034 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004035
Gilles Peskine449bd832023-01-11 14:50:10 +01004036 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004037
Gilles Peskine449bd832023-01-11 14:50:10 +01004038 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4039 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004040 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004041 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004042 }
4043
Gilles Peskine449bd832023-01-11 14:50:10 +01004044 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4045 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004046}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004047#else /* !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 Bakker48f7a5d2013-04-19 14:30:58 +02004050{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004051 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004052 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004053 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004054 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004055 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004056 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004057 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004058 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004059 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004060 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004061
Gilles Peskine449bd832023-01-11 14:50:10 +01004062 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004063
Gilles Peskine449bd832023-01-11 14:50:10 +01004064 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4065 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004066 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004067 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004068 }
4069
Hanno Becker2a831a42019-02-07 13:17:25 +00004070#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004071 if (ssl->session_negotiate->peer_cert == NULL) {
4072 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004073 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004074 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004075 }
4076#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004077 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4078 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004079 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004080 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004081 }
4082#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4083
Simon Butcher99000142016-10-13 17:21:01 +01004084 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004085 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4086 if (0 != ret) {
4087 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4088 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004089 }
4090
4091 ssl->state++;
4092
Simon Butcher99000142016-10-13 17:21:01 +01004093 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004094 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4095 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4096 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4097 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004098 }
4099
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004101
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004102#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4103 peer_pk = &ssl->handshake->peer_pubkey;
4104#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004105 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004106 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004107 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004108 }
4109 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4110#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4111
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004112 /*
4113 * struct {
4114 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4115 * opaque signature<0..2^16-1>;
4116 * } DigitallySigned;
4117 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004118 if (i + 2 > ssl->in_hslen) {
4119 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4120 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004121 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004122
Ronald Cron8457c122022-03-07 11:32:54 +01004123 /*
4124 * Hash
4125 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004126 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004127
Gilles Peskine449bd832023-01-11 14:50:10 +01004128 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4129 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4130 " for verify message"));
4131 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004132 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004133
Simon Butcher99000142016-10-13 17:21:01 +01004134#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004135 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004136 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004137 }
Simon Butcher99000142016-10-13 17:21:01 +01004138#endif
Paul Bakker926af752012-11-23 13:38:07 +01004139
Ronald Cron8457c122022-03-07 11:32:54 +01004140 /* Info from md_alg will be used instead */
4141 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004142
Ronald Cron8457c122022-03-07 11:32:54 +01004143 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004144
Ronald Cron8457c122022-03-07 11:32:54 +01004145 /*
4146 * Signature
4147 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004148 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4149 == MBEDTLS_PK_NONE) {
4150 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4151 " for verify message"));
4152 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004153 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004154
Ronald Cron8457c122022-03-07 11:32:54 +01004155 /*
4156 * Check the certificate's key type matches the signature alg
4157 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004158 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4159 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4160 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004161 }
4162
4163 i++;
4164
Gilles Peskine449bd832023-01-11 14:50:10 +01004165 if (i + 2 > ssl->in_hslen) {
4166 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4167 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004168 }
4169
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004170 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004171 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004172
Gilles Peskine449bd832023-01-11 14:50:10 +01004173 if (i + sig_len != ssl->in_hslen) {
4174 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4175 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004176 }
4177
Simon Butcher99000142016-10-13 17:21:01 +01004178 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004179 {
4180 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004181 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4182 if (0 != ret) {
4183 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4184 return ret;
4185 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004186 }
Simon Butcher99000142016-10-13 17:21:01 +01004187
Gilles Peskine449bd832023-01-11 14:50:10 +01004188 if ((ret = mbedtls_pk_verify(peer_pk,
4189 md_alg, hash_start, hashlen,
4190 ssl->in_msg + i, sig_len)) != 0) {
4191 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4192 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004193 }
4194
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004195 ret = mbedtls_ssl_update_handshake_status(ssl);
4196 if (0 != ret) {
4197 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4198 return ret;
4199 }
Simon Butcher99000142016-10-13 17:21:01 +01004200
Gilles Peskine449bd832023-01-11 14:50:10 +01004201 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004202
Gilles Peskine449bd832023-01-11 14:50:10 +01004203 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004204}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004205#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004207#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004208MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004209static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004210{
Janos Follath865b3eb2019-12-16 11:46:15 +00004211 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004212 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004213 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004214
Gilles Peskine449bd832023-01-11 14:50:10 +01004215 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004217 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4218 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004219
4220 /*
4221 * struct {
4222 * uint32 ticket_lifetime_hint;
4223 * opaque ticket<0..2^16-1>;
4224 * } NewSessionTicket;
4225 *
4226 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4227 * 8 . 9 ticket_len (n)
4228 * 10 . 9+n ticket content
4229 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004230
Ronald Cron3c0072b2023-11-22 10:00:14 +01004231#if defined(MBEDTLS_HAVE_TIME)
4232 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4233#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004234 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4235 ssl->session_negotiate,
4236 ssl->out_msg + 10,
4237 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4238 &tlen, &lifetime)) != 0) {
4239 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004240 tlen = 0;
4241 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004242
Gilles Peskine449bd832023-01-11 14:50:10 +01004243 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4244 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004245 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004246
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004247 /*
4248 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4249 * ChangeCipherSpec share the same state.
4250 */
4251 ssl->handshake->new_session_ticket = 0;
4252
Gilles Peskine449bd832023-01-11 14:50:10 +01004253 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4254 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4255 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004256 }
4257
Gilles Peskine449bd832023-01-11 14:50:10 +01004258 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004259
Gilles Peskine449bd832023-01-11 14:50:10 +01004260 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004261}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004262#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004263
Paul Bakker5121ce52009-01-03 21:22:43 +00004264/*
Paul Bakker1961b702013-01-25 14:49:24 +01004265 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004266 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004267int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004268{
4269 int ret = 0;
4270
Gilles Peskine449bd832023-01-11 14:50:10 +01004271 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004272
Gilles Peskine449bd832023-01-11 14:50:10 +01004273 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004274 case MBEDTLS_SSL_HELLO_REQUEST:
4275 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004276 break;
4277
Paul Bakker1961b702013-01-25 14:49:24 +01004278 /*
4279 * <== ClientHello
4280 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004281 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004282 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004283 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004285#if defined(MBEDTLS_SSL_PROTO_DTLS)
4286 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004287 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004288#endif
4289
Paul Bakker1961b702013-01-25 14:49:24 +01004290 /*
4291 * ==> ServerHello
4292 * Certificate
4293 * ( ServerKeyExchange )
4294 * ( CertificateRequest )
4295 * ServerHelloDone
4296 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004297 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004298 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004299 break;
4300
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004301 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004302 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004303 break;
4304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004305 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004306 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004307 break;
4308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004309 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004310 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004311 break;
4312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004313 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004314 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004315 break;
4316
4317 /*
4318 * <== ( Certificate/Alert )
4319 * ClientKeyExchange
4320 * ( CertificateVerify )
4321 * ChangeCipherSpec
4322 * Finished
4323 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004324 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004325 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004326 break;
4327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004328 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004329 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004330 break;
4331
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004332 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004333 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004334 break;
4335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004336 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004337 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004338 break;
4339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004340 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004341 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004342 break;
4343
4344 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004345 * ==> ( NewSessionTicket )
4346 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004347 * Finished
4348 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004349 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4350#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004351 if (ssl->handshake->new_session_ticket != 0) {
4352 ret = ssl_write_new_session_ticket(ssl);
4353 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004354#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004355 ret = mbedtls_ssl_write_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_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004359 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004360 break;
4361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004362 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004363 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004364 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004365 break;
4366
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004367 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004368 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004369 break;
4370
4371 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004372 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4373 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004374 }
4375
Gilles Peskine449bd832023-01-11 14:50:10 +01004376 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004377}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004378
Gilles Peskine449bd832023-01-11 14:50:10 +01004379void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004380{
TRodziewicz3946f792021-06-14 12:11:18 +02004381 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004382}
4383
Jerry Yufb4b6472022-01-27 15:03:26 +08004384#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */