blob: aca37fd2bb8baf64bf9b6d3727802ea5bd13de52 [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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001062 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001063 * Copy the client's handshake message_seq on initial handshakes,
1064 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001065 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001068 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001069 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001070 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1071 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1072 "%u (expected %u)", cli_msg_seq,
1073 ssl->handshake->in_msg_seq));
1074 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001075 }
1076
1077 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001079#endif
1080 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001081 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001082 ssl->handshake->out_msg_seq = cli_msg_seq;
1083 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1084 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001085 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001086 /*
1087 * For now we don't support fragmentation, so make sure
1088 * fragment_offset == 0 and fragment_length == length
1089 */
1090 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1092 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1093 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001094 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 4, ("fragment_offset=%u fragment_length=%u length=%u",
1096 (unsigned) fragment_offset, (unsigned) fragment_length,
1097 (unsigned) length));
1098 if (fragment_offset != 0 || length != fragment_length) {
1099 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1100 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001101 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001102 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001103 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001105
Gilles Peskine449bd832023-01-11 14:50:10 +01001106 buf += mbedtls_ssl_hs_hdr_len(ssl);
1107 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001108
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001109 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001110 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001111 * 0 . 1 protocol version
1112 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001113 * 34 . 34 session id length (1 byte)
1114 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001115 * 35+x . 35+x DTLS only: cookie length (1 byte)
1116 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001117 * .. . .. ciphersuite list length (2 bytes)
1118 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001119 * .. . .. compression alg. list length (1 byte)
1120 * .. . .. compression alg. list
1121 * .. . .. extensions length (2 bytes, optional)
1122 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001123 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001124
1125 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001126 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001127 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1128 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001129 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 if (msg_len < 38) {
1131 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1132 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001133 }
1134
1135 /*
1136 * Check and save the protocol version
1137 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001138 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001139
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001140 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1141 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001142 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001143 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001144
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1146 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1147 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1148 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1149 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001150 }
1151
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001152 /*
1153 * Save client random (inc. Unix time)
1154 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001155 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001158
1159 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001160 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001161 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001162 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001163
Gilles Peskine449bd832023-01-11 14:50:10 +01001164 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1165 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1166 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1167 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1168 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1169 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001170 }
1171
Gilles Peskine449bd832023-01-11 14:50:10 +01001172 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001173
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001174 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 memset(ssl->session_negotiate->id, 0,
1176 sizeof(ssl->session_negotiate->id));
1177 memcpy(ssl->session_negotiate->id, buf + 35,
1178 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001179
1180 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001181 * Check the cookie length and content
1182 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001185 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001186 cookie_len = buf[cookie_offset];
1187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1189 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1190 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1191 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1192 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001193 }
1194
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1196 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001198#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#if defined(MBEDTLS_SSL_RENEGOTIATION)
1201 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001202#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 ) {
1204 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1205 buf + cookie_offset + 1, cookie_len,
1206 ssl->cli_id, ssl->cli_id_len) != 0) {
1207 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001208 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001209 } else {
1210 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001211 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001212 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001213 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001214#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001215 {
1216 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001218 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1220 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001221 }
1222
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001224 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 /*
1227 * Check the ciphersuitelist length (will be parsed later)
1228 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001229 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001231#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001233
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001234 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001235
Gilles Peskine449bd832023-01-11 14:50:10 +01001236 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001237 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 (ciph_len % 2) != 0) {
1239 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1240 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1241 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1242 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001243 }
1244
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1246 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001247
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001248 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001249 * Check the compression algorithm's length.
1250 * The list contents are ignored because implementing
1251 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1252 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001253 */
1254 comp_offset = ciph_offset + 2 + ciph_len;
1255
1256 comp_len = buf[comp_offset];
1257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001259 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 comp_len + comp_offset + 1 > msg_len) {
1261 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1262 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1263 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1264 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001265 }
1266
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1268 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001269
Gilles Peskine449bd832023-01-11 14:50:10 +01001270 /*
1271 * Check the extension length
1272 */
1273 ext_offset = comp_offset + 1 + comp_len;
1274 if (msg_len > ext_offset) {
1275 if (msg_len < ext_offset + 2) {
1276 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1277 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1278 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1279 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001280 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001281
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001282 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001283
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 if (msg_len != ext_offset + 2 + ext_len) {
1285 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1286 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1287 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1288 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1289 }
1290 } else {
1291 ext_len = 0;
1292 }
Paul Bakker48916f92012-09-16 19:57:18 +00001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 ext = buf + ext_offset + 2;
1295 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1296
1297 while (ext_len != 0) {
1298 unsigned int ext_id;
1299 unsigned int ext_size;
1300 if (ext_len < 4) {
1301 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1302 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1303 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1304 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1305 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001306 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1307 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001308
1309 if (ext_size + 4 > ext_len) {
1310 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1311 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1312 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1313 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1314 }
1315 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001317 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1319 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1320 ext + 4 + ext_size);
1321 if (ret != 0) {
1322 return ret;
1323 }
Simon Butcher584a5472016-05-23 16:24:52 +01001324 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001325#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001326
Simon Butcher584a5472016-05-23 16:24:52 +01001327 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001328 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001330 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001331#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001332
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1334 if (ret != 0) {
1335 return ret;
1336 }
Simon Butcher584a5472016-05-23 16:24:52 +01001337 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001338
Jerry Yue7541932022-01-28 10:21:24 +08001339#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001340 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001342
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1344 if (ret != 0) {
1345 return ret;
1346 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001347
1348 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001349 break;
Jerry Yue7541932022-01-28 10:21:24 +08001350#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001351
Valerio Setti60d3b912023-07-25 10:43:53 +02001352#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001353 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001355 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001357
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1359 if (ret != 0) {
1360 return ret;
1361 }
Simon Butcher584a5472016-05-23 16:24:52 +01001362 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001363
Simon Butcher584a5472016-05-23 16:24:52 +01001364 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001366 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001367
Gilles Peskine449bd832023-01-11 14:50:10 +01001368 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1369 if (ret != 0) {
1370 return ret;
1371 }
Simon Butcher584a5472016-05-23 16:24:52 +01001372 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001373#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001374 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001375 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001376
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001377#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001378 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001379 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001380
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1382 if (ret != 0) {
1383 return ret;
1384 }
Simon Butcher584a5472016-05-23 16:24:52 +01001385 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001386#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001389 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001390 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001391
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1393 if (ret != 0) {
1394 return ret;
1395 }
Simon Butcher584a5472016-05-23 16:24:52 +01001396 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001397#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001398
Hanno Beckera0e20d02019-05-15 14:03:01 +01001399#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001400 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001402
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1404 if (ret != 0) {
1405 return ret;
1406 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001407 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001408#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001410#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001411 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001413
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1415 if (ret != 0) {
1416 return ret;
1417 }
Simon Butcher584a5472016-05-23 16:24:52 +01001418 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001422 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1426 if (ret != 0) {
1427 return ret;
1428 }
Simon Butcher584a5472016-05-23 16:24:52 +01001429 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001432#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001433 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001434 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001435
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1437 if (ret != 0) {
1438 return ret;
1439 }
Simon Butcher584a5472016-05-23 16:24:52 +01001440 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001444 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001446
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1448 ext + 4 + ext_size);
1449 if (ret != 0) {
1450 return ret;
1451 }
Simon Butcher584a5472016-05-23 16:24:52 +01001452 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001453#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001454
Johan Pascalb62bb512015-12-03 21:56:45 +01001455#if defined(MBEDTLS_SSL_DTLS_SRTP)
1456 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001458
Gilles Peskine449bd832023-01-11 14:50:10 +01001459 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1460 if (ret != 0) {
1461 return ret;
1462 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001463 break;
1464#endif /* MBEDTLS_SSL_DTLS_SRTP */
1465
Simon Butcher584a5472016-05-23 16:24:52 +01001466 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001467 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1468 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001469 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001470
Gilles Peskine449bd832023-01-11 14:50:10 +01001471 ext_len -= 4 + ext_size;
1472 ext += 4 + ext_size;
1473 }
1474
Jerry Yue7541932022-01-28 10:21:24 +08001475#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001476
1477 /*
1478 * Try to fall back to default hash SHA1 if the client
1479 * hasn't provided any preferred signature-hash combinations.
1480 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001481 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001482 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1483 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001484#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001485 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1486 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001487#endif
1488#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001489 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1490 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001491#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001492 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001493 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001494
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001495 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1496 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1497 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001498
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001500 }
1501
Jerry Yue7541932022-01-28 10:21:24 +08001502#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001503
Paul Bakker48916f92012-09-16 19:57:18 +00001504 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001505 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1506 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001507 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1508 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1509 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001510#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001511 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1512 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1513 "during renegotiation"));
1514 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1515 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1516 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001517 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001518#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001519 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001520 break;
1521 }
1522 }
1523
1524 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001525 * Renegotiation security checks
1526 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001527 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1528 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1529 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001530 handshake_failure = 1;
1531 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001532#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001534 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001535 renegotiation_info_seen == 0) {
1536 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001537 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001538 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1539 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1540 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1541 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
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 renegotiation_info_seen == 1) {
1546 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001547 handshake_failure = 1;
1548 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001549#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001550
Gilles Peskine449bd832023-01-11 14:50:10 +01001551 if (handshake_failure == 1) {
1552 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1553 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1554 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001555 }
Paul Bakker380da532012-04-18 16:10:25 +00001556
Paul Bakker41c83d32013-03-20 14:39:14 +01001557 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001558 * Server certification selection (after processing TLS extensions)
1559 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001560 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1561 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1562 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001563 }
Glenn Strauss69894072022-01-24 12:58:00 -05001564#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1565 ssl->handshake->sni_name = NULL;
1566 ssl->handshake->sni_name_len = 0;
1567#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001568
1569 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001570 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001571 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001572 * and certificate from the SNI callback triggered by the SNI extension
1573 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001574 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001575 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001576 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001577 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001578
Gilles Peskine449bd832023-01-11 14:50:10 +01001579 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1580 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1581 for (i = 0; ciphersuites[i] != 0; i++) {
1582 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001583 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001584 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001585
TRodziewicz8476f2f2021-06-02 14:34:47 +02001586 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001587
Gilles Peskine449bd832023-01-11 14:50:10 +01001588 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1589 &ciphersuite_info)) != 0) {
1590 return ret;
1591 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001592
Gilles Peskine449bd832023-01-11 14:50:10 +01001593 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001594 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001595 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001596 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001597 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001598 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001599 for (i = 0; ciphersuites[i] != 0; i++) {
1600 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1601 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001602 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001604
1605 got_common_suite = 1;
1606
Gilles Peskine449bd832023-01-11 14:50:10 +01001607 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1608 &ciphersuite_info)) != 0) {
1609 return ret;
1610 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001611
Gilles Peskine449bd832023-01-11 14:50:10 +01001612 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001613 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001614 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001615 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001616 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001617 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001618
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 if (got_common_suite) {
1620 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1621 "but none of them usable"));
1622 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1623 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1624 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1625 } else {
1626 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
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;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001630 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001631
1632have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001634
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001635 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001636 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001637
Paul Bakker5121ce52009-01-03 21:22:43 +00001638 ssl->state++;
1639
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001640#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1642 mbedtls_ssl_recv_flight_completed(ssl);
1643 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001644#endif
1645
Hanno Becker7e5437a2017-04-28 17:15:26 +01001646 /* Debugging-only output for testsuite */
1647#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001648 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001649 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1650 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001651 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001652 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1653 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1654 sig_hash));
1655 } else {
1656 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1657 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001658 }
1659#endif
1660
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001662
Gilles Peskine449bd832023-01-11 14:50:10 +01001663 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001664}
1665
Hanno Beckera0e20d02019-05-15 14:03:01 +01001666#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001667static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1668 unsigned char *buf,
1669 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001670{
1671 unsigned char *p = buf;
1672 size_t ext_len;
1673 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1674
1675 *olen = 0;
1676
1677 /* Skip writing the extension if we don't want to use it or if
1678 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001679 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001680 return;
1681 }
1682
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1684 * which is at most 255, so the increment cannot overflow. */
1685 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1686 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1687 return;
1688 }
1689
1690 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001691
1692 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001693 * struct {
1694 * opaque cid<0..2^8-1>;
1695 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001696 */
1697 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001698 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001699 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001700 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001701 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001702
1703 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001704 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001705
1706 *olen = ssl->own_cid_len + 5;
1707}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001708#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001709
Neil Armstrong76b74072022-04-06 13:43:54 +02001710#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001711static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1712 unsigned char *buf,
1713 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001714{
1715 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001716 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001717
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001718 /*
1719 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1720 * from a client and then selects a stream or Authenticated Encryption
1721 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1722 * encrypt-then-MAC response extension back to the client."
1723 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001724 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001725 ssl->session_negotiate->ciphersuite);
1726 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001727 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001728 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001729 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001730 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001731 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001732 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001733
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001735 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001736 }
Ronald Cron862902d2022-03-24 14:15:28 +01001737 }
1738
Gilles Peskine449bd832023-01-11 14:50:10 +01001739 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001740 *olen = 0;
1741 return;
1742 }
1743
Gilles Peskine449bd832023-01-11 14:50:10 +01001744 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001745
Gilles Peskine449bd832023-01-11 14:50:10 +01001746 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001747 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001748
1749 *p++ = 0x00;
1750 *p++ = 0x00;
1751
1752 *olen = 4;
1753}
Neil Armstrong76b74072022-04-06 13:43:54 +02001754#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001755
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001756#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001757static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1758 unsigned char *buf,
1759 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001760{
1761 unsigned char *p = buf;
1762
Gilles Peskine449bd832023-01-11 14:50:10 +01001763 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001764 *olen = 0;
1765 return;
1766 }
1767
Gilles Peskine449bd832023-01-11 14:50:10 +01001768 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1769 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001770
Gilles Peskine449bd832023-01-11 14:50:10 +01001771 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001772 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001773
1774 *p++ = 0x00;
1775 *p++ = 0x00;
1776
1777 *olen = 4;
1778}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001779#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001780
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001781#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001782static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1783 unsigned char *buf,
1784 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001785{
1786 unsigned char *p = buf;
1787
Gilles Peskine449bd832023-01-11 14:50:10 +01001788 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001789 *olen = 0;
1790 return;
1791 }
1792
Gilles Peskine449bd832023-01-11 14:50:10 +01001793 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001794
Gilles Peskine449bd832023-01-11 14:50:10 +01001795 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001796 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001797
1798 *p++ = 0x00;
1799 *p++ = 0x00;
1800
1801 *olen = 4;
1802}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001803#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001804
Gilles Peskine449bd832023-01-11 14:50:10 +01001805static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1806 unsigned char *buf,
1807 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001808{
1809 unsigned char *p = buf;
1810
Gilles Peskine449bd832023-01-11 14:50:10 +01001811 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001812 *olen = 0;
1813 return;
1814 }
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001817
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001819 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001821#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001822 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001823 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001824 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001825 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001826
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001828 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001830 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001831 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001832#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001833 {
1834 *p++ = 0x00;
1835 *p++ = 0x01;
1836 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001837 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001838
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001839 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001840}
1841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001842#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001843static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1844 unsigned char *buf,
1845 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001846{
1847 unsigned char *p = buf;
1848
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001850 *olen = 0;
1851 return;
1852 }
1853
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001855
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001857 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001858
1859 *p++ = 0x00;
1860 *p++ = 1;
1861
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001862 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001863
1864 *olen = 5;
1865}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001866#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001867
Valerio Setti7aeec542023-07-05 18:57:21 +02001868#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001869 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001870 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001871static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1872 unsigned char *buf,
1873 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001874{
1875 unsigned char *p = buf;
1876 ((void) ssl);
1877
Gilles Peskine449bd832023-01-11 14:50:10 +01001878 if ((ssl->handshake->cli_exts &
1879 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001880 *olen = 0;
1881 return;
1882 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001883
Gilles Peskine449bd832023-01-11 14:50:10 +01001884 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001885
Gilles Peskine449bd832023-01-11 14:50:10 +01001886 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001887 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001888
1889 *p++ = 0x00;
1890 *p++ = 2;
1891
1892 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001893 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001894
1895 *olen = 6;
1896}
Valerio Setti45d56f32023-07-13 17:23:20 +02001897#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001898 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001899 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001900
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001901#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001902static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1903 unsigned char *buf,
1904 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001905{
Janos Follath865b3eb2019-12-16 11:46:15 +00001906 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001907 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001908 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001909 size_t kkpp_len;
1910
1911 *olen = 0;
1912
1913 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001914 if (ssl->handshake->ciphersuite_info->key_exchange !=
1915 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001916 return;
1917 }
1918
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1920
1921 if (end - p < 4) {
1922 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1923 return;
1924 }
1925
1926 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001927 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001928
Neil Armstrongca7d5062022-05-31 14:43:23 +02001929#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001930 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001931 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001932 MBEDTLS_ECJPAKE_ROUND_ONE);
1933 if (ret != 0) {
1934 psa_destroy_key(ssl->handshake->psa_pake_password);
1935 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1936 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001937 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001938 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001939#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001940 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001941 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001942 ssl->conf->f_rng, ssl->conf->p_rng);
1943 if (ret != 0) {
1944 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001945 return;
1946 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001947#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001948
Gilles Peskine449bd832023-01-11 14:50:10 +01001949 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001950 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001951
1952 *olen = kkpp_len + 4;
1953}
1954#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1955
Gilles Peskine449bd832023-01-11 14:50:10 +01001956#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1957static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1958 unsigned char *buf,
1959 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001960{
Ron Eldor75870ec2018-12-06 17:31:55 +02001961 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001962 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001963 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1964
1965 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001966
Gilles Peskine449bd832023-01-11 14:50:10 +01001967 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1968 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001969 return;
1970 }
1971
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001973
Gilles Peskine449bd832023-01-11 14:50:10 +01001974 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001975 mki_len = ssl->dtls_srtp_info.mki_len;
1976 }
1977
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001978 /* The extension total size is 9 bytes :
1979 * - 2 bytes for the extension tag
1980 * - 2 bytes for the total size
1981 * - 2 bytes for the protection profile length
1982 * - 2 bytes for the protection profile
1983 * - 1 byte for the mki length
1984 * + the actual mki length
1985 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001986 if ((size_t) (end - buf) < mki_len + 9) {
1987 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001988 return;
1989 }
1990
Johan Pascalb62bb512015-12-03 21:56:45 +01001991 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001992 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001993 /*
1994 * total length 5 and mki value: only one profile(2 bytes)
1995 * and length(2 bytes) and srtp_mki )
1996 */
Ron Eldor591f1622018-01-22 12:30:04 +02001997 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001999
2000 /* protection profile length: 2 */
2001 buf[4] = 0x00;
2002 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002003 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002004 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2005 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2006 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2007 } else {
2008 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002009 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002010 }
2011
Ron Eldor591f1622018-01-22 12:30:04 +02002012 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002013 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002014
Ron Eldor591f1622018-01-22 12:30:04 +02002015 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002016}
2017#endif /* MBEDTLS_SSL_DTLS_SRTP */
2018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002019#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002020MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002021static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002022{
Janos Follath865b3eb2019-12-16 11:46:15 +00002023 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002024 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002025 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002026
Gilles Peskine449bd832023-01-11 14:50:10 +01002027 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002028
2029 /*
2030 * struct {
2031 * ProtocolVersion server_version;
2032 * opaque cookie<0..2^8-1>;
2033 * } HelloVerifyRequest;
2034 */
2035
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002036 /* The RFC is not clear on this point, but sending the actual negotiated
2037 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002038 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2039 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002040 p += 2;
2041
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002042 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002043 if (ssl->conf->f_cookie_write == NULL) {
2044 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2045 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002046 }
2047
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002048 /* Skip length byte until we know the length */
2049 cookie_len_byte = p++;
2050
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2052 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2053 ssl->cli_id, ssl->cli_id_len)) != 0) {
2054 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2055 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002056 }
2057
Gilles Peskine449bd832023-01-11 14:50:10 +01002058 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002059
Gilles Peskine449bd832023-01-11 14:50:10 +01002060 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002061
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002062 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002063 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2064 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002066 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002067
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2069 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2070 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002071 }
2072
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002073#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2075 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2076 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2077 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002078 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002079#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002082
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002084}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002085#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002086
Gilles Peskine449bd832023-01-11 14:50:10 +01002087static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002088{
2089 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002090 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002091 mbedtls_ssl_session * const session = ssl->session_negotiate;
2092
2093 /* Resume is 0 by default, see ssl_handshake_init().
2094 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002096 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002097 }
2098 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002099 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 }
2101 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002102 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002104#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002106 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002108#endif
2109
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002111
Gilles Peskine449bd832023-01-11 14:50:10 +01002112 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2113 session->id,
2114 session->id_len,
2115 &session_tmp);
2116 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002117 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002119
Gilles Peskine449bd832023-01-11 14:50:10 +01002120 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002121 /* Mismatch between cached and negotiated session */
2122 goto exit;
2123 }
2124
2125 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002126 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002127 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002129
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002131 ssl->handshake->resume = 1;
2132
2133exit:
2134
Gilles Peskine449bd832023-01-11 14:50:10 +01002135 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002136}
2137
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002138MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002139static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002140{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002141#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002142 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002143#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002144 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002145 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002146 unsigned char *buf, *p;
2147
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002150#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002151 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2152 ssl->handshake->cookie_verify_result != 0) {
2153 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2154 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002155
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002157 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002158#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002159
Paul Bakker5121ce52009-01-03 21:22:43 +00002160 /*
2161 * 0 . 0 handshake type
2162 * 1 . 3 handshake length
2163 * 4 . 5 protocol version
2164 * 6 . 9 UNIX time()
2165 * 10 . 37 random bytes
2166 */
2167 buf = ssl->out_msg;
2168 p = buf + 4;
2169
Gilles Peskine449bd832023-01-11 14:50:10 +01002170 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002171 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002172
Gilles Peskine449bd832023-01-11 14:50:10 +01002173 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2174 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002176#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 t = mbedtls_time(NULL);
2178 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002179 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2182 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002183#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002184 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2185 return ret;
2186 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002187
2188 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002189#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002190
Ronald Cronc5649382023-04-04 15:33:42 +02002191 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 return ret;
2193 }
Ronald Cronc5649382023-04-04 15:33:42 +02002194 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002195
Ronald Cronc5649382023-04-04 15:33:42 +02002196#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2197 /*
2198 * RFC 8446
2199 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2200 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2201 * response to a ClientHello MUST set the last 8 bytes of their Random
2202 * value specially in their ServerHello.
2203 */
2204 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2205 static const unsigned char magic_tls12_downgrade_string[] =
2206 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2207
2208 MBEDTLS_STATIC_ASSERT(
2209 sizeof(magic_tls12_downgrade_string) == 8,
2210 "magic_tls12_downgrade_string does not have the expected size");
2211
Ronald Cronfe01ec22023-04-06 09:56:53 +02002212 memcpy(p, magic_tls12_downgrade_string,
2213 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002214 } else
2215#endif
2216 {
2217 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2218 return ret;
2219 }
2220 }
2221 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002222
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002224
Gilles Peskine449bd832023-01-11 14:50:10 +01002225 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002226
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002228
Gilles Peskine449bd832023-01-11 14:50:10 +01002229 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002230 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002231 * New session, create a new session id,
2232 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002233 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002234 ssl->state++;
2235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002237 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002238#endif
2239
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002240#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002241 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002242 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002243 memset(ssl->session_negotiate->id, 0, 32);
2244 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002246 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002247 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002248 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2249 n)) != 0) {
2250 return ret;
2251 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002252 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002253 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002254 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002255 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002256 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002257 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002258 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002259
Gilles Peskine449bd832023-01-11 14:50:10 +01002260 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2261 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2262 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002263 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002264 }
2265
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002266 /*
2267 * 38 . 38 session id length
2268 * 39 . 38+n session id
2269 * 39+n . 40+n chosen ciphersuite
2270 * 41+n . 41+n chosen compression alg.
2271 * 42+n . 43+n extensions length
2272 * 44+n . 43+n+m extensions
2273 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002274 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002276 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002277
Gilles Peskine449bd832023-01-11 14:50:10 +01002278 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2279 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2280 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2281 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002282
Gilles Peskine449bd832023-01-11 14:50:10 +01002283 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002284 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002285 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002286
Gilles Peskine449bd832023-01-11 14:50:10 +01002287 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2288 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2289 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2290 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002291
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002292 /*
2293 * First write extensions, then the total length
2294 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002295 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002296 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002298#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002299 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002300 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002301#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002302
Hanno Beckera0e20d02019-05-15 14:03:01 +01002303#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002304 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002305 ext_len += olen;
2306#endif
2307
Neil Armstrong76b74072022-04-06 13:43:54 +02002308#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002310 ext_len += olen;
2311#endif
2312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002313#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002315 ext_len += olen;
2316#endif
2317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002318#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002319 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002320 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002321#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002322
Valerio Setti7aeec542023-07-05 18:57:21 +02002323#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002324 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002325 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002326 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002327 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2328 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2329 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002330 ext_len += olen;
2331 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002332#endif
2333
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002334#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002335 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002336 ext_len += olen;
2337#endif
2338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002339#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002340 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2342 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002343 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002344 }
Paul Elliottf518f812022-07-11 12:36:20 +01002345
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002346 ext_len += olen;
2347#endif
2348
Johan Pascalb62bb512015-12-03 21:56:45 +01002349#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002350 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002351 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002352#endif
2353
Gilles Peskine449bd832023-01-11 14:50:10 +01002354 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2355 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002356
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 if (ext_len > 0) {
2358 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002359 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002360 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002361
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002362 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002363 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2364 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002365
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002367
Gilles Peskine449bd832023-01-11 14:50:10 +01002368 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002369
Gilles Peskine449bd832023-01-11 14:50:10 +01002370 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002371}
2372
Gilles Peskineeccd8882020-03-10 12:19:08 +01002373#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002374MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002375static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002376{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002377 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002378 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002379
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002381
Gilles Peskine449bd832023-01-11 14:50:10 +01002382 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2383 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002384 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002385 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002386 }
2387
Gilles Peskine449bd832023-01-11 14:50:10 +01002388 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2389 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002390}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002391#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002392MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002393static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002394{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002395 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002396 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002397 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002398 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002399 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002400 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002401 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002402 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002403 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002406
2407 ssl->state++;
2408
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002409#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002411 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002412 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002413#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002414 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002415
Gilles Peskine449bd832023-01-11 14:50:10 +01002416 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2417 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2418 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2419 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002420 }
2421
2422 /*
2423 * 0 . 0 handshake type
2424 * 1 . 3 handshake length
2425 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002426 * 5 .. m-1 cert types
2427 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002428 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002429 * n .. n+1 length of all DNs
2430 * n+2 .. n+3 length of DN 1
2431 * n+4 .. ... Distinguished Name #1
2432 * ... .. ... length of DN 2, etc.
2433 */
2434 buf = ssl->out_msg;
2435 p = buf + 4;
2436
2437 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002438 * Supported certificate types
2439 *
2440 * ClientCertificateType certificate_types<1..2^8-1>;
2441 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002443 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002445#if defined(MBEDTLS_RSA_C)
2446 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002447#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002448#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002449 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002450#endif
2451
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002452 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002453 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002454
Paul Bakker577e0062013-08-28 11:57:20 +02002455 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002456
Paul Bakker926af752012-11-23 13:38:07 +01002457 /*
2458 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002459 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002460 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2461 *
2462 * struct {
2463 * HashAlgorithm hash;
2464 * SignatureAlgorithm signature;
2465 * } SignatureAndHashAlgorithm;
2466 *
2467 * enum { (255) } HashAlgorithm;
2468 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002469 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002470 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2471 if (sig_alg == NULL) {
2472 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2473 }
Ronald Cron8457c122022-03-07 11:32:54 +01002474
Gilles Peskine449bd832023-01-11 14:50:10 +01002475 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2476 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002477
Gilles Peskine449bd832023-01-11 14:50:10 +01002478 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002479 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002480 }
2481 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002482 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002483 }
Simon Butcher99000142016-10-13 17:21:01 +01002484
Paul Elliott96a0fd92022-11-08 17:09:56 +00002485 /* Write elements at offsets starting from 1 (offset 0 is for the
2486 * length). Thus the offset of each element is the length of the
2487 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002488 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002489 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002490
Paul Bakker926af752012-11-23 13:38:07 +01002491 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002492
Paul Elliott96a0fd92022-11-08 17:09:56 +00002493 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002495 sa_len += 2;
2496 p += sa_len;
2497
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002498 /*
2499 * DistinguishedName certificate_authorities<0..2^16-1>;
2500 * opaque DistinguishedName<1..2^16-1>;
2501 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002502 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002503
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002504 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002505
Gilles Peskine449bd832023-01-11 14:50:10 +01002506 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002507 /* NOTE: If trusted certificates are provisioned
2508 * via a CA callback (configured through
2509 * `mbedtls_ssl_conf_ca_cb()`, then the
2510 * CertificateRequest is currently left empty. */
2511
Glenn Strauss999ef702022-03-11 01:37:23 -05002512#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2513#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002514 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002515 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002516 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002517#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002518 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002519 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002520 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002521#endif
Janos Follath088ce432017-04-10 12:42:31 +01002522#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002523 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002524 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002525 } else
Janos Follath088ce432017-04-10 12:42:31 +01002526#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002527 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002528
Gilles Peskine449bd832023-01-11 14:50:10 +01002529 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002530 /* It follows from RFC 5280 A.1 that this length
2531 * can be represented in at most 11 bits. */
2532 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002533
Gilles Peskine449bd832023-01-11 14:50:10 +01002534 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2535 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002536 break;
2537 }
2538
Gilles Peskine449bd832023-01-11 14:50:10 +01002539 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002540 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002541 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002542 p += dn_size;
2543
Gilles Peskine449bd832023-01-11 14:50:10 +01002544 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002545
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002546 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002547 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002548 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002549 }
2550
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002551 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002552 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2553 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002554 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002555
Gilles Peskine449bd832023-01-11 14:50:10 +01002556 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002557
Gilles Peskine449bd832023-01-11 14:50:10 +01002558 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002559
Gilles Peskine449bd832023-01-11 14:50:10 +01002560 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002561}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002562#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002563
Valerio Setti4d0e8462023-10-06 13:20:21 +02002564#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002565 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002566#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002567MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002568static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002569{
2570 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2571 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002572 mbedtls_pk_context *pk;
2573 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002574 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002575 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2576 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002577#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002578 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002579 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002580 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002581 mbedtls_ecp_keypair *key;
2582#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002583
Gilles Peskine449bd832023-01-11 14:50:10 +01002584 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002585
Gilles Peskine449bd832023-01-11 14:50:10 +01002586 if (pk == NULL) {
2587 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2588 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002589
Valerio Setti0813b6f2023-06-16 12:18:53 +02002590 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002591
Valerio Setti0813b6f2023-06-16 12:18:53 +02002592 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002593 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002594#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2595 case MBEDTLS_PK_ECKEY:
2596 case MBEDTLS_PK_ECKEY_DH:
2597 case MBEDTLS_PK_ECDSA:
2598#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002599 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2600 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2601 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002602
Valerio Settibced8bc2023-12-06 10:40:47 +01002603 /* Get the attributes of the key previously parsed by PK module in
2604 * order to extract its type and length (in bits). */
2605 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002606 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002607 ret = PSA_TO_MBEDTLS_ERR(status);
2608 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002609 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002610 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002611 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002612
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002613#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2614 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002615 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2616 * module and only have ECDSA capabilities. Since we need
2617 * them for ECDH later, we export and then re-import them with
2618 * proper flags and algorithm. Of course We also set key's type
2619 * and bits that we just got above. */
2620 key_attributes = psa_key_attributes_init();
2621 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2622 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2623 psa_set_key_type(&key_attributes,
2624 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2625 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002626
Valerio Setti202bb712023-12-06 17:05:24 +01002627 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2628 if (status != PSA_SUCCESS) {
2629 ret = PSA_TO_MBEDTLS_ERR(status);
2630 goto exit;
2631 }
2632 status = psa_import_key(&key_attributes, buf, key_len,
2633 &ssl->handshake->xxdh_psa_privkey);
2634 if (status != PSA_SUCCESS) {
2635 ret = PSA_TO_MBEDTLS_ERR(status);
2636 goto exit;
2637 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002638
Valerio Setti202bb712023-12-06 17:05:24 +01002639 /* Set this key as owned by the TLS library: it will be its duty
2640 * to clear it exit. */
2641 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002642
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002643 ret = 0;
2644 break;
2645 }
2646#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2647
2648 /* Opaque key is created by the user (externally from Mbed TLS)
2649 * so we assume it already has the right algorithm and flags
2650 * set. Just copy its ID as reference. */
2651 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2652 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002653 ret = 0;
2654 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002655
Valerio Setti0813b6f2023-06-16 12:18:53 +02002656#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002657 case MBEDTLS_PK_ECKEY:
2658 case MBEDTLS_PK_ECKEY_DH:
2659 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002660 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002661 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002662 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2664 }
Valerio Setti97207782023-05-18 18:59:06 +02002665 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002666 if (tls_id == 0) {
2667 /* This elliptic curve is not supported */
2668 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2669 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002670
Gilles Peskine449bd832023-01-11 14:50:10 +01002671 /* If the above conversion to TLS ID was fine, then also this one will
2672 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002673 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002674 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002675
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002676 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002677
Gilles Peskine449bd832023-01-11 14:50:10 +01002678 key_attributes = psa_key_attributes_init();
2679 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2680 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2681 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002682 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002683 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002684
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002685 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002687 mbedtls_platform_zeroize(buf, sizeof(buf));
2688 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002689 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002690
Gilles Peskine449bd832023-01-11 14:50:10 +01002691 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002692 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002693 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002694 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002695 mbedtls_platform_zeroize(buf, sizeof(buf));
2696 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002697 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002698
Valerio Setti6835b4a2023-06-22 09:06:31 +02002699 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 ret = 0;
2701 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002702#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002703 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002704 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002705 }
2706
Valerio Settibced8bc2023-12-06 10:40:47 +01002707exit:
2708 psa_reset_key_attributes(&key_attributes);
2709 mbedtls_platform_zeroize(buf, sizeof(buf));
2710
Gilles Peskine449bd832023-01-11 14:50:10 +01002711 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002712}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002713#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002714MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002715static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002716{
Janos Follath865b3eb2019-12-16 11:46:15 +00002717 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002718
Gilles Peskine449bd832023-01-11 14:50:10 +01002719 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2720 if (private_key == NULL) {
2721 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2722 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002723 }
2724
Gilles Peskine449bd832023-01-11 14:50:10 +01002725 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2726 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2727 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002728 }
2729
Gilles Peskine449bd832023-01-11 14:50:10 +01002730 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002731 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002732 MBEDTLS_ECDH_OURS)) != 0) {
2733 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2734 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002735 }
2736
Gilles Peskine449bd832023-01-11 14:50:10 +01002737 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002738}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002739#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002740#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2741 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002742
Gilles Peskineeccd8882020-03-10 12:19:08 +01002743#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002744 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002745MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002746static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2747 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002748{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002749 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2750 * signature length which will be added in ssl_write_server_key_exchange
2751 * after the call to ssl_prepare_server_key_exchange.
2752 * ssl_write_server_key_exchange also takes care of incrementing
2753 * ssl->out_msglen. */
2754 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002755 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2756 - sig_start);
2757 int ret = ssl->conf->f_async_resume(ssl,
2758 sig_start, signature_len, sig_max_len);
2759 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002760 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002761 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002762 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002763 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2764 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002765}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002766#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002767 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002768
Gilles Peskined3eb0612018-01-08 17:07:44 +01002769/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002770 * calculating the signature if any, but excluding formatting the
2771 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002772MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002773static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2774 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002775{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002776 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002777 ssl->handshake->ciphersuite_info;
2778
Gilles Peskineeccd8882020-03-10 12:19:08 +01002779#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002780#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002781 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002782#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002783#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002784
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002785 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002786#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002787 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002788#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002789
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002790#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002791#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002792 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002793#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002794 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 +02002795#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002796#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002797
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002798 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002799
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002800 /*
2801 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002802 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002803 *
2804 */
2805
2806 /*
2807 * - ECJPAKE key exchanges
2808 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002809#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002810 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002811 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002812#if defined(MBEDTLS_USE_PSA_CRYPTO)
2813 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2814 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2815 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002816 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002817 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002818
Valerio Setti6f1b5742022-11-16 10:00:32 +01002819 /*
2820 * The first 3 bytes are:
2821 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2822 * [1, 2] elliptic curve's TLS ID
2823 *
2824 * However since we only support secp256r1 for now, we hardcode its
2825 * TLS ID here
2826 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002827 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002828 MBEDTLS_ECP_DP_SECP256R1);
2829 if (tls_id == 0) {
2830 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002831 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002832 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002833 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002834 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002835
Gilles Peskine449bd832023-01-11 14:50:10 +01002836 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2837 out_p + output_offset,
2838 end_p - out_p - output_offset, &output_len,
2839 MBEDTLS_ECJPAKE_ROUND_TWO);
2840 if (ret != 0) {
2841 psa_destroy_key(ssl->handshake->psa_pake_password);
2842 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2843 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2844 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002845 }
2846
Valerio Setti02c25b52022-11-15 14:08:42 +01002847 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002848 ssl->out_msglen += output_offset;
2849#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002850 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002851
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002852 ret = mbedtls_ecjpake_write_round_two(
2853 &ssl->handshake->ecjpake_ctx,
2854 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002855 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002856 ssl->conf->f_rng, ssl->conf->p_rng);
2857 if (ret != 0) {
2858 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2859 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002860 }
2861
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002862 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002863#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002864 }
2865#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2866
Hanno Becker1aa267c2017-04-28 17:08:27 +01002867 /*
2868 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2869 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2870 * we use empty support identity hints here.
2871 **/
2872#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002873 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002874 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2875 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002876 ssl->out_msg[ssl->out_msglen++] = 0x00;
2877 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002878 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002879#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2880 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002881
Hanno Becker7e5437a2017-04-28 17:15:26 +01002882 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002883 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002884 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002885#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002886 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002887 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002888 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002889
Gilles Peskine449bd832023-01-11 14:50:10 +01002890 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2891 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2892 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002893 }
2894
Paul Bakker41c83d32013-03-20 14:39:14 +01002895 /*
2896 * Ephemeral DH parameters:
2897 *
2898 * struct {
2899 * opaque dh_p<1..2^16-1>;
2900 * opaque dh_g<1..2^16-1>;
2901 * opaque dh_Ys<1..2^16-1>;
2902 * } ServerDHParams;
2903 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002904 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2905 &ssl->conf->dhm_P,
2906 &ssl->conf->dhm_G)) != 0) {
2907 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2908 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002909 }
Paul Bakker48916f92012-09-16 19:57:18 +00002910
Gilles Peskine449bd832023-01-11 14:50:10 +01002911 if ((ret = mbedtls_dhm_make_params(
2912 &ssl->handshake->dhm_ctx,
2913 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2914 ssl->out_msg + ssl->out_msglen, &len,
2915 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2916 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2917 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002918 }
2919
Jerry Yuc5aef882021-12-23 20:15:02 +08002920#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002921 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002922#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002923
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002924 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002925
Gilles Peskine449bd832023-01-11 14:50:10 +01002926 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2927 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2928 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2929 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002930 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002931#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002932
Hanno Becker1aa267c2017-04-28 17:08:27 +01002933 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002934 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002935 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002936#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002937 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002938 /*
2939 * Ephemeral ECDH parameters:
2940 *
2941 * struct {
2942 * ECParameters curve_params;
2943 * ECPoint public;
2944 * } ServerECDHParams;
2945 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002946 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002947 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002948 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002949 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002950
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002951 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002952 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2953 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2954 }
2955 for (; *group_list != 0; group_list++) {
2956 for (curr_tls_id = ssl->handshake->curves_tls_id;
2957 *curr_tls_id != 0; curr_tls_id++) {
2958 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002959 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002960 }
2961 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002962 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002963
Gilles Peskine449bd832023-01-11 14:50:10 +01002964curve_matching_done:
2965 if (*curr_tls_id == 0) {
2966 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2967 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2968 }
2969
2970 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2971 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002972
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002973#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002974 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2975 psa_key_attributes_t key_attributes;
2976 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002977 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2978 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2979 // data length(1)
2980 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002981 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002982 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002983
Gilles Peskine449bd832023-01-11 14:50:10 +01002984 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002985
Valerio Setti40d9ca92023-01-04 16:08:04 +01002986 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002987 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002988 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002989 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2990 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2991 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002992 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002993 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002994 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002995
2996 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002997 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2998 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002999 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003000 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003001
3002 /*
3003 * ECParameters curve_params
3004 *
3005 * First byte is curve_type, always named_curve
3006 */
3007 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3008
3009 /*
3010 * Next two bytes are the namedcurve value
3011 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003012 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003013 p += 2;
3014
3015 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003016 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003017 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003018 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003019 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003020 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3021 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003022 }
3023
3024 /*
3025 * ECPoint public
3026 *
3027 * First byte is data length.
3028 * It will be filled later. p holds now the data length location.
3029 */
3030
3031 /* Export the public part of the ECDH private key from PSA.
3032 * Make one byte space for the length.
3033 */
3034 unsigned char *own_pubkey = p + data_length_size;
3035
Gilles Peskine449bd832023-01-11 14:50:10 +01003036 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3037 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003038
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003039 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003040 own_pubkey, own_pubkey_max_len,
3041 &len);
3042 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003043 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003044 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003045 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3046 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003047 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003048 }
3049
3050 /* Store the length of the exported public key. */
3051 *p = (uint8_t) len;
3052
3053 /* Determine full message length. */
3054 len += header_size;
3055#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003056 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003057 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003058
Gilles Peskine449bd832023-01-11 14:50:10 +01003059 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3060 curr_grp_id)) != 0) {
3061 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3062 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003063 }
3064
Gilles Peskine449bd832023-01-11 14:50:10 +01003065 if ((ret = mbedtls_ecdh_make_params(
3066 &ssl->handshake->ecdh_ctx, &len,
3067 ssl->out_msg + ssl->out_msglen,
3068 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3069 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3070 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3071 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003072 }
3073
Gilles Peskine449bd832023-01-11 14:50:10 +01003074 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3075 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003076#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003077
Jerry Yuc5aef882021-12-23 20:15:02 +08003078#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003079 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003080#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003081
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003082 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003083 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003084#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003085
Hanno Becker1aa267c2017-04-28 17:08:27 +01003086 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003087 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003088 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003089 * exchange parameters, compute and add the signature here.
3090 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003091 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003092#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003093 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3094 if (dig_signed == NULL) {
3095 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3096 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003097 }
3098
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003099 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003100 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003101 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003102
Janos Follath865b3eb2019-12-16 11:46:15 +00003103 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003104
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003105 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003106 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003107 * For TLS 1.2, obey signature-hash-algorithm extension
3108 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003109 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003110
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003111 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003112 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003113
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003114 unsigned char sig_hash =
3115 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003116 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003117
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003119
Ronald Cron8457c122022-03-07 11:32:54 +01003120 /* For TLS 1.2, obey signature-hash-algorithm extension
3121 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3123 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003124 /* (... because we choose a cipher suite
3125 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003126 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003127 }
3128
Gilles Peskine449bd832023-01-11 14:50:10 +01003129 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003130
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003131 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003132 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003133 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003134 if (md_alg != MBEDTLS_MD_NONE) {
3135 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3136 dig_signed,
3137 dig_signed_len,
3138 md_alg);
3139 if (ret != 0) {
3140 return ret;
3141 }
3142 } else {
3143 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3144 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003145 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003146
Gilles Peskine449bd832023-01-11 14:50:10 +01003147 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003148
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003149 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003150 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003151 */
Ronald Cron8457c122022-03-07 11:32:54 +01003152 /*
3153 * We need to specify signature and hash algorithm explicitly through
3154 * a prefix to the signature.
3155 *
3156 * struct {
3157 * HashAlgorithm hash;
3158 * SignatureAlgorithm signature;
3159 * } SignatureAndHashAlgorithm;
3160 *
3161 * struct {
3162 * SignatureAndHashAlgorithm algorithm;
3163 * opaque signature<0..2^16-1>;
3164 * } DigitallySigned;
3165 *
3166 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003167
Gilles Peskine449bd832023-01-11 14:50:10 +01003168 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3169 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003170
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003171#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003172 if (ssl->conf->f_async_sign_start != NULL) {
3173 ret = ssl->conf->f_async_sign_start(ssl,
3174 mbedtls_ssl_own_cert(ssl),
3175 md_alg, hash, hashlen);
3176 switch (ret) {
3177 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3178 /* act as if f_async_sign was null */
3179 break;
3180 case 0:
3181 ssl->handshake->async_in_progress = 1;
3182 return ssl_resume_server_key_exchange(ssl, signature_len);
3183 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3184 ssl->handshake->async_in_progress = 1;
3185 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3186 default:
3187 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3188 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003189 }
3190 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003191#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003192
Gilles Peskine449bd832023-01-11 14:50:10 +01003193 if (mbedtls_ssl_own_key(ssl) == NULL) {
3194 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3195 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003196 }
3197
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003198 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3199 * signature length which will be added in ssl_write_server_key_exchange
3200 * after the call to ssl_prepare_server_key_exchange.
3201 * ssl_write_server_key_exchange also takes care of incrementing
3202 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003203 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3204 md_alg, hash, hashlen,
3205 ssl->out_msg + ssl->out_msglen + 2,
3206 out_buf_len - ssl->out_msglen - 2,
3207 signature_len,
3208 ssl->conf->f_rng,
3209 ssl->conf->p_rng)) != 0) {
3210 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3211 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003212 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003213 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003214#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003215
Gilles Peskine449bd832023-01-11 14:50:10 +01003216 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003217}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003218
Gilles Peskined3eb0612018-01-08 17:07:44 +01003219/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003220 * that do not include a ServerKeyExchange message, do nothing. Either
3221 * way, if successful, move on to the next step in the SSL state
3222 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003223MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003224static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003225{
Janos Follath865b3eb2019-12-16 11:46:15 +00003226 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003227 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003228#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003229 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003230 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003231#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003232
Gilles Peskine449bd832023-01-11 14:50:10 +01003233 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003234
Gilles Peskineeccd8882020-03-10 12:19:08 +01003235#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003236 /* Extract static ECDH parameters and abort if ServerKeyExchange
3237 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003238 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003239 /* For suites involving ECDH, extract DH parameters
3240 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003241#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003242 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3243 ret = ssl_get_ecdh_params_from_cert(ssl);
3244 if (ret != 0) {
3245 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3246 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003247 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003248 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003249#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003250
3251 /* Key exchanges not involving ephemeral keys don't use
3252 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003253 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003254 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003255 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003256 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003257#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003258
Gilles Peskineeccd8882020-03-10 12:19:08 +01003259#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003260 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003261 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003262 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003263 if (ssl->handshake->async_in_progress != 0) {
3264 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3265 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3266 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003267#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003268 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003269 {
3270 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003272 }
3273
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003275 /* If we're starting to write a new message, set ssl->out_msglen
3276 * to 0. But if we're resuming after an asynchronous message,
3277 * out_msglen is the amount of data written so far and mst be
3278 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003279 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3280 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3281 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003282 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003283 }
3284 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003285 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003286
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003287 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003288 * ssl_prepare_server_key_exchange already wrote the signature
3289 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003290#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003291 if (signature_len != 0) {
3292 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3293 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003294
Gilles Peskine449bd832023-01-11 14:50:10 +01003295 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3296 ssl->out_msg + ssl->out_msglen,
3297 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003298
3299 /* Skip over the already-written signature */
3300 ssl->out_msglen += signature_len;
3301 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003302#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003303
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003304 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003305 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3306 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003307
3308 ssl->state++;
3309
Gilles Peskine449bd832023-01-11 14:50:10 +01003310 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3311 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3312 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003313 }
3314
Gilles Peskine449bd832023-01-11 14:50:10 +01003315 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3316 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003317}
3318
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003319MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003320static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003321{
Janos Follath865b3eb2019-12-16 11:46:15 +00003322 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003323
Gilles Peskine449bd832023-01-11 14:50:10 +01003324 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003325
3326 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003327 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3328 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003329
3330 ssl->state++;
3331
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003332#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003333 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3334 mbedtls_ssl_send_flight_completed(ssl);
3335 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003336#endif
3337
Gilles Peskine449bd832023-01-11 14:50:10 +01003338 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3339 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3340 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003341 }
3342
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003343#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3345 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3346 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3347 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003348 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003349#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003350
Gilles Peskine449bd832023-01-11 14:50:10 +01003351 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003352
Gilles Peskine449bd832023-01-11 14:50:10 +01003353 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003354}
3355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003356#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3357 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003358MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003359static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3360 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003361{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003362 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003363 size_t n;
3364
3365 /*
3366 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3367 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003368 if (*p + 2 > end) {
3369 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3370 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003371 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003372
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003373 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003374 *p += 2;
3375
Gilles Peskine449bd832023-01-11 14:50:10 +01003376 if (*p + n > end) {
3377 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3378 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003379 }
3380
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3382 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3383 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003384 }
3385
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003386 *p += n;
3387
Gilles Peskine449bd832023-01-11 14:50:10 +01003388 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003389
Gilles Peskine449bd832023-01-11 14:50:10 +01003390 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003391}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003392#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3393 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003394
Gilles Peskineac767e52024-09-20 18:08:44 +02003395#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003396
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003397#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003398MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003399static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3400 unsigned char *peer_pms,
3401 size_t *peer_pmslen,
3402 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003403{
Gilles Peskine449bd832023-01-11 14:50:10 +01003404 int ret = ssl->conf->f_async_resume(ssl,
3405 peer_pms, peer_pmslen, peer_pmssize);
3406 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003407 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003408 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003409 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003410 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3411 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003412}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003413#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003414
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003415MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003416static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3417 const unsigned char *p,
3418 const unsigned char *end,
3419 unsigned char *peer_pms,
3420 size_t *peer_pmslen,
3421 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003422{
Janos Follath865b3eb2019-12-16 11:46:15 +00003423 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003424
Gilles Peskine449bd832023-01-11 14:50:10 +01003425 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3426 if (own_cert == NULL) {
3427 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3428 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003429 }
3430 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003431 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3432 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003433
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003434#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003435 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003436 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003437 if (ssl->handshake->async_in_progress != 0) {
3438 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3439 return ssl_resume_decrypt_pms(ssl,
3440 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003441 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003442#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003443
3444 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003445 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003446 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 if (p + 2 > end) {
3448 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3449 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003450 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003451 if (*p++ != MBEDTLS_BYTE_1(len) ||
3452 *p++ != MBEDTLS_BYTE_0(len)) {
3453 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3454 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003455 }
3456
Gilles Peskine449bd832023-01-11 14:50:10 +01003457 if (p + len != end) {
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 Peskine422ccab2018-01-11 18:29:01 +01003462 /*
3463 * Decrypt the premaster secret
3464 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003465#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003466 if (ssl->conf->f_async_decrypt_start != NULL) {
3467 ret = ssl->conf->f_async_decrypt_start(ssl,
3468 mbedtls_ssl_own_cert(ssl),
3469 p, len);
3470 switch (ret) {
3471 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3472 /* act as if f_async_decrypt_start was null */
3473 break;
3474 case 0:
3475 ssl->handshake->async_in_progress = 1;
3476 return ssl_resume_decrypt_pms(ssl,
3477 peer_pms,
3478 peer_pmslen,
3479 peer_pmssize);
3480 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3481 ssl->handshake->async_in_progress = 1;
3482 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3483 default:
3484 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3485 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003486 }
3487 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003488#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003489
Gilles Peskine449bd832023-01-11 14:50:10 +01003490 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3491 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3492 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003493 }
3494
Gilles Peskine449bd832023-01-11 14:50:10 +01003495 ret = mbedtls_pk_decrypt(private_key, p, len,
3496 peer_pms, peer_pmslen, peer_pmssize,
3497 ssl->conf->f_rng, ssl->conf->p_rng);
3498 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003499}
3500
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003501MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003502static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3503 const unsigned char *p,
3504 const unsigned char *end,
3505 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003506{
Janos Follath865b3eb2019-12-16 11:46:15 +00003507 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003508 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3509 unsigned char ver[2];
3510 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003511 size_t peer_pmslen;
3512 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003513
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003514 /* In case of a failure in decryption, the decryption may write less than
3515 * 2 bytes of output, but we always read the first two bytes. It doesn't
3516 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003517 * ret being nonzero, and we only care whether diff is 0.
3518 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3519 * also makes memory analyzers happy (don't access uninitialized memory,
3520 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003521 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003522 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003523
Gilles Peskine449bd832023-01-11 14:50:10 +01003524 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3525 peer_pms,
3526 &peer_pmslen,
3527 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003528
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003529#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003530 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3531 return ret;
3532 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003533#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003534
Gilles Peskine449bd832023-01-11 14:50:10 +01003535 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3536 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003537
3538 /* Avoid data-dependent branches while checking for invalid
3539 * padding, to protect against timing-based Bleichenbacher-type
3540 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003541 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003542 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3543 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3544 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003545
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003546 /*
3547 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3548 * must not cause the connection to end immediately; instead, send a
3549 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003550 * To protect against timing-based variants of the attack, we must
3551 * not have any branch that depends on whether the decryption was
3552 * successful. In particular, always generate the fake premaster secret,
3553 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003554 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003555 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3556 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003557 /* It's ok to abort on an RNG failure, since this does not reveal
3558 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003559 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003560 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003561
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003562#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003563 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003564 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3565 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003566#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003567
Gilles Peskine449bd832023-01-11 14:50:10 +01003568 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3569 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3570 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3571 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003572 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003573 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003574
Gilles Peskine422ccab2018-01-11 18:29:01 +01003575 /* Set pms to either the true or the fake PMS, without
3576 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003577 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578
Gilles Peskine449bd832023-01-11 14:50:10 +01003579 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003580}
Gilles Peskineac767e52024-09-20 18:08:44 +02003581#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003582
Gilles Peskineeccd8882020-03-10 12:19:08 +01003583#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003584MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003585static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3586 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003587{
Paul Bakker6db455e2013-09-18 17:29:31 +02003588 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003589 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003590
Gilles Peskine449bd832023-01-11 14:50:10 +01003591 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3592 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3593 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003594 }
3595
3596 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003597 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003598 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003599 if (end - *p < 2) {
3600 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3601 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003602 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003603
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003604 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003605 *p += 2;
3606
Gilles Peskine449bd832023-01-11 14:50:10 +01003607 if (n == 0 || n > end - *p) {
3608 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3609 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003610 }
3611
Gilles Peskine449bd832023-01-11 14:50:10 +01003612 if (ssl->conf->f_psk != NULL) {
3613 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003614 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003615 }
3616 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003617 /* Identity is not a big secret since clients send it in the clear,
3618 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003619 if (n != ssl->conf->psk_identity_len ||
3620 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003621 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003622 }
3623 }
3624
Gilles Peskine449bd832023-01-11 14:50:10 +01003625 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3626 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3627 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3628 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3629 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003630 }
3631
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003632 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003633
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003635}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003636#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003637
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003638MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003639static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003640{
Janos Follath865b3eb2019-12-16 11:46:15 +00003641 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003642 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003643 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003644
Hanno Beckere694c3e2017-12-27 21:34:08 +00003645 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003646
Gilles Peskine449bd832023-01-11 14:50:10 +01003647 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003648
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003649#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskineac767e52024-09-20 18:08:44 +02003650 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine712e9a12024-09-20 18:11:31 +02003651 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA &&
Gilles Peskine449bd832023-01-11 14:50:10 +01003652 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003653 /* We've already read a record and there is an asynchronous
3654 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003655 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003656 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3657 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003658#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3660 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3661 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003662 }
3663
Gilles Peskine449bd832023-01-11 14:50:10 +01003664 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003665 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003666
Gilles Peskine449bd832023-01-11 14:50:10 +01003667 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3668 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3669 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003670 }
3671
Gilles Peskine449bd832023-01-11 14:50:10 +01003672 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003677#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003678 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3679 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3680 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3681 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003682 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003683
Gilles Peskine449bd832023-01-11 14:50:10 +01003684 if (p != end) {
3685 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3686 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003687 }
3688
Gilles Peskine449bd832023-01-11 14:50:10 +01003689 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3690 ssl->handshake->premaster,
3691 MBEDTLS_PREMASTER_SIZE,
3692 &ssl->handshake->pmslen,
3693 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3694 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3695 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003696 }
3697
Gilles Peskine449bd832023-01-11 14:50:10 +01003698 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3699 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003700#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003701#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3702 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3703 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3704 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003705 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003706 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3707 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003708 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003709#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003710 size_t data_len = (size_t) (*p++);
3711 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003712 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3713 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3714
Gilles Peskine530c4232023-10-02 15:37:23 +02003715 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003716
3717 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003718 * We must have at least two bytes (1 for length, at least 1 for data)
3719 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003720 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003721 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3722 buf_len));
3723 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003724 }
3725
Gilles Peskine449bd832023-01-11 14:50:10 +01003726 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003727 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3728 " > %" MBEDTLS_PRINTF_SIZET,
3729 data_len, buf_len));
3730 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003731 }
3732
3733 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003734 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003735 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3736 " > %" MBEDTLS_PRINTF_SIZET,
3737 data_len,
3738 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003739 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3740 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003741 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3742 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003743
3744 /* Compute ECDH shared secret. */
3745 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003746 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3747 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003748 handshake->premaster, sizeof(handshake->premaster),
3749 &handshake->pmslen);
3750 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003751 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003752 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003753 if (handshake->xxdh_psa_privkey_is_external == 0) {
3754 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003755 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003756 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003757 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003758 }
3759
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003760 if (handshake->xxdh_psa_privkey_is_external == 0) {
3761 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003762
Gilles Peskine449bd832023-01-11 14:50:10 +01003763 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003764 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003765 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3766 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003767 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003768 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003769 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003770#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003771 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003772 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3774 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003775 }
3776
Gilles Peskine449bd832023-01-11 14:50:10 +01003777 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3778 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003779
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3781 &ssl->handshake->pmslen,
3782 ssl->handshake->premaster,
3783 MBEDTLS_MPI_MAX_SIZE,
3784 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3785 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3786 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003787 }
3788
Gilles Peskine449bd832023-01-11 14:50:10 +01003789 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3790 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003791#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003792 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003793#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3794 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3795 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3796 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3797#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003798 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3799 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3800 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3801 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003802 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003803
Gilles Peskine449bd832023-01-11 14:50:10 +01003804 if (p != end) {
3805 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3806 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003807 }
3808
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003809#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003810 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003811 (mbedtls_key_exchange_type_t) ciphersuite_info->
3812 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003813 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3814 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003815 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003816#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003817 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003818#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003819#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3821 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3822 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3823 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003824 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3826 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3827 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003828 }
3829
Gilles Peskine449bd832023-01-11 14:50:10 +01003830 if (p != end) {
3831 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3832 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003833 }
3834
Neil Armstrong80f6f322022-05-03 17:56:38 +02003835#if defined(MBEDTLS_USE_PSA_CRYPTO)
3836 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003838 size_t pms_len;
3839
3840 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003841 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3842 pms + 2, pms_end - (pms + 2), &pms_len,
3843 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3844 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3845 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003846 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003847 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003848 pms += 2 + pms_len;
3849
Gilles Peskine449bd832023-01-11 14:50:10 +01003850 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003851#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003852 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003853 (mbedtls_key_exchange_type_t) ciphersuite_info->
3854 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3856 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003857 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003858#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003859 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003860#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003861#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003862 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003863#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003864 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3865 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003866 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003867
3868 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3869
Gilles Peskine449bd832023-01-11 14:50:10 +01003870 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3871 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003872 psa_destroy_key(handshake->xxdh_psa_privkey);
3873 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003874 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003875 }
3876
3877 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003878 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003879 psa_destroy_key(handshake->xxdh_psa_privkey);
3880 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003881 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003882 }
3883
Neil Armstrong039db292022-03-09 11:38:34 +01003884 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003886 psa_destroy_key(handshake->xxdh_psa_privkey);
3887 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003888 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003889 }
3890
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003891 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3892 the sizes of the FFDH keys which are at least 2048 bits.
3893 The size of the array is thus greater than 256 bytes which is greater than any
3894 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003895#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003896 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3897 psa_destroy_key(handshake->xxdh_psa_privkey);
3898 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003899 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003900 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003901#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003902 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3903 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003904#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003905
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003906 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3907 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003908 p += ecpoint_len;
3909
Neil Armstrong3bcef082022-03-23 18:16:54 +01003910 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003911 * - a uint16 containing the length (in octets) of the ECDH computation
3912 * - the octet string produced by the ECDH computation
3913 * - a uint16 containing the length (in octets) of the PSK
3914 * - the PSK itself
3915 */
Neil Armstrong039db292022-03-09 11:38:34 +01003916 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003917 const unsigned char * const psm_end =
3918 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003919 /* uint16 to store length (in octets) of the ECDH computation */
3920 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003921 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003922
3923 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003924 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003925 handshake->xxdh_psa_privkey,
3926 handshake->xxdh_psa_peerkey,
3927 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003928 psm + zlen_size,
3929 psm_end - (psm + zlen_size),
3930 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003931
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003932 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3933 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003934
Gilles Peskine449bd832023-01-11 14:50:10 +01003935 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003936 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003937 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003938 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003939 }
Neil Armstrong039db292022-03-09 11:38:34 +01003940
Neil Armstrong3bcef082022-03-23 18:16:54 +01003941 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003942 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003943 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003944
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003945#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003946 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3947 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3948 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003949 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003950
Gilles Peskine449bd832023-01-11 14:50:10 +01003951 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003952 p, (size_t) (end - p))) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003953 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3954 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003955 }
3956
Gilles Peskine449bd832023-01-11 14:50:10 +01003957 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3958 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003959
Gilles Peskine449bd832023-01-11 14:50:10 +01003960 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003961 (mbedtls_key_exchange_type_t) ciphersuite_info->
3962 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003963 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3964 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003965 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003966#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003967 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003968#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3969#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003970 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3971 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3972 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3973 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003974 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003976#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003977#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003978 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02003979#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003981 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003982 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3983 psa_destroy_key(ssl->handshake->psa_pake_password);
3984 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003985
Gilles Peskine449bd832023-01-11 14:50:10 +01003986 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3987 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003988 }
3989#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003990 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003991 p, (size_t) (end - p));
Gilles Peskine449bd832023-01-11 14:50:10 +01003992 if (ret != 0) {
3993 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
3994 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003995 }
3996
Gilles Peskine449bd832023-01-11 14:50:10 +01003997 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
3998 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3999 ssl->conf->f_rng, ssl->conf->p_rng);
4000 if (ret != 0) {
4001 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4002 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004003 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004004#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004005 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004006#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004007 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004008 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4009 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004010 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004011
Gilles Peskine449bd832023-01-11 14:50:10 +01004012 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4013 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4014 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004015 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004016
Paul Bakker5121ce52009-01-03 21:22:43 +00004017 ssl->state++;
4018
Gilles Peskine449bd832023-01-11 14:50:10 +01004019 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004020
Gilles Peskine449bd832023-01-11 14:50:10 +01004021 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004022}
4023
Gilles Peskineeccd8882020-03-10 12:19:08 +01004024#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004025MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004026static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004027{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004028 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004029 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004030
Gilles Peskine449bd832023-01-11 14:50:10 +01004031 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004032
Gilles Peskine449bd832023-01-11 14:50:10 +01004033 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4034 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004035 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004036 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004037 }
4038
Gilles Peskine449bd832023-01-11 14:50:10 +01004039 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4040 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004041}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004042#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004043MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004044static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004045{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004046 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004047 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004048 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004049 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004050 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004051 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004052 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004053 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004054 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004055 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004056
Gilles Peskine449bd832023-01-11 14:50:10 +01004057 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004058
Gilles Peskine449bd832023-01-11 14:50:10 +01004059 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4060 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004061 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004062 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004063 }
4064
Hanno Becker2a831a42019-02-07 13:17:25 +00004065#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004066 if (ssl->session_negotiate->peer_cert == NULL) {
4067 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004068 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004069 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004070 }
4071#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004072 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4073 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004074 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004075 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004076 }
4077#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4078
Simon Butcher99000142016-10-13 17:21:01 +01004079 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004080 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4081 if (0 != ret) {
4082 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4083 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004084 }
4085
4086 ssl->state++;
4087
Simon Butcher99000142016-10-13 17:21:01 +01004088 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004089 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4090 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4091 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4092 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004093 }
4094
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004096
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004097#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4098 peer_pk = &ssl->handshake->peer_pubkey;
4099#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004101 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004102 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004103 }
4104 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4105#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4106
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004107 /*
4108 * struct {
4109 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4110 * opaque signature<0..2^16-1>;
4111 * } DigitallySigned;
4112 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004113 if (i + 2 > ssl->in_hslen) {
4114 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4115 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004116 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004117
Ronald Cron8457c122022-03-07 11:32:54 +01004118 /*
4119 * Hash
4120 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004121 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004122
Gilles Peskine449bd832023-01-11 14:50:10 +01004123 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4124 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4125 " for verify message"));
4126 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004127 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004128
Simon Butcher99000142016-10-13 17:21:01 +01004129#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004130 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004131 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004132 }
Simon Butcher99000142016-10-13 17:21:01 +01004133#endif
Paul Bakker926af752012-11-23 13:38:07 +01004134
Ronald Cron8457c122022-03-07 11:32:54 +01004135 /* Info from md_alg will be used instead */
4136 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004137
Ronald Cron8457c122022-03-07 11:32:54 +01004138 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004139
Ronald Cron8457c122022-03-07 11:32:54 +01004140 /*
4141 * Signature
4142 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004143 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4144 == MBEDTLS_PK_NONE) {
4145 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4146 " for verify message"));
4147 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004148 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004149
Ronald Cron8457c122022-03-07 11:32:54 +01004150 /*
4151 * Check the certificate's key type matches the signature alg
4152 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004153 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4154 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4155 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004156 }
4157
4158 i++;
4159
Gilles Peskine449bd832023-01-11 14:50:10 +01004160 if (i + 2 > ssl->in_hslen) {
4161 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4162 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004163 }
4164
Dave Rodgmana3d0f612023-11-03 23:34:02 +00004165 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004166 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004167
Gilles Peskine449bd832023-01-11 14:50:10 +01004168 if (i + sig_len != ssl->in_hslen) {
4169 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4170 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004171 }
4172
Simon Butcher99000142016-10-13 17:21:01 +01004173 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004174 {
4175 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004176 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4177 if (0 != ret) {
4178 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4179 return ret;
4180 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004181 }
Simon Butcher99000142016-10-13 17:21:01 +01004182
Gilles Peskine449bd832023-01-11 14:50:10 +01004183 if ((ret = mbedtls_pk_verify(peer_pk,
4184 md_alg, hash_start, hashlen,
4185 ssl->in_msg + i, sig_len)) != 0) {
4186 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4187 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004188 }
4189
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004190 ret = mbedtls_ssl_update_handshake_status(ssl);
4191 if (0 != ret) {
4192 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4193 return ret;
4194 }
Simon Butcher99000142016-10-13 17:21:01 +01004195
Gilles Peskine449bd832023-01-11 14:50:10 +01004196 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004197
Gilles Peskine449bd832023-01-11 14:50:10 +01004198 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004199}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004200#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004201
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004202#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004203MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004204static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004205{
Janos Follath865b3eb2019-12-16 11:46:15 +00004206 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004207 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004208 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004209
Gilles Peskine449bd832023-01-11 14:50:10 +01004210 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004211
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004212 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4213 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004214
4215 /*
4216 * struct {
4217 * uint32 ticket_lifetime_hint;
4218 * opaque ticket<0..2^16-1>;
4219 * } NewSessionTicket;
4220 *
4221 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4222 * 8 . 9 ticket_len (n)
4223 * 10 . 9+n ticket content
4224 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004225
Ronald Cron3c0072b2023-11-22 10:00:14 +01004226#if defined(MBEDTLS_HAVE_TIME)
4227 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4228#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004229 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4230 ssl->session_negotiate,
4231 ssl->out_msg + 10,
4232 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4233 &tlen, &lifetime)) != 0) {
4234 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004235 tlen = 0;
4236 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004237
Gilles Peskine449bd832023-01-11 14:50:10 +01004238 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4239 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004240 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004241
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004242 /*
4243 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4244 * ChangeCipherSpec share the same state.
4245 */
4246 ssl->handshake->new_session_ticket = 0;
4247
Gilles Peskine449bd832023-01-11 14:50:10 +01004248 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4249 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4250 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004251 }
4252
Gilles Peskine449bd832023-01-11 14:50:10 +01004253 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004254
Gilles Peskine449bd832023-01-11 14:50:10 +01004255 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004256}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004257#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004258
Paul Bakker5121ce52009-01-03 21:22:43 +00004259/*
Paul Bakker1961b702013-01-25 14:49:24 +01004260 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004261 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004262int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004263{
4264 int ret = 0;
4265
Gilles Peskine449bd832023-01-11 14:50:10 +01004266 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004267
Gilles Peskine449bd832023-01-11 14:50:10 +01004268 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004269 case MBEDTLS_SSL_HELLO_REQUEST:
4270 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004271 break;
4272
Paul Bakker1961b702013-01-25 14:49:24 +01004273 /*
4274 * <== ClientHello
4275 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004276 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004277 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004278 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004280#if defined(MBEDTLS_SSL_PROTO_DTLS)
4281 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004282 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004283#endif
4284
Paul Bakker1961b702013-01-25 14:49:24 +01004285 /*
4286 * ==> ServerHello
4287 * Certificate
4288 * ( ServerKeyExchange )
4289 * ( CertificateRequest )
4290 * ServerHelloDone
4291 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004292 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004293 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004294 break;
4295
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004296 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004297 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004298 break;
4299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004300 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004301 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004302 break;
4303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004304 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004305 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004306 break;
4307
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004308 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004309 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004310 break;
4311
4312 /*
4313 * <== ( Certificate/Alert )
4314 * ClientKeyExchange
4315 * ( CertificateVerify )
4316 * ChangeCipherSpec
4317 * Finished
4318 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004319 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004320 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004321 break;
4322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004323 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004324 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004325 break;
4326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004327 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004328 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004329 break;
4330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004331 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004332 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004333 break;
4334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004335 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004336 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004337 break;
4338
4339 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004340 * ==> ( NewSessionTicket )
4341 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004342 * Finished
4343 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004344 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4345#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004346 if (ssl->handshake->new_session_ticket != 0) {
4347 ret = ssl_write_new_session_ticket(ssl);
4348 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004349#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004350 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004351 break;
4352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004353 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004354 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004355 break;
4356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004357 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004358 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004359 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004360 break;
4361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004362 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004363 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004364 break;
4365
4366 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004367 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4368 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004369 }
4370
Gilles Peskine449bd832023-01-11 14:50:10 +01004371 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004372}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004373
Gilles Peskine449bd832023-01-11 14:50:10 +01004374void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004375{
TRodziewicz3946f792021-06-14 12:11:18 +02004376 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004377}
4378
Jerry Yufb4b6472022-01-27 15:03:26 +08004379#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */